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(); | ||
|  |   }); | ||
|  | }); |