2022-09-27 20:47:12 +08:00
import * as io from '@actions/io' ;
import * as os from 'os' ;
import fs from 'fs' ;
import path from 'path' ;
import each from 'jest-each' ;
import * as hc from '@actions/http-client' ;
import * as installer from '../src/installer' ;
import { QualityOptions } from '../src/setup-dotnet' ;
import { IS_WINDOWS } from '../src/utils' ;
import { IS_LINUX } from '../src/utils' ;
2019-06-20 04:22:22 +08:00
2022-09-27 20:47:12 +08:00
let toolDir : string ;
if ( IS_WINDOWS ) {
toolDir = path . join ( process . env [ 'PROGRAMFILES' ] + '' , 'dotnet' ) ;
} else if ( IS_LINUX ) {
toolDir = '/usr/share/dotnet' ;
} else {
toolDir = path . join ( process . env [ 'HOME' ] + '' , '.dotnet' ) ;
}
2019-06-20 04:22:22 +08:00
const tempDir = path . join ( __dirname , 'runner' , 'temp' ) ;
2019-07-31 00:53:06 +08:00
process . env [ 'RUNNER_TOOL_CACHE' ] = toolDir ;
process . env [ 'RUNNER_TEMP' ] = tempDir ;
2019-06-21 20:21:08 +08:00
2022-09-27 20:47:12 +08:00
describe ( 'DotnetCoreInstaller tests' , ( ) = > {
2019-06-20 04:22:22 +08:00
beforeAll ( async ( ) = > {
2020-09-16 00:36:09 +08:00
process . env . RUNNER_TOOL_CACHE = toolDir ;
process . env . DOTNET_INSTALL_DIR = toolDir ;
process . env . RUNNER_TEMP = tempDir ;
2020-09-24 23:26:00 +08:00
process . env . DOTNET_ROOT = '' ;
2022-09-27 20:47:12 +08:00
try {
await io . rmRF ( ` ${ toolDir } /* ` ) ;
await io . rmRF ( ` ${ tempDir } /* ` ) ;
} catch ( err ) {
console . log (
` Failed to remove test directories, check the error message: ${ os . EOL } ` ,
err . message
) ;
}
} , 30000 ) ;
2019-06-20 04:22:22 +08:00
2022-09-27 20:47:12 +08:00
afterEach ( async ( ) = > {
2019-06-21 20:21:08 +08:00
try {
2022-09-27 20:47:12 +08:00
await io . rmRF ( ` ${ toolDir } /* ` ) ;
await io . rmRF ( ` ${ tempDir } /* ` ) ;
} catch ( err ) {
console . log (
` Failed to remove test directories, check the error message: ${ os . EOL } ` ,
err . message
) ;
2019-06-21 20:21:08 +08:00
}
2020-09-16 00:36:09 +08:00
} , 30000 ) ;
2019-06-21 20:21:08 +08:00
2023-05-05 16:43:09 +08:00
// it('Aquires multiple versions of dotnet', async () => {
// const versions = ['2.2.207', '3.1.120'];
// for (const version of versions) {
// await getDotnet(version);
// }
// expect(fs.existsSync(path.join(toolDir, 'sdk', '2.2.207'))).toBe(true);
// expect(fs.existsSync(path.join(toolDir, 'sdk', '3.1.120'))).toBe(true);
// if (IS_WINDOWS) {
// expect(fs.existsSync(path.join(toolDir, 'dotnet.exe'))).toBe(true);
// } else {
// expect(fs.existsSync(path.join(toolDir, 'dotnet'))).toBe(true);
// }
// expect(process.env.DOTNET_ROOT).toBeDefined();
// expect(process.env.PATH).toBeDefined();
// expect(process.env.DOTNET_ROOT).toBe(toolDir);
// expect(process.env.PATH?.startsWith(toolDir)).toBe(true);
// }, 600000);
// it('Acquires version of dotnet if no matching version is installed', async () => {
// await getDotnet('3.1.201');
// expect(fs.existsSync(path.join(toolDir, 'sdk', '3.1.201'))).toBe(true);
// if (IS_WINDOWS) {
// expect(fs.existsSync(path.join(toolDir, 'dotnet.exe'))).toBe(true);
// } else {
// expect(fs.existsSync(path.join(toolDir, 'dotnet'))).toBe(true);
// }
// expect(process.env.DOTNET_ROOT).toBeDefined();
// expect(process.env.PATH).toBeDefined();
// expect(process.env.DOTNET_ROOT).toBe(toolDir);
// expect(process.env.PATH?.startsWith(toolDir)).toBe(true);
// }, 600000); //This needs some time to download on "slower" internet connections
// it('Acquires generic version of dotnet if no matching version is installed', async () => {
// await getDotnet('3.1');
// const directory = fs
// .readdirSync(path.join(toolDir, 'sdk'))
// .filter(fn => fn.startsWith('3.1.'));
// expect(directory.length > 0).toBe(true);
// if (IS_WINDOWS) {
// expect(fs.existsSync(path.join(toolDir, 'dotnet.exe'))).toBe(true);
// } else {
// expect(fs.existsSync(path.join(toolDir, 'dotnet'))).toBe(true);
// }
// expect(process.env.DOTNET_ROOT).toBeDefined();
// expect(process.env.PATH).toBeDefined();
// expect(process.env.DOTNET_ROOT).toBe(toolDir);
// expect(process.env.PATH?.startsWith(toolDir)).toBe(true);
// }, 600000); //This needs some time to download on "slower" internet connections
2019-08-13 00:14:43 +08:00
2022-09-29 23:45:25 +08:00
it ( 'Returns string with installed SDK version' , async ( ) = > {
2023-05-05 16:43:09 +08:00
const version = '6.0.1xx' ;
2022-09-29 23:45:25 +08:00
2023-03-09 20:43:05 +08:00
const installedVersion = await getDotnet ( version ) ;
2022-09-29 23:45:25 +08:00
expect ( installedVersion ) . toBe ( '3.1.120' ) ;
} , 600000 ) ;
2019-06-20 04:22:22 +08:00
} ) ;
2019-06-21 20:21:08 +08:00
2023-05-05 16:43:09 +08:00
// describe('DotnetVersionResolver tests', () => {
// each([
// '3.1',
// '3.x',
// '3.1.x',
// '3.1.*',
// '3.1.X',
// '3.1.2',
// '3.1.0-preview1'
// ]).test(
// "if valid version: '%s' is supplied, it should return version object with some value",
// async version => {
// const dotnetVersionResolver = new installer.DotnetVersionResolver(
// version
// );
// const versionObject = await dotnetVersionResolver.createDotNetVersion();
// expect(!!versionObject.value).toBe(true);
// }
// );
// each([
// '.',
// '..',
// ' . ',
// '. ',
// ' .',
// ' . . ',
// ' .. ',
// ' . ',
// '-1.-1',
// '-1',
// '-1.-1.-1',
// '..3',
// '1..3',
// '1..',
// '.2.3',
// '.2.x',
// '*.',
// '1.2.',
// '1.2.-abc',
// 'a.b',
// 'a.b.c',
// 'a.b.c-preview',
// ' 0 . 1 . 2 ',
// 'invalid'
// ]).test(
// "if invalid version: '%s' is supplied, it should throw",
// async version => {
// const dotnetVersionResolver = new installer.DotnetVersionResolver(
// version
// );
// await expect(
// async () => await dotnetVersionResolver.createDotNetVersion()
// ).rejects.toThrow();
// }
// );
// each(['3.1', '3.1.x', '3.1.*', '3.1.X', '5.0.1xx']).test(
// "if version: '%s' that can be resolved to 'channel' option is supplied, it should set type to 'channel' in version object",
// async version => {
// const dotnetVersionResolver = new installer.DotnetVersionResolver(
// version
// );
// const versionObject = await dotnetVersionResolver.createDotNetVersion();
// expect(versionObject.type.toLowerCase().includes('channel')).toBe(true);
// }
// );
// each(['6.0', '6.0.x', '6.0.*', '6.0.X', '6.0.1xx']).test(
// "if version: '%s' that can be resolved to 'channel' option is supplied and its major tag is >= 6, it should set type to 'channel' and qualityFlag to 'true' in version object",
// async version => {
// const dotnetVersionResolver = new installer.DotnetVersionResolver(
// version
// );
// const versionObject = await dotnetVersionResolver.createDotNetVersion();
// expect(versionObject.type.toLowerCase().includes('channel')).toBe(true);
// expect(versionObject.qualityFlag).toBe(true);
// }
// );
// each(['3.1.2', '3.1.0-preview1']).test(
// "if version: '%s' that can be resolved to 'version' option is supplied, it should set quality flag to 'false' and type to 'version' in version object",
// async version => {
// const dotnetVersionResolver = new installer.DotnetVersionResolver(
// version
// );
// const versionObject = await dotnetVersionResolver.createDotNetVersion();
// expect(versionObject.type.toLowerCase().includes('version')).toBe(true);
// expect(versionObject.qualityFlag).toBe(false);
// }
// );
// each(['3.1.2', '3.1']).test(
// 'it should create proper line arguments for powershell/bash installation scripts',
// async version => {
// const dotnetVersionResolver = new installer.DotnetVersionResolver(
// version
// );
// const versionObject = await dotnetVersionResolver.createDotNetVersion();
// const windowsRegEx = new RegExp(/^-[VC]/);
// const nonWindowsRegEx = new RegExp(/^--[vc]/);
// if (IS_WINDOWS) {
// expect(windowsRegEx.test(versionObject.type)).toBe(true);
// expect(nonWindowsRegEx.test(versionObject.type)).toBe(false);
// } else {
// expect(nonWindowsRegEx.test(versionObject.type)).toBe(true);
// expect(windowsRegEx.test(versionObject.type)).toBe(false);
// }
// }
// );
// it('Should throw if supplied dotnet version is in A.B.Cxx syntax and the major tag is lower than 5', async () => {
// const version = '3.1.1xx';
// const dotnetVersionResolver = new installer.DotnetVersionResolver(version);
// await expect(dotnetVersionResolver.createDotNetVersion()).rejects.toThrow(
// `'dotnet-version' was supplied in invalid format: ${version}! The A.B.Cxx syntax is available since the .NET 5.0 release.`
// );
// }, 600000);
// it('Should resolve version supplied as * to channel type and set value to LTS', async () => {
// const version = '*';
// const dotnetVersionResolver = new installer.DotnetVersionResolver(version);
// const versionObject = await dotnetVersionResolver.createDotNetVersion();
// expect(versionObject.type.toLowerCase().includes('channel')).toBe(true);
// expect(versionObject.value).toBe('LTS');
// }, 600000);
// });
2022-09-27 20:47:12 +08:00
2019-06-21 20:21:08 +08:00
function normalizeFileContents ( contents : string ) : string {
return contents
. trim ( )
. replace ( new RegExp ( '\r\n' , 'g' ) , '\n' )
. replace ( new RegExp ( '\r' , 'g' ) , '\n' ) ;
}
2023-03-09 20:43:05 +08:00
async function getDotnet ( version : string , quality = '' ) : Promise < string > {
2022-09-27 20:47:12 +08:00
const dotnetInstaller = new installer . DotnetCoreInstaller (
version ,
quality as QualityOptions
) ;
2022-09-29 23:45:25 +08:00
const installedVersion = await dotnetInstaller . installDotnet ( ) ;
2021-11-23 18:03:56 +08:00
installer . DotnetCoreInstaller . addToPath ( ) ;
2022-09-29 23:45:25 +08:00
return installedVersion ;
2019-06-21 20:21:08 +08:00
}