| 
									
										
										
										
											2022-01-16 17:33:29 +01:00
										 |  |  | import * as fs from 'fs'; | 
					
						
							|  |  |  | import os from 'os'; | 
					
						
							|  |  |  | import * as path from 'path'; | 
					
						
							|  |  |  | import * as core from '@actions/core'; | 
					
						
							|  |  |  | import * as io from '@actions/io'; | 
					
						
							|  |  |  | import * as toolchains from '../src/toolchains'; | 
					
						
							| 
									
										
										
										
											2023-03-09 14:49:35 +02:00
										 |  |  | import {M2_DIR, MVN_TOOLCHAINS_FILE} from '../src/constants'; | 
					
						
							| 
									
										
										
										
											2022-01-16 17:33:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | const m2Dir = path.join(__dirname, M2_DIR); | 
					
						
							|  |  |  | const toolchainsFile = path.join(m2Dir, MVN_TOOLCHAINS_FILE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('toolchains tests', () => { | 
					
						
							|  |  |  |   let spyOSHomedir: jest.SpyInstance; | 
					
						
							|  |  |  |   let spyInfo: jest.SpyInstance; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeEach(async () => { | 
					
						
							|  |  |  |     await io.rmRF(m2Dir); | 
					
						
							|  |  |  |     spyOSHomedir = jest.spyOn(os, 'homedir'); | 
					
						
							|  |  |  |     spyOSHomedir.mockReturnValue(__dirname); | 
					
						
							|  |  |  |     spyInfo = jest.spyOn(core, 'info'); | 
					
						
							|  |  |  |     spyInfo.mockImplementation(() => null); | 
					
						
							|  |  |  |   }, 300000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   afterAll(async () => { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       await io.rmRF(m2Dir); | 
					
						
							|  |  |  |     } catch { | 
					
						
							|  |  |  |       console.log('Failed to remove test directories'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     jest.resetAllMocks(); | 
					
						
							|  |  |  |     jest.clearAllMocks(); | 
					
						
							|  |  |  |     jest.restoreAllMocks(); | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('creates toolchains.xml in alternate locations', async () => { | 
					
						
							|  |  |  |     const jdkInfo = { | 
					
						
							|  |  |  |       version: '17', | 
					
						
							|  |  |  |       vendor: 'Eclipse Temurin', | 
					
						
							|  |  |  |       id: 'temurin_17', | 
					
						
							|  |  |  |       jdkHome: '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64' | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const altHome = path.join(__dirname, 'runner', 'toolchains'); | 
					
						
							|  |  |  |     const altToolchainsFile = path.join(altHome, MVN_TOOLCHAINS_FILE); | 
					
						
							|  |  |  |     await io.rmRF(altHome); // ensure it doesn't already exist
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await toolchains.createToolchainsSettings({ | 
					
						
							|  |  |  |       jdkInfo, | 
					
						
							|  |  |  |       settingsDirectory: altHome, | 
					
						
							|  |  |  |       overwriteSettings: true | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(fs.existsSync(m2Dir)).toBe(false); | 
					
						
							|  |  |  |     expect(fs.existsSync(toolchainsFile)).toBe(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(fs.existsSync(altHome)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.existsSync(altToolchainsFile)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.readFileSync(altToolchainsFile, 'utf-8')).toEqual( | 
					
						
							|  |  |  |       toolchains.generateToolchainDefinition( | 
					
						
							|  |  |  |         '', | 
					
						
							|  |  |  |         jdkInfo.version, | 
					
						
							|  |  |  |         jdkInfo.vendor, | 
					
						
							|  |  |  |         jdkInfo.id, | 
					
						
							|  |  |  |         jdkInfo.jdkHome | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await io.rmRF(altHome); | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('creates toolchains.xml with minimal configuration', async () => { | 
					
						
							|  |  |  |     const jdkInfo = { | 
					
						
							|  |  |  |       version: '17', | 
					
						
							|  |  |  |       vendor: 'Eclipse Temurin', | 
					
						
							|  |  |  |       id: 'temurin_17', | 
					
						
							|  |  |  |       jdkHome: '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64' | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const result = `<?xml version="1.0"?>
 | 
					
						
							|  |  |  | <toolchains xmlns="https://maven.apache.org/TOOLCHAINS/1.1.0" | 
					
						
							|  |  |  |   xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" | 
					
						
							|  |  |  |   xsi:schemaLocation="https://maven.apache.org/TOOLCHAINS/1.1.0 https://maven.apache.org/xsd/toolchains-1.1.0.xsd"> | 
					
						
							|  |  |  |   <toolchain> | 
					
						
							|  |  |  |     <type>jdk</type> | 
					
						
							|  |  |  |     <provides> | 
					
						
							|  |  |  |       <version>17</version> | 
					
						
							|  |  |  |       <vendor>Eclipse Temurin</vendor> | 
					
						
							|  |  |  |       <id>temurin_17</id> | 
					
						
							|  |  |  |     </provides> | 
					
						
							|  |  |  |     <configuration> | 
					
						
							|  |  |  |       <jdkHome>/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64</jdkHome> | 
					
						
							|  |  |  |     </configuration> | 
					
						
							|  |  |  |   </toolchain> | 
					
						
							|  |  |  | </toolchains>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await toolchains.createToolchainsSettings({ | 
					
						
							|  |  |  |       jdkInfo, | 
					
						
							|  |  |  |       settingsDirectory: m2Dir, | 
					
						
							|  |  |  |       overwriteSettings: true | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(fs.existsSync(m2Dir)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.existsSync(toolchainsFile)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.readFileSync(toolchainsFile, 'utf-8')).toEqual( | 
					
						
							|  |  |  |       toolchains.generateToolchainDefinition( | 
					
						
							|  |  |  |         '', | 
					
						
							|  |  |  |         jdkInfo.version, | 
					
						
							|  |  |  |         jdkInfo.vendor, | 
					
						
							|  |  |  |         jdkInfo.id, | 
					
						
							|  |  |  |         jdkInfo.jdkHome | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     expect( | 
					
						
							|  |  |  |       toolchains.generateToolchainDefinition( | 
					
						
							|  |  |  |         '', | 
					
						
							|  |  |  |         jdkInfo.version, | 
					
						
							|  |  |  |         jdkInfo.vendor, | 
					
						
							|  |  |  |         jdkInfo.id, | 
					
						
							|  |  |  |         jdkInfo.jdkHome | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ).toEqual(result); | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('reuses existing toolchains.xml files', async () => { | 
					
						
							|  |  |  |     const jdkInfo = { | 
					
						
							|  |  |  |       version: '17', | 
					
						
							|  |  |  |       vendor: 'Eclipse Temurin', | 
					
						
							|  |  |  |       id: 'temurin_17', | 
					
						
							|  |  |  |       jdkHome: '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64' | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const originalFile = `<toolchains>
 | 
					
						
							|  |  |  |         <toolchain> | 
					
						
							|  |  |  |             <type>jdk</type> | 
					
						
							|  |  |  |         <provides> | 
					
						
							|  |  |  |         <version>1.6</version> | 
					
						
							|  |  |  |         <vendor>Sun</vendor> | 
					
						
							|  |  |  |         <id>sun_1.6</id> | 
					
						
							|  |  |  |         </provides> | 
					
						
							|  |  |  |         <configuration> | 
					
						
							|  |  |  |         <jdkHome>/opt/jdk/sun/1.6</jdkHome> | 
					
						
							|  |  |  |         </configuration> | 
					
						
							|  |  |  |         </toolchain> | 
					
						
							|  |  |  |       </toolchains>`;
 | 
					
						
							|  |  |  |     const result = `<?xml version="1.0"?>
 | 
					
						
							|  |  |  | <toolchains> | 
					
						
							|  |  |  |   <toolchain> | 
					
						
							|  |  |  |     <type>jdk</type> | 
					
						
							|  |  |  |     <provides> | 
					
						
							|  |  |  |       <version>1.6</version> | 
					
						
							|  |  |  |       <vendor>Sun</vendor> | 
					
						
							|  |  |  |       <id>sun_1.6</id> | 
					
						
							|  |  |  |     </provides> | 
					
						
							|  |  |  |     <configuration> | 
					
						
							|  |  |  |       <jdkHome>/opt/jdk/sun/1.6</jdkHome> | 
					
						
							|  |  |  |     </configuration> | 
					
						
							|  |  |  |   </toolchain> | 
					
						
							|  |  |  |   <toolchain> | 
					
						
							|  |  |  |     <type>jdk</type> | 
					
						
							|  |  |  |     <provides> | 
					
						
							|  |  |  |       <version>17</version> | 
					
						
							|  |  |  |       <vendor>Eclipse Temurin</vendor> | 
					
						
							|  |  |  |       <id>temurin_17</id> | 
					
						
							|  |  |  |     </provides> | 
					
						
							|  |  |  |     <configuration> | 
					
						
							|  |  |  |       <jdkHome>/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64</jdkHome> | 
					
						
							|  |  |  |     </configuration> | 
					
						
							|  |  |  |   </toolchain> | 
					
						
							|  |  |  | </toolchains>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-09 14:49:35 +02:00
										 |  |  |     fs.mkdirSync(m2Dir, {recursive: true}); | 
					
						
							| 
									
										
										
										
											2022-01-16 17:33:29 +01:00
										 |  |  |     fs.writeFileSync(toolchainsFile, originalFile); | 
					
						
							|  |  |  |     expect(fs.existsSync(m2Dir)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.existsSync(toolchainsFile)).toBe(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await toolchains.createToolchainsSettings({ | 
					
						
							|  |  |  |       jdkInfo, | 
					
						
							|  |  |  |       settingsDirectory: m2Dir, | 
					
						
							|  |  |  |       overwriteSettings: true | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(fs.existsSync(m2Dir)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.existsSync(toolchainsFile)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.readFileSync(toolchainsFile, 'utf-8')).toEqual( | 
					
						
							|  |  |  |       toolchains.generateToolchainDefinition( | 
					
						
							|  |  |  |         originalFile, | 
					
						
							|  |  |  |         jdkInfo.version, | 
					
						
							|  |  |  |         jdkInfo.vendor, | 
					
						
							|  |  |  |         jdkInfo.id, | 
					
						
							|  |  |  |         jdkInfo.jdkHome | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     expect( | 
					
						
							|  |  |  |       toolchains.generateToolchainDefinition( | 
					
						
							|  |  |  |         originalFile, | 
					
						
							|  |  |  |         jdkInfo.version, | 
					
						
							|  |  |  |         jdkInfo.vendor, | 
					
						
							|  |  |  |         jdkInfo.id, | 
					
						
							|  |  |  |         jdkInfo.jdkHome | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ).toEqual(result); | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('does not overwrite existing toolchains.xml files', async () => { | 
					
						
							|  |  |  |     const jdkInfo = { | 
					
						
							|  |  |  |       version: '17', | 
					
						
							|  |  |  |       vendor: 'Eclipse Temurin', | 
					
						
							|  |  |  |       id: 'temurin_17', | 
					
						
							|  |  |  |       jdkHome: '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64' | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const originalFile = `<toolchains>
 | 
					
						
							|  |  |  |         <toolchain> | 
					
						
							|  |  |  |             <type>jdk</type> | 
					
						
							|  |  |  |         <provides> | 
					
						
							|  |  |  |         <version>1.6</version> | 
					
						
							|  |  |  |         <vendor>Sun</vendor> | 
					
						
							|  |  |  |         <id>sun_1.6</id> | 
					
						
							|  |  |  |         </provides> | 
					
						
							|  |  |  |         <configuration> | 
					
						
							|  |  |  |         <jdkHome>/opt/jdk/sun/1.6</jdkHome> | 
					
						
							|  |  |  |         </configuration> | 
					
						
							|  |  |  |         </toolchain> | 
					
						
							|  |  |  |       </toolchains>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-09 14:49:35 +02:00
										 |  |  |     fs.mkdirSync(m2Dir, {recursive: true}); | 
					
						
							| 
									
										
										
										
											2022-01-16 17:33:29 +01:00
										 |  |  |     fs.writeFileSync(toolchainsFile, originalFile); | 
					
						
							|  |  |  |     expect(fs.existsSync(m2Dir)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.existsSync(toolchainsFile)).toBe(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await toolchains.createToolchainsSettings({ | 
					
						
							|  |  |  |       jdkInfo, | 
					
						
							|  |  |  |       settingsDirectory: m2Dir, | 
					
						
							|  |  |  |       overwriteSettings: false | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(fs.existsSync(m2Dir)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.existsSync(toolchainsFile)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.readFileSync(toolchainsFile, 'utf-8')).toEqual(originalFile); | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('generates valid toolchains.xml with minimal configuration', () => { | 
					
						
							|  |  |  |     const jdkInfo = { | 
					
						
							|  |  |  |       version: 'JAVA_VERSION', | 
					
						
							|  |  |  |       vendor: 'JAVA_VENDOR', | 
					
						
							|  |  |  |       id: 'VENDOR_VERSION', | 
					
						
							|  |  |  |       jdkHome: 'JAVA_HOME' | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const expectedToolchains = `<?xml version="1.0"?>
 | 
					
						
							|  |  |  | <toolchains xmlns="https://maven.apache.org/TOOLCHAINS/1.1.0" | 
					
						
							|  |  |  |   xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" | 
					
						
							|  |  |  |   xsi:schemaLocation="https://maven.apache.org/TOOLCHAINS/1.1.0 https://maven.apache.org/xsd/toolchains-1.1.0.xsd"> | 
					
						
							|  |  |  |   <toolchain> | 
					
						
							|  |  |  |     <type>jdk</type> | 
					
						
							|  |  |  |     <provides> | 
					
						
							|  |  |  |       <version>${jdkInfo.version}</version> | 
					
						
							|  |  |  |       <vendor>${jdkInfo.vendor}</vendor> | 
					
						
							|  |  |  |       <id>${jdkInfo.id}</id> | 
					
						
							|  |  |  |     </provides> | 
					
						
							|  |  |  |     <configuration> | 
					
						
							|  |  |  |       <jdkHome>${jdkInfo.jdkHome}</jdkHome> | 
					
						
							|  |  |  |     </configuration> | 
					
						
							|  |  |  |   </toolchain> | 
					
						
							|  |  |  | </toolchains>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect( | 
					
						
							|  |  |  |       toolchains.generateToolchainDefinition( | 
					
						
							|  |  |  |         '', | 
					
						
							|  |  |  |         jdkInfo.version, | 
					
						
							|  |  |  |         jdkInfo.vendor, | 
					
						
							|  |  |  |         jdkInfo.id, | 
					
						
							|  |  |  |         jdkInfo.jdkHome | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ).toEqual(expectedToolchains); | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('creates toolchains.xml with correct id when none is supplied', async () => { | 
					
						
							|  |  |  |     const version = '17'; | 
					
						
							|  |  |  |     const distributionName = 'temurin'; | 
					
						
							|  |  |  |     const id = 'temurin_17'; | 
					
						
							| 
									
										
										
										
											2023-03-09 14:49:35 +02:00
										 |  |  |     const jdkHome = | 
					
						
							|  |  |  |       '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64'; | 
					
						
							| 
									
										
										
										
											2022-01-16 17:33:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-09 14:49:35 +02:00
										 |  |  |     await toolchains.configureToolchains( | 
					
						
							|  |  |  |       version, | 
					
						
							|  |  |  |       distributionName, | 
					
						
							|  |  |  |       jdkHome, | 
					
						
							|  |  |  |       undefined | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-01-16 17:33:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     expect(fs.existsSync(m2Dir)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.existsSync(toolchainsFile)).toBe(true); | 
					
						
							|  |  |  |     expect(fs.readFileSync(toolchainsFile, 'utf-8')).toEqual( | 
					
						
							| 
									
										
										
										
											2023-03-09 14:49:35 +02:00
										 |  |  |       toolchains.generateToolchainDefinition( | 
					
						
							|  |  |  |         '', | 
					
						
							|  |  |  |         version, | 
					
						
							|  |  |  |         distributionName, | 
					
						
							|  |  |  |         id, | 
					
						
							|  |  |  |         jdkHome | 
					
						
							|  |  |  |       ) | 
					
						
							| 
									
										
										
										
											2022-01-16 17:33:29 +01:00
										 |  |  |     ); | 
					
						
							|  |  |  |   }, 100000); | 
					
						
							|  |  |  | }); |