diff --git a/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/Tests/package-lock.json
new file mode 100644
index 000000000000..d230de9c1529
--- /dev/null
+++ b/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/Tests/package-lock.json
@@ -0,0 +1,14 @@
+{
+ "name": "vstestplatform-tool-installer",
+ "version": "1.0.4",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@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
+ }
+ }
+}
diff --git a/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/Tests/package.json b/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/Tests/package.json
new file mode 100644
index 000000000000..af3e777b22d6
--- /dev/null
+++ b/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/Tests/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "vstestplatform-tool-installer",
+ "version": "1.0.4",
+ "description": "Visual Studio Test Platform Installer",
+ "main": "vstestplatformtoolInstaller.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git"
+ },
+ "keywords": [
+ "Azure",
+ "Pipelines",
+ "Tasks",
+ "VsTestplatform",
+ "VsTest"
+ ],
+ "author": "Microsoft Corporation",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues"
+ },
+ "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme",
+ "devDependencies": {
+ "@types/mocha": "^5.2.7"
+ }
+}
diff --git a/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/package-lock.json b/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/package-lock.json
new file mode 100644
index 000000000000..ae62fc2698f3
--- /dev/null
+++ b/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/package-lock.json
@@ -0,0 +1,557 @@
+{
+ "name": "vstestplatform-tool-installer",
+ "version": "1.0.4",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/concat-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
+ "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/mocha": {
+ "version": "5.2.7",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz",
+ "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ=="
+ },
+ "@types/node": {
+ "version": "20.8.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz",
+ "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==",
+ "requires": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "@types/q": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
+ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ=="
+ },
+ "@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+ },
+ "@types/semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ=="
+ },
+ "@types/uuid": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz",
+ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw=="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "azure-pipelines-task-lib": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.1.0.tgz",
+ "integrity": "sha512-8CNC9PcP+4eS76QcIDmPmBfrrao9xpy/M0Uts4TWk3chfr3uOXFGf0DYHVTJGF9180g51kyVXYTObicouq0KZQ==",
+ "requires": {
+ "minimatch": "3.0.5",
+ "mockery": "^2.1.0",
+ "q": "^1.5.1",
+ "semver": "^5.1.0",
+ "shelljs": "^0.8.5",
+ "sync-request": "6.1.0",
+ "uuid": "^3.0.1"
+ }
+ },
+ "azure-pipelines-tool-lib": {
+ "version": "2.0.0-preview",
+ "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.0-preview.tgz",
+ "integrity": "sha512-OeivwKLpLMsvGpZ2H+2UPxFwwqNkV8TzfKByqjYAllzGDAw4BvciAdjCMwkpGdTOnzfPbRpr33sy48kn7RqfKA==",
+ "requires": {
+ "@types/semver": "^5.3.0",
+ "@types/uuid": "^3.4.5",
+ "azure-pipelines-task-lib": "^4.0.0-preview",
+ "semver": "^5.7.0",
+ "semver-compare": "^1.0.0",
+ "typed-rest-client": "^1.8.6",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "@types/uuid": {
+ "version": "3.4.10",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz",
+ "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A=="
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg=="
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "dependencies": {
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "http-basic": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
+ "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+ "requires": {
+ "caseless": "^0.12.0",
+ "concat-stream": "^1.6.2",
+ "http-response-object": "^3.0.1",
+ "parse-cache-control": "^1.0.1"
+ }
+ },
+ "http-response-object": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
+ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+ "requires": {
+ "@types/node": "^10.0.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.17.60",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
+ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
+ }
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
+ },
+ "is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "mockery": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz",
+ "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA=="
+ },
+ "object-inspect": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+ "integrity": "sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "requires": {
+ "asap": "~2.0.6"
+ }
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="
+ },
+ "qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "requires": {
+ "resolve": "^1.1.6"
+ }
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="
+ },
+ "shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "requires": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ }
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ },
+ "sync-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
+ "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "requires": {
+ "http-response-object": "^3.0.1",
+ "sync-rpc": "^1.2.1",
+ "then-request": "^6.0.0"
+ }
+ },
+ "sync-rpc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
+ "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "requires": {
+ "get-port": "^3.1.0"
+ }
+ },
+ "then-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
+ "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "requires": {
+ "@types/concat-stream": "^1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "^8.0.0",
+ "@types/qs": "^6.2.31",
+ "caseless": "~0.12.0",
+ "concat-stream": "^1.6.0",
+ "form-data": "^2.2.0",
+ "http-basic": "^8.1.1",
+ "http-response-object": "^3.0.1",
+ "promise": "^8.0.0",
+ "qs": "^6.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "8.10.66",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="
+ }
+ }
+ },
+ "tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
+ },
+ "typed-rest-client": {
+ "version": "1.8.9",
+ "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz",
+ "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==",
+ "requires": {
+ "qs": "^6.9.1",
+ "tunnel": "0.0.6",
+ "underscore": "^1.12.1"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
+ "typescript": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
+ "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
+ },
+ "undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ }
+ }
+}
diff --git a/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/package.json b/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/package.json
new file mode 100644
index 000000000000..507c599b91d5
--- /dev/null
+++ b/Tasks/VsTestPlatformToolInstallerV1/_buildConfigs/Node20/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "vstestplatform-tool-installer",
+ "version": "1.0.4",
+ "description": "Visual Studio Test Platform Installer",
+ "main": "vstestplatformtoolInstaller.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git"
+ },
+ "keywords": [
+ "Azure",
+ "Pipelines",
+ "Tasks",
+ "VsTestplatform",
+ "VsTest"
+ ],
+ "author": "Microsoft Corporation",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues"
+ },
+ "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme",
+ "dependencies": {
+ "azure-pipelines-task-lib": "^4.1.0",
+ "@types/node": "^20.3.1",
+ "@types/mocha": "^5.2.7",
+ "@types/q": "^1.5.0",
+ "@types/uuid": "^8.3.0",
+ "azure-pipelines-tool-lib": "^2.0.0-preview",
+ "performance-now": "0.2.0"
+ },
+ "devDependencies": {
+ "typescript": "5.1.6"
+ }
+}
diff --git a/Tasks/VsTestPlatformToolInstallerV1/task.json b/Tasks/VsTestPlatformToolInstallerV1/task.json
index 751387b7c829..c61e9cfbb140 100644
--- a/Tasks/VsTestPlatformToolInstallerV1/task.json
+++ b/Tasks/VsTestPlatformToolInstallerV1/task.json
@@ -14,7 +14,7 @@
"author": "Microsoft Corporation",
"version": {
"Major": 1,
- "Minor": 215,
+ "Minor": 231,
"Patch": 0
},
"satisfies": [
@@ -139,4 +139,4 @@
"ExpectedTempToBeSet": "Expected Agent.TempDirectory to be set.",
"ParsedVersion": "Parsed the version of the Microsoft.Testplatform package to be %s from the file name. Please ensure that the file name is the same as when the .nupkg file is downloaded from the official nuget feed."
}
-}
+}
\ No newline at end of file
diff --git a/Tasks/VsTestPlatformToolInstallerV1/task.loc.json b/Tasks/VsTestPlatformToolInstallerV1/task.loc.json
index e375cbe942eb..0be1dae5b03d 100644
--- a/Tasks/VsTestPlatformToolInstallerV1/task.loc.json
+++ b/Tasks/VsTestPlatformToolInstallerV1/task.loc.json
@@ -14,7 +14,7 @@
"author": "Microsoft Corporation",
"version": {
"Major": 1,
- "Minor": 215,
+ "Minor": 231,
"Patch": 0
},
"satisfies": [
diff --git a/_generated/VsTestPlatformToolInstallerV1.versionmap.txt b/_generated/VsTestPlatformToolInstallerV1.versionmap.txt
new file mode 100644
index 000000000000..3071c0a2192a
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1.versionmap.txt
@@ -0,0 +1,2 @@
+Default|1.231.0
+Node20_229_4|1.231.1
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/.npmrc b/_generated/VsTestPlatformToolInstallerV1_Node20/.npmrc
new file mode 100644
index 000000000000..5fca0d518be7
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/.npmrc
@@ -0,0 +1 @@
+scripts-prepend-node-path=true
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/de-DE/resources.resjson
new file mode 100644
index 000000000000..d9b2c15082e1
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/de-DE/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Installer für die Visual Studio-Testplattform",
+ "loc.helpMarkDown": "[Testplattformpaket für NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "Hiermit wird die Testplattform aus \"nuget.org\" oder dem Toolcache abgerufen. Erfüllt die vstest-Anforderung und kann zum Ausführen von Tests und zum Erfassen von Diagnosedaten mithilfe der Visual Studio Test-Aufgabe verwendet werden.",
+ "loc.instanceNameFormat": "Installer für Visual Studio Test-Plattform",
+ "loc.group.displayName.packageSettings": "Paketeinstellungen",
+ "loc.input.label.packageFeedSelector": "Paketfeed",
+ "loc.input.help.packageFeedSelector": "Geben Sie den Feed an, aus dem das NuGet-Paket für die Visual Studio Test-Plattform abgerufen werden soll.",
+ "loc.input.label.versionSelector": "Version",
+ "loc.input.help.versionSelector": "Wählen Sie aus, ob die aktuelle Version oder eine bestimmte Version der Visual Studio-Testplattform installiert werden soll. Wenn Sie den Installer für die Testplattform zum Ausführen von Tests der programmierten UI ausführen, müssen Sie sicherstellen, dass die ausgewählte Version der Hauptversion von Visual Studio entspricht, mit der die Testbinärdateien erstellt wurden. Wenn z. B. das Projekt für den Test der programmierten UI mit Visual Studio 2017 (Version 15.x) erstellt wurde, müssen Sie Version 15.x der Testplattform verwenden.",
+ "loc.input.label.testPlatformVersion": "Version der Testplattform",
+ "loc.input.help.testPlatformVersion": "Geben Sie die Version der Visual Studio Test-Plattform an, die auf dem Agent installiert werden soll. Verfügbare Versionen können in NuGet angezeigt werden.",
+ "loc.input.label.customFeed": "Paketquelle",
+ "loc.input.help.customFeed": "Rufen Sie das testplatform-Paket aus dem angegebenen Paketfeed ab. Es kann sich um einen öffentlichen oder um einen privaten Feed handeln.",
+ "loc.input.label.username": "Benutzername",
+ "loc.input.help.username": "Der Benutzername für die Authentifizierung beim angegebenen Feed. Wenn ein persönliches Zugriffstoken als Kennwort angegeben wird, ist der Benutzername optional.",
+ "loc.input.label.password": "Kennwort",
+ "loc.input.help.password": "Das Kennwort oder ein persönliches Zugriffstoken für die Authentifizierung beim angegebenen Feed.",
+ "loc.input.label.netShare": "UNC-Pfad",
+ "loc.input.help.netShare": "Geben Sie den vollständigen UNC-Pfad zur NUPKG-Datei \"microsoft.testplatform\" an.",
+ "loc.messages.StartingInstaller": "Die Installeraufgabe für VsTest-Plattformtools wird gestartet.",
+ "loc.messages.ProvideExplicitVersion": "Die von Ihnen angegebene Version (%s) ist keine explizite Version. Geben Sie eine Versionsnummer in der Form \"HauptVer.NebenVer.PatchVer\" an.",
+ "loc.messages.NoPackageFoundInCache": "Im Cache wurde keine stabile Version des Testplattformpakets gefunden.",
+ "loc.messages.OnlyWindowsOsSupported": "Diese Aufgabe wird nur auf Windows-Agenten unterstützt und kann auf anderen Plattformen nicht verwendet werden.",
+ "loc.messages.RequiredVersionNotListed": "Die erforderliche Version des Microsoft.Testplatform-Pakets wurde im NuGet-Feed nicht aufgeführt. Es wird nach der neuesten stabilen Version im Cache gesucht.",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "Fehler beim Abrufen der Liste verfügbarer Pakete aus NuGet. Es wird nach der neuesten stabilen Version im Cache gesucht.",
+ "loc.messages.FailedToAcquireTestPlatform": "Fehler beim Abrufen der Testplattform. Legen Sie \"system.debug\" auf TRUE fest. Weitere Informationen finden Sie in den Debugprotokollen.",
+ "loc.messages.InstallationSuccessful": "VsTest verwendet das Testplattformpaket unter \"%s\".",
+ "loc.messages.TestPlatformDownloadFailed": "Fehler beim Herunterladen der Version %s der Testplattform. Fehler: %s.",
+ "loc.messages.LookingForLatestStableVersion": "Die neueste stabile Version der Microsoft.Testplatform wird gesucht.",
+ "loc.messages.LookingForLatestPreReleaseVersion": "Die neueste Vorabversion der Microsoft.Testplatform wird gesucht.",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "Stellen Sie sicher, dass der Pfad des Agent-Arbeitsverzeichnisses weniger als 50 Zeichen umfasst, um einen erfolgreichen Download des Testplattformpakets zu gewährleisten.",
+ "loc.messages.ListPackagesFailed": "Fehler beim Auflisten von Paketen. \"Nuget.exe\" hat \"%s\" zurückgegeben.\nStandardfehler:\n%sStandardausgabe:\n%s",
+ "loc.messages.NugetErrorCode": "\"NuGet.exe\" hat den Fehlercode %s zurückgegeben.",
+ "loc.messages.UpgradeAgentMessage": "Führen Sie über https://github.com/Microsoft/vsts-agent/releases ein Agent-Upgrade auf die aktuelle Version durch.",
+ "loc.messages.SpecifiedFileDoesNotExist": "Der angegebene Pfad \"%s\" ist nicht vorhanden, ist keine gültige Datei oder nicht zugänglich. Geben Sie einen gültigen Pfad zur NUPKG-Datei \"microsoft.testplatform\" an, die Sie installieren möchten.",
+ "loc.messages.UnexpectedFileName": "Es können keine Versionsinformationen aus der Datei \"%s\" extrahiert werden. Benennen Sie die von nuget.org heruntergeladene NUPKG-Datei \"microsoft.testplatform\" nicht um. Falls Sie die Datei umbenannt haben, laden Sie die Datei erneut herunter, oder ändern Sie den Dateinamen zurück in den ursprünglichen Namen.",
+ "loc.messages.ConfigFileWriteFailed": "Fehler beim Schreiben in die nuget.config-Datei \"%s\". Fehler: %s ",
+ "loc.messages.LatestStableCached": "Es wird im Cache nach der neuesten stabilen Version gesucht.",
+ "loc.messages.DownloadFailed": "Downloadfehler mit Fehlercode %s.",
+ "loc.messages.ExpectedTempToBeSet": "\"Agent.TempDirectory\" muss festgelegt werden.",
+ "loc.messages.ParsedVersion": "Die Version des Microsoft.Testplatform-Pakets wurde auf Übereinstimmung mit \"%s\" aus dem Dateinamen analysiert. Stellen Sie sicher, dass der Dateiname mit dem beim Herunterladen der NUPKG-Datei aus dem offiziellen NuGet-Feed übereinstimmt."
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/en-US/resources.resjson
new file mode 100644
index 000000000000..0fc423add024
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/en-US/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Visual Studio test platform installer",
+ "loc.helpMarkDown": "[Test platform package on NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "Acquire the test platform from nuget.org or the tool cache. Satisfies the ‘vstest’ demand and can be used for running tests and collecting diagnostic data using the Visual Studio Test task.",
+ "loc.instanceNameFormat": "Visual Studio Test Platform Installer",
+ "loc.group.displayName.packageSettings": "Package settings",
+ "loc.input.label.packageFeedSelector": "Package Feed",
+ "loc.input.help.packageFeedSelector": "Specify the feed from which the Visual Studio Test Platform nuget packge should be fetched.",
+ "loc.input.label.versionSelector": "Version",
+ "loc.input.help.versionSelector": "Pick whether to install the latest version or a specific version of the Visual Studio Test Platform. If you use the test platform installer to run Coded UI tests, ensure that the version you choose matches the major version of Visual Studio with which the test binaries were built. For e.g., if the Coded UI test project was built using Visual Studio 2017 (version 15.x), you must use test platform version 15.x.",
+ "loc.input.label.testPlatformVersion": "Test Platform Version",
+ "loc.input.help.testPlatformVersion": "Specify the version of Visual Studio Test Platform to install on the agent. Available versions can be viewed on nuget.",
+ "loc.input.label.customFeed": "Package Source",
+ "loc.input.help.customFeed": "Fetch the testplatform package from the specified package feed. Can be a public or a private feed.",
+ "loc.input.label.username": "User Name",
+ "loc.input.help.username": "User name for authenticating against the specified feed. If providing a PAT token as password, username is optional.",
+ "loc.input.label.password": "Password",
+ "loc.input.help.password": "Password or personal access token for authenticating against the specified feed.",
+ "loc.input.label.netShare": "UNC Path",
+ "loc.input.help.netShare": "Specify the full UNC path to the microsoft.testplatform nupkg file.",
+ "loc.messages.StartingInstaller": "Starting VsTest platform tools installer task.",
+ "loc.messages.ProvideExplicitVersion": "The version you provided (%s) is not an explicit version. Please provide a version number of the form majorVer.minorVer.patchVer.",
+ "loc.messages.NoPackageFoundInCache": "Failed to find any stable version of the test platform package in the cache.",
+ "loc.messages.OnlyWindowsOsSupported": "This task is supported only on Windows agents and cannot be used on other platforms.",
+ "loc.messages.RequiredVersionNotListed": "Required version of the Microsoft.Testplatform package was not listed in the nuget feed, looking for latest stable version cached.",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "Failed to fetch list of available packages from nuget, looking for latest stable version cached.",
+ "loc.messages.FailedToAcquireTestPlatform": "Failed to acquire the test platform. Please set system.debug to true and refer to the debug logs for additional information.",
+ "loc.messages.InstallationSuccessful": "VsTest will use the Test Platform package found in %s",
+ "loc.messages.TestPlatformDownloadFailed": "Failed to download version %s of the test platform with error %s.",
+ "loc.messages.LookingForLatestStableVersion": "Looking for the latest stable version of the Microsoft.Testplatform.",
+ "loc.messages.LookingForLatestPreReleaseVersion": "Looking for the latest pre-release version of the Microsoft.Testplatform.",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "Please ensure that the agent work directory path is less than 50 characters to guarantee successful download of the test platform package.",
+ "loc.messages.ListPackagesFailed": "Listing packages failed. Nuget.exe returned %s.\nStandard Error:\n%sStandard Out:\n%s",
+ "loc.messages.NugetErrorCode": "Nuget.exe returned error code: %s",
+ "loc.messages.UpgradeAgentMessage": "Please upgrade your agent to the latest available in https://github.com/Microsoft/vsts-agent/releases.",
+ "loc.messages.SpecifiedFileDoesNotExist": "The path provided %s does not exist, is not a valid file or is not accessible. Please provide a valid path to the microsoft.testplatform nupkg file you want to install.",
+ "loc.messages.UnexpectedFileName": "Unable to extract version info from the file %s. Please do not rename the microsoft.testplatform nupkg file downloaded from nuget.org. If you have, then please redownload the file or rename it back to its original name.",
+ "loc.messages.ConfigFileWriteFailed": "Failed to write nuget.config file %s with error %s",
+ "loc.messages.LatestStableCached": "Looking for latest stable version cached.",
+ "loc.messages.DownloadFailed": "Download failed with error code: %s.",
+ "loc.messages.ExpectedTempToBeSet": "Expected Agent.TempDirectory to be set.",
+ "loc.messages.ParsedVersion": "Parsed the version of the Microsoft.Testplatform package to be %s from the file name. Please ensure that the file name is the same as when the .nupkg file is downloaded from the official nuget feed."
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/es-ES/resources.resjson
new file mode 100644
index 000000000000..548b80688741
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/es-ES/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Instalador de Visual Studio Test Platform",
+ "loc.helpMarkDown": "[Paquete Test Platform en NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "Adquiere la plataforma de pruebas de nuget.org o de la memoria caché de herramientas. Cumple la demanda de \"vstest\" y se puede usar para ejecutar pruebas y recopilar datos de diagnóstico mediante la tarea de Visual Studio Test.",
+ "loc.instanceNameFormat": "Instalador de Visual Studio Test Platform",
+ "loc.group.displayName.packageSettings": "Configuración del paquete",
+ "loc.input.label.packageFeedSelector": "Fuente del paquete",
+ "loc.input.help.packageFeedSelector": "Especifique la fuente desde la que debe capturarse el paquete NuGet de Visual Studio Test Platform.",
+ "loc.input.label.versionSelector": "Versión",
+ "loc.input.help.versionSelector": "Seleccione si quiere instalar la última versión de Visual Studio Test Platform o bien una versión específica. Si usa el instalador de la plataforma de pruebas para ejecutar pruebas automatizadas de IU, asegúrese de que la versión que elija coincide con la versión principal de Visual Studio con la que se compilaron los archivos binarios de prueba. Por ejemplo, si el proyecto de pruebas automatizadas de IU se compiló con Visual Studio 2017 (versión 15.x), debe usar la versión 15.x de la plataforma de pruebas.",
+ "loc.input.label.testPlatformVersion": "Versión de Test Platform",
+ "loc.input.help.testPlatformVersion": "Especifique la versión de Visual Studio Test Platform que se va a instalar en el agente. Las versiones disponibles se pueden ver en nuget.",
+ "loc.input.label.customFeed": "Origen del paquete",
+ "loc.input.help.customFeed": "Capture el paquete testplatform de la fuente de paquete especificada. Puede ser una fuente pública o privada.",
+ "loc.input.label.username": "Nombre de usuario",
+ "loc.input.help.username": "Nombre de usuario para autenticarse en la fuente especificada. Si se proporciona un token PAT como contraseña, el nombre de usuario es opcional.",
+ "loc.input.label.password": "Contraseña",
+ "loc.input.help.password": "Contraseña o token de acceso personal para autenticarse en la fuente especificada.",
+ "loc.input.label.netShare": "Ruta de acceso UNC",
+ "loc.input.help.netShare": "Especifique la ruta de acceso UNC completa al archivo nupkg microsoft.testplatform.",
+ "loc.messages.StartingInstaller": "Tarea de inicio del instalador de herramientas de la plataforma VsTest.",
+ "loc.messages.ProvideExplicitVersion": "La versión (%s) que ha proporcionado no es una versión explícita. Proporcione un número de versión con el formato majorVer.minorVer.patchVer.",
+ "loc.messages.NoPackageFoundInCache": "No se encontró ninguna versión estable del paquete de plataforma de pruebas en caché.",
+ "loc.messages.OnlyWindowsOsSupported": "Esta tarea solo se admite en los agentes de Windows y no se puede usar en otras plataformas.",
+ "loc.messages.RequiredVersionNotListed": "La versión necesaria del paquete Microsoft.Testplatform no se incluía en la fuente NuGet. Buscando la última versión estable en caché.",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "No se pudo capturar la lista de paquetes disponibles de NuGet. Buscando la última versión estable en caché.",
+ "loc.messages.FailedToAcquireTestPlatform": "No se pudo adquirir la plataforma de pruebas. Establezca system.debug en true y consulte los registros de depuración para obtener más información.",
+ "loc.messages.InstallationSuccessful": "VsTest usará el paquete de Test Platform que se encuentra en %s.",
+ "loc.messages.TestPlatformDownloadFailed": "No se pudo descargar la versión %s de la plataforma de pruebas con el error %s.",
+ "loc.messages.LookingForLatestStableVersion": "Buscando la última versión estable de Microsoft.Testplatform.",
+ "loc.messages.LookingForLatestPreReleaseVersion": "Buscando la última versión preliminar de Microsoft.Testplatform.",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "Asegúrese de que la ruta de acceso del directorio de trabajo del agente tiene menos de 50 caracteres para garantizar una descarga correcta del paquete de plataforma de pruebas.",
+ "loc.messages.ListPackagesFailed": "Error al enumerar los paquetes. NuGet.exe devolvió %s.\nError estándar:\n%s. Salida estándar:\n%s",
+ "loc.messages.NugetErrorCode": "NuGet.exe devolvió un código de error: %s",
+ "loc.messages.UpgradeAgentMessage": "Actualice el agente a la última versión disponible en https://github.com/Microsoft/vsts-agent/releases.",
+ "loc.messages.SpecifiedFileDoesNotExist": "La ruta de acceso %s proporcionada no existe, no es un archivo válido o no es accesible. Proporcione una ruta de acceso válida al archivo nupkg microsoft.testplatform que quiere instalar.",
+ "loc.messages.UnexpectedFileName": "No se puede extraer la información de versión del archivo %s. No cambie el nombre del archivo nupkg microsoft.testplatform que se ha descargado de nuget.org. Si lo ha cambiado, vuelva a descargar el archivo o cambie de nuevo al nombre original.",
+ "loc.messages.ConfigFileWriteFailed": "No se pudo escribir en el archivo nuget.config %s. Error: %s",
+ "loc.messages.LatestStableCached": "Buscando la última versión estable en caché.",
+ "loc.messages.DownloadFailed": "Error de descarga. Código de error: %s.",
+ "loc.messages.ExpectedTempToBeSet": "Se esperaba que Agent.TempDirectory estuviera establecido.",
+ "loc.messages.ParsedVersion": "Se ha analizado la versión del paquete Microsoft.Testplatform a partir del nombre de archivo y es %s. Asegúrese de que el nombre de archivo es el mismo que cuando se descarga el archivo .nupkg desde la fuente NuGet oficial."
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson
new file mode 100644
index 000000000000..5f17b8800af4
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Programme d'installation de Visual Studio Test Platform",
+ "loc.helpMarkDown": "[Package de plateforme de test sur NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "Acquiert la plateforme de test à partir de nuget.org ou du cache d'outils. Répond à la demande de 'vstest', et permet d'exécuter des tests et de collecter des données de diagnostic à l'aide de la tâche Visual Studio Test.",
+ "loc.instanceNameFormat": "Visual Studio Test Platform Installer",
+ "loc.group.displayName.packageSettings": "Paramètres de package",
+ "loc.input.label.packageFeedSelector": "Flux de package",
+ "loc.input.help.packageFeedSelector": "Spécifiez le flux à partir duquel le package nuget de Visual Studio Test Platform doit être récupéré (fetch).",
+ "loc.input.label.versionSelector": "Version",
+ "loc.input.help.versionSelector": "Choisissez d'installer la dernière version ou une version spécifique de Visual Studio Test Platform. Si vous utilisez le programme d'installation de Visual Studio Test Platform pour exécuter des tests codés de l'interface utilisateur, vérifiez que la version que vous choisissez correspond à la version principale de Visual Studio avec laquelle les fichiers binaires de test ont été générés. Par exemple, si le projet de test codé de l'interface utilisateur a été généré à l'aide de Visual Studio 2017 (version 15.x), vous devez utiliser la version 15.x de la plateforme de test.",
+ "loc.input.label.testPlatformVersion": "Version de la plateforme de test",
+ "loc.input.help.testPlatformVersion": "Spécifiez la version de Visual Studio Test Platform à installer sur l'agent. Vous pouvez consulter les versions disponibles sur nuget.",
+ "loc.input.label.customFeed": "Source du package",
+ "loc.input.help.customFeed": "Récupérez (fetch) le package testplatform à partir du flux de package spécifié. Il peut s'agir d'un flux public ou privé.",
+ "loc.input.label.username": "Nom d'utilisateur",
+ "loc.input.help.username": "Nom d'utilisateur pour l'authentification auprès du flux spécifié. Si vous fournissez un jeton PAT en tant que mot de passe, le nom d'utilisateur est facultatif.",
+ "loc.input.label.password": "Mot de passe",
+ "loc.input.help.password": "Mot de passe ou jeton d'accès personnel pour l'authentification auprès du flux spécifié.",
+ "loc.input.label.netShare": "Chemin UNC",
+ "loc.input.help.netShare": "Spécifiez le chemin UNC complet du fichier microsoft.testplatform nupkg.",
+ "loc.messages.StartingInstaller": "Démarrage de la tâche du programme d'installation des outils de plateforme VsTest.",
+ "loc.messages.ProvideExplicitVersion": "La version que vous avez fournie (%s) n'est pas une version explicite. Indiquez un numéro de version sous la forme VersionPrincipale.VersionMineur.VersionCorrective.",
+ "loc.messages.NoPackageFoundInCache": "Échec de la recherche d'une version stable du package de plateforme de test dans le cache.",
+ "loc.messages.OnlyWindowsOsSupported": "Cette tâche est prise en charge uniquement sur les agents Windows et ne peut pas être utilisée sur d'autres plateformes.",
+ "loc.messages.RequiredVersionNotListed": "La version nécessaire du package Microsoft.Testplatform n'est pas répertoriée dans le flux nuget. Recherche de la dernière version stable mise en cache.",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "Échec de la récupération (fetch) de la liste des packages disponibles depuis nuget. Recherche de la dernière version stable mise en cache.",
+ "loc.messages.FailedToAcquireTestPlatform": "Échec de l'acquisition de la plateforme de test. Affectez la valeur true à system.debug, et consultez les journaux de débogage pour plus d'informations.",
+ "loc.messages.InstallationSuccessful": "VsTest va utiliser le package de plateforme de test trouvé dans %s",
+ "loc.messages.TestPlatformDownloadFailed": "Échec du téléchargement de la version %s de la plateforme de test. Erreur : %s.",
+ "loc.messages.LookingForLatestStableVersion": "Recherche de la dernière version stable de Microsoft.Testplatform.",
+ "loc.messages.LookingForLatestPreReleaseVersion": "Recherche de la dernière préversion de Microsoft.Testplatform.",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "Vérifiez que le chemin du répertoire de travail de l'agent est inférieur à 50 caractères pour garantir la réussite du téléchargement du package de plateforme de test.",
+ "loc.messages.ListPackagesFailed": "Échec de l'affichage de la liste des packages. Nuget.exe a retourné %s.\nErreur standard :\n%sSortie standard :\n%s",
+ "loc.messages.NugetErrorCode": "Nuget.exe a retourné le code d'erreur %s",
+ "loc.messages.UpgradeAgentMessage": "Mettez à niveau votre agent vers la dernière version disponible dans https://github.com/Microsoft/vsts-agent/releases.",
+ "loc.messages.SpecifiedFileDoesNotExist": "Le chemin fourni %s n'existe pas, n'est pas un fichier valide ou n'est pas accessible. Indiquez le chemin valide du fichier microsoft.testplatform nupkg à installer.",
+ "loc.messages.UnexpectedFileName": "Impossible d'extraire les informations de version du fichier %s. Ne renommez pas le fichier microsoft.testplatform nupkg téléchargé à partir de nuget.org. Sinon, retéléchargez le fichier, ou renommez-le avec son nom d'origine.",
+ "loc.messages.ConfigFileWriteFailed": "Échec de l'écriture du fichier nuget.config %s. Erreur : %s",
+ "loc.messages.LatestStableCached": "Recherche de la dernière version stable mise en cache.",
+ "loc.messages.DownloadFailed": "Échec du téléchargement. Code d'erreur : %s.",
+ "loc.messages.ExpectedTempToBeSet": "Agent.TempDirectory est censé être défini.",
+ "loc.messages.ParsedVersion": "Analyse effectuée de la version du package Microsoft.Testplatform à %s à partir du nom de fichier. Vérifiez que le nom de fichier est le même quand le fichier .nupkg est téléchargé à partir du flux nuget officiel."
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/it-IT/resources.resjson
new file mode 100644
index 000000000000..ea96d37b3aca
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/it-IT/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Programma di installazione della piattaforma di test di Visual Studio",
+ "loc.helpMarkDown": "[Pacchetto della piattaforma di test su NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "Acquisisce la piattaforma di test da nuget.org o dalla cache degli strumenti. Soddisfa la richiesta 'vstest' e può essere usato per eseguire test e raccogliere dati di diagnostica usando l'attività Test con Visual Studio.",
+ "loc.instanceNameFormat": "Programma di installazione della piattaforma di test di Visual Studio",
+ "loc.group.displayName.packageSettings": "Impostazioni del pacchetto",
+ "loc.input.label.packageFeedSelector": "Feed del pacchetto",
+ "loc.input.help.packageFeedSelector": "Consente di specificare il feed dal quale deve essere recuperato il pacchetto NuGet della piattaforma di test di Visual Studio.",
+ "loc.input.label.versionSelector": "Versione",
+ "loc.input.help.versionSelector": "Scegliere se installare l'ultima versione o una versione specifica della piattaforma di test Visual Studio. Se si usa il programma di installazione della piattaforma di test per eseguire i test codificati dell'interfaccia utente, assicurarsi che la versione scelta corrisponda alla versione principale di Visual Studio con cui sono stati compilati i file binari di test. Se, ad esempio, il progetto di test codificato dell'interfaccia utente è stato compilato con Visual Studio 2017 (versione 15.x), è necessario usare la piattaforma di test versione 15.x.",
+ "loc.input.label.testPlatformVersion": "Versione della piattaforma di test",
+ "loc.input.help.testPlatformVersion": "Consente di specificare la versione della piattaforma di test di Visual Studio da installare nell'agente. Le versioni disponibili possono essere visualizzate su NuGet.",
+ "loc.input.label.customFeed": "Origine del pacchetto",
+ "loc.input.help.customFeed": "Recupera il pacchetto testplatform dal feed del pacchetto specificato. Può essere un feed pubblico o privato.",
+ "loc.input.label.username": "Nome utente",
+ "loc.input.help.username": "Nome utente per l'autenticazione al feed specificato. Se si specifica un token di accesso personale come password, il nome utente è facoltativo.",
+ "loc.input.label.password": "Password",
+ "loc.input.help.password": "Password o token di accesso personale per l'autenticazione al feed specificato.",
+ "loc.input.label.netShare": "Percorso UNC",
+ "loc.input.help.netShare": "Consente di specificare il percorso UNC completo del file nupkg microsoft.testplatform.",
+ "loc.messages.StartingInstaller": "Avvio dell'attività del programma di installazione strumenti della piattaforma VsTest.",
+ "loc.messages.ProvideExplicitVersion": "La versione specificata (%s) non è una versione esplicita. Specificare un numero di versione in formato versionePrincipale.versioneSecondaria.versionePatch.",
+ "loc.messages.NoPackageFoundInCache": "Non è stato possibile trovare nella cache alcuna versione stabile del pacchetto della piattaforma di test.",
+ "loc.messages.OnlyWindowsOsSupported": "Questa attività è supportata solo in agenti Windows e non può essere usata su altre piattaforme.",
+ "loc.messages.RequiredVersionNotListed": "La versione richiesta del pacchetto Microsoft.Testplatform non è incluso nell'elenco del feed NuGet. Verrà cercata l'ultima versione stabile memorizzata nella cache.",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "Non è stato possibile recuperare l'elenco dei pacchetti disponibili da NuGet. Verrà cercata l'ultima versione stabile memorizzata nella cache.",
+ "loc.messages.FailedToAcquireTestPlatform": "Non è stato possibile acquisire la piattaforma di test. Impostare system.debug su true. Per altre informazioni, vedere i log di debug.",
+ "loc.messages.InstallationSuccessful": "VsTest userà il pacchetto della piattaforma di test trovato in %s",
+ "loc.messages.TestPlatformDownloadFailed": "Non è stato possibile scaricare la versione %s della piattaforma di test. Errore: %s.",
+ "loc.messages.LookingForLatestStableVersion": "Ricerca dell'ultima versione stabile di Microsoft.Testplatform.",
+ "loc.messages.LookingForLatestPreReleaseVersion": "Ricerca dell'ultima versione preliminare di Microsoft.Testplatform.",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "Per garantire il corretto download del pacchetto della piattaforma di test, assicurarsi che la lunghezza del percorso della directory di lavoro dell'agente sia inferiore a 50 caratteri.",
+ "loc.messages.ListPackagesFailed": "La visualizzazione dell'elenco dei pacchetti non è riuscita. Nuget.exe ha restituito %s.\nSTDERR:\n%sSTDOUT:\n%s",
+ "loc.messages.NugetErrorCode": "Nuget.exe ha restituito il codice errore %s",
+ "loc.messages.UpgradeAgentMessage": "Aggiornare l'agente alla versione più recente disponibile in https://github.com/Microsoft/vsts-agent/releases.",
+ "loc.messages.SpecifiedFileDoesNotExist": "Il percorso specificato %s non esiste, non è un file valido oppure non è accessibile. Specificare un percorso valido per il file nupkg microsoft.testplatform che si vuole installare.",
+ "loc.messages.UnexpectedFileName": "Non è possibile estrarre le informazioni sulla versione dal file %s. Non rinominare il file nupkg microsoft.testplatform scaricato da nuget.org. Se lo è già fatto, scaricare nuovamente il file o rinominarlo con il nome originale.",
+ "loc.messages.ConfigFileWriteFailed": "Non è stato possibile scrivere nel file nuget.config %s. Errore: %s",
+ "loc.messages.LatestStableCached": "Ricerca dell'ultima versione stabile memorizzata nella cache.",
+ "loc.messages.DownloadFailed": "Il download non è riuscito. Codice errore: %s.",
+ "loc.messages.ExpectedTempToBeSet": "Elemento Agent.TempDirectory previsto da impostare.",
+ "loc.messages.ParsedVersion": "La versione del pacchetto Microsoft.Testplatform da %s dal nome file è stata analizzata. Assicurarsi che il nome file sia uguale a quello del file con estensione nupkg scaricato dal feed NuGet ufficiale."
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson
new file mode 100644
index 000000000000..fd2c613f0bd9
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Visual Studio テスト プラットフォーム インストーラー",
+ "loc.helpMarkDown": "[NuGet 上のテスト プラットフォーム パッケージ](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "nuget.org またはツール キャッシュからテスト プラットフォームを取得します。'vstest' 要求を満たし、Visual Studio テスト タスクを使用するテストの実行と診断データの収集に使用できます。",
+ "loc.instanceNameFormat": "Visual Studio テスト プラットフォーム インストーラー",
+ "loc.group.displayName.packageSettings": "パッケージ設定",
+ "loc.input.label.packageFeedSelector": "パッケージ フィード",
+ "loc.input.help.packageFeedSelector": "Visual Studio テスト プラットフォームの nuget パッケージの取得元となるフィードを指定します。",
+ "loc.input.label.versionSelector": "バージョン",
+ "loc.input.help.versionSelector": "Visual Studio テスト プラットフォームの最新バージョンと特定のバージョンのどちらをインストールするかを選択します。 テスト プラットフォーム インストーラーを使用してコード化された UI テストを実行する場合、選択したバージョンが、テスト バイナリのビルドに使用された Visual Studio のメジャー バージョンと一致していることをご確認ください。例: コード化された UI テスト プロジェクトが Visual Studio 2017 (バージョン 15.x) を使用してビルドされた場合は、バージョン 15.x のテスト プラットフォームを使用する必要があります。",
+ "loc.input.label.testPlatformVersion": "テスト プラットフォームのバージョン",
+ "loc.input.help.testPlatformVersion": "エージェントをインストールする Visual Studio テスト プラットフォームのバージョンを指定します。使用可能なバージョンは、nuget で確認できます。",
+ "loc.input.label.customFeed": "パッケージ ソース",
+ "loc.input.help.customFeed": "指定したパッケージ フィードから testplatform パッケージを取得します。パブリックまたはプライベート フィードを指定できます。",
+ "loc.input.label.username": "ユーザー名",
+ "loc.input.help.username": "指定されたフィードに対する認証用のユーザー名。パスワードとして PAT トークンを指定する場合は、ユーザー名は省略可能です。",
+ "loc.input.label.password": "パスワード",
+ "loc.input.help.password": "指定されたフィードに対して認証するための、パスワードまたは個人用アクセス トークン。",
+ "loc.input.label.netShare": "UNC パス",
+ "loc.input.help.netShare": "microsoft.testplatform nupkg ファイルへの完全な UNC パスを指定します。",
+ "loc.messages.StartingInstaller": "VsTest プラットフォーム ツール インストーラー タスクを開始しています。",
+ "loc.messages.ProvideExplicitVersion": "指定されたバージョン (%s) が明確なバージョンではありません。majorVer.minorVer.patchVer の形式でバージョン番号を指定してください。",
+ "loc.messages.NoPackageFoundInCache": "キャッシュでテスト プラットフォーム パッケージの安定バージョンが見つかりませんでした。",
+ "loc.messages.OnlyWindowsOsSupported": "このタスクは、Windows エージェントでのみサポートされ、他のプラットフォームでは使用できません。",
+ "loc.messages.RequiredVersionNotListed": "Microsoft.Testplatform パッケージの必須バージョンが nuget フィードの一覧にありません。キャッシュにある最新の安定バージョンを探しています。",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "nuget から取得可能なパッケージの一覧をフェッチできませんでした。キャッシュに入っている最新の安定バージョンを検索しています。",
+ "loc.messages.FailedToAcquireTestPlatform": "テスト プラットフォームを取得できませんでした。system.debug を true に設定し、デバッグ ログで追加情報を参照してください。",
+ "loc.messages.InstallationSuccessful": "VsTest は、%s で見つかったテスト プラットフォーム パッケージを使用します",
+ "loc.messages.TestPlatformDownloadFailed": "テスト プラットフォームのバージョン %s をダウンロードできませんでした。エラー: %s。",
+ "loc.messages.LookingForLatestStableVersion": "Microsoft.Testplatform の最新の安定バージョンを探しています。",
+ "loc.messages.LookingForLatestPreReleaseVersion": "Microsoft.Testplatform の最新のプレリリース バージョンを探しています。",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "エージェントの作業ディレクトリ パスが 50 文字未満であることを確認して、テスト プラットフォーム パッケージが確実にダウンロードされるようにしてください。",
+ "loc.messages.ListPackagesFailed": "パッケージを一覧表示できませんでした。Nuget.exe が %s を返しました。\n標準エラー:\n%s標準出力:\n%s",
+ "loc.messages.NugetErrorCode": "Nuget.exe が次のエラー コードを返しました。%s",
+ "loc.messages.UpgradeAgentMessage": "エージェントを、https://github.com/Microsoft/vsts-agent/releases にある利用可能な最新バージョンにアップグレードしてください。",
+ "loc.messages.SpecifiedFileDoesNotExist": "指定されたパス %s は存在しないか、有効なファイルではないか、アクセスできません。インストールする microsoft.testplatform nupkg ファイルへの有効なパスを指定してください。",
+ "loc.messages.UnexpectedFileName": "ファイル %s からバージョン情報を抽出できません。nuget.org からダウンロードされた microsoft.testplatform nupkg ファイルの名前を変更しないでください。変更した場合は、ファイルを再ダウンロードするか元の名前に戻します。",
+ "loc.messages.ConfigFileWriteFailed": "nuget.config ファイル %s への書き込みに失敗しました。エラー: %s",
+ "loc.messages.LatestStableCached": "キャッシュされた最新の安定バージョンを探しています。",
+ "loc.messages.DownloadFailed": "ダウンロードが失敗しました。エラー コード: %s。",
+ "loc.messages.ExpectedTempToBeSet": "Agent.TempDirectory の設定が必要でした。",
+ "loc.messages.ParsedVersion": "Microsoft.Testplatform パッケージのバージョンが %s であることをファイル名から解析しました。ファイル名が、.nupkg ファイルを公式の nuget フィードからダウンロードしたときと同じであることを確認してください。"
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson
new file mode 100644
index 000000000000..fd9bc79a8ddd
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Visual Studio 테스트 플랫폼 설치 관리자",
+ "loc.helpMarkDown": "[NuGet의 테스트 플랫폼 패키지](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "nuget.org 또는 도구 캐시에서 테스트 플랫폼을 가져옵니다. 'vstest' 요청을 충족하며, Visual Studio 테스트 작업을 사용하여 테스트를 실행하고 진단 데이터를 수집하는 데 사용할 수 있습니다.",
+ "loc.instanceNameFormat": "Visual Studio 테스트 플랫폼 설치 관리자",
+ "loc.group.displayName.packageSettings": "패키지 설정",
+ "loc.input.label.packageFeedSelector": "패키지 피드",
+ "loc.input.help.packageFeedSelector": "Visual Studio 테스트 플랫폼 NuGet 패키지를 페치할 피드를 지정합니다.",
+ "loc.input.label.versionSelector": "버전",
+ "loc.input.help.versionSelector": "Visual Studio 테스트 플랫폼의 최신 버전을 설치할지 또는 특정 버전을 설치할지를 선택합니다. 테스트 플랫폼 설치 관리자를 사용하여 코딩된 UI 테스트를 실행하는 경우, 선택한 버전이 테스트 이진 파일 빌드에 사용한 Visual Studio의 주 버전과 일치하는지 확인합니다. 예를 들어 Visual Studio 2017(버전 15.x)을 사용하여 코딩된 UI 테스트 프로젝트를 빌드한 경우 테스트 플랫폼 버전 15.x를 사용해야 합니다.",
+ "loc.input.label.testPlatformVersion": "테스트 플랫폼 버전",
+ "loc.input.help.testPlatformVersion": "에이전트에 설치할 Visual Studio Test 플랫폼의 버전을 지정합니다. 사용 가능한 버전은 NuGet에서 확인할 수 있습니다.",
+ "loc.input.label.customFeed": "패키지 소스",
+ "loc.input.help.customFeed": "지정한 패키지 피드에서 testplatform 패키지를 페치합니다. 퍼블릭 또는 프라이빗 피드일 수 있습니다.",
+ "loc.input.label.username": "사용자 이름",
+ "loc.input.help.username": "지정한 피드에 인증하기 위한 사용자 이름입니다. PAT 토큰을 암호로 지정하는 경우 사용자 이름은 선택 사항입니다.",
+ "loc.input.label.password": "암호",
+ "loc.input.help.password": "지정한 피드에 인증하기 위한 암호 또는 개인용 액세스 토큰입니다.",
+ "loc.input.label.netShare": "UNC 경로",
+ "loc.input.help.netShare": "microsoft.testplatform nupkg 파일에 대한 전체 UNC 경로를 지정합니다.",
+ "loc.messages.StartingInstaller": "VsTest 플랫폼 도구 설치 관리자 작업을 시작합니다.",
+ "loc.messages.ProvideExplicitVersion": "입력한 버전(%s)은 명시적 버전이 아닙니다. majorVer.minorVer.patchVer 형식의 버전 번호를 입력하세요.",
+ "loc.messages.NoPackageFoundInCache": "캐시에서 테스트 플랫폼 패키지의 안정적인 버전을 찾지 못했습니다.",
+ "loc.messages.OnlyWindowsOsSupported": "이 작업은 Windows 에이전트에서만 지원되며 다른 플랫폼에서는 사용할 수 없습니다.",
+ "loc.messages.RequiredVersionNotListed": "필요한 Microsoft.Testplatform 패키지 버전이 NuGet 피드에 나열되지 않았습니다. 캐시된 안정적인 최신 버전을 찾고 있습니다.",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "NuGet에서 사용 가능한 패키지 목록을 가져오지 못했습니다. 캐시된 안정적인 최신 버전을 찾고 있습니다.",
+ "loc.messages.FailedToAcquireTestPlatform": "테스트 플랫폼을 가져오지 못했습니다. system.debug를 true로 설정하고, 추가 정보는 디버그 로그를 참조하세요.",
+ "loc.messages.InstallationSuccessful": "VsTest는 %s에 있는 테스트 플랫폼 패키지를 사용합니다.",
+ "loc.messages.TestPlatformDownloadFailed": "테스트 플랫폼 %s 버전을 다운로드하지 못했습니다(오류: %s).",
+ "loc.messages.LookingForLatestStableVersion": "Microsoft.Testplatform의 안정적인 최신 버전을 찾고 있습니다.",
+ "loc.messages.LookingForLatestPreReleaseVersion": "Microsoft.Testplatform의 최신 시험판 버전을 찾고 있습니다.",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "테스트 플랫폼 패키지를 성공적으로 다운로드하려면 에이전트 작업 디렉터리 경로가 50자 미만인지 확인하세요.",
+ "loc.messages.ListPackagesFailed": "패키지를 나열하지 못했습니다. Nuget.exe에서 %s이(가) 반환되었습니다.\n표준 오류:\n%s표준 출력:\n%s",
+ "loc.messages.NugetErrorCode": "Nuget.exe에서 오류 코드 %s이(가) 반환되었습니다.",
+ "loc.messages.UpgradeAgentMessage": "Https://github.com/Microsoft/vsts-agent/releases에서 사용 가능한 최신 버전으로 에이전트를 업그레이드하세요.",
+ "loc.messages.SpecifiedFileDoesNotExist": "입력한 경로 %s이(가) 없거나, 유효한 파일이 아니거나, 액세스할 수 없습니다. 설치할 microsoft.testplatform nupkg 파일의 유효한 경로를 입력하세요.",
+ "loc.messages.UnexpectedFileName": "%s 파일에서 버전 정보를 추출할 수 없습니다. nuget.org에서 다운로드한 microsoft.testplatform nupkg 파일의 이름을 바꾸지 마세요. 파일 이름을 바꾼 경우 파일을 다시 다운로드하거나 원래 이름으로 다시 바꾸세요.",
+ "loc.messages.ConfigFileWriteFailed": "nuget.config 파일 %s에 쓰지 못했습니다(오류: %s).",
+ "loc.messages.LatestStableCached": "캐시된 안정적인 최신 버전을 찾는 중입니다.",
+ "loc.messages.DownloadFailed": "다운로드하지 못했습니다(오류 코드: %s).",
+ "loc.messages.ExpectedTempToBeSet": "Agent.TempDirectory를 설정해야 합니다.",
+ "loc.messages.ParsedVersion": "파일 이름에서 Microsoft.Testplatform 패키지 버전을 %s(으)로 구문 분석했습니다. 공식 NuGet 피드에서 .nupkg 파일을 다운로드할 때와 파일 이름이 동일한지 확인하세요."
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson
new file mode 100644
index 000000000000..eca218f6a175
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Установщик платформы тестирования Visual Studio",
+ "loc.helpMarkDown": "[Пакет тестовой платформы на сайте NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "Получите тестовую платформу с сайта nuget.org или из кэша инструментов. Удовлетворяет запросу \"vstest\" и может использоваться для выполнения тестов и сбора диагностических данных с помощью задачи тестирования Visual Studio.",
+ "loc.instanceNameFormat": "Установщик платформы тестирования Visual Studio",
+ "loc.group.displayName.packageSettings": "Параметры пакета",
+ "loc.input.label.packageFeedSelector": "Веб-канал пакета",
+ "loc.input.help.packageFeedSelector": "Укажите веб-канал, из которого необходимо получить пакет nuget платформы тестирования Visual Studio.",
+ "loc.input.label.versionSelector": "Версия",
+ "loc.input.help.versionSelector": "Выберите, следует ли установить последнюю версию или конкретную версию тестовой платформы Visual Studio. Если вы используете установщик тестовой платформы для выполнения закодированных тестов пользовательского интерфейса, убедитесь, что выбранная версия соответствует основному номеру версии Visual Studio, с помощью которой были собраны созданы тестовые двоичные файлы. Например, если проект закодированных тестов пользовательского интерфейса был создан с помощью Visual Studio 2017 (версия 15.x), необходимо использовать тестовую платформу версии 15.x.",
+ "loc.input.label.testPlatformVersion": "Версия платформы тестирования",
+ "loc.input.help.testPlatformVersion": "Укажите версию платформы тестирования Visual Studio, которую следует установить на компьютере агента. Доступные версии можно просмотреть в nuget.",
+ "loc.input.label.customFeed": "Источник пакета",
+ "loc.input.help.customFeed": "Получите пакет testplatform из указанного веб-канала пакетов. Веб-канал может быть общедоступным или частным.",
+ "loc.input.label.username": "Имя пользователя",
+ "loc.input.help.username": "Имя пользователя для проверки подлинности в указанном веб-канале. Если в качестве пароля предоставляется личный маркер доступа, имя пользователя указывать необязательно.",
+ "loc.input.label.password": "Пароль",
+ "loc.input.help.password": "Пароль или личный маркер доступа для проверки подлинности в указанном веб-канале.",
+ "loc.input.label.netShare": "UNC-путь",
+ "loc.input.help.netShare": "Укажите полный UNC-путь к файлу nupkg microsoft.testplatform.",
+ "loc.messages.StartingInstaller": "Запускается задача установщика средств платформы VsTest.",
+ "loc.messages.ProvideExplicitVersion": "Указанная версия (%s) не является явно заданной. Укажите номер версии в формате основной_номер.дополнительный_номер.номер_исправления.",
+ "loc.messages.NoPackageFoundInCache": "Не удалось найти стабильную версию пакета платформы тестирования в кэше.",
+ "loc.messages.OnlyWindowsOsSupported": "Эта задача поддерживается только в агентах Windows и не может использоваться на других платформах.",
+ "loc.messages.RequiredVersionNotListed": "Требуемая версия пакета Microsoft.Testplatform не была приведена в канале nuget. Идет поиск последней стабильной версии в кэше.",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "Не удалось получить список доступных пакетов из nuget. Идет поиск последней стабильной версии в кэше.",
+ "loc.messages.FailedToAcquireTestPlatform": "Не удалось получить тестовую платформу. Присвойте переменной system.debug значение true и обратитесь к журналам отладки для получения дополнительных сведений.",
+ "loc.messages.InstallationSuccessful": "VsTest будет использовать пакет тестовой платформы, найденный в %s.",
+ "loc.messages.TestPlatformDownloadFailed": "Не удалось скачать версию %s платформы тестирования из-за ошибки %s.",
+ "loc.messages.LookingForLatestStableVersion": "Идет поиск последней стабильной версии Microsoft.Testplatform.",
+ "loc.messages.LookingForLatestPreReleaseVersion": "Идет поиск последней предварительной версии Microsoft.Testplatform.",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "Убедитесь, что путь к рабочему каталогу агента короче 50 символов, чтобы гарантировать скачивание пакета платформы тестирования.",
+ "loc.messages.ListPackagesFailed": "Не удалось перечислить пакеты. Программа NuGet.exe вернула %s.\nСтандартная ошибка:\n%sСтандартный вывод:\n%s",
+ "loc.messages.NugetErrorCode": "Программа NuGet.exe вернула код ошибки: %s",
+ "loc.messages.UpgradeAgentMessage": "Обновите агент до последней доступной версии в https://github.com/Microsoft/vsts-agent/releases.",
+ "loc.messages.SpecifiedFileDoesNotExist": "Указанный путь %s не существует, не является допустимым файлом или недоступен. Укажите допустимый путь к файлу nupkg microsoft.testplatform, который требуется установить.",
+ "loc.messages.UnexpectedFileName": "Не удалось извлечь сведения о версии из файла %s. Не переименовывайте файл nupkg microsoft.testplatform, скачанный с сайта nuget.org. Если вы переименовали его, скачайте его повторно или восстановите его исходное имя.",
+ "loc.messages.ConfigFileWriteFailed": "Не удалось записать файл nuget.config %s из-за ошибки %s",
+ "loc.messages.LatestStableCached": "Поиск последней стабильной версии в кэше.",
+ "loc.messages.DownloadFailed": "Сбой скачивания с кодом ошибки: %s.",
+ "loc.messages.ExpectedTempToBeSet": "Переменная Agent.TempDirectory должна быть задана.",
+ "loc.messages.ParsedVersion": "В результате анализа имени файла версия пакета Microsoft.Testplatform была определена как %s. Убедитесь в том, что имя файла не изменилось с момента скачивания файла NUPKG из официального веб-канала nuget."
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson
new file mode 100644
index 000000000000..f7731ef39e7b
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Visual Studio 测试平台安装程序",
+ "loc.helpMarkDown": "[NuGet 上的测试平台包](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "从 nuget.org 或工具缓存中获取测试平台。满足 \"vstest\" 需求,并可用于运行测试和使用 Visual Studio 测试任务收集诊断数据。",
+ "loc.instanceNameFormat": "Visual Studio 测试平台安装程序",
+ "loc.group.displayName.packageSettings": "包设置",
+ "loc.input.label.packageFeedSelector": "包源",
+ "loc.input.help.packageFeedSelector": "指定应在其中提取 Visual Studio 测试平台 nuget 包的源。",
+ "loc.input.label.versionSelector": "版本",
+ "loc.input.help.versionSelector": "选择是安装最新版本还是特定版本的 Visual Studio 测试平台。 如果使用测试平台安装程序运行编码的 UI 测试,请确保所选版本与通过其生成了测试二进制文件的 Visual Studio 的主要版本匹配。例如,如果编码的 UI 测试项目是使用 Visual Studio 2017 (版本 15.x)生成的,则必须使用测试平台版本 15.x。",
+ "loc.input.label.testPlatformVersion": "测试平台版本",
+ "loc.input.help.testPlatformVersion": "指定安装在代理上的 Visual Studio 测试平台版本。可在 nuget 中查看可用版本。",
+ "loc.input.label.customFeed": "包源",
+ "loc.input.help.customFeed": "从指定包源中提取 testplatform 包。可以是公共源,也可以是私有源。",
+ "loc.input.label.username": "用户名",
+ "loc.input.help.username": "用于对指定源进行身份验证的用户名。如果提供 PAT 令牌作为密码,则用户名是可选的。",
+ "loc.input.label.password": "密码",
+ "loc.input.help.password": "用于对指定源进行身份验证的密码或个人访问令牌。",
+ "loc.input.label.netShare": "UNC 路径",
+ "loc.input.help.netShare": "指定 microsoft.testplatform nupkg 文件的完整 UNC 路径。",
+ "loc.messages.StartingInstaller": "正在启动 VsTest 平台工具安装程序任务。",
+ "loc.messages.ProvideExplicitVersion": "提供的版本(%s)不是显式版本。请提供窗体 majorVer.minorVer.patchVer 的版本号。",
+ "loc.messages.NoPackageFoundInCache": "未能在缓存中找到任何稳定版本的测试平台包。",
+ "loc.messages.OnlyWindowsOsSupported": "此任务仅在 Windows 代理上受支持,而无法用于其他平台。",
+ "loc.messages.RequiredVersionNotListed": "nuget 源中未列所需版本的 Microsoft.Testplatform 包,正在查找已缓存的最新稳定版本。",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "未能从 nuget 提取可用包列表,正在查找已缓存的最新稳定版本。",
+ "loc.messages.FailedToAcquireTestPlatform": "无法获取测试平台。请将 system.debug 设置为 true 并参阅调试日志以了解其他信息。",
+ "loc.messages.InstallationSuccessful": "VsTest 将使用在 %s 中找到的测试平台包",
+ "loc.messages.TestPlatformDownloadFailed": "无法下载 %s 版本的测试平台,错误为 %s。",
+ "loc.messages.LookingForLatestStableVersion": "正在查找最新稳定版本的 Microsoft.Testplatform。",
+ "loc.messages.LookingForLatestPreReleaseVersion": "正在查找最新预发布版本的 Microsoft.Testplatform。",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "请确保代理工作目录路径少于 50 个字符以保证测试平台包下载成功。",
+ "loc.messages.ListPackagesFailed": "列出包失败。Nuget.exe 返回了 %s。\n标准错误:\n%s标准输出:\n%s",
+ "loc.messages.NugetErrorCode": "Nuget.exe 返回了错误代码: %s",
+ "loc.messages.UpgradeAgentMessage": "请将代理升级到 https://github.com/Microsoft/vsts-agent/releases 中提供的最新版本。",
+ "loc.messages.SpecifiedFileDoesNotExist": "提供的路径 %s 不存在、不是有效文件或不可访问。请提供要安装的 microsoft.testplatform nupkg 文件的有效路径。",
+ "loc.messages.UnexpectedFileName": "无法从文件 %s 提取版本信息。请勿重命名从 nuget.org 下载的 microsoft.testplatform nupkg 文件。如果已重命名,请重新下载该文件或将其重新重命名为原始名称。",
+ "loc.messages.ConfigFileWriteFailed": "未能写入 nuget.config 文件 %s,错误为 %s",
+ "loc.messages.LatestStableCached": "查找已缓存的最新稳定版本。",
+ "loc.messages.DownloadFailed": "下载失败,错误代码: %s。",
+ "loc.messages.ExpectedTempToBeSet": "Agent.TempDirectory 待设置。",
+ "loc.messages.ParsedVersion": "已将 Microsoft.Testplatform 包的版本从文件名分析为 %s。请确保该文件名与从官方 nuget 源下载 .nupkg 文件时的名称相同。"
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson
new file mode 100644
index 000000000000..49928c256d74
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson
@@ -0,0 +1,43 @@
+{
+ "loc.friendlyName": "Visual Studio 測試平台安裝程式",
+ "loc.helpMarkDown": "[NuGet 上的測試平台套件](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "loc.description": "從 nuget.org 或工具快取取得測試平台。滿足 ‘vstest’ 需求且可用於執行測試,以及使用 Visual Studio Test 工作收集診斷資料。",
+ "loc.instanceNameFormat": "Visual Studio 測試平台安裝程式",
+ "loc.group.displayName.packageSettings": "套件設定",
+ "loc.input.label.packageFeedSelector": "套件摘要",
+ "loc.input.help.packageFeedSelector": "請指定應從其中擷取 Visual Studio 測試平台 nuget 套件的摘要。",
+ "loc.input.label.versionSelector": "版本",
+ "loc.input.help.versionSelector": "請挑選要安裝 Visual Studio 測試平台的最新版本或特定版本。 如果您使用測試平台安裝程式來執行自動程式化 UI 測試,請確保您選擇的版本符合已建置測試二進位的 Visual Studio 主要版本。舉例來說,若自動程式化 UI 測試專案是以 Visual Studio 2017 (15.x 版) 建置而成,您就必須使用測試平台 15.x 版。",
+ "loc.input.label.testPlatformVersion": "測試平台版本",
+ "loc.input.help.testPlatformVersion": "指定代理程式上要安裝的 Visual Studio 測試平台版本。前往 nuget 可檢視可用的版本。",
+ "loc.input.label.customFeed": "套件來源",
+ "loc.input.help.customFeed": "從指定的套件摘要擷取 testplatform 套件。可以是公用或私用摘要。",
+ "loc.input.label.username": "使用者名稱",
+ "loc.input.help.username": "用於對指定摘要驗證的使用者名稱。若將 PAT 權杖作為密碼提供,則可不提供使用者名稱。",
+ "loc.input.label.password": "密碼",
+ "loc.input.help.password": "用於向指定摘要驗證的密碼或個人存取權杖。",
+ "loc.input.label.netShare": "UNC 路徑",
+ "loc.input.help.netShare": "請指定 microsoft.testplatform nupkg 檔案的完整 UNC 路徑。",
+ "loc.messages.StartingInstaller": "正在啟動 VsTest 平台工具安裝程式工作。",
+ "loc.messages.ProvideExplicitVersion": "您提供的版本 (%s) 不是明確的版本。請提供格式為 majorVer.minorVer.patchVer 的版本號碼。",
+ "loc.messages.NoPackageFoundInCache": "在快取中找不到任何測試平台套件的穩定版本。",
+ "loc.messages.OnlyWindowsOsSupported": "只有 Windows 代理程式支援此工作,而無法用於其他平台。",
+ "loc.messages.RequiredVersionNotListed": "Microsoft.Testplatform 套件的必要版本未列在 nuget 摘要中,正在尋找快取到的最新穩定版本。",
+ "loc.messages.FailedToListAvailablePackagesFromNuget": "無法從 nuget 擷取可用套件的清單,正在尋找快取到的最新穩定版本。",
+ "loc.messages.FailedToAcquireTestPlatform": "無法取得測試平台。請將 system.debug 設為 true,並查看偵錯記錄以取得額外資訊。",
+ "loc.messages.InstallationSuccessful": "VsTest 會使用 %s 中找到的測試平台套件",
+ "loc.messages.TestPlatformDownloadFailed": "無法下載測試平台的 %s 版本。錯誤: %s。",
+ "loc.messages.LookingForLatestStableVersion": "正在尋找 Microsoft.Testplatform 的最新穩定版本。",
+ "loc.messages.LookingForLatestPreReleaseVersion": "正在尋找 Microsoft.Testplatform 的最新發行前版本。",
+ "loc.messages.AgentWorkDirectoryPathTooLong": "請確定代理程式工作目錄路徑長度少於 50 個字元,以確保測試平台套件能夠成功下載。",
+ "loc.messages.ListPackagesFailed": "列出套件失敗。Nuget.exe 傳回 %s。\n標準錯誤:\n%s標準輸出:\n%s",
+ "loc.messages.NugetErrorCode": "Nuget.exe 傳回錯誤碼: %s",
+ "loc.messages.UpgradeAgentMessage": "請將您的代理程式升級為 https://github.com/Microsoft/vsts-agent/releases 中最新的可用版本。",
+ "loc.messages.SpecifiedFileDoesNotExist": "提供的路徑 %s 不存在、不是有效檔案或無法存取。請為您要安裝的 microsoft.testplatform nupkg 檔案提供有效路徑。",
+ "loc.messages.UnexpectedFileName": "無法從檔案 %s 擷取版本資訊。請勿將從 nuget.org 下載的 microsoft.testplatform nupkg 檔案重新命名。若已重新命名,則請重新下載檔案或將其命名回原始名稱。",
+ "loc.messages.ConfigFileWriteFailed": "無法寫入 nuget.config 檔案 %s。錯誤: %s",
+ "loc.messages.LatestStableCached": "正在尋找快取到的最新穩定版本。",
+ "loc.messages.DownloadFailed": "下載失敗。錯誤碼: %s。",
+ "loc.messages.ExpectedTempToBeSet": "應設定 Agent.TempDirectory。",
+ "loc.messages.ParsedVersion": "已將 Microsoft.Testplatform 套件版本剖析為檔案名稱中的 %s。請確認檔案名稱與從官方 nuget 摘要下載 .nupkg 檔案時相同。"
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/L0.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/L0.ts
new file mode 100644
index 000000000000..d3694f854e4d
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/L0.ts
@@ -0,0 +1,699 @@
+import * as path from 'path';
+import * as assert from 'assert';
+import * as ttm from 'azure-pipelines-task-lib/mock-test';
+import * as constants from '../constants';
+import * as testConstants from './TestConstants';
+import * as tl from 'azure-pipelines-task-lib';
+
+describe('VsTestPlatformToolInstaller Suite', function() {
+ this.timeout(10000);
+
+ if (!tl.osType().match(/^Win/)) {
+ return;
+ }
+
+ before((done) => {
+ done();
+ });
+
+ beforeEach((done) => {
+ // Clear all inputs and other environment variables
+ delete process.env[constants.vsTestToolsInstallerInstalledToolLocation];
+ delete process.env[constants.versionSelector];
+ delete process.env[constants.testPlatformVersion];
+ delete process.env[constants.downloadPath];
+ delete process.env[testConstants.expectedTestPlatformVersion];
+ delete process.env[testConstants.findLocalToolFirstCallReturnValue];
+ delete process.env[testConstants.findLocalToolSecondCallReturnValue];
+ delete process.env[testConstants.listPackagesReturnCode];
+ delete process.env[testConstants.listPackagesOutput];
+ delete process.env[constants.username];
+ delete process.env[constants.password];
+ delete process.env[testConstants.feedId];
+ delete process.env[constants.packageFeedSelector];
+ delete process.env[constants.customFeed];
+ delete process.env[testConstants.packageSource];
+ delete process.env[testConstants.configFile];
+
+ process.env[constants.packageFeedSelector] = constants.nugetOrg;
+ process.env[testConstants.packageSource] = constants.defaultPackageSource;
+ process.env[testConstants.writeNugetConfigReturnCode] = '0';
+ process.env[constants.agentTempDirectory] = 'temp';
+ process.env[constants.downloadPath] = `${process.env[constants.agentTempDirectory]}\\VsTest`;
+
+ done();
+ });
+
+ after(function () {
+ // add code for cleanup if any
+ });
+
+ // *************************************************** Nuget Org Tests ******************************************************
+
+ it('Get latest pre-release version cache hit', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+ process.env[testConstants.listPackagesReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Expected a cache hit.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version cache miss and download success', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.downloadPackageReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Could not find Microsoft.TestPlatform.${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache. Fetching it from nuget.`), `Should have encountered a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Downloading Test Platform version ${process.env[testConstants.expectedTestPlatformVersion]} from ${process.env[testConstants.packageSource]} to ${process.env[constants.downloadPath]}.`), `Should have attempted download of version ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Caching the downloaded folder temp\\VsTest\\${constants.packageId}.${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have cached ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version listing failed but a stable version found in cache', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = 'x';
+ process.env[testConstants.listPackagesReturnCode] = '1';
+ process.env[testConstants.downloadPackageReturnCode] = '0';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\17.5.0`;
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`FailedToListAvailablePackagesFromNuget`), `Listing packages should have failed.`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Should have been a cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to ${process.env[testConstants.findLocalToolFirstCallReturnValue]}.`), `Should have set variable to ${process.env[testConstants.findLocalToolFirstCallReturnValue]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version listing failed but no stable version found in cache', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.listPackagesReturnCode] = '1';
+ process.env[testConstants.downloadPackageReturnCode] = '0';
+ process.env[testConstants.expectedTestPlatformVersion] = 'x';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length !== 0 || tr.errorIssues.length, 'should have written to stderr');
+ assert(tr.failed, `Task should have failed`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`FailedToListAvailablePackagesFromNuget`), `Listing packages should have failed.`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Should have been a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained('NoPackageFoundInCache'), `Should warn no stable package found in cache`);
+ assert(tr.stdOutContained('FailedToAcquireTestPlatform'), `Should fail with failed to acquire test platform`);
+
+ done();
+ });
+
+ it('Get latest pre-release version cache miss and download failed but fallback cache hit', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.downloadPackageReturnCode] = '1';
+ process.env[testConstants.findLocalToolSecondCallReturnValue] = `VsTest\\17.5.0`;
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Could not find Microsoft.TestPlatform.${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache. Fetching it from nuget.`), `Should have encountered a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Downloading Test Platform version ${process.env[testConstants.expectedTestPlatformVersion]} from ${process.env[testConstants.packageSource]} to ${process.env[constants.downloadPath]}.`), `Should have attempted download of version ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`TestPlatformDownloadFailed`), `Download should have failed`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to ${process.env[testConstants.findLocalToolSecondCallReturnValue]}.`), `Should have set variable to ${process.env[testConstants.findLocalToolSecondCallReturnValue]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version cache miss and download failed and fallback cache miss', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.downloadPackageReturnCode] = '1';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length !== 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.failed, `Task should have failed`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Could not find Microsoft.TestPlatform.${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache. Fetching it from nuget.`), `Should have encountered a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Downloading Test Platform version ${process.env[testConstants.expectedTestPlatformVersion]} from ${process.env[testConstants.packageSource]} to ${process.env[constants.downloadPath]}.`), `Should have attempted download of version ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`TestPlatformDownloadFailed`), `Download should have failed`);
+ process.env[testConstants.expectedTestPlatformVersion] = 'x';
+ assert(tr.stdOutContained(`Cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Should have been a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained('NoPackageFoundInCache'), `Should warn no stable package found in cache`);
+ assert(tr.stdOutContained('FailedToAcquireTestPlatform'), `Should fail with failed to acquire test platform`);
+
+ done();
+ });
+
+ it('Get latest stable version cache hit', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'latestStable';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+ process.env[testConstants.listPackagesReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestStableVersion`), `Should have looked for latest stable version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Expected a cache hit.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest stable version listing empty and cache hit', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'latestStable';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = 'x';
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\17.5.0`;
+ process.env[testConstants.listPackagesOutput] = '';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestStableVersion`), `Should have looked for latest stable version.`);
+ assert(tr.stdOutContained(`FailedToListAvailablePackagesFromNuget`), `Listing packages should have failed.`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Should have been a cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to ${process.env[testConstants.findLocalToolFirstCallReturnValue]}.`), `Should have set variable to ${process.env[testConstants.findLocalToolFirstCallReturnValue]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get specific version cache hit', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'specificVersion';
+ process.env[constants.testPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Expected a cache hit.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get specific version cache miss and download success', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.versionSelector] = 'specificVersion';
+ process.env[constants.testPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.downloadPackageReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Could not find Microsoft.TestPlatform.${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache. Fetching it from nuget.`), `Should have encountered a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Downloading Test Platform version ${process.env[testConstants.expectedTestPlatformVersion]} from ${process.env[testConstants.packageSource]} to ${process.env[constants.downloadPath]}.`), `Should have attempted download of version ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Caching the downloaded folder temp\\VsTest\\${constants.packageId}.${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have cached ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ // ***************************************************** Custom Feed Tests *************************************************************
+
+ it('Get latest pre-release version cache hit from custom feed no password', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.packageFeedSelector] = constants.customFeed;
+ process.env[constants.customFeed] = 'somecustomfeed';
+ process.env[testConstants.packageSource] = 'somecustomfeed';
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+ process.env[testConstants.listPackagesReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Expected a cache hit.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version cache hit from custom feed and password provided', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.password] = 'pattoken';
+ process.env[testConstants.feedId] = 'somefeedid';
+ process.env[constants.packageFeedSelector] = constants.customFeed;
+ process.env[constants.customFeed] = 'somecustomfeed';
+ process.env[testConstants.packageSource] = 'somefeedid';
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[testConstants.configFile] = `${process.env[constants.agentTempDirectory]}\\somefeedid.config`;
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+ process.env[testConstants.listPackagesReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Expected a cache hit.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version cache hit from custom feed username and password provided', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.username] = 'someuser';
+ process.env[constants.password] = 'pattoken';
+ process.env[testConstants.feedId] = 'somefeedid';
+ process.env[constants.packageFeedSelector] = constants.customFeed;
+ process.env[constants.customFeed] = 'somecustomfeed';
+ process.env[testConstants.packageSource] = 'somefeedid';
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[testConstants.configFile] = `${process.env[constants.agentTempDirectory]}\\somefeedid.config`;
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+ process.env[testConstants.listPackagesReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(constants.emptyNugetConfig), `Should have written skeleton nuget config file contents.`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Expected a cache hit.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Deleted file ${process.env[testConstants.configFile]}`), `Should have cleaned up the temp config file.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version cache miss and download success for custom feed with password', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.password] = 'pattoken';
+ process.env[testConstants.feedId] = 'somefeedid';
+ process.env[constants.packageFeedSelector] = constants.customFeed;
+ process.env[constants.customFeed] = 'somecustomfeed';
+ process.env[testConstants.packageSource] = 'somefeedid';
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[testConstants.configFile] = `${process.env[constants.agentTempDirectory]}\\somefeedid.config`;
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.downloadPackageReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`LookingForLatestPreReleaseVersion`), `Should have looked for latest pre-release version.`);
+ assert(tr.stdOutContained(`Found the latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have found latest version to be ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Could not find Microsoft.TestPlatform.${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache. Fetching it from nuget.`), `Should have encountered a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Downloading Test Platform version ${process.env[testConstants.expectedTestPlatformVersion]} from ${process.env[testConstants.packageSource]} to ${process.env[constants.downloadPath]}.`), `Should have attempted download of version ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Caching the downloaded folder temp\\VsTest\\${constants.packageId}.${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have cached ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version cache hit from custom feed, password provided but writing config fails', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.password] = 'pattoken';
+ process.env[testConstants.feedId] = 'somefeedid';
+ process.env[constants.packageFeedSelector] = constants.customFeed;
+ process.env[constants.customFeed] = 'somecustomfeed';
+ process.env[testConstants.packageSource] = 'somefeedid';
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[testConstants.configFile] = `${process.env[constants.agentTempDirectory]}\\somefeedid.config`;
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = 'x';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.writeNugetConfigReturnCode] = '1';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length !== 0 || tr.errorIssues.length, 'should have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`ConfigFileWriteFailed`), `Config file write should have failed and error message for it shown.`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Expected a cache hit.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get latest pre-release version cache hit from custom feed, password provided but writing config fails and fallback cache lookup fails', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.password] = 'pattoken';
+ process.env[testConstants.feedId] = 'somefeedid';
+ process.env[constants.packageFeedSelector] = constants.customFeed;
+ process.env[constants.customFeed] = 'somecustomfeed';
+ process.env[testConstants.packageSource] = 'somefeedid';
+ process.env[constants.versionSelector] = 'latestPreRelease';
+ process.env[testConstants.configFile] = `${process.env[constants.agentTempDirectory]}\\somefeedid.config`;
+ process.env[constants.testPlatformVersion] = '';
+ process.env[testConstants.expectedTestPlatformVersion] = 'x';
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.writeNugetConfigReturnCode] = '1';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length !== 0 || tr.errorIssues.length, 'should have written to stderr');
+ assert(tr.failed, `Task should have failed`);
+ assert(tr.stdOutContained(`ConfigFileWriteFailed`), `Config file write should have failed and error message for it shown.`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Should have been a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained('NoPackageFoundInCache'), `Should warn no stable package found in cache`);
+ assert(tr.stdOutContained('FailedToAcquireTestPlatform'), `Should fail with failed to acquire test platform`);
+
+ done();
+ });
+
+ // ***************************************************** Network Share Tests *************************************************************
+
+ it('Get specified package from path provided from network share cache hit', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.packageFeedSelector] = constants.netShare;
+ process.env[testConstants.packageSource] = '\\somesharepath';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+ process.env[constants.netShare] = `\\\\somesharepath\\Microsoft.Testplatform.${process.env[testConstants.expectedTestPlatformVersion]}.nupkg`;
+ process.env[testConstants.listPackagesReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Cache hit for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Expected a cache hit.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get specified package from path provided from network share cache miss and copy successful', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.packageFeedSelector] = constants.netShare;
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[constants.netShare] = `\\\\somesharepath\\Microsoft.Testplatform.${process.env[testConstants.expectedTestPlatformVersion]}.nupkg`;
+ process.env[testConstants.packageSource] = process.env[constants.netShare];
+ process.env[testConstants.listPackagesReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Could not find Microsoft.TestPlatform.${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache. Fetching it from nuget.`), `Should have encountered a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get specified package from path provided from network share cache miss share and copy unsuccessful but fallback cache lookup successful', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.packageFeedSelector] = constants.netShare;
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[constants.netShare] = `\\\\somesharepath\\Microsoft.Testplatform.${process.env[testConstants.expectedTestPlatformVersion]}.nupkg`;
+ process.env[testConstants.packageSource] = process.env[constants.netShare];
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.downloadPackageReturnCode] = '1';
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = ``;
+ process.env[testConstants.findLocalToolSecondCallReturnValue] = `VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}`;
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.succeeded, `Task should have succeeded`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Could not find Microsoft.TestPlatform.${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache. Fetching it from nuget.`), `Should have encountered a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Set variable VsTestToolsInstallerInstalledToolLocation value to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`), `Should have set variable to VsTest\\${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained('InstallationSuccessful'));
+
+ done();
+ });
+
+ it('Get specified package from path provided from network share cache miss and copy unsuccessful and fallback cache lookup unsuccessful', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.packageFeedSelector] = constants.netShare;
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[constants.netShare] = `\\\\somesharepath\\Microsoft.Testplatform.${process.env[testConstants.expectedTestPlatformVersion]}.nupkg`;
+ process.env[testConstants.packageSource] = process.env[constants.netShare];
+ process.env[testConstants.listPackagesReturnCode] = '0';
+ process.env[testConstants.downloadPackageReturnCode] = '1';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.failed, `Task should have succeeded`);
+ assert(tr.stdOutContained(`Looking for version ${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache.`), `Should have looked for ${process.env[testConstants.expectedTestPlatformVersion]} in the cache.`);
+ assert(tr.stdOutContained(`Could not find Microsoft.TestPlatform.${process.env[testConstants.expectedTestPlatformVersion]} in the tools cache. Fetching it from nuget.`), `Should have encountered a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}.`);
+ assert(tr.stdOutContained(`Cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}`), `Should have been a cache miss for ${process.env[testConstants.expectedTestPlatformVersion]}`);
+ assert(tr.stdOutContained('NoPackageFoundInCache'), `Should warn no stable package found in cache`);
+ assert(tr.stdOutContained('FailedToAcquireTestPlatform'), `Should fail with failed to acquire test platform`);
+
+ done();
+ });
+
+ it('Get specified package from path provided from network share invalid filename', (done: MochaDone) => {
+
+ // Setup the mock runner
+ const tp = path.join(__dirname, 'TestSetup.js');
+ const tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+
+ // Set the inputs
+ process.env[constants.packageFeedSelector] = constants.netShare;
+ process.env[testConstants.packageSource] = '\\somesharepath';
+ process.env[testConstants.expectedTestPlatformVersion] = '17.5.0-preview-20221003-04';
+ process.env[constants.netShare] = `\\\\somesharepath\\Miiiicrosoft.Testplatform.${process.env[testConstants.expectedTestPlatformVersion]}.nupkg`;
+ process.env[testConstants.listPackagesReturnCode] = '0';
+
+ // Start the run
+ tr.run();
+
+ // Asserts
+ assert(tr.stderr.length === 0 || tr.errorIssues.length, 'should not have written to stderr');
+ assert(tr.failed, `Task should have failed`);
+ assert(tr.stdOutContained(`UnexpectedFileName`));
+
+ done();
+ });
+});
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestConstants.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestConstants.ts
new file mode 100644
index 000000000000..c9d1b6022fcb
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestConstants.ts
@@ -0,0 +1,13 @@
+export const downloadPath = 'downloadPath';
+export const expectedTestPlatformVersion = 'expectedTestPlatformVersion';
+export const findLocalToolFirstCallReturnValue = 'findLocalToolFirstCallReturnValue';
+export const findLocalToolSecondCallReturnValue = 'findLocalToolSecondCallReturnValue';
+export const listPackagesReturnCode = 'listPackagesReturnCode';
+export const downloadPackageReturnCode = 'downloadPackageReturnCode';
+export const writeNugetConfigReturnCode = 'writeNugetConfigReturnCode';
+export const secondCacheLookup = 'secondCacheLookup';
+export const listPackagesOutput = 'listPackagesOutput';
+export const latestPreRelease = 'latestPreRelease';
+export const packageSource = 'packageSource';
+export const configFile = 'configFile';
+export const feedId = 'feedId';
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestHelpers.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestHelpers.ts
new file mode 100644
index 000000000000..507863e429c6
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestHelpers.ts
@@ -0,0 +1,14 @@
+export function addArg(commandLine: string, arg: string) : string {
+ if (isNullEmptyOrUndefined(arg)) {
+ return commandLine;
+ }
+
+ if (isNullEmptyOrUndefined(commandLine)) {
+ return arg;
+ }
+ return commandLine + ' ' + arg;
+}
+
+export function isNullEmptyOrUndefined(obj: any) {
+ return obj === null || obj === '' || obj === undefined;
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestSetup.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestSetup.ts
new file mode 100644
index 000000000000..a641b0ec5ae1
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/TestSetup.ts
@@ -0,0 +1,232 @@
+import * as ma from 'azure-pipelines-task-lib/mock-answer';
+import * as tmrm from 'azure-pipelines-task-lib/mock-run';
+import * as testConstants from './TestConstants';
+import * as testHelpers from './TestHelpers';
+import * as constants from '../constants';
+import * as path from 'path';
+
+// Get the task path
+const taskPath = path.join(__dirname, '..', 'vstestplatformtoolinstaller.js');
+const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
+
+// Set inputs
+if (!testHelpers.isNullEmptyOrUndefined(process.env[constants.packageFeedSelector])) {
+ tr.setInput(constants.packageFeedSelector, process.env[constants.packageFeedSelector]);
+}
+
+if (!testHelpers.isNullEmptyOrUndefined(process.env[constants.versionSelector])) {
+ tr.setInput(constants.versionSelector, process.env[constants.versionSelector]);
+}
+
+if (!testHelpers.isNullEmptyOrUndefined(process.env[constants.testPlatformVersion])) {
+ tr.setInput(constants.testPlatformVersion, process.env[constants.testPlatformVersion]);
+}
+
+if (!testHelpers.isNullEmptyOrUndefined(process.env[constants.customFeed])) {
+ tr.setInput(constants.customFeed, process.env[constants.customFeed]);
+}
+
+if (!testHelpers.isNullEmptyOrUndefined(process.env[constants.username])) {
+ tr.setInput(constants.username, process.env[constants.username]);
+}
+
+if (!testHelpers.isNullEmptyOrUndefined(process.env[constants.password])) {
+ tr.setInput(constants.password, process.env[constants.password]);
+}
+
+if (!testHelpers.isNullEmptyOrUndefined(process.env[constants.netShare])) {
+ tr.setInput(constants.netShare, process.env[constants.netShare]);
+}
+
+const expectedTestPlatformVersion = process.env[testConstants.expectedTestPlatformVersion];
+const nugetToolPath = path.join(__dirname, '..', 'nuget.exe');
+const downloadPath = process.env[constants.downloadPath];
+
+// Construct commands to be mocked
+let listPackagesCommand = '';
+listPackagesCommand = testHelpers.addArg(listPackagesCommand, nugetToolPath);
+listPackagesCommand = testHelpers.addArg(listPackagesCommand, constants.list);
+if (process.env[constants.packageFeedSelector] === constants.nugetOrg) {
+ listPackagesCommand = testHelpers.addArg(listPackagesCommand, `packageid:${constants.packageId}`);
+} else {
+ listPackagesCommand = testHelpers.addArg(listPackagesCommand, constants.packageId);
+}
+if (process.env[constants.versionSelector] === testConstants.latestPreRelease) {
+ listPackagesCommand = testHelpers.addArg(listPackagesCommand, constants.preRelease);
+}
+listPackagesCommand = testHelpers.addArg(listPackagesCommand, constants.noninteractive);
+listPackagesCommand = testHelpers.addArg(listPackagesCommand, constants.source);
+listPackagesCommand = testHelpers.addArg(listPackagesCommand, process.env[testConstants.packageSource]);
+if (!testHelpers.isNullEmptyOrUndefined(process.env[testConstants.configFile])) {
+ listPackagesCommand = testHelpers.addArg(listPackagesCommand, constants.configFile);
+ listPackagesCommand = testHelpers.addArg(listPackagesCommand, process.env[testConstants.configFile]);
+}
+
+console.log(`List package command: ${listPackagesCommand}\n`);
+
+let downloadNugetPackageCommand = '';
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, nugetToolPath);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.install);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.packageId);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.version);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, expectedTestPlatformVersion);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.source);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, process.env[testConstants.packageSource]);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.outputDirectory);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, downloadPath);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.noCache);
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.directDownload);
+if (!testHelpers.isNullEmptyOrUndefined(process.env[testConstants.configFile])) {
+ downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.configFile);
+ downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, process.env[testConstants.configFile]);
+}
+downloadNugetPackageCommand = testHelpers.addArg(downloadNugetPackageCommand, constants.noninteractive);
+
+console.log(`Download nuget package command: ${downloadNugetPackageCommand}\n`);
+
+if (testHelpers.isNullEmptyOrUndefined(process.env[constants.username])) {
+ process.env[constants.username] = constants.defaultUsername;
+}
+
+let writeNugetConfigCommand = '';
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, nugetToolPath);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.sources);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.add);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.noninteractive);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.name);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, process.env[testConstants.feedId]);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.source);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, process.env[constants.customFeed]);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.validAuthenticationTypes);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.basic);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.usernameParam);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, process.env[constants.username]);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.passwordParam);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, process.env[constants.password]);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, constants.configFile);
+writeNugetConfigCommand = testHelpers.addArg(writeNugetConfigCommand, `${process.env[constants.agentTempDirectory]}\\${process.env[testConstants.feedId]}.config`);
+
+console.log(`Write nuget config command: ${writeNugetConfigCommand}\n`);
+
+let listPackagesCommandOutput;
+if (process.env[testConstants.listPackagesOutput] !== undefined) {
+ listPackagesCommandOutput = process.env[testConstants.listPackagesOutput];
+} else {
+ listPackagesCommandOutput = 'Microsoft.TestPlatform 17.5.0'
+ + (process.env[constants.versionSelector] === 'latestPreRelease' ? '-preview-20221003-04' : '')
+ + '\r\nMicrosoft.TestPlatform.Build 17.4.0\r\nMicrosoft.TestPlatform.CLI 17.4.0\r\nMicrosoft.TestPlatform.ObjectModel 17.4.0\r\nMicrosoft.TestPlatform.Portable 17.5.0-preview-20221003-04\r\nMicrosoft.TestPlatform.TestHost 17.4.0\r\nMicrosoft.TestPlatform.TranslationLayer 17.4.0';
+}
+
+// Construct the answers object
+const answers: ma.TaskLibAnswers = {
+ 'which': {
+ },
+ 'checkPath': {
+ },
+ 'exec': {
+ },
+ 'exist': {
+ },
+ 'stats' : {
+ }
+};
+
+// Provide answers for task mock
+if (!testHelpers.isNullEmptyOrUndefined(process.env[constants.netShare])) {
+ answers.exist[`${process.env[constants.netShare]}`] = true;
+ answers.stats[`${process.env[constants.netShare]}`] = { 'isFile': true };
+}
+answers.which[`${nugetToolPath}`] = nugetToolPath;
+answers.checkPath[`${nugetToolPath}`] = true;
+answers.exec[`${listPackagesCommand}`] = {
+ 'code': +process.env[testConstants.listPackagesReturnCode],
+ 'stdout': listPackagesCommandOutput,
+ 'stderr': ''
+};
+answers.exec[`${downloadNugetPackageCommand}`] = {
+ 'code': +process.env[testConstants.downloadPackageReturnCode],
+ 'stdout': '',
+ 'stderr': ''
+};
+answers.exec[`${writeNugetConfigCommand}`] = {
+ 'code': +process.env[testConstants.writeNugetConfigReturnCode],
+ 'stdout': '',
+ 'stderr': ''
+};
+tr.setAnswers(answers);
+
+// Mock toolrunner
+tr.registerMock('azure-pipelines-task-lib/toolrunner', require('azure-pipelines-task-lib/mock-toolrunner'));
+
+// Mock task-tool-lib
+const taskToolLibMock: any = {};
+taskToolLibMock.findLocalTool = function(tool: string, version: string): string {
+
+ if (process.env[testConstants.findLocalToolFirstCallReturnValue] !== testConstants.secondCacheLookup && process.env[testConstants.findLocalToolFirstCallReturnValue]) {
+ tl.debug(`Cache hit for ${version}`);
+ const retValue = process.env[testConstants.findLocalToolFirstCallReturnValue];
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = testConstants.secondCacheLookup;
+ return retValue;
+ }
+
+ if (process.env[testConstants.findLocalToolFirstCallReturnValue] === testConstants.secondCacheLookup && process.env[testConstants.findLocalToolSecondCallReturnValue]) {
+ tl.debug(`Cache hit for ${version}`);
+ return process.env[testConstants.findLocalToolSecondCallReturnValue];
+ }
+
+ process.env[testConstants.findLocalToolFirstCallReturnValue] = testConstants.secondCacheLookup;
+
+ tl.debug(`Cache miss for ${version}`);
+
+ return null;
+};
+taskToolLibMock.isExplicitVersion = function(version: string): boolean {
+ return true;
+};
+taskToolLibMock.cleanVersion = function(version: string): string {
+ return version;
+};
+taskToolLibMock.cacheDir = function(toolRoot: string, packageName: string, version: string): string {
+ return path.join(packageName, version);
+};
+tr.registerMock('azure-pipelines-tool-lib/tool', taskToolLibMock);
+
+// Create mock for getVariable
+const tl = require('azure-pipelines-task-lib/mock-task');
+const tlClone = Object.assign({}, tl);
+tlClone.getVariable = function(variable: string) {
+ return process.env[variable];
+};
+// Create a mock for asser agent
+tlClone.assertAgent = function(variable: string) {
+ return;
+};
+// Register the tl mock
+tr.registerMock('azure-pipelines-task-lib/mock-task', tlClone);
+
+const uuid = require('uuid');
+// Create a mock for the uuid module
+const uuidClone = Object.assign({}, uuid);
+uuidClone.v1 = function() {
+ return process.env[testConstants.feedId];
+};
+
+tr.registerMock('uuid', uuidClone);
+
+const fs = require('fs');
+// Create a mock for fs operations
+const fsClone = Object.assign({}, fs);
+fsClone.writeFileSync = function(filePath: string, contents: string, options?: string) {
+ console.log(contents);
+ return;
+};
+// mock unlink
+fsClone.unlinkSync = function(filePath: string) {
+ console.log(`Deleted file ${filePath}`);
+ return;
+};
+
+tr.registerMock('fs', fsClone);
+
+// Start the run
+tr.run();
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/package-lock.json b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/package-lock.json
new file mode 100644
index 000000000000..d230de9c1529
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/package-lock.json
@@ -0,0 +1,14 @@
+{
+ "name": "vstestplatform-tool-installer",
+ "version": "1.0.4",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@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
+ }
+ }
+}
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/package.json b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/package.json
new file mode 100644
index 000000000000..af3e777b22d6
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/Tests/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "vstestplatform-tool-installer",
+ "version": "1.0.4",
+ "description": "Visual Studio Test Platform Installer",
+ "main": "vstestplatformtoolInstaller.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git"
+ },
+ "keywords": [
+ "Azure",
+ "Pipelines",
+ "Tasks",
+ "VsTestplatform",
+ "VsTest"
+ ],
+ "author": "Microsoft Corporation",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues"
+ },
+ "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme",
+ "devDependencies": {
+ "@types/mocha": "^5.2.7"
+ }
+}
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/cieventlogger.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/cieventlogger.ts
new file mode 100644
index 000000000000..ce50b9280974
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/cieventlogger.ts
@@ -0,0 +1,38 @@
+import * as tl from 'azure-pipelines-task-lib/task';
+
+const area: string = 'TestExecution';
+const feature: string = 'VsTestToolsInstaller';
+const consolidatedCiData: { [key: string]: any; } = <{ [key: string]: any; }>{};
+
+function getDefaultProps() {
+ return {
+ releaseuri: tl.getVariable('Release.ReleaseUri'),
+ releaseid: tl.getVariable('Release.ReleaseId'),
+ builduri: tl.getVariable('Build.BuildUri'),
+ buildid: tl.getVariable('Build.Buildid')
+ };
+}
+
+export function addToConsolidatedCi(key: string, value: any) {
+ consolidatedCiData[key] = value;
+}
+
+export function fireConsolidatedCi() {
+ publishEvent('vstestToolInstallerConsolidatedCiEvent', consolidatedCiData);
+}
+
+export function publishEvent(subFeature: string, properties: { [key: string]: any }): void {
+ try {
+ tl.assertAgent('2.125.0');
+ properties.subFeature = subFeature;
+ publishTelemetry(area, feature, Object.assign(getDefaultProps(), properties));
+ } catch (err) {
+ tl.debug(`Unable to publish telemetry due to lower agent version.`);
+ }
+}
+
+export function publishTelemetry(area: string, feature: string, properties: { [key: string]: any }): void {
+ const data = JSON.stringify(properties);
+ tl.debug('telemetry area: ' + area + ' feature: ' + feature + ' data: ' + data);
+ tl.command('telemetry.publish', { 'area': area, 'feature': feature }, data);
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/constants.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/constants.ts
new file mode 100644
index 000000000000..9d57d9b40563
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/constants.ts
@@ -0,0 +1,66 @@
+// general constants
+export const toolFolderName = 'VsTest';
+export const downloadPath = 'downloadPath';
+export const defaultUsername = 'vstestPlatformToolInstaller';
+export const vsTestToolsInstallerInstalledToolLocation = 'VsTestToolsInstallerInstalledToolLocation';
+
+// agent related constants
+export const agentTempDirectory = 'Agent.TempDirectory';
+export const agentWorkFolder = 'Agent.WorkFolder';
+
+// external constants
+export const packageId = 'Microsoft.TestPlatform';
+export const defaultPackageSource = 'https://api.nuget.org/v3/index.json';
+
+// nuget exe parameters
+export const list = 'list';
+export const basic = 'basic';
+export const install = 'install';
+export const sources = 'sources';
+export const add = 'Add';
+export const noninteractive = '-NonInteractive';
+export const name = '-Name';
+export const source = '-Source';
+export const version = '-Version';
+export const noCache = '-NoCache';
+export const usernameParam = '-Username';
+export const passwordParam = '-Password';
+export const configFile = '-ConfigFile';
+export const preRelease = '-PreRelease';
+export const directDownload = '-DirectDownload';
+export const outputDirectory = '-OutputDirectory';
+export const validAuthenticationTypes = '-ValidAuthenticationTypes';
+
+// input fields
+export const netShare = 'netShare';
+export const username = 'username';
+export const password = 'password';
+export const versionSelector = 'versionSelector';
+export const packageFeedSelector = 'packageFeedSelector';
+export const testPlatformVersion = 'testPlatformVersion';
+
+// input values
+export const nugetOrg = 'nugetOrg';
+export const customFeed = 'customFeed';
+export const latestStable = 'lateststable';
+export const specificVersion = 'specificversion';
+export const latestPrerelease = 'latestprerelease';
+
+// CI related constants
+export const unsupportedOS = 'unsupportedOS';
+export const listingFailed = 'listingFailed';
+export const installationStatusFailed = 'failed';
+export const installationStatusSucceeded = 'succeeded';
+export const downloadFailed = 'downloadFailed';
+export const notExplicitVersion = 'notExplicitVersion';
+export const configFileWriteFailed = 'configFileWriteFailed';
+export const packageFileDoesNotExist = 'packageFileDoesNotExist';
+export const unexpectedPackageFileName = 'unexpectedPackageFileName';
+
+// Regexes
+export const versionExtractionRegex = /microsoft\.testplatform\.(.*)\.nupkg/i;
+
+// Long constants
+export const emptyNugetConfig = `\n` +
+ `\n` +
+ ``;
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/helpers.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/helpers.ts
new file mode 100644
index 000000000000..163820d1c0f0
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/helpers.ts
@@ -0,0 +1,61 @@
+import * as tl from 'azure-pipelines-task-lib/task';
+import * as path from 'path';
+import * as fs from 'fs';
+import * as os from 'os';
+
+export function setVsTestToolLocation(toolPath: string) {
+ // Set the task variable so that the VsTest task can consume this path
+ tl.setVariable('VsTestToolsInstallerInstalledToolLocation', toolPath);
+ console.log(tl.loc('InstallationSuccessful', toolPath));
+ tl.debug(`Set variable VsTestToolsInstallerInstalledToolLocation value to ${toolPath}.`);
+}
+
+export function cleanUpTempConfigFile(tempConfigFilePath: string) {
+ if (isNullEmptyOrUndefined(tempConfigFilePath)) {
+ return;
+ }
+
+ try {
+ fs.unlinkSync(tempConfigFilePath);
+ } catch (error) {
+ tl.debug(`Failed to delete temp config file ${tempConfigFilePath} with error ${error}.`);
+ }
+}
+
+export function pathExistsAsFile(path: string) {
+ return tl.exist(path) && tl.stats(path).isFile();
+}
+
+export function pathExistsAsDirectory(path: string) {
+ return tl.exist(path) && tl.stats(path).isDirectory();
+}
+
+export function GenerateTempFile(fileName: string): string {
+ return path.join(getTempFolder(), fileName);
+}
+
+export function isNullEmptyOrUndefined(obj: any) {
+ return obj === null || obj === '' || obj === undefined;
+}
+
+export function isNullOrUndefined(obj: any) {
+ return obj === null || obj === '' || obj === undefined;
+}
+
+export function isNullOrWhitespace(input: any) {
+ if (typeof input === 'undefined' || input === null) {
+ return true;
+ }
+ return input.replace(/\s/g, '').length < 1;
+}
+
+export function getTempFolder(): string {
+ try {
+ tl.assertAgent('2.115.0');
+ const tmpDir = tl.getVariable('Agent.TempDirectory');
+ return tmpDir;
+ } catch (err) {
+ tl.warning(tl.loc('UpgradeAgentMessage'));
+ return os.tmpdir();
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/icon.png b/_generated/VsTestPlatformToolInstallerV1_Node20/icon.png
new file mode 100644
index 000000000000..6865419ec88b
Binary files /dev/null and b/_generated/VsTestPlatformToolInstallerV1_Node20/icon.png differ
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/icon.svg b/_generated/VsTestPlatformToolInstallerV1_Node20/icon.svg
new file mode 100644
index 000000000000..d05e696288a5
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/icon.svg
@@ -0,0 +1,13 @@
+
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/make.json b/_generated/VsTestPlatformToolInstallerV1_Node20/make.json
new file mode 100644
index 000000000000..dacc1ec03e46
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/make.json
@@ -0,0 +1,10 @@
+{
+ "externals": {
+ "files": [
+ {
+ "url": "https://dist.nuget.org/win-x86-commandline/v5.0.0-preview4/nuget.exe",
+ "dest": "nuget.exe"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/networkshareinstaller.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/networkshareinstaller.ts
new file mode 100644
index 000000000000..3f71b6c0000a
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/networkshareinstaller.ts
@@ -0,0 +1,72 @@
+import * as tl from 'azure-pipelines-task-lib/task';
+import * as path from 'path';
+import * as toolLib from 'azure-pipelines-tool-lib/tool';
+import * as perf from 'performance-now';
+import * as ci from './cieventlogger';
+import * as constants from './constants';
+import * as helpers from './helpers';
+import { NugetDownloadHelper } from './nugetdownloadhelper';
+
+let startTime: number;
+
+export class NetworkShareInstaller {
+ // Installs the test platform from a network share path provided by the user. The path should point to a .nupkg file.
+ public async installVsTestPlatformToolFromNetworkShare(netSharePath: string) {
+ let vstestPlatformInstalledLocation;
+ let packageSource;
+
+ // Remove all double quotes from the path.
+ netSharePath = netSharePath.replace(/["]+/g, '');
+
+ tl.debug(`Attempting to fetch the vstest platform from the specified network share path ${netSharePath}.`);
+
+ if (helpers.pathExistsAsFile(netSharePath)) {
+ packageSource = path.dirname(netSharePath);
+ } else {
+ ci.addToConsolidatedCi('failureReason', constants.packageFileDoesNotExist);
+ throw new Error(tl.loc('SpecifiedFileDoesNotExist', netSharePath));
+ }
+
+ const fileName = path.basename(netSharePath);
+ const versionExtractionRegex = constants.versionExtractionRegex;
+ const regexMatches = versionExtractionRegex.exec(fileName);
+
+ if (!regexMatches || regexMatches.length !== 2) {
+ ci.addToConsolidatedCi('failureReason', constants.unexpectedPackageFileName);
+ throw new Error(tl.loc('UnexpectedFileName', fileName));
+ }
+ const testPlatformVersion = regexMatches[1];
+ ci.addToConsolidatedCi('testPlatformVersion', testPlatformVersion);
+
+ // If the version provided is not an explicit version (ie contains containing wildcards) then throw
+ if (!toolLib.isExplicitVersion(testPlatformVersion)) {
+ ci.publishEvent('InvalidVersionSpecified', { version: testPlatformVersion } );
+ ci.addToConsolidatedCi('failureReason', constants.notExplicitVersion);
+ throw new Error(tl.loc('ProvideExplicitVersion', testPlatformVersion));
+ }
+
+ console.log(tl.loc('ParsedVersion', testPlatformVersion));
+ tl.debug(`Looking for version ${testPlatformVersion} in the tools cache.`);
+ startTime = perf();
+
+ // Check cache for the specified version
+ vstestPlatformInstalledLocation = toolLib.findLocalTool(constants.toolFolderName, testPlatformVersion);
+
+ ci.addToConsolidatedCi('cacheLookupTime', perf() - startTime);
+
+ // If found in the cache then set the tool location and return
+ if (!helpers.isNullEmptyOrUndefined(vstestPlatformInstalledLocation)) {
+ ci.addToConsolidatedCi('firstCacheLookupSucceeded', 'true');
+ helpers.setVsTestToolLocation(vstestPlatformInstalledLocation);
+ return;
+ }
+
+ ci.addToConsolidatedCi('firstCacheLookupSucceeded', 'false');
+
+ vstestPlatformInstalledLocation = await new NugetDownloadHelper()
+ .attemptPackageDownload(packageSource, testPlatformVersion, null);
+
+ // Set the vstest platform tool location for the vstest task to consume
+ helpers.setVsTestToolLocation(vstestPlatformInstalledLocation);
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/nugetdownloadhelper.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/nugetdownloadhelper.ts
new file mode 100644
index 000000000000..371bf4d275b9
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/nugetdownloadhelper.ts
@@ -0,0 +1,102 @@
+import * as tl from 'azure-pipelines-task-lib/task';
+import * as toolLib from 'azure-pipelines-tool-lib/tool';
+import * as path from 'path';
+import * as perf from 'performance-now';
+import * as ci from './cieventlogger';
+import * as constants from './constants';
+import * as helpers from './helpers';
+
+let startTime: number;
+
+export class NugetDownloadHelper {
+ // Attemps to download the package and on failure looks for the latest stable version already present in the cache
+ public async attemptPackageDownload(packageSource: string, testPlatformVersion: string, nugetConfigFilePath: string) : Promise {
+ let vstestPlatformInstalledLocation;
+ try {
+ tl.debug(`Could not find ${constants.packageId}.${testPlatformVersion} in the tools cache. Fetching it from nuget.`);
+
+ // Download the required version and cache it
+ vstestPlatformInstalledLocation = await this.acquireAndCacheVsTestPlatformNuget(packageSource,
+ testPlatformVersion, nugetConfigFilePath);
+
+ } catch (error) {
+ tl.error(tl.loc('TestPlatformDownloadFailed', testPlatformVersion, error));
+
+ if ((tl.getInput(constants.packageFeedSelector) === constants.nugetOrg || tl.getInput(constants.packageFeedSelector) === constants.customFeed)
+ && tl.getInput(constants.versionSelector) === constants.specificVersion) {
+ return null;
+ }
+
+ console.log(tl.loc('LatestStableCached'));
+ testPlatformVersion = 'x';
+
+ ci.addToConsolidatedCi('downloadSucceeded', 'false');
+ ci.publishEvent('DownloadFailed', { action: 'getLatestAvailableInCache', error: error } );
+ startTime = perf();
+
+ // Download failed, look for the latest version available in the cache
+ vstestPlatformInstalledLocation = toolLib.findLocalTool(constants.toolFolderName, testPlatformVersion);
+
+ ci.addToConsolidatedCi('secondCacheLookupTime', perf() - startTime);
+
+ // No version found in cache, fail the task
+ if (!vstestPlatformInstalledLocation || vstestPlatformInstalledLocation === 'undefined') {
+ ci.addToConsolidatedCi('secondCacheLookupSucceeded', 'false');
+ ci.addToConsolidatedCi('failureReason', constants.downloadFailed);
+ tl.error(tl.loc('NoPackageFoundInCache'));
+ throw new Error(tl.loc('FailedToAcquireTestPlatform'));
+ }
+
+ ci.addToConsolidatedCi('secondCacheLookupSucceeded', 'true');
+ }
+
+ return vstestPlatformInstalledLocation;
+ }
+
+ // Downloads and caches the test platform package
+ private async acquireAndCacheVsTestPlatformNuget(packageSource: string, testPlatformVersion: string, nugetConfigFilePath: string): Promise {
+ testPlatformVersion = toolLib.cleanVersion(testPlatformVersion);
+ const nugetTool = tl.tool(path.join(__dirname, 'nuget.exe'));
+ let downloadPath = helpers.getTempFolder();
+
+ // Ensure Agent.TempDirectory is set
+ if (!downloadPath) {
+ throw new Error(tl.loc('ExpectedTempToBeSet'));
+ }
+
+ // Call out a warning if the agent work folder path is longer than 50 characters as anything longer may cause the download to fail
+ // Note: This upper limit was calculated for a particular test platform package version and is subject to change
+ if (tl.getVariable(constants.agentWorkFolder) && tl.getVariable(constants.agentWorkFolder).length > 50) {
+ ci.addToConsolidatedCi('agentWorkDirectoryPathTooLong', 'true');
+ tl.warning(tl.loc('AgentWorkDirectoryPathTooLong'));
+ }
+
+ // Use as short a path as possible due to nested folders in the package that may potentially exceed the 255 char windows path limit
+ downloadPath = path.join(downloadPath, constants.toolFolderName);
+ nugetTool.arg(constants.install).arg(constants.packageId).arg(constants.version).arg(testPlatformVersion).arg(constants.source)
+ .arg(packageSource).arg(constants.outputDirectory).arg(downloadPath).arg(constants.noCache).arg(constants.directDownload)
+ .argIf(nugetConfigFilePath, constants.configFile).argIf(nugetConfigFilePath, nugetConfigFilePath).arg(constants.noninteractive);
+
+ tl.debug(`Downloading Test Platform version ${testPlatformVersion} from ${packageSource} to ${downloadPath}.`);
+ startTime = perf();
+ const resultCode = await nugetTool.exec();
+ ci.addToConsolidatedCi('downloadTime', perf() - startTime);
+
+ tl.debug(`Nuget.exe returned with result code ${resultCode}`);
+
+ if (resultCode !== 0) {
+ tl.error(tl.loc('NugetErrorCode', resultCode));
+ throw new Error(tl.loc('DownloadFailed', resultCode));
+ }
+
+ // Install into the local tool cache
+ const toolRoot = path.join(downloadPath, constants.packageId + '.' + testPlatformVersion);
+
+ tl.debug(`Caching the downloaded folder ${toolRoot}.`);
+ startTime = perf();
+ const vstestPlatformInstalledLocation = await toolLib.cacheDir(toolRoot, constants.toolFolderName, testPlatformVersion);
+ ci.addToConsolidatedCi('cacheTime', perf() - startTime);
+
+ return vstestPlatformInstalledLocation;
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/nugetfeedinstaller.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/nugetfeedinstaller.ts
new file mode 100644
index 000000000000..2908b37ffd81
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/nugetfeedinstaller.ts
@@ -0,0 +1,183 @@
+import * as tl from 'azure-pipelines-task-lib/task';
+import * as toolLib from 'azure-pipelines-tool-lib/tool';
+import * as path from 'path';
+import { exec } from 'child_process';
+import * as perf from 'performance-now';
+import * as ci from './cieventlogger';
+import * as constants from './constants';
+import * as helpers from './helpers';
+import * as uuid from 'uuid';
+import * as fs from 'fs';
+import { NugetPackageVersionHelper } from './nugetpackageversionhelper';
+import { NugetDownloadHelper } from './nugetdownloadhelper';
+import { async } from 'q';
+
+let startTime: number;
+
+export class NugetFeedInstaller {
+ // Installs the test platform from a custom feed provided by the user along with credentials for authentication against said feed
+ public async installVsTestPlatformToolFromCustomFeed(packageSource: string, versionSelectorInput: string, testPlatformVersion: string, username: string, password: string) {
+ let tempConfigFilePath = null;
+ try {
+ try {
+ if (!helpers.isNullEmptyOrUndefined(password)) {
+ tl.debug('Attempting to write feed details along with provided credentials to temporary config file.');
+ tempConfigFilePath = helpers.GenerateTempFile(`${uuid.v1()}.config`);
+ const feedId = uuid.v1();
+ this.prepareNugetConfigFile(packageSource, tempConfigFilePath, username, password, feedId);
+ packageSource = feedId;
+ ci.addToConsolidatedCi('passwordProvided', 'true');
+ ci.addToConsolidatedCi('usernameProvided', `${!helpers.isNullEmptyOrUndefined(username)}`);
+ } else {
+ packageSource = tl.getInput(constants.customFeed);
+ tl.debug(`Credentials were not provided. Skipping writing to config file. Will use custom package feed provided by user ${packageSource}`);
+ }
+ } catch (error) {
+ tl.error(error);
+ console.log(tl.loc('LatestStableCached'));
+ // Look for the latest stable version available in the cache as a fallback.
+ testPlatformVersion = 'x';
+ tempConfigFilePath = null;
+ }
+
+ await this.installVsTestPlatformToolFromSpecifiedFeed(packageSource, testPlatformVersion, versionSelectorInput, tempConfigFilePath);
+
+ } finally {
+ helpers.cleanUpTempConfigFile(tempConfigFilePath);
+ }
+ }
+
+ // Installs the test platform from the feed specified. If platfornVersion is null then the versionSelectorInput is read and the version
+ // is determined accordingly. Additionally provide the config file to help with authentication if the feed is a custom feed.
+ public async installVsTestPlatformToolFromSpecifiedFeed(packageSource: string, testPlatformVersion: string, versionSelectorInput: string, nugetConfigFilePath: string) {
+ let vstestPlatformInstalledLocation: string;
+ let includePreRelease: boolean;
+
+ ci.addToConsolidatedCi('versionSelectorInput', versionSelectorInput);
+ tl.debug(`Using the package source ${packageSource} to get the ${constants.packageId} nuget package.`);
+
+ if (!helpers.isNullEmptyOrUndefined(nugetConfigFilePath)) {
+ tl.debug(`Using provided config file ${nugetConfigFilePath}.`);
+ }
+
+ if (versionSelectorInput.toLowerCase() === constants.latestStable) {
+ console.log(tl.loc('LookingForLatestStableVersion'));
+ testPlatformVersion = null;
+ includePreRelease = false;
+
+ } else if (versionSelectorInput.toLowerCase() === constants.latestPrerelease) {
+ console.log(tl.loc('LookingForLatestPreReleaseVersion'));
+ testPlatformVersion = null;
+ includePreRelease = true;
+ }
+
+ if (versionSelectorInput.toLowerCase() !== constants.specificVersion) {
+
+ try {
+ ci.addToConsolidatedCi('latestVersionIdentified', 'false');
+ testPlatformVersion = new NugetPackageVersionHelper()
+ .getLatestPackageVersionNumber(packageSource, includePreRelease, nugetConfigFilePath);
+
+ if (helpers.isNullEmptyOrUndefined(testPlatformVersion)) {
+
+ tl.warning(tl.loc('RequiredVersionNotListed'));
+ tl.debug('Looking for latest stable available version in cache.');
+ ci.publishEvent('RequestedVersionNotListed', { action: 'getLatestAvailableInCache' } );
+ // Look for the latest stable version available in the cache
+ testPlatformVersion = 'x';
+
+ } else {
+ ci.addToConsolidatedCi('latestVersionIdentified', 'true');
+ tl.debug(`Found the latest version to be ${testPlatformVersion}.`);
+ ci.publishEvent('RequestedVersionListed', { action: 'lookInCacheForListedVersion', version: testPlatformVersion } );
+ }
+
+ } catch (error) {
+ // Failed to list available versions, look for the latest stable version available in the cache
+ tl.error(`${tl.loc('FailedToListAvailablePackagesFromNuget')}\n${error}`);
+ tl.debug('Looking for latest stable version available version in cache.');
+ ci.publishEvent('RequestedVersionListFailed', { action: 'getLatestAvailableInCache', error: error } );
+ testPlatformVersion = 'x';
+ }
+ }
+
+ tl.debug(`Looking for version ${testPlatformVersion} in the tools cache.`);
+ startTime = perf();
+
+ // Check cache for the specified version
+ vstestPlatformInstalledLocation = toolLib.findLocalTool(constants.toolFolderName, testPlatformVersion);
+
+ ci.addToConsolidatedCi('cacheLookupTime', perf() - startTime);
+
+ // If found in the cache then set the tool location and return
+ if (!helpers.isNullEmptyOrUndefined(vstestPlatformInstalledLocation)) {
+ ci.addToConsolidatedCi('firstCacheLookupSucceeded', 'true');
+ helpers.setVsTestToolLocation(vstestPlatformInstalledLocation);
+ return;
+ }
+
+ ci.addToConsolidatedCi('firstCacheLookupSucceeded', 'false');
+
+ // If the testPlatformVersion is 'x' meaning listing failed and we were looking for a stable version in the cache
+ // and the cache lookup failed, then fail the task
+ if (!testPlatformVersion || testPlatformVersion === 'x') {
+ tl.error(tl.loc('NoPackageFoundInCache'));
+ ci.addToConsolidatedCi('failureReason', constants.listingFailed);
+ throw new Error(tl.loc('FailedToAcquireTestPlatform'));
+ }
+
+ // If the version provided is not an explicit version (ie contains containing wildcards) then throw
+ if (!toolLib.isExplicitVersion(testPlatformVersion)) {
+ ci.publishEvent('InvalidVersionSpecified', { version: testPlatformVersion } );
+ ci.addToConsolidatedCi('failureReason', constants.notExplicitVersion);
+ throw new Error(tl.loc('ProvideExplicitVersion', testPlatformVersion));
+ }
+
+ vstestPlatformInstalledLocation = await new NugetDownloadHelper()
+ .attemptPackageDownload(packageSource, testPlatformVersion, nugetConfigFilePath);
+
+ // Set the vstest platform tool location for the vstest task to consume
+ helpers.setVsTestToolLocation(vstestPlatformInstalledLocation);
+ }
+
+ // Utility function that writes the feed url along with username and password if provided into the specified nuget config file
+ private prepareNugetConfigFile(packageSource: string, configFilePath: string, username: string, password: string, feedId: string) {
+ const feedUrl = tl.getInput(constants.customFeed);
+
+ tl.debug(`Writing package source details to temp config file ${configFilePath}`);
+
+ try {
+ // Write the skeleton nuget config contents to the config file
+ fs.writeFileSync(configFilePath, constants.emptyNugetConfig, { encoding: 'utf-8' });
+ } catch (error) {
+ ci.addToConsolidatedCi('failureReason', 'configFileWriteFailed');
+ throw new Error(tl.loc('ConfigFileWriteFailed', configFilePath, error));
+ }
+
+ if (!helpers.isNullEmptyOrUndefined(password) && helpers.isNullEmptyOrUndefined(username)) {
+ username = constants.defaultUsername;
+ }
+
+ const nugetTool = tl.tool(path.join(__dirname, 'nuget.exe'));
+
+ nugetTool.arg(constants.sources).arg(constants.add).arg(constants.noninteractive)
+ .arg(constants.name).arg(feedId).arg(constants.source).arg(feedUrl)
+ .arg(constants.validAuthenticationTypes).arg(constants.basic)
+ .argIf(password, constants.usernameParam).argIf(password, username)
+ .argIf(password, constants.passwordParam).argIf(password, password)
+ .argIf(configFilePath, constants.configFile).argIf(configFilePath, configFilePath);
+
+ startTime = perf();
+ const result = nugetTool.execSync();
+ ci.addToConsolidatedCi('prepareConfigFileTime', perf() - startTime);
+
+ if (result.code !== 0 || !(result.stderr === null || result.stderr === undefined || result.stderr === '')) {
+ ci.addToConsolidatedCi('failureReason', constants.configFileWriteFailed);
+ throw new Error(tl.loc('ConfigFileWriteFailed', configFilePath, result.stderr));
+ }
+
+ // Assign the feed name we wrote into the config file to the packageSource variable
+ tl.debug(`Setting the source to feed with id ${feedId} whose details were written to the config file.`);
+ ci.publishEvent('PackageSourceOverridden', {packageSource: 'customFeed'} );
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/nugetpackageversionhelper.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/nugetpackageversionhelper.ts
new file mode 100644
index 000000000000..7b1a474ff74e
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/nugetpackageversionhelper.ts
@@ -0,0 +1,51 @@
+import * as tl from 'azure-pipelines-task-lib/task';
+import * as path from 'path';
+import * as perf from 'performance-now';
+import * as ci from './cieventlogger';
+import * as constants from './constants';
+
+let startTime: number;
+
+export class NugetPackageVersionHelper {
+
+ // Lists the latest version of the package available in the feed specified.
+ public getLatestPackageVersionNumber(packageSource: string, includePreRelease: boolean, nugetConfigFilePath: string): string {
+ const nugetTool = tl.tool(path.join(__dirname, 'nuget.exe'));
+
+ ci.addToConsolidatedCi('includePreRelease', `${includePreRelease}`);
+
+ // Only search by package id if the feed is the offial nuget feed, otherwise search by package name as not all feeds
+ // support searching by package id
+ nugetTool.arg(constants.list)
+ .argIf(packageSource === constants.defaultPackageSource , `packageid:${constants.packageId}`)
+ .argIf(packageSource !== constants.defaultPackageSource , `${constants.packageId}`)
+ .argIf(includePreRelease, constants.preRelease)
+ .arg(constants.noninteractive).arg(constants.source).arg(packageSource)
+ .argIf(nugetConfigFilePath, constants.configFile)
+ .argIf(nugetConfigFilePath, nugetConfigFilePath);
+
+ startTime = perf();
+ const result = nugetTool.execSync();
+
+ ci.addToConsolidatedCi('ListLatestPackageTime', perf() - startTime);
+
+ if (result.code !== 0 || !(result.stderr === null || result.stderr === undefined || result.stderr === '')) {
+ tl.error(tl.loc('NugetErrorCode', result.code));
+ ci.addToConsolidatedCi('listingPackagesFailed', 'true');
+ throw new Error(tl.loc('ListPackagesFailed', result.code, result.stderr, result.stdout));
+ }
+
+ const listOfPackages = result.stdout.split('\r\n');
+ let version: string;
+
+ // parse the version number from the output string
+ listOfPackages.forEach(nugetPackage => {
+ if (nugetPackage.split(' ')[0] === constants.packageId) {
+ version = nugetPackage.split(' ')[1];
+ return;
+ }
+ });
+
+ return version;
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/package-lock.json b/_generated/VsTestPlatformToolInstallerV1_Node20/package-lock.json
new file mode 100644
index 000000000000..ae62fc2698f3
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/package-lock.json
@@ -0,0 +1,557 @@
+{
+ "name": "vstestplatform-tool-installer",
+ "version": "1.0.4",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/concat-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
+ "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/mocha": {
+ "version": "5.2.7",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz",
+ "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ=="
+ },
+ "@types/node": {
+ "version": "20.8.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz",
+ "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==",
+ "requires": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "@types/q": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
+ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ=="
+ },
+ "@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+ },
+ "@types/semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ=="
+ },
+ "@types/uuid": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz",
+ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw=="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "azure-pipelines-task-lib": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.1.0.tgz",
+ "integrity": "sha512-8CNC9PcP+4eS76QcIDmPmBfrrao9xpy/M0Uts4TWk3chfr3uOXFGf0DYHVTJGF9180g51kyVXYTObicouq0KZQ==",
+ "requires": {
+ "minimatch": "3.0.5",
+ "mockery": "^2.1.0",
+ "q": "^1.5.1",
+ "semver": "^5.1.0",
+ "shelljs": "^0.8.5",
+ "sync-request": "6.1.0",
+ "uuid": "^3.0.1"
+ }
+ },
+ "azure-pipelines-tool-lib": {
+ "version": "2.0.0-preview",
+ "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.0-preview.tgz",
+ "integrity": "sha512-OeivwKLpLMsvGpZ2H+2UPxFwwqNkV8TzfKByqjYAllzGDAw4BvciAdjCMwkpGdTOnzfPbRpr33sy48kn7RqfKA==",
+ "requires": {
+ "@types/semver": "^5.3.0",
+ "@types/uuid": "^3.4.5",
+ "azure-pipelines-task-lib": "^4.0.0-preview",
+ "semver": "^5.7.0",
+ "semver-compare": "^1.0.0",
+ "typed-rest-client": "^1.8.6",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "@types/uuid": {
+ "version": "3.4.10",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz",
+ "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A=="
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg=="
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "dependencies": {
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "http-basic": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
+ "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+ "requires": {
+ "caseless": "^0.12.0",
+ "concat-stream": "^1.6.2",
+ "http-response-object": "^3.0.1",
+ "parse-cache-control": "^1.0.1"
+ }
+ },
+ "http-response-object": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
+ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+ "requires": {
+ "@types/node": "^10.0.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.17.60",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
+ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
+ }
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
+ },
+ "is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "mockery": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz",
+ "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA=="
+ },
+ "object-inspect": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+ "integrity": "sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "requires": {
+ "asap": "~2.0.6"
+ }
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="
+ },
+ "qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "requires": {
+ "resolve": "^1.1.6"
+ }
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="
+ },
+ "shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "requires": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ }
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ },
+ "sync-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
+ "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "requires": {
+ "http-response-object": "^3.0.1",
+ "sync-rpc": "^1.2.1",
+ "then-request": "^6.0.0"
+ }
+ },
+ "sync-rpc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
+ "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "requires": {
+ "get-port": "^3.1.0"
+ }
+ },
+ "then-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
+ "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "requires": {
+ "@types/concat-stream": "^1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "^8.0.0",
+ "@types/qs": "^6.2.31",
+ "caseless": "~0.12.0",
+ "concat-stream": "^1.6.0",
+ "form-data": "^2.2.0",
+ "http-basic": "^8.1.1",
+ "http-response-object": "^3.0.1",
+ "promise": "^8.0.0",
+ "qs": "^6.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "8.10.66",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="
+ }
+ }
+ },
+ "tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
+ },
+ "typed-rest-client": {
+ "version": "1.8.9",
+ "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz",
+ "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==",
+ "requires": {
+ "qs": "^6.9.1",
+ "tunnel": "0.0.6",
+ "underscore": "^1.12.1"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
+ "typescript": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
+ "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
+ },
+ "undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ }
+ }
+}
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/package.json b/_generated/VsTestPlatformToolInstallerV1_Node20/package.json
new file mode 100644
index 000000000000..507c599b91d5
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "vstestplatform-tool-installer",
+ "version": "1.0.4",
+ "description": "Visual Studio Test Platform Installer",
+ "main": "vstestplatformtoolInstaller.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git"
+ },
+ "keywords": [
+ "Azure",
+ "Pipelines",
+ "Tasks",
+ "VsTestplatform",
+ "VsTest"
+ ],
+ "author": "Microsoft Corporation",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues"
+ },
+ "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme",
+ "dependencies": {
+ "azure-pipelines-task-lib": "^4.1.0",
+ "@types/node": "^20.3.1",
+ "@types/mocha": "^5.2.7",
+ "@types/q": "^1.5.0",
+ "@types/uuid": "^8.3.0",
+ "azure-pipelines-tool-lib": "^2.0.0-preview",
+ "performance-now": "0.2.0"
+ },
+ "devDependencies": {
+ "typescript": "5.1.6"
+ }
+}
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/task.json b/_generated/VsTestPlatformToolInstallerV1_Node20/task.json
new file mode 100644
index 000000000000..181db6af7254
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/task.json
@@ -0,0 +1,150 @@
+{
+ "id": "2C65196A-54FD-4A02-9BE8-D9D1837B7111",
+ "name": "VisualStudioTestPlatformInstaller",
+ "friendlyName": "Visual Studio test platform installer",
+ "description": "Acquire the test platform from nuget.org or the tool cache. Satisfies the ‘vstest’ demand and can be used for running tests and collecting diagnostic data using the Visual Studio Test task.",
+ "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/tool/vstest-platform-tool-installer",
+ "helpMarkDown": "[Test platform package on NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform/)",
+ "category": "Tool",
+ "runsOn": [
+ "Agent",
+ "DeploymentGroup"
+ ],
+ "minimumAgentVersion": "2.144.0",
+ "author": "Microsoft Corporation",
+ "version": {
+ "Major": 1,
+ "Minor": 231,
+ "Patch": 1
+ },
+ "satisfies": [
+ "VsTest"
+ ],
+ "demands": [],
+ "instanceNameFormat": "Visual Studio Test Platform Installer",
+ "groups": [
+ {
+ "name": "packageSettings",
+ "displayName": "Package settings",
+ "isExpanded": true
+ }
+ ],
+ "inputs": [
+ {
+ "name": "packageFeedSelector",
+ "type": "pickList",
+ "label": "Package Feed",
+ "defaultValue": "nugetOrg",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "Specify the feed from which the Visual Studio Test Platform nuget packge should be fetched.",
+ "options": {
+ "nugetOrg": "Official Nuget",
+ "customFeed": "Custom Feed",
+ "netShare": "Network path"
+ }
+ },
+ {
+ "name": "versionSelector",
+ "type": "pickList",
+ "label": "Version",
+ "defaultValue": "latestPreRelease",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "Pick whether to install the latest version or a specific version of the Visual Studio Test Platform. If you use the test platform installer to run Coded UI tests, ensure that the version you choose matches the major version of Visual Studio with which the test binaries were built. For e.g., if the Coded UI test project was built using Visual Studio 2017 (version 15.x), you must use test platform version 15.x.",
+ "options": {
+ "latestPreRelease": "Latest (Includes Pre-Release)",
+ "latestStable": "Latest Stable",
+ "specificVersion": "Specific Version"
+ },
+ "visibleRule": "packageFeedSelector = nugetOrg || packageFeedSelector = customFeed"
+ },
+ {
+ "name": "testPlatformVersion",
+ "type": "string",
+ "label": "Test Platform Version",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "Specify the version of Visual Studio Test Platform to install on the agent. Available versions can be viewed on nuget.",
+ "visibleRule": "versionSelector = specificVersion"
+ },
+ {
+ "name": "customFeed",
+ "type": "string",
+ "label": "Package Source",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "Fetch the testplatform package from the specified package feed. Can be a public or a private feed.",
+ "visibleRule": "packageFeedSelector = customFeed"
+ },
+ {
+ "name": "username",
+ "type": "string",
+ "label": "User Name",
+ "required": false,
+ "groupName": "packageSettings",
+ "helpMarkDown": "User name for authenticating against the specified feed. If providing a PAT token as password, username is optional.",
+ "visibleRule": "packageFeedSelector = customFeed"
+ },
+ {
+ "name": "password",
+ "type": "string",
+ "label": "Password",
+ "required": false,
+ "groupName": "packageSettings",
+ "helpMarkDown": "Password or personal access token for authenticating against the specified feed.",
+ "visibleRule": "packageFeedSelector = customFeed"
+ },
+ {
+ "name": "netShare",
+ "type": "string",
+ "label": "UNC Path",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "Specify the full UNC path to the microsoft.testplatform nupkg file.",
+ "visibleRule": "packageFeedSelector = netShare"
+ }
+ ],
+ "execution": {
+ "Node10": {
+ "target": "vstestplatformtoolinstaller.js",
+ "argumentFormat": ""
+ },
+ "Node16": {
+ "target": "vstestplatformtoolinstaller.js",
+ "argumentFormat": ""
+ },
+ "Node20": {
+ "target": "vstestplatformtoolinstaller.js",
+ "argumentFormat": ""
+ }
+ },
+ "messages": {
+ "StartingInstaller": "Starting VsTest platform tools installer task.",
+ "ProvideExplicitVersion": "The version you provided (%s) is not an explicit version. Please provide a version number of the form majorVer.minorVer.patchVer.",
+ "NoPackageFoundInCache": "Failed to find any stable version of the test platform package in the cache.",
+ "OnlyWindowsOsSupported": "This task is supported only on Windows agents and cannot be used on other platforms.",
+ "RequiredVersionNotListed": "Required version of the Microsoft.Testplatform package was not listed in the nuget feed, looking for latest stable version cached.",
+ "FailedToListAvailablePackagesFromNuget": "Failed to fetch list of available packages from nuget, looking for latest stable version cached.",
+ "FailedToAcquireTestPlatform": "Failed to acquire the test platform. Please set system.debug to true and refer to the debug logs for additional information.",
+ "InstallationSuccessful": "VsTest will use the Test Platform package found in %s",
+ "TestPlatformDownloadFailed": "Failed to download version %s of the test platform with error %s.",
+ "LookingForLatestStableVersion": "Looking for the latest stable version of the Microsoft.Testplatform.",
+ "LookingForLatestPreReleaseVersion": "Looking for the latest pre-release version of the Microsoft.Testplatform.",
+ "AgentWorkDirectoryPathTooLong": "Please ensure that the agent work directory path is less than 50 characters to guarantee successful download of the test platform package.",
+ "ListPackagesFailed": "Listing packages failed. Nuget.exe returned %s.\nStandard Error:\n%sStandard Out:\n%s",
+ "NugetErrorCode": "Nuget.exe returned error code: %s",
+ "UpgradeAgentMessage": "Please upgrade your agent to the latest available in https://github.com/Microsoft/vsts-agent/releases.",
+ "SpecifiedFileDoesNotExist": "The path provided %s does not exist, is not a valid file or is not accessible. Please provide a valid path to the microsoft.testplatform nupkg file you want to install.",
+ "UnexpectedFileName": "Unable to extract version info from the file %s. Please do not rename the microsoft.testplatform nupkg file downloaded from nuget.org. If you have, then please redownload the file or rename it back to its original name.",
+ "ConfigFileWriteFailed": "Failed to write nuget.config file %s with error %s",
+ "LatestStableCached": "Looking for latest stable version cached.",
+ "DownloadFailed": "Download failed with error code: %s.",
+ "ExpectedTempToBeSet": "Expected Agent.TempDirectory to be set.",
+ "ParsedVersion": "Parsed the version of the Microsoft.Testplatform package to be %s from the file name. Please ensure that the file name is the same as when the .nupkg file is downloaded from the official nuget feed."
+ },
+ "_buildConfigMapping": {
+ "Default": "1.231.0",
+ "Node20_229_4": "1.231.1"
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/task.loc.json b/_generated/VsTestPlatformToolInstallerV1_Node20/task.loc.json
new file mode 100644
index 000000000000..9f8f150d0cd2
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/task.loc.json
@@ -0,0 +1,150 @@
+{
+ "id": "2C65196A-54FD-4A02-9BE8-D9D1837B7111",
+ "name": "VisualStudioTestPlatformInstaller",
+ "friendlyName": "ms-resource:loc.friendlyName",
+ "description": "ms-resource:loc.description",
+ "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/tool/vstest-platform-tool-installer",
+ "helpMarkDown": "ms-resource:loc.helpMarkDown",
+ "category": "Tool",
+ "runsOn": [
+ "Agent",
+ "DeploymentGroup"
+ ],
+ "minimumAgentVersion": "2.144.0",
+ "author": "Microsoft Corporation",
+ "version": {
+ "Major": 1,
+ "Minor": 231,
+ "Patch": 1
+ },
+ "satisfies": [
+ "VsTest"
+ ],
+ "demands": [],
+ "instanceNameFormat": "ms-resource:loc.instanceNameFormat",
+ "groups": [
+ {
+ "name": "packageSettings",
+ "displayName": "ms-resource:loc.group.displayName.packageSettings",
+ "isExpanded": true
+ }
+ ],
+ "inputs": [
+ {
+ "name": "packageFeedSelector",
+ "type": "pickList",
+ "label": "ms-resource:loc.input.label.packageFeedSelector",
+ "defaultValue": "nugetOrg",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "ms-resource:loc.input.help.packageFeedSelector",
+ "options": {
+ "nugetOrg": "Official Nuget",
+ "customFeed": "Custom Feed",
+ "netShare": "Network path"
+ }
+ },
+ {
+ "name": "versionSelector",
+ "type": "pickList",
+ "label": "ms-resource:loc.input.label.versionSelector",
+ "defaultValue": "latestPreRelease",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "ms-resource:loc.input.help.versionSelector",
+ "options": {
+ "latestPreRelease": "Latest (Includes Pre-Release)",
+ "latestStable": "Latest Stable",
+ "specificVersion": "Specific Version"
+ },
+ "visibleRule": "packageFeedSelector = nugetOrg || packageFeedSelector = customFeed"
+ },
+ {
+ "name": "testPlatformVersion",
+ "type": "string",
+ "label": "ms-resource:loc.input.label.testPlatformVersion",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "ms-resource:loc.input.help.testPlatformVersion",
+ "visibleRule": "versionSelector = specificVersion"
+ },
+ {
+ "name": "customFeed",
+ "type": "string",
+ "label": "ms-resource:loc.input.label.customFeed",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "ms-resource:loc.input.help.customFeed",
+ "visibleRule": "packageFeedSelector = customFeed"
+ },
+ {
+ "name": "username",
+ "type": "string",
+ "label": "ms-resource:loc.input.label.username",
+ "required": false,
+ "groupName": "packageSettings",
+ "helpMarkDown": "ms-resource:loc.input.help.username",
+ "visibleRule": "packageFeedSelector = customFeed"
+ },
+ {
+ "name": "password",
+ "type": "string",
+ "label": "ms-resource:loc.input.label.password",
+ "required": false,
+ "groupName": "packageSettings",
+ "helpMarkDown": "ms-resource:loc.input.help.password",
+ "visibleRule": "packageFeedSelector = customFeed"
+ },
+ {
+ "name": "netShare",
+ "type": "string",
+ "label": "ms-resource:loc.input.label.netShare",
+ "required": true,
+ "groupName": "packageSettings",
+ "helpMarkDown": "ms-resource:loc.input.help.netShare",
+ "visibleRule": "packageFeedSelector = netShare"
+ }
+ ],
+ "execution": {
+ "Node10": {
+ "target": "vstestplatformtoolinstaller.js",
+ "argumentFormat": ""
+ },
+ "Node16": {
+ "target": "vstestplatformtoolinstaller.js",
+ "argumentFormat": ""
+ },
+ "Node20": {
+ "target": "vstestplatformtoolinstaller.js",
+ "argumentFormat": ""
+ }
+ },
+ "messages": {
+ "StartingInstaller": "ms-resource:loc.messages.StartingInstaller",
+ "ProvideExplicitVersion": "ms-resource:loc.messages.ProvideExplicitVersion",
+ "NoPackageFoundInCache": "ms-resource:loc.messages.NoPackageFoundInCache",
+ "OnlyWindowsOsSupported": "ms-resource:loc.messages.OnlyWindowsOsSupported",
+ "RequiredVersionNotListed": "ms-resource:loc.messages.RequiredVersionNotListed",
+ "FailedToListAvailablePackagesFromNuget": "ms-resource:loc.messages.FailedToListAvailablePackagesFromNuget",
+ "FailedToAcquireTestPlatform": "ms-resource:loc.messages.FailedToAcquireTestPlatform",
+ "InstallationSuccessful": "ms-resource:loc.messages.InstallationSuccessful",
+ "TestPlatformDownloadFailed": "ms-resource:loc.messages.TestPlatformDownloadFailed",
+ "LookingForLatestStableVersion": "ms-resource:loc.messages.LookingForLatestStableVersion",
+ "LookingForLatestPreReleaseVersion": "ms-resource:loc.messages.LookingForLatestPreReleaseVersion",
+ "AgentWorkDirectoryPathTooLong": "ms-resource:loc.messages.AgentWorkDirectoryPathTooLong",
+ "ListPackagesFailed": "ms-resource:loc.messages.ListPackagesFailed",
+ "NugetErrorCode": "ms-resource:loc.messages.NugetErrorCode",
+ "UpgradeAgentMessage": "ms-resource:loc.messages.UpgradeAgentMessage",
+ "SpecifiedFileDoesNotExist": "ms-resource:loc.messages.SpecifiedFileDoesNotExist",
+ "UnexpectedFileName": "ms-resource:loc.messages.UnexpectedFileName",
+ "ConfigFileWriteFailed": "ms-resource:loc.messages.ConfigFileWriteFailed",
+ "LatestStableCached": "ms-resource:loc.messages.LatestStableCached",
+ "DownloadFailed": "ms-resource:loc.messages.DownloadFailed",
+ "ExpectedTempToBeSet": "ms-resource:loc.messages.ExpectedTempToBeSet",
+ "ParsedVersion": "ms-resource:loc.messages.ParsedVersion"
+ },
+ "_buildConfigMapping": {
+ "Default": "1.231.0",
+ "Node20_229_4": "1.231.1"
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/tsconfig.json b/_generated/VsTestPlatformToolInstallerV1_Node20/tsconfig.json
new file mode 100644
index 000000000000..0438b79f69ac
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "target": "ES6",
+ "module": "commonjs"
+ }
+}
\ No newline at end of file
diff --git a/_generated/VsTestPlatformToolInstallerV1_Node20/vstestplatformtoolinstaller.ts b/_generated/VsTestPlatformToolInstallerV1_Node20/vstestplatformtoolinstaller.ts
new file mode 100644
index 000000000000..9f579c753c63
--- /dev/null
+++ b/_generated/VsTestPlatformToolInstallerV1_Node20/vstestplatformtoolinstaller.ts
@@ -0,0 +1,79 @@
+import * as tl from 'azure-pipelines-task-lib/task';
+import * as os from 'os';
+import * as path from 'path';
+import * as perf from 'performance-now';
+import * as ci from './cieventlogger';
+import * as constants from './constants';
+import { NugetFeedInstaller } from './nugetfeedinstaller';
+import { NetworkShareInstaller } from './networkshareinstaller';
+let startTime: number;
+
+// First function to be invoke starting the installation
+async function startInstaller() {
+ try {
+
+ console.log(tl.loc('StartingInstaller'));
+ console.log('==============================================================================');
+
+ const osPlat: string = os.platform();
+ ci.addToConsolidatedCi('operatingSystem', osPlat);
+ ci.addToConsolidatedCi('result', constants.installationStatusFailed);
+
+ // Fail the task if os is not windows
+ if (osPlat !== 'win32') {
+ ci.addToConsolidatedCi('failureReason', constants.unsupportedOS);
+ tl.setResult(tl.TaskResult.Failed, tl.loc('OnlyWindowsOsSupported'));
+ return;
+ }
+
+ // Read task inputs
+ const packageFeedSelectorInput = tl.getInput(constants.packageFeedSelector, true);
+ const versionSelectorInput = tl.getInput(constants.versionSelector, false);
+ const testPlatformVersion = tl.getInput(constants.testPlatformVersion, false);
+ const networkSharePath = tl.getInput(constants.netShare, false);
+ const username = tl.getInput(constants.username, false);
+ const password = tl.getInput(constants.password, false);
+ const packageSource = constants.defaultPackageSource;
+
+ ci.addToConsolidatedCi('packageFeedSelectorInput', packageFeedSelectorInput);
+
+ tl.debug(`Selected package feed: ${packageFeedSelectorInput}`);
+ switch (packageFeedSelectorInput.toLowerCase()) {
+
+ case 'nugetorg':
+ tl.debug('Going via nuget org download flow.');
+ await new NugetFeedInstaller()
+ .installVsTestPlatformToolFromSpecifiedFeed(packageSource, testPlatformVersion, versionSelectorInput, null);
+ break;
+
+ case 'customfeed':
+ tl.debug('Going via custom feed download flow.');
+ await new NugetFeedInstaller()
+ .installVsTestPlatformToolFromCustomFeed(packageSource, versionSelectorInput, testPlatformVersion, username, password);
+ break;
+
+ case 'netshare':
+ tl.debug('Going via net share copy flow.');
+ await new NetworkShareInstaller().installVsTestPlatformToolFromNetworkShare(networkSharePath);
+ break;
+ }
+
+ } catch (error) {
+ ci.publishEvent('Completed', { isSetupSuccessful: 'false' } );
+ tl.setResult(tl.TaskResult.Failed, error);
+ return;
+ }
+
+ ci.addToConsolidatedCi('result', constants.installationStatusSucceeded);
+}
+
+// Execution start
+tl.setResourcePath(path.join(__dirname, 'task.json'));
+startTime = perf();
+startInstaller().then(() => {
+ ci.addToConsolidatedCi('executionTime', perf() - startTime);
+ ci.fireConsolidatedCi();
+}).catch(() => {
+ ci.addToConsolidatedCi('executionTime', perf() - startTime);
+ ci.fireConsolidatedCi();
+});
\ No newline at end of file
diff --git a/make-options.json b/make-options.json
index 53c61a69023f..47443ecd95c6 100644
--- a/make-options.json
+++ b/make-options.json
@@ -356,6 +356,7 @@
"UseDotNetV2"
],
"Node20_229_4": [
+ "VsTestPlatformToolInstallerV1",
"ContainerStructureTestV0",
"PublishCodeCoverageResultsV1",
"VsTestV2",