| 
									
										
										
										
											2021-03-15 13:39:46 +03:00
										 |  |  | 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 () => { | 
					
						
							| 
									
										
										
										
											2021-03-24 21:30:05 +03:00
										 |  |  |     const inputs = { | 
					
						
							|  |  |  |       version: actualJavaVersion, | 
					
						
							|  |  |  |       architecture: 'x86', | 
					
						
							|  |  |  |       packageType: 'jdk', | 
					
						
							|  |  |  |       checkLatest: false | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-03-15 13:39:46 +03:00
										 |  |  |     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 () => { | 
					
						
							| 
									
										
										
										
											2021-03-24 21:30:05 +03:00
										 |  |  |     const inputs = { | 
					
						
							|  |  |  |       version: actualJavaVersion, | 
					
						
							|  |  |  |       architecture: 'x86', | 
					
						
							|  |  |  |       packageType: 'jdk', | 
					
						
							|  |  |  |       checkLatest: false | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-03-15 13:39:46 +03:00
										 |  |  |     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 () => { | 
					
						
							| 
									
										
										
										
											2021-03-24 21:30:05 +03:00
										 |  |  |     const inputs = { | 
					
						
							|  |  |  |       version: '11.0.289', | 
					
						
							|  |  |  |       architecture: 'x86', | 
					
						
							|  |  |  |       packageType: 'jdk', | 
					
						
							|  |  |  |       checkLatest: false | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-03-15 13:39:46 +03:00
										 |  |  |     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 () => { | 
					
						
							| 
									
										
										
										
											2021-03-24 21:30:05 +03:00
										 |  |  |     const inputs = { | 
					
						
							|  |  |  |       version: '11.0.289', | 
					
						
							|  |  |  |       architecture: 'x86', | 
					
						
							|  |  |  |       packageType: 'jdk', | 
					
						
							|  |  |  |       checkLatest: false | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-03-15 13:39:46 +03:00
										 |  |  |     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([ | 
					
						
							| 
									
										
										
										
											2021-03-24 21:30:05 +03:00
										 |  |  |     [ | 
					
						
							|  |  |  |       { 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' | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2021-03-15 13:39:46 +03:00
										 |  |  |   ])( | 
					
						
							|  |  |  |     `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([ | 
					
						
							| 
									
										
										
										
											2021-03-24 21:30:05 +03:00
										 |  |  |     [{ 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 | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2021-03-15 13:39:46 +03:00
										 |  |  |   ])('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(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |