mirror of
				https://gitea.com/actions/setup-java.git
				synced 2025-11-02 07:47:06 +00:00 
			
		
		
		
	* actions/setup-java@v2 - Support different distributions (#132) * Implement support for custom vendors in setup-java * minor improvements * minor refactoring * Add unit tests and e2e tests * Update documentation for setup-java@v2 release * minor improvements * regenerate dist * fix comments * resolve comments * resolve comments * fix tests * Update README.md Co-authored-by: George Adams <george.adams@microsoft.com> * Apply suggestions from code review Co-authored-by: Konrad Pabjan <konradpabjan@github.com> * fix minor nitpicks * handle 4th digit * pull latest main * Update README.md * rename adoptium to adopt * rename adoptium to adopt * rename adoptium to adopt * Update README.md * make java-version and distribution required for action * update readme * fix tests * fix e2e tests Co-authored-by: George Adams <george.adams@microsoft.com> Co-authored-by: Konrad Pabjan <konradpabjan@github.com> * Add "overwrite-settings" input parameter (#136) * add overwrite-settings parameter * fix e2e tests * print debug * fix e2e tests * add comment * remove comment * Add "Contents/Home" postfix on macOS if provider creates it (#139) * Update e2e-versions.yml * Update e2e-versions.yml * implement fix * Update e2e-versions.yml * Update installer.ts * fix filter logic * Update e2e-versions.yml * remove extra logic * Update e2e-versions.yml * Add check-latest flag (#141) * add changes for check-latest * run prerelease script * resolving comments * fixing tests * fix spelling * improve core.info messages * run format * run prerelease * change version to fix test * resolve comment for check-latest * Update README.md * added hosted tool cache section * Apply suggestions from code review Co-authored-by: Maxim Lobanov <v-malob@microsoft.com> Co-authored-by: Konrad Pabjan <konradpabjan@github.com> * Avoid "+" sign in Java path in v2-preview (#145) * try to handle _ versions * more logs * more debug * test 1 * more fixes * fix typo * Update e2e-versions.yml * add unit-tests * remove debug info from tests * debug pre-cached versions * change e2e tests to ubuntu-latest * update npm licenses Co-authored-by: George Adams <george.adams@microsoft.com> Co-authored-by: Konrad Pabjan <konradpabjan@github.com> Co-authored-by: Dmitry Shibanov <dmitry-shibanov@github.com>
		
			
				
	
	
		
			236 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import fs from 'fs';
 | 
						|
 | 
						|
import * as tc from '@actions/tool-cache';
 | 
						|
import * as core from '@actions/core';
 | 
						|
 | 
						|
import path from 'path';
 | 
						|
import * as semver from 'semver';
 | 
						|
import * as util from '../../src/util';
 | 
						|
 | 
						|
import { LocalDistribution } from '../../src/distributions/local/installer';
 | 
						|
 | 
						|
describe('setupJava', () => {
 | 
						|
  const actualJavaVersion = '11.1.10';
 | 
						|
  const javaPath = path.join('Java_jdkfile_jdk', actualJavaVersion, 'x86');
 | 
						|
 | 
						|
  let mockJavaBase: LocalDistribution;
 | 
						|
 | 
						|
  let spyGetToolcachePath: jest.SpyInstance;
 | 
						|
  let spyTcCacheDir: jest.SpyInstance;
 | 
						|
  let spyTcFindAllVersions: jest.SpyInstance;
 | 
						|
  let spyCoreDebug: jest.SpyInstance;
 | 
						|
  let spyCoreInfo: jest.SpyInstance;
 | 
						|
  let spyCoreExportVariable: jest.SpyInstance;
 | 
						|
  let spyCoreAddPath: jest.SpyInstance;
 | 
						|
  let spyCoreSetOutput: jest.SpyInstance;
 | 
						|
  let spyFsStat: jest.SpyInstance;
 | 
						|
  let spyFsReadDir: jest.SpyInstance;
 | 
						|
  let spyUtilsExtractJdkFile: jest.SpyInstance;
 | 
						|
  let spyPathResolve: jest.SpyInstance;
 | 
						|
  let expectedJdkFile = 'JavaLocalJdkFile';
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    spyGetToolcachePath = jest.spyOn(util, 'getToolcachePath');
 | 
						|
    spyGetToolcachePath.mockImplementation(
 | 
						|
      (toolname: string, javaVersion: string, architecture: string) => {
 | 
						|
        const semverVersion = new semver.Range(javaVersion);
 | 
						|
 | 
						|
        if (path.basename(javaPath) !== architecture || !javaPath.includes(toolname)) {
 | 
						|
          return '';
 | 
						|
        }
 | 
						|
 | 
						|
        return semver.satisfies(actualJavaVersion, semverVersion) ? javaPath : '';
 | 
						|
      }
 | 
						|
    );
 | 
						|
 | 
						|
    spyTcCacheDir = jest.spyOn(tc, 'cacheDir');
 | 
						|
    spyTcCacheDir.mockImplementation(
 | 
						|
      (archivePath: string, toolcacheFolderName: string, version: string, architecture: string) =>
 | 
						|
        path.join(toolcacheFolderName, version, architecture)
 | 
						|
    );
 | 
						|
 | 
						|
    spyTcFindAllVersions = jest.spyOn(tc, 'findAllVersions');
 | 
						|
    spyTcFindAllVersions.mockReturnValue([actualJavaVersion]);
 | 
						|
 | 
						|
    // Spy on core methods
 | 
						|
    spyCoreDebug = jest.spyOn(core, 'debug');
 | 
						|
    spyCoreDebug.mockImplementation(() => undefined);
 | 
						|
 | 
						|
    spyCoreInfo = jest.spyOn(core, 'info');
 | 
						|
    spyCoreInfo.mockImplementation(() => undefined);
 | 
						|
 | 
						|
    spyCoreAddPath = jest.spyOn(core, 'addPath');
 | 
						|
    spyCoreAddPath.mockImplementation(() => undefined);
 | 
						|
 | 
						|
    spyCoreExportVariable = jest.spyOn(core, 'exportVariable');
 | 
						|
    spyCoreExportVariable.mockImplementation(() => undefined);
 | 
						|
 | 
						|
    spyCoreSetOutput = jest.spyOn(core, 'setOutput');
 | 
						|
    spyCoreSetOutput.mockImplementation(() => undefined);
 | 
						|
 | 
						|
    // Spy on fs methods
 | 
						|
    spyFsReadDir = jest.spyOn(fs, 'readdirSync');
 | 
						|
    spyFsReadDir.mockImplementation(() => ['JavaTest']);
 | 
						|
 | 
						|
    spyFsStat = jest.spyOn(fs, 'statSync');
 | 
						|
    spyFsStat.mockImplementation((file: string) => {
 | 
						|
      return { isFile: () => file === expectedJdkFile };
 | 
						|
    });
 | 
						|
 | 
						|
    // Spy on util methods
 | 
						|
    spyUtilsExtractJdkFile = jest.spyOn(util, 'extractJdkFile');
 | 
						|
    spyUtilsExtractJdkFile.mockImplementation(() => 'some/random/path/');
 | 
						|
 | 
						|
    // Spy on path methods
 | 
						|
    spyPathResolve = jest.spyOn(path, 'resolve');
 | 
						|
    spyPathResolve.mockImplementation((path: string) => path);
 | 
						|
  });
 | 
						|
 | 
						|
  afterEach(() => {
 | 
						|
    jest.resetAllMocks();
 | 
						|
    jest.clearAllMocks();
 | 
						|
    jest.restoreAllMocks();
 | 
						|
  });
 | 
						|
 | 
						|
  it('java is resolved from toolcache, jdkfile is untouched', async () => {
 | 
						|
    const inputs = {
 | 
						|
      version: actualJavaVersion,
 | 
						|
      architecture: 'x86',
 | 
						|
      packageType: 'jdk',
 | 
						|
      checkLatest: false
 | 
						|
    };
 | 
						|
    const jdkFile = 'not_existing_one';
 | 
						|
    const expected = {
 | 
						|
      version: actualJavaVersion,
 | 
						|
      path: path.join('Java_jdkfile_jdk', inputs.version, inputs.architecture)
 | 
						|
    };
 | 
						|
 | 
						|
    mockJavaBase = new LocalDistribution(inputs, jdkFile);
 | 
						|
    await expect(mockJavaBase.setupJava()).resolves.toEqual(expected);
 | 
						|
    expect(spyGetToolcachePath).toHaveBeenCalled();
 | 
						|
    expect(spyCoreInfo).toHaveBeenCalledWith(`Resolved Java ${actualJavaVersion} from tool-cache`);
 | 
						|
    expect(spyCoreInfo).not.toHaveBeenCalledWith(
 | 
						|
      `Java ${inputs.version} was not found in tool-cache. Trying to unpack JDK file...`
 | 
						|
    );
 | 
						|
  });
 | 
						|
 | 
						|
  it("java is resolved from toolcache, jdkfile doesn't exist", async () => {
 | 
						|
    const inputs = {
 | 
						|
      version: actualJavaVersion,
 | 
						|
      architecture: 'x86',
 | 
						|
      packageType: 'jdk',
 | 
						|
      checkLatest: false
 | 
						|
    };
 | 
						|
    const jdkFile = undefined;
 | 
						|
    const expected = {
 | 
						|
      version: actualJavaVersion,
 | 
						|
      path: path.join('Java_jdkfile_jdk', inputs.version, inputs.architecture)
 | 
						|
    };
 | 
						|
 | 
						|
    mockJavaBase = new LocalDistribution(inputs, jdkFile);
 | 
						|
    await expect(mockJavaBase.setupJava()).resolves.toEqual(expected);
 | 
						|
    expect(spyGetToolcachePath).toHaveBeenCalled();
 | 
						|
    expect(spyCoreInfo).toHaveBeenCalledWith(`Resolved Java ${actualJavaVersion} from tool-cache`);
 | 
						|
    expect(spyCoreInfo).not.toHaveBeenCalledWith(
 | 
						|
      `Java ${inputs.version} was not found in tool-cache. Trying to unpack JDK file...`
 | 
						|
    );
 | 
						|
  });
 | 
						|
 | 
						|
  it('java is unpacked from jdkfile', async () => {
 | 
						|
    const inputs = {
 | 
						|
      version: '11.0.289',
 | 
						|
      architecture: 'x86',
 | 
						|
      packageType: 'jdk',
 | 
						|
      checkLatest: false
 | 
						|
    };
 | 
						|
    const jdkFile = expectedJdkFile;
 | 
						|
    const expected = {
 | 
						|
      version: '11.0.289',
 | 
						|
      path: path.join('Java_jdkfile_jdk', inputs.version, inputs.architecture)
 | 
						|
    };
 | 
						|
 | 
						|
    mockJavaBase = new LocalDistribution(inputs, jdkFile);
 | 
						|
    await expect(mockJavaBase.setupJava()).resolves.toEqual(expected);
 | 
						|
    expect(spyTcFindAllVersions).toHaveBeenCalled();
 | 
						|
    expect(spyCoreInfo).not.toHaveBeenCalledWith(
 | 
						|
      `Resolved Java ${actualJavaVersion} from tool-cache`
 | 
						|
    );
 | 
						|
    expect(spyCoreInfo).toHaveBeenCalledWith(`Extracting Java from '${jdkFile}'`);
 | 
						|
    expect(spyCoreInfo).toHaveBeenCalledWith(
 | 
						|
      `Java ${inputs.version} was not found in tool-cache. Trying to unpack JDK file...`
 | 
						|
    );
 | 
						|
  });
 | 
						|
 | 
						|
  it('jdk file is not found', async () => {
 | 
						|
    const inputs = {
 | 
						|
      version: '11.0.289',
 | 
						|
      architecture: 'x86',
 | 
						|
      packageType: 'jdk',
 | 
						|
      checkLatest: false
 | 
						|
    };
 | 
						|
    const jdkFile = 'not_existing_one';
 | 
						|
    const expected = {
 | 
						|
      javaVersion: '11.0.289',
 | 
						|
      javaPath: path.join('Java_jdkfile_jdk', inputs.version, inputs.architecture)
 | 
						|
    };
 | 
						|
 | 
						|
    mockJavaBase = new LocalDistribution(inputs, jdkFile);
 | 
						|
    expected.javaPath = path.join('Java_jdkfile_jdk', inputs.version, inputs.architecture);
 | 
						|
    await expect(mockJavaBase.setupJava()).rejects.toThrowError(
 | 
						|
      "JDK file was not found in path 'not_existing_one'"
 | 
						|
    );
 | 
						|
    expect(spyTcFindAllVersions).toHaveBeenCalled();
 | 
						|
    expect(spyCoreInfo).not.toHaveBeenCalledWith(
 | 
						|
      `Resolved Java ${actualJavaVersion} from tool-cache`
 | 
						|
    );
 | 
						|
    expect(spyCoreInfo).not.toHaveBeenCalledWith(`Extracting Java from '${jdkFile}'`);
 | 
						|
    expect(spyCoreInfo).toHaveBeenCalledWith(
 | 
						|
      `Java ${inputs.version} was not found in tool-cache. Trying to unpack JDK file...`
 | 
						|
    );
 | 
						|
  });
 | 
						|
 | 
						|
  it.each([
 | 
						|
    [
 | 
						|
      { version: '8.0.289', architecture: 'x64', packageType: 'jdk', checkLatest: false },
 | 
						|
      'otherJdkFile'
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      { version: '11.0.289', architecture: 'x64', packageType: 'jdk', checkLatest: false },
 | 
						|
      'otherJdkFile'
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      { version: '12.0.289', architecture: 'x64', packageType: 'jdk', checkLatest: false },
 | 
						|
      'otherJdkFile'
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      { version: '11.1.11', architecture: 'x64', packageType: 'jdk', checkLatest: false },
 | 
						|
      'not_existing_one'
 | 
						|
    ]
 | 
						|
  ])(
 | 
						|
    `Throw an error if jdkfile has wrong path, inputs %s, jdkfile %s, real name ${expectedJdkFile}`,
 | 
						|
    async (inputs, jdkFile) => {
 | 
						|
      mockJavaBase = new LocalDistribution(inputs, jdkFile);
 | 
						|
      await expect(mockJavaBase.setupJava()).rejects.toThrowError(
 | 
						|
        /JDK file was not found in path */
 | 
						|
      );
 | 
						|
      expect(spyTcFindAllVersions).toHaveBeenCalled();
 | 
						|
    }
 | 
						|
  );
 | 
						|
 | 
						|
  it.each([
 | 
						|
    [{ version: '8.0.289', architecture: 'x64', packageType: 'jdk', checkLatest: false }, ''],
 | 
						|
    [
 | 
						|
      { version: '7.0.289', architecture: 'x64', packageType: 'jdk', checkLatest: false },
 | 
						|
      undefined
 | 
						|
    ],
 | 
						|
    [
 | 
						|
      { version: '11.0.289', architecture: 'x64', packageType: 'jdk', checkLatest: false },
 | 
						|
      undefined
 | 
						|
    ]
 | 
						|
  ])('Throw an error if jdkfile is not specified, inputs %s', async (inputs, jdkFile) => {
 | 
						|
    mockJavaBase = new LocalDistribution(inputs, jdkFile);
 | 
						|
    await expect(mockJavaBase.setupJava()).rejects.toThrowError("'jdkFile' is not specified");
 | 
						|
    expect(spyTcFindAllVersions).toHaveBeenCalled();
 | 
						|
  });
 | 
						|
});
 |