diff --git a/build/pack.cake b/build/pack.cake index 8ed8bf7d23..b27b8f074e 100644 --- a/build/pack.cake +++ b/build/pack.cake @@ -19,7 +19,14 @@ Task("Build") .IsDependentOn("Clean") .Does((parameters) => { + // build .Net code Build(parameters.Configuration); + + var workDir = "./src/GitVersionVsixTask"; + // build typescript code + NpmSet(new NpmSetSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent, Key = "progress", Value = "false" }); + NpmInstall(new NpmInstallSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent }); + NpmRunScript(new NpmRunScriptSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent, ScriptName = "build" }); }); #endregion @@ -32,6 +39,7 @@ Task("Test") .Does((parameters) => { var frameworks = new[] { parameters.CoreFxVersion, parameters.FullFxVersion }; + var testResultsPath = parameters.Paths.Directories.TestResultsOutput; foreach(var framework in frameworks) { @@ -42,7 +50,6 @@ Task("Test") { actions.Add(() => { - var testResultsPath = parameters.Paths.Directories.TestResultsOutput + "/"; var projectName = $"{project.GetFilenameWithoutExtension()}.{framework}"; var settings = new DotNetCoreTestSettings { Framework = framework, @@ -53,7 +60,8 @@ Task("Test") if (!parameters.IsRunningOnMacOS) { settings.TestAdapterPath = new DirectoryPath("."); - settings.Logger = $"nunit;LogFilePath={MakeAbsolute(new FilePath($"{testResultsPath}{projectName}.results.xml"))}"; + var resultsPath = MakeAbsolute(testResultsPath.CombineWithFilePath($"{projectName}.results.xml")); + settings.Logger = $"nunit;LogFilePath={resultsPath}"; } var coverletSettings = new CoverletSettings { @@ -80,6 +88,12 @@ Task("Test") Parallel.Invoke(options, actions.ToArray()); } + + var workDir = "./src/GitVersionVsixTask"; + var npmSettings = new NpmRunScriptSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent, ScriptName = "test" }; + var vsixResultsPath = MakeAbsolute(testResultsPath.CombineWithFilePath("vsix.results.xml")); + npmSettings.Arguments.Add($"--reporter-options mochaFile={vsixResultsPath}"); + NpmRunScript(npmSettings); }) .ReportError(exception => { @@ -204,9 +218,6 @@ Task("Pack-Vsix") UpdateTaskVersion(new FilePath(workDir + "/GitVersionTask/task.json"), taskId, parameters.Version.GitVersion); // build and pack - NpmSet(new NpmSetSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent, Key = "progress", Value = "false" }); - NpmInstall(new NpmInstallSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent }); - NpmRunScript(new NpmRunScriptSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent, ScriptName = "build" }); var settings = new TfxExtensionCreateSettings { diff --git a/src/GitVersionVsixTask/GitVersion.ts b/src/GitVersionVsixTask/GitVersion.ts index 874e050155..8625410285 100644 --- a/src/GitVersionVsixTask/GitVersion.ts +++ b/src/GitVersionVsixTask/GitVersion.ts @@ -1,7 +1,8 @@ -import tl = require('azure-pipelines-task-lib/task'); -import tr = require('azure-pipelines-task-lib/toolrunner'); -import path = require('path'); -import os = require('os'); +import * as path from 'path'; +import * as os from 'os'; + +import * as tl from 'azure-pipelines-task-lib/task'; +import * as tr from 'azure-pipelines-task-lib/toolrunner'; export class GitVersionTask { execOptions: tr.IExecOptions; @@ -15,13 +16,12 @@ export class GitVersionTask { additionalArguments: string; targetPath: string; sourcesDirectory: string; - currentDirectory: string; - workingDirectory: string; gitVersionPath: string; runtime: string; constructor() { - this.preferBundledVersion = tl.getBoolInput('preferBundledVersion') || true; + + this.targetPath = tl.getInput('targetPath'); this.useConfigFile = tl.getBoolInput('useConfigFile'); this.configFilePath = tl.getInput('configFilePath'); @@ -29,17 +29,13 @@ export class GitVersionTask { this.updateAssemblyInfo = tl.getBoolInput('updateAssemblyInfo'); this.updateAssemblyInfoFilename = tl.getInput('updateAssemblyInfoFilename'); - this.additionalArguments = tl.getInput('additionalArguments'); - this.targetPath = tl.getInput('targetPath'); - this.runtime = tl.getInput('runtime') || "core"; + this.preferBundledVersion = tl.getBoolInput('preferBundledVersion'); + this.runtime = tl.getInput('runtime') || 'core'; this.gitVersionPath = tl.getInput('gitVersionPath'); - this.sourcesDirectory = tl.getVariable("Build.SourcesDirectory"); + this.additionalArguments = tl.getInput('additionalArguments'); - this.currentDirectory = __dirname; - this.workingDirectory = !this.targetPath - ? this.sourcesDirectory - : path.join(this.sourcesDirectory, this.targetPath); + this.sourcesDirectory = tl.getVariable('Build.SourcesDirectory').replace(/\\/g, '/'); this.execOptions = { cwd: undefined, @@ -55,9 +51,10 @@ export class GitVersionTask { public async execute() { try { + let workingDirectory = this.getWorkingDirectory(this.targetPath); let exe = this.getExecutable(); exe.arg([ - this.workingDirectory, + workingDirectory, "/output", "buildserver", "/nofetch"]); @@ -67,7 +64,7 @@ export class GitVersionTask { exe.arg(["/config", this.configFilePath]); } else { - throw 'GitVersion configuration file not found at ' + this.configFilePath; + throw new Error('GitVersion configuration file not found at ' + this.configFilePath); } } @@ -77,7 +74,7 @@ export class GitVersionTask { exe.arg(this.updateAssemblyInfoFilename); } else { - throw 'AssemblyInfoFilename file not found at ' + this.updateAssemblyInfoFilename; + throw new Error('AssemblyInfoFilename file not found at ' + this.updateAssemblyInfoFilename); } } @@ -87,14 +84,14 @@ export class GitVersionTask { const result = await exe.exec(this.execOptions); if (result) { - tl.setResult(tl.TaskResult.Failed, "An error occured during GitVersion execution") + tl.setResult(tl.TaskResult.Failed, "An error occured during GitVersion execution"); } else { - tl.setResult(tl.TaskResult.Succeeded, "GitVersion executed successfully") + tl.setResult(tl.TaskResult.Succeeded, "GitVersion executed successfully"); } } catch (err) { tl.debug(err.stack); - tl.setResult(tl.TaskResult.Failed, err); + tl.setResult(tl.TaskResult.Failed, err, true); } } @@ -124,13 +121,37 @@ export class GitVersionTask { } public getExecutablePath(exeName:string) { - if (this.gitVersionPath){ - return this.gitVersionPath; - } else if (this.preferBundledVersion) { - return path.join(this.currentDirectory, this.runtime, exeName); + let exePath; + if (this.preferBundledVersion) { + let currentDirectory = __dirname; + exePath = path.join(currentDirectory, this.runtime, exeName); + } else { + if (tl.filePathSupplied('gitVersionPath') && tl.exist(this.gitVersionPath) && tl.stats(this.gitVersionPath).isFile()) { + exePath = this.gitVersionPath; + } else{ + throw new Error('GitVersion executable not found at ' + this.gitVersionPath); + } + } + + return exePath.replace(/\\/g, '/'); + } + + public getWorkingDirectory(targetPath: string) { + let workDir; + + if (!targetPath){ + workDir = this.sourcesDirectory; + } else { + if (tl.exist(targetPath) && tl.stats(targetPath).isDirectory()) { + workDir = path.join(this.sourcesDirectory, targetPath); + } + else { + throw new Error('Directory not found at ' + targetPath); + } } + return workDir.replace(/\\/g, '/'); } } -var exe = new GitVersionTask(); -exe.execute().catch((reason) => tl.setResult(tl.TaskResult.Failed, reason)); +var task = new GitVersionTask(); +task.execute().catch((reason) => tl.setResult(tl.TaskResult.Failed, reason)); diff --git a/src/GitVersionVsixTask/GitVersionTask/task.json b/src/GitVersionVsixTask/GitVersionTask/task.json index 1db5d64576..eeff3d6323 100644 --- a/src/GitVersionVsixTask/GitVersionTask/task.json +++ b/src/GitVersionVsixTask/GitVersionTask/task.json @@ -25,78 +25,80 @@ }], "instanceNameFormat": "GitVersion", "inputs": [{ - "name": "runtime", - "type": "radio", - "label": "Runtime", - "defaultValue": "core", - "required": true, - "options": { - "core": "dotnet core", - "full": "dotnet fullframework (or mono)" + "name": "runtime", + "type": "radio", + "label": "Runtime", + "defaultValue": "core", + "required": true, + "options": { + "core": "dotnet core", + "full": "dotnet fullframework (or mono)" + }, + "helpMarkDown": "Specify the runtime used for running the tool" + }, { + "name": "preferBundledVersion", + "type": "boolean", + "label": "Prefer bundled GitVersion", + "defaultValue": "true", + "required": false, + "helpMarkDown": "If checked it will prefer the bundled version over a version found in path" + }, { + "name": "gitVersionPath", + "type": "string", + "label": "Path to GitVersion", + "defaultValue": "", + "required": false, + "helpMarkDown": "Optionally supply the path to GitVersion", + "visibleRule": "preferBundledVersion = true" }, - "helpMarkDown": "Specify the runtime used for running the tool" - }, { - "name": "preferBundledVersion", - "type": "boolean", - "label": "Prefer bundled GitVersion", - "defaultValue": "true", - "required": false, - "helpMarkDown": "If checked it will prefer the bundled version over a version found in path" - }, { - "name": "useConfigFile", - "type": "boolean", - "label": "Specify Configuration file", - "defaultValue": "false", - "required": false, - "helpMarkDown": "Whether to use a custom configuration file" - }, { - "name": "configFilePath", - "type": "filePath", - "label": "Configuration file", - "defaultValue": "", - "required": false, - "helpMarkDown": "Optional path to config file (defaults to GitVersion.yml)", - "visibleRule": "useConfigFile = true" - }, { - "name": "updateAssemblyInfo", - "type": "boolean", - "label": "Update AssemblyInfo files", - "defaultValue": "false", - "required": false, - "helpMarkDown": "Whether to update versions in the AssemblyInfo files" - }, { - "name": "updateAssemblyInfoFilename", - "type": "string", - "label": "Update Assembly File", - "defaultValue": "", - "required": false, - "helpMarkDown": "Update versions in specified file", - "visibleRule": "updateAssemblyInfo = true" - }, { - "name": "gitVersionPath", - "type": "string", - "label": "Path to GitVersion", - "defaultValue": "", - "required": false, - "helpMarkDown": "Optionally supply the path to GitVersion", - "groupName": "gitversionDetails" - }, { - "name": "targetPath", - "type": "string", - "label": "Working directory path", - "defaultValue": "", - "required": false, - "helpMarkDown": "Optionally supply the path to the working directory", - "groupName": "gitversionDetails" - }, { - "name": "additionalArguments", - "type": "string", - "label": "Additional GitVersion arguments", - "defaultValue": "", - "required": false, - "helpMarkDown": "Additional arguments to send to GitVersion", - "groupName": "additional" - }], + { + "name": "useConfigFile", + "type": "boolean", + "label": "Specify Configuration file", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Whether to use a custom configuration file" + }, { + "name": "configFilePath", + "type": "filePath", + "label": "Configuration file", + "defaultValue": "", + "required": false, + "helpMarkDown": "Optional path to config file (defaults to GitVersion.yml)", + "visibleRule": "useConfigFile = true" + }, { + "name": "updateAssemblyInfo", + "type": "boolean", + "label": "Update AssemblyInfo files", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Whether to update versions in the AssemblyInfo files" + }, { + "name": "updateAssemblyInfoFilename", + "type": "string", + "label": "Update Assembly File", + "defaultValue": "", + "required": false, + "helpMarkDown": "Update versions in specified file", + "visibleRule": "updateAssemblyInfo = true" + }, { + "name": "targetPath", + "type": "string", + "label": "Working directory path", + "defaultValue": "", + "required": false, + "helpMarkDown": "Optionally supply the path to the working directory", + "groupName": "gitversionDetails" + }, { + "name": "additionalArguments", + "type": "string", + "label": "Additional GitVersion arguments", + "defaultValue": "", + "required": false, + "helpMarkDown": "Additional arguments to send to GitVersion", + "groupName": "additional" + } + ], "execution": { "Node": { "target": "GitVersion.js", @@ -104,4 +106,4 @@ "workingDirectory": "." } } -} +} \ No newline at end of file diff --git a/src/GitVersionVsixTask/package-lock.json b/src/GitVersionVsixTask/package-lock.json index df52f587a2..a71379e4fd 100644 --- a/src/GitVersionVsixTask/package-lock.json +++ b/src/GitVersionVsixTask/package-lock.json @@ -4,16 +4,16 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", "dev": true }, "@types/node": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz", - "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==", + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", "dev": true }, "@types/q": { @@ -22,12 +22,27 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "app-root-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-1.0.0.tgz", @@ -71,6 +86,15 @@ "readable-stream": "^2.0.0" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -135,6 +159,12 @@ "concat-map": "0.0.1" } }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", @@ -198,6 +228,34 @@ } } }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, "clipboardy": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", @@ -259,6 +317,21 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "colors": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", @@ -343,6 +416,12 @@ "which": "^1.2.9" } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -368,6 +447,15 @@ "meow": "*" } }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -407,6 +495,18 @@ "object-keys": "^1.0.12" } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -456,6 +556,18 @@ "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", "dev": true }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -486,6 +598,15 @@ "locate-path": "^3.0.0" } }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -545,6 +666,12 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -554,12 +681,24 @@ "function-bind": "^1.1.1" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", @@ -618,6 +757,12 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -684,6 +829,16 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "json-in-place": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-in-place/-/json-in-place-1.0.1.tgz", @@ -823,6 +978,15 @@ "integrity": "sha1-egy/ZfQ7WShiWp1NDcVLGMrcfvM=", "dev": true }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -858,6 +1022,25 @@ "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "dev": true, + "requires": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + } + } + }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", @@ -942,11 +1125,161 @@ "minimist": "0.0.8" } }, + "mocha": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", + "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.2.2", + "yargs-parser": "13.0.0", + "yargs-unparser": "1.5.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "mocha-xunit-reporter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mocha-xunit-reporter/-/mocha-xunit-reporter-1.1.0.tgz", + "integrity": "sha512-S1bo2a5SyZ/rDNbsAtEXDw03FA43KDvinqn/VfKMoi/PoijXY3+x+v8Qtfg4yHcgFFLFgR6fmpPJpiD+bGsGLg==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "mockery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -965,6 +1298,16 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -1007,6 +1350,18 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -1443,6 +1798,12 @@ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -1495,6 +1856,21 @@ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", @@ -1615,9 +1991,9 @@ "dev": true }, "typescript": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", - "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", "dev": true }, "underscore": { @@ -1729,6 +2105,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "winreg": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/winreg/-/winreg-0.0.12.tgz", @@ -1823,6 +2208,12 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -1887,6 +2278,17 @@ "decamelize": "^1.2.0" } }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + } + }, "zip-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", diff --git a/src/GitVersionVsixTask/package.json b/src/GitVersionVsixTask/package.json index 469aa93f9c..ff13549a18 100644 --- a/src/GitVersionVsixTask/package.json +++ b/src/GitVersionVsixTask/package.json @@ -5,23 +5,23 @@ "description": "", "main": "index.js", "scripts": { - "build": "npm run build:ts", - "build:ts": "tsc && copy-node-modules . GitVersionTask", - "test": "echo \"Error: no test specified\" && exit 1", + "build": "tsc && tsc --p tests/tsconfig.json && copy-node-modules . GitVersionTask", + "test": "mocha tests/test-suite.js --reporter mocha-xunit-reporter", "package": "tfx extension create --manifest-globs vss-extension.json" }, "author": "", "license": "MIT", "dependencies": { - "q": "1.5.1", "azure-pipelines-task-lib": "2.8.0" }, "devDependencies": { - "@types/minimatch": "3.0.3", - "@types/node": "12.0.10", + "@types/mocha": "^5.2.7", + "@types/node": "12.7.2", "@types/q": "1.5.2", "copy-node-modules": "^1.1.1", + "mocha": "^6.2.0", + "mocha-xunit-reporter": "^1.1.0", "tfx-cli": "0.6.3", - "typescript": "^3.5.2" + "typescript": "^3.5.3" } } diff --git a/src/GitVersionVsixTask/tests/test-setup.ts b/src/GitVersionVsixTask/tests/test-setup.ts new file mode 100644 index 0000000000..fd8887c1dd --- /dev/null +++ b/src/GitVersionVsixTask/tests/test-setup.ts @@ -0,0 +1,103 @@ +import * as path from 'path'; + +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import * as shared from './test-shared'; + +let taskDir = path.join(__dirname, '..', 'GitVersionTask'); +let taskPath = path.join(taskDir, 'GitVersion.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['BUILD_SOURCESDIRECTORY'] = shared.SharedValues.BUILD_SOURCESDIRECTORY; + +let runtime = process.env[shared.TestEnvVars.runtime] || 'core'; + +tmr.setInput('targetPath', process.env[shared.TestEnvVars.targetPath] || ''); + +tmr.setInput('useConfigFile', process.env[shared.TestEnvVars.useConfigFile] || 'false'); +tmr.setInput('configFilePath', process.env[shared.TestEnvVars.configFilePath] || ''); + +tmr.setInput('updateAssemblyInfo', process.env[shared.TestEnvVars.updateAssemblyInfo] || 'false'); +tmr.setInput('updateAssemblyInfoFilename', process.env[shared.TestEnvVars.updateAssemblyInfoFilename] || ''); + +tmr.setInput('preferBundledVersion', process.env[shared.TestEnvVars.preferBundledVersion] || 'true'); +tmr.setInput('gitVersionPath', process.env[shared.TestEnvVars.gitVersionPath] || ''); +tmr.setInput('runtime', runtime); + +tmr.setInput('additionalArguments', process.env[shared.TestEnvVars.additionalArguments] || ''); + +console.log("Inputs have been set"); + +var gitVersionPath = (path.join(taskDir, runtime, runtime == 'core' ? 'GitVersion.dll' : 'GitVersion.exe')).replace(/\\/g, '/'); + +let a: ma.TaskLibAnswers = { + "which": { "dotnet": "dotnet" }, + "checkPath": { "dotnet": true }, + "exec": {}, + "exist": { + "src": true, + "customConfig.yml" : true, + "GlobalAssemblyInfo.cs" : true, + "TestGitversion.dll" : true + }, + "stats": { + "src" : { + "isDirectory" : true + }, + "customConfig.yml" : { + "isFile": true + }, + "GlobalAssemblyInfo.cs" : { + "isFile": true + }, + "TestGitversion.dll" : { + "isFile": true + }, + } +}; + +a.exec["dotnet " + gitVersionPath + " /user/build /output buildserver /nofetch"] = { + "code": 0, + "stdout": "GitVersion run successfully with defaults", + "stderr": "" +}; + +a.exec["dotnet " + gitVersionPath + " " + shared.SharedValues.BUILD_SOURCESDIRECTORY + "/src /output buildserver /nofetch"] = { + "code": 0, + "stdout": "GitVersion run successfully with custom targetPath", + "stderr": "" +}; + +a.exec["dotnet " + gitVersionPath + " " + shared.SharedValues.BUILD_SOURCESDIRECTORY + " /output buildserver /nofetch /config customConfig.yml"] = { + "code": 0, + "stdout": "GitVersion run successfully with custom config", + "stderr": "" +}; + +a.exec["dotnet " + gitVersionPath + " " + shared.SharedValues.BUILD_SOURCESDIRECTORY + " /output buildserver /nofetch /updateassemblyinfo GlobalAssemblyInfo.cs"] = { + "code": 0, + "stdout": "GitVersion run successfully with custom assembly info", + "stderr": "" +}; + +a.exec[gitVersionPath + " " + shared.SharedValues.BUILD_SOURCESDIRECTORY + " /output buildserver /nofetch"] = { + "code": 0, + "stdout": "GitVersion.exe run successfully with defaults", + "stderr": "" +}; + +a.exec["mono " + gitVersionPath + " " + shared.SharedValues.BUILD_SOURCESDIRECTORY + " /output buildserver /nofetch"] = { + "code": 0, + "stdout": "GitVersion.exe run successfully with defaults", + "stderr": "" +}; + +a.exec["dotnet " + "TestGitversion.dll" + " " + shared.SharedValues.BUILD_SOURCESDIRECTORY + " /output buildserver /nofetch"] = { + "code": 0, + "stdout": "GitVersion run successfully with custom exe", + "stderr": "" +}; + +tmr.setAnswers(a); + +tmr.run(); diff --git a/src/GitVersionVsixTask/tests/test-shared.ts b/src/GitVersionVsixTask/tests/test-shared.ts new file mode 100644 index 0000000000..f9ce6878bc --- /dev/null +++ b/src/GitVersionVsixTask/tests/test-shared.ts @@ -0,0 +1,15 @@ +export let TestEnvVars = { + preferBundledVersion: "__preferBundledVersion__", + useConfigFile: "__useConfigFile__", + configFilePath: "__configFilePath__", + updateAssemblyInfo: "__updateAssemblyInfo__", + updateAssemblyInfoFilename: "__updateAssemblyInfoFilename__", + additionalArguments: "__additionalArguments__", + targetPath: "__targetPath__", + runtime: "__runtime__", + gitVersionPath: "__gitVersionPath__", +} + +export let SharedValues = { + BUILD_SOURCESDIRECTORY: "/user/build" +} diff --git a/src/GitVersionVsixTask/tests/test-suite.ts b/src/GitVersionVsixTask/tests/test-suite.ts new file mode 100644 index 0000000000..e5ed1b5d4c --- /dev/null +++ b/src/GitVersionVsixTask/tests/test-suite.ts @@ -0,0 +1,349 @@ +import * as os from 'os'; +import * as path from 'path'; +import * as assert from 'assert'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import * as shared from './test-shared'; + +function runValidations(validator: () => void, tr: ttm.MockTestRunner, done: MochaDone) { + try { + validator(); + console.log(tr.succeeded); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } +} + +let taskDir = path.join(__dirname, '..', 'GitVersionTask').replace(/\\/g, '/'); + +describe('GitVersion Vsix Task tests', function () { + + beforeEach(() => { + delete process.env[shared.TestEnvVars.preferBundledVersion]; + delete process.env[shared.TestEnvVars.useConfigFile]; + delete process.env[shared.TestEnvVars.configFilePath]; + delete process.env[shared.TestEnvVars.updateAssemblyInfo]; + delete process.env[shared.TestEnvVars.updateAssemblyInfoFilename]; + delete process.env[shared.TestEnvVars.additionalArguments]; + delete process.env[shared.TestEnvVars.targetPath]; + delete process.env[shared.TestEnvVars.runtime]; + delete process.env[shared.TestEnvVars.gitVersionPath]; + }); + + after(() => { + + }); + + it('Succeeds: Runs GitVersion default configurations', function (done: MochaDone) { + this.timeout(1000); + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.succeeded, 'should have succeeded'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 0, "should have no errors"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.ran("dotnet " + taskDir + "/core/GitVersion.dll /user/build /output buildserver /nofetch")); + + assert(tr.stdOutContained('GitVersion run successfully with defaults'), "should display 'GitVersion run successfully with defaults'"); + + }, tr, done); + }); + + it('Succeeds: Runs GitVersion default configurations', function (done: MochaDone) { + this.timeout(1000); + process.env[shared.TestEnvVars.runtime] = 'full'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.succeeded, 'should have succeeded'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 0, "should have no errors"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + + var exec = os.platform() != 'win32' ? "mono " : ""; + assert(tr.ran(exec + taskDir + "/full/GitVersion.exe /user/build /output buildserver /nofetch")); + + assert(tr.stdOutContained('GitVersion.exe run successfully with defaults'), "should display 'GitVersion.exe run successfully with defaults'"); + + }, tr, done); + }); + + it('Fails: Runs GitVersion with wrong targetPath', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.targetPath] = 'wrongPath'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.failed, 'should have failed'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 1, "should have thrown an error"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 0, 'should not have invoked tool. actual: ' + tr.invokedToolCount); + + assert(tr.stdOutContained('Directory not found'), "should display 'Directory not found'"); + + }, tr, done); + }); + + it('Succeeds: Runs GitVersion with correct target', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.targetPath] = 'src'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.succeeded, 'should have succeeded'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 0, "should have no errors"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.ran("dotnet " + taskDir + "/core/GitVersion.dll /user/build/src /output buildserver /nofetch")); + + assert(tr.stdOutContained('GitVersion run successfully with custom targetPath'), "should display 'GitVersion run successfully with custom targetPath'"); + + }, tr, done); + }); + + it('Fails: Runs GitVersion with no configuration file specified', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.useConfigFile] = 'true'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert.equal(tr.succeeded, false, 'should have failed'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 1, "should have thrown an error"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 0, 'should not have invoked tool. actual: ' + tr.invokedToolCount); + + assert(tr.stdOutContained('GitVersion configuration file not found'), "should display 'GitVersion configuration file not found'"); + + }, tr, done); + }); + + it('Fails: Runs GitVersion with wrong configuration file specified', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.useConfigFile] = 'true'; + process.env[shared.TestEnvVars.configFilePath] = 'wronfConfig.yml'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.failed, 'should have failed'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 1, "should have thrown an error"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 0, 'should not have invoked tool. actual: ' + tr.invokedToolCount); + + assert(tr.stdOutContained('GitVersion configuration file not found'), "should display 'GitVersion configuration file not found'"); + + }, tr, done); + }); + + it('Succeeds: Runs GitVersion with correct custom configuration file specified', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.useConfigFile] = 'true'; + process.env[shared.TestEnvVars.configFilePath] = 'customConfig.yml'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.succeeded, 'should have succeeded'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 0, "should have no error"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.ran("dotnet " + taskDir + "/core/GitVersion.dll /user/build /output buildserver /nofetch /config customConfig.yml")); + + assert(tr.stdOutContained('GitVersion run successfully with custom config'), "should display 'GitVersion run successfully with custom config'"); + + }, tr, done); + }); + + it('Fails: Runs GitVersion with no assembly info file specified', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.updateAssemblyInfo] = 'true'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.failed, 'should have failed'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 1, "should have thrown an error"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 0, 'should not have invoked tool. actual: ' + tr.invokedToolCount); + + assert(tr.stdOutContained('AssemblyInfoFilename file not found'), "should display 'AssemblyInfoFilename file not found'"); + + }, tr, done); + }); + + it('Fails: Runs GitVersion with wrong assembly info file specified', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.updateAssemblyInfo] = 'true'; + process.env[shared.TestEnvVars.updateAssemblyInfoFilename] = 'wrongAssemblyInfo.cs'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.failed, 'should have failed'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 1, "should have thrown an error"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 0, 'should not have invoked tool. actual: ' + tr.invokedToolCount); + + assert(tr.stdOutContained('AssemblyInfoFilename file not found'), "should display 'AssemblyInfoFilename file not found'"); + + }, tr, done); + }); + + it('Succeeds: Runs GitVersion with correct custom assembly info file specified', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.updateAssemblyInfo] = 'true'; + process.env[shared.TestEnvVars.updateAssemblyInfoFilename] = 'GlobalAssemblyInfo.cs'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.succeeded, 'should have succeeded'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 0, "should have no errors"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.ran("dotnet " + taskDir + "/core/GitVersion.dll /user/build /output buildserver /nofetch /updateassemblyinfo GlobalAssemblyInfo.cs")); + + assert(tr.stdOutContained('GitVersion run successfully with custom assembly info'), "should display 'GitVersion run successfully with custom assembly info'"); + + }, tr, done); + }); + + it('Fails: Runs GitVersion with no custom executable', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.preferBundledVersion] = 'false'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.failed, 'should have failed'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 1, "should have thrown an error"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 0, 'should not have invoked tool. actual: ' + tr.invokedToolCount); + + assert(tr.stdOutContained('GitVersion executable not found'), "should display 'GitVersion executable not found'"); + + }, tr, done); + }); + + it('Fails: Runs GitVersion with wrong custom executable', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.preferBundledVersion] = 'false'; + process.env[shared.TestEnvVars.gitVersionPath] = 'wrongGitversion.dll'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.failed, 'should have failed'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 1, "should have thrown an error"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 0, 'should not have invoked tool. actual: ' + tr.invokedToolCount); + + assert(tr.stdOutContained('GitVersion executable not found'), "should display 'GitVersion executable not found'"); + + }, tr, done); + }); + + it('Succeeds: Runs GitVersion with correct custom executable', function (done: MochaDone) { + this.timeout(1000); + + process.env[shared.TestEnvVars.preferBundledVersion] = 'false'; + process.env[shared.TestEnvVars.gitVersionPath] = 'TestGitversion.dll'; + + let tp = path.join(__dirname, 'test-setup.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + + assert(tr.succeeded, 'should have succeeded'); + assert(tr.warningIssues.length == 0, "should have no warnings"); + assert(tr.errorIssues.length == 0, "should have no errors"); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.ran("dotnet TestGitversion.dll /user/build /output buildserver /nofetch")); + + assert(tr.stdOutContained('GitVersion run successfully with custom exe'), "should display 'GitVersion run successfully with custom exe'"); + }, tr, done); + }); + +}); diff --git a/src/GitVersionVsixTask/tests/tsconfig.json b/src/GitVersionVsixTask/tests/tsconfig.json new file mode 100644 index 0000000000..6f2d9f401d --- /dev/null +++ b/src/GitVersionVsixTask/tests/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "target": "es6", + "sourceMap": false, + "inlineSourceMap": true, + "declaration": false + } +} diff --git a/src/GitVersionVsixTask/tsconfig.json b/src/GitVersionVsixTask/tsconfig.json index 6ea2b4a34a..98f991b9ea 100644 --- a/src/GitVersionVsixTask/tsconfig.json +++ b/src/GitVersionVsixTask/tsconfig.json @@ -8,7 +8,8 @@ "target": "es6", "sourceMap": false, "inlineSourceMap": true, - "declaration": false, + "declaration": true, "outDir": "GitVersionTask" - } + }, + "exclude": ["tests", "GitVersionTask"] }