| 
									
										
										
										
											2020-03-10 11:51:57 -04:00
										 |  |  | import * as io from '@actions/io'; | 
					
						
							|  |  |  | import * as tc from '@actions/tool-cache'; | 
					
						
							|  |  |  | import * as fs from 'fs'; | 
					
						
							|  |  |  | import * as os from 'os'; | 
					
						
							|  |  |  | import * as path from 'path'; | 
					
						
							| 
									
										
										
										
											2019-08-03 21:49:54 -04:00
										 |  |  | import * as installer from '../src/installer'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-10 11:51:57 -04:00
										 |  |  | const isWindows = process.platform === 'win32'; | 
					
						
							|  |  |  | let toolDir: string; | 
					
						
							| 
									
										
										
										
											2019-08-03 21:49:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('installer tests', () => { | 
					
						
							|  |  |  |   beforeAll(async () => { | 
					
						
							| 
									
										
										
										
											2020-03-10 11:51:57 -04:00
										 |  |  |     toolDir = path.join( | 
					
						
							|  |  |  |       __dirname, | 
					
						
							|  |  |  |       'runner', | 
					
						
							|  |  |  |       path.join( | 
					
						
							|  |  |  |         Math.random() | 
					
						
							|  |  |  |           .toString(36) | 
					
						
							|  |  |  |           .substring(7) | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       'tools' | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     const tempDir = path.join( | 
					
						
							|  |  |  |       __dirname, | 
					
						
							|  |  |  |       'runner', | 
					
						
							|  |  |  |       path.join( | 
					
						
							|  |  |  |         Math.random() | 
					
						
							|  |  |  |           .toString(36) | 
					
						
							|  |  |  |           .substring(7) | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       'temp' | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2019-08-03 21:49:54 -04:00
										 |  |  |     await io.rmRF(toolDir); | 
					
						
							|  |  |  |     await io.rmRF(tempDir); | 
					
						
							| 
									
										
										
										
											2020-03-10 11:51:57 -04:00
										 |  |  |     process.env['RUNNER_TOOL_CACHE'] = toolDir; | 
					
						
							|  |  |  |     process.env['RUNNER_TEMP'] = tempDir; | 
					
						
							| 
									
										
										
										
											2019-08-03 21:49:54 -04:00
										 |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('Acquires version of node if no matching version is installed', async () => { | 
					
						
							|  |  |  |     await installer.getNode('10.16.0'); | 
					
						
							|  |  |  |     const nodeDir = path.join(toolDir, 'node', '10.16.0', os.arch()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(fs.existsSync(`${nodeDir}.complete`)).toBe(true); | 
					
						
							| 
									
										
										
										
											2020-03-10 11:51:57 -04:00
										 |  |  |     if (isWindows) { | 
					
						
							| 
									
										
										
										
											2019-08-03 21:49:54 -04:00
										 |  |  |       expect(fs.existsSync(path.join(nodeDir, 'node.exe'))).toBe(true); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       expect(fs.existsSync(path.join(nodeDir, 'bin', 'node'))).toBe(true); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-10 11:51:57 -04:00
										 |  |  |   if (isWindows) { | 
					
						
							| 
									
										
										
										
											2019-08-03 21:49:54 -04:00
										 |  |  |     it('Falls back to backup location if first one doesnt contain correct version', async () => { | 
					
						
							|  |  |  |       await installer.getNode('5.10.1'); | 
					
						
							|  |  |  |       const nodeDir = path.join(toolDir, 'node', '5.10.1', os.arch()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(fs.existsSync(`${nodeDir}.complete`)).toBe(true); | 
					
						
							|  |  |  |       expect(fs.existsSync(path.join(nodeDir, 'node.exe'))).toBe(true); | 
					
						
							|  |  |  |     }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('Falls back to third location if second one doesnt contain correct version', async () => { | 
					
						
							|  |  |  |       await installer.getNode('0.12.18'); | 
					
						
							|  |  |  |       const nodeDir = path.join(toolDir, 'node', '0.12.18', os.arch()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(fs.existsSync(`${nodeDir}.complete`)).toBe(true); | 
					
						
							|  |  |  |       expect(fs.existsSync(path.join(nodeDir, 'node.exe'))).toBe(true); | 
					
						
							|  |  |  |     }, 100000); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('Throws if no location contains correct node version', async () => { | 
					
						
							|  |  |  |     let thrown = false; | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       await installer.getNode('1000'); | 
					
						
							|  |  |  |     } catch { | 
					
						
							|  |  |  |       thrown = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expect(thrown).toBe(true); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('Acquires version of node with long paths', async () => { | 
					
						
							|  |  |  |     const toolpath = await installer.getNode('8.8.1'); | 
					
						
							|  |  |  |     const nodeDir = path.join(toolDir, 'node', '8.8.1', os.arch()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(fs.existsSync(`${nodeDir}.complete`)).toBe(true); | 
					
						
							| 
									
										
										
										
											2020-03-10 11:51:57 -04:00
										 |  |  |     if (isWindows) { | 
					
						
							| 
									
										
										
										
											2019-08-03 21:49:54 -04:00
										 |  |  |       expect(fs.existsSync(path.join(nodeDir, 'node.exe'))).toBe(true); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       expect(fs.existsSync(path.join(nodeDir, 'bin', 'node'))).toBe(true); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('Uses version of node installed in cache', async () => { | 
					
						
							|  |  |  |     const nodeDir: string = path.join(toolDir, 'node', '250.0.0', os.arch()); | 
					
						
							|  |  |  |     await io.mkdirP(nodeDir); | 
					
						
							|  |  |  |     fs.writeFileSync(`${nodeDir}.complete`, 'hello'); | 
					
						
							|  |  |  |     // This will throw if it doesn't find it in the cache (because no such version exists)
 | 
					
						
							|  |  |  |     await installer.getNode('250.0.0'); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('Doesnt use version of node that was only partially installed in cache', async () => { | 
					
						
							|  |  |  |     const nodeDir: string = path.join(toolDir, 'node', '251.0.0', os.arch()); | 
					
						
							|  |  |  |     await io.mkdirP(nodeDir); | 
					
						
							|  |  |  |     let thrown = false; | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       // This will throw if it doesn't find it in the cache (because no such version exists)
 | 
					
						
							|  |  |  |       await installer.getNode('251.0.0'); | 
					
						
							|  |  |  |     } catch { | 
					
						
							|  |  |  |       thrown = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expect(thrown).toBe(true); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('Resolves semantic versions of node installed in cache', async () => { | 
					
						
							|  |  |  |     const nodeDir: string = path.join(toolDir, 'node', '252.0.0', os.arch()); | 
					
						
							|  |  |  |     await io.mkdirP(nodeDir); | 
					
						
							|  |  |  |     fs.writeFileSync(`${nodeDir}.complete`, 'hello'); | 
					
						
							|  |  |  |     // These will throw if it doesn't find it in the cache (because no such version exists)
 | 
					
						
							|  |  |  |     await installer.getNode('252.0.0'); | 
					
						
							|  |  |  |     await installer.getNode('252'); | 
					
						
							|  |  |  |     await installer.getNode('252.0'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |