From 60bc3ef0d4b52b6369561215b8d172d788d5eb1b Mon Sep 17 00:00:00 2001 From: Ning Tang Date: Tue, 14 Jan 2025 13:46:05 +0800 Subject: [PATCH 1/5] feat: install action support binary test tool --- .../yaml-schema/v1.8/yaml.schema.json | 4 ++ .../component/driver/devTool/installDriver.ts | 23 ++++++------ .../devTool/interfaces/InstallToolArgs.ts | 1 + .../.vscode/launch.json.tpl | 6 +-- .../custom-copilot-basic/.vscode/tasks.json | 37 +++++++++++++++++-- .../teamsapp.testtool.yml.tpl | 1 + 6 files changed, 51 insertions(+), 21 deletions(-) diff --git a/packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json b/packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json index 709ee98960..674cf064df 100644 --- a/packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json +++ b/packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json @@ -1304,6 +1304,10 @@ "symlinkDir": { "type": "string", "description": "The path of the symlink target for the folder containing Teams App Test Tool binaries." + }, + "releaseType": { + "type": "string", + "description": "The release type of Teams App Test Tool: binary or npm. Default to 'npm'." } } } diff --git a/packages/fx-core/src/component/driver/devTool/installDriver.ts b/packages/fx-core/src/component/driver/devTool/installDriver.ts index 41650d2a81..64340776a9 100644 --- a/packages/fx-core/src/component/driver/devTool/installDriver.ts +++ b/packages/fx-core/src/component/driver/devTool/installDriver.ts @@ -4,10 +4,14 @@ /** * @author Xiaofu Huang */ +import { hooks } from "@feathersjs/hooks/lib"; +import { FxError, Result } from "@microsoft/teamsfx-api"; import * as path from "path"; import semver from "semver"; import { Service } from "typedi"; -import { FxError, Result } from "@microsoft/teamsfx-api"; +import { ErrorContextMW } from "../../../common/globalVars"; +import { getLocalizedString } from "../../../common/localizeUtils"; +import { InvalidActionInputError } from "../../../error/common"; import { DependencyStatus, EmptyLogger, @@ -15,10 +19,14 @@ import { TestToolReleaseType, v3DefaultHelpLink, } from "../../deps-checker"; +import { DotnetChecker } from "../../deps-checker/internal/dotnetChecker"; +import { FuncToolChecker } from "../../deps-checker/internal/funcToolChecker"; +import { TestToolChecker } from "../../deps-checker/internal/testToolChecker"; import { LocalCertificate, LocalCertificateManager } from "../../local/localCertificateManager"; import { wrapRun } from "../../utils/common"; import { DriverContext } from "../interface/commonArgs"; import { ExecutionResult, StepDriver } from "../interface/stepDriver"; +import { addStartAndEndTelemetry } from "../middleware/addStartAndEndTelemetry"; import { WrapDriverContext } from "../util/wrapUtil"; import { Summaries, @@ -29,16 +37,8 @@ import { } from "./constant"; import { DotnetInstallationUserError } from "./error/dotnetInstallationUserError"; import { FuncInstallationUserError } from "./error/funcInstallationUserError"; -import { InstallToolArgs } from "./interfaces/InstallToolArgs"; -import { InvalidActionInputError } from "../../../error/common"; -import { addStartAndEndTelemetry } from "../middleware/addStartAndEndTelemetry"; -import { hooks } from "@feathersjs/hooks/lib"; -import { getLocalizedString } from "../../../common/localizeUtils"; -import { FuncToolChecker } from "../../deps-checker/internal/funcToolChecker"; -import { DotnetChecker } from "../../deps-checker/internal/dotnetChecker"; -import { ErrorContextMW } from "../../../common/globalVars"; -import { TestToolChecker } from "../../deps-checker/internal/testToolChecker"; import { TestToolInstallationUserError } from "./error/testToolInstallationUserError"; +import { InstallToolArgs } from "./interfaces/InstallToolArgs"; const ACTION_NAME = "devTool/install"; const helpLink = "https://aka.ms/teamsfx-actions/devtool-install"; @@ -127,8 +127,7 @@ export class ToolsInstallDriverImpl { if (args.testTool) { await this.resolveTestTool( - // Hardcode to npm release type if running from YAML - TestToolReleaseType.Npm, + args.testTool.releaseType as TestToolReleaseType, `${args.testTool.version}`, args.testTool.symlinkDir ); diff --git a/packages/fx-core/src/component/driver/devTool/interfaces/InstallToolArgs.ts b/packages/fx-core/src/component/driver/devTool/interfaces/InstallToolArgs.ts index 9114337ddf..109244569c 100644 --- a/packages/fx-core/src/component/driver/devTool/interfaces/InstallToolArgs.ts +++ b/packages/fx-core/src/component/driver/devTool/interfaces/InstallToolArgs.ts @@ -35,4 +35,5 @@ interface FuncArgs { interface TestToolArgs { version: string | number; symlinkDir: string; + releaseType: string; } diff --git a/templates/python/custom-copilot-basic/.vscode/launch.json.tpl b/templates/python/custom-copilot-basic/.vscode/launch.json.tpl index 64d89b5e54..1b7a40296e 100644 --- a/templates/python/custom-copilot-basic/.vscode/launch.json.tpl +++ b/templates/python/custom-copilot-basic/.vscode/launch.json.tpl @@ -148,12 +148,8 @@ "name": "Debug in Test Tool", "configurations": [ "Start Python", - "Start Test Tool" ], - "cascadeTerminateToConfigurations": [ - "Start Test Tool" - ], - "preLaunchTask": "Deploy (Test Tool)", + "preLaunchTask": "Test Tool", "presentation": { "group": "2-local", "order": 1 diff --git a/templates/python/custom-copilot-basic/.vscode/tasks.json b/templates/python/custom-copilot-basic/.vscode/tasks.json index a964abf89f..883c49873f 100644 --- a/templates/python/custom-copilot-basic/.vscode/tasks.json +++ b/templates/python/custom-copilot-basic/.vscode/tasks.json @@ -4,6 +4,14 @@ { "version": "2.0.0", "tasks": [ + { + "label": "Test Tool", + "dependsOn": ["Validate prerequisites (Test Tool)", "Deploy (Test Tool)", "Start Test Tool"], + "dependsOrder": "sequence", + "presentation": { + "reveal": "never" + }, + }, { // Check all required prerequisites. // See https://aka.ms/teamsfx-tasks/check-prerequisites to know the details and how to customize the args. @@ -12,7 +20,6 @@ "command": "debug-check-prerequisites", "args": { "prerequisites": [ - "nodejs", // Check if Node.js is installed and the version is >= 12. "portOccupancy" // Validate available ports to ensure those debug ones are not occupied. ], "portOccupancy": [ @@ -25,15 +32,37 @@ // Build project. // See https://aka.ms/teamsfx-tasks/deploy to know the details and how to customize the args. "label": "Deploy (Test Tool)", - "dependsOn": [ - "Validate prerequisites (Test Tool)" - ], "type": "teamsfx", "command": "deploy", "args": { "env": "testtool", } }, + { + "label": "Start Test Tool", + "type": "shell", + "command": "${workspaceFolder}/devTools/teamsapptester/teamsapptester.exe", + "args": [ + "start" + ], + "isBackground": true, + "problemMatcher": { + "owner": "custom", + "pattern": { + "regexp": ".*InternalServiceError: (.*)", + "message": 1 + }, + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": ".*Teams App Test Tool" + }, + "endsPattern": { + "regexp": ".*started web socket client" + } + }, + } + }, { "label": "Start Teams App Locally", "dependsOn": [ diff --git a/templates/python/custom-copilot-basic/teamsapp.testtool.yml.tpl b/templates/python/custom-copilot-basic/teamsapp.testtool.yml.tpl index bb5d6a35d4..9a7ea88032 100644 --- a/templates/python/custom-copilot-basic/teamsapp.testtool.yml.tpl +++ b/templates/python/custom-copilot-basic/teamsapp.testtool.yml.tpl @@ -10,6 +10,7 @@ deploy: testTool: version: ~0.2.1 symlinkDir: ./devTools/teamsapptester + releaseType: binary # Generate runtime environment variables - uses: file/createOrUpdateEnvironmentFile From d39c98ae1a2955516e7c080eeca3abe3b8758cf2 Mon Sep 17 00:00:00 2001 From: Ning Tang Date: Thu, 16 Jan 2025 09:41:11 +0800 Subject: [PATCH 2/5] fix: use npm as default option --- .../fx-core/src/component/driver/devTool/installDriver.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/fx-core/src/component/driver/devTool/installDriver.ts b/packages/fx-core/src/component/driver/devTool/installDriver.ts index 64340776a9..c00fa5cdbd 100644 --- a/packages/fx-core/src/component/driver/devTool/installDriver.ts +++ b/packages/fx-core/src/component/driver/devTool/installDriver.ts @@ -127,7 +127,9 @@ export class ToolsInstallDriverImpl { if (args.testTool) { await this.resolveTestTool( - args.testTool.releaseType as TestToolReleaseType, + args.testTool.releaseType == TestToolReleaseType.Binary + ? TestToolReleaseType.Binary + : TestToolReleaseType.Npm, `${args.testTool.version}`, args.testTool.symlinkDir ); From c577892b6a0bfbbedb638a712eb80ddb1a3a49d7 Mon Sep 17 00:00:00 2001 From: Ning Tang Date: Thu, 16 Jan 2025 16:09:28 +0800 Subject: [PATCH 3/5] fix: add ut --- .../component/driver/devTool/installDriver.ts | 7 +++++++ .../devTool/interfaces/InstallToolArgs.ts | 2 +- .../driver/devTool/installDriver.test.ts | 19 +++++++++++++++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/fx-core/src/component/driver/devTool/installDriver.ts b/packages/fx-core/src/component/driver/devTool/installDriver.ts index c00fa5cdbd..5fea07b85b 100644 --- a/packages/fx-core/src/component/driver/devTool/installDriver.ts +++ b/packages/fx-core/src/component/driver/devTool/installDriver.ts @@ -330,6 +330,13 @@ export class ToolsInstallDriverImpl { if (typeof args.testTool.symlinkDir !== "string") { throw new InvalidActionInputError(ACTION_NAME, ["testTool.symlinkDir"], helpLink); } + if ( + args.testTool.releaseType && + args.testTool.releaseType !== TestToolReleaseType.Binary && + args.testTool.releaseType !== TestToolReleaseType.Npm + ) { + throw new InvalidActionInputError(ACTION_NAME, ["testTool.releaseType"], helpLink); + } } } diff --git a/packages/fx-core/src/component/driver/devTool/interfaces/InstallToolArgs.ts b/packages/fx-core/src/component/driver/devTool/interfaces/InstallToolArgs.ts index 109244569c..0a22383ec2 100644 --- a/packages/fx-core/src/component/driver/devTool/interfaces/InstallToolArgs.ts +++ b/packages/fx-core/src/component/driver/devTool/interfaces/InstallToolArgs.ts @@ -35,5 +35,5 @@ interface FuncArgs { interface TestToolArgs { version: string | number; symlinkDir: string; - releaseType: string; + releaseType?: string; } diff --git a/packages/fx-core/tests/component/driver/devTool/installDriver.test.ts b/packages/fx-core/tests/component/driver/devTool/installDriver.test.ts index d929cf27fe..3c8114b440 100644 --- a/packages/fx-core/tests/component/driver/devTool/installDriver.test.ts +++ b/packages/fx-core/tests/component/driver/devTool/installDriver.test.ts @@ -5,7 +5,7 @@ import { UserError } from "@microsoft/teamsfx-api"; import chai from "chai"; import "mocha"; import * as sinon from "sinon"; -import { DepsType } from "../../../../src/component/deps-checker/depsChecker"; +import { DepsType, TestToolReleaseType } from "../../../../src/component/deps-checker/depsChecker"; import { DotnetChecker } from "../../../../src/component/deps-checker/internal/dotnetChecker"; import { FuncToolChecker } from "../../../../src/component/deps-checker/internal/funcToolChecker"; import { TestToolChecker } from "../../../../src/component/deps-checker/internal/testToolChecker"; @@ -319,7 +319,7 @@ describe("Tools Install Driver test", () => { }); it("Install test tool", async () => { - sandbox.stub(TestToolChecker.prototype, "resolve").resolves({ + const resolveStub = sandbox.stub(TestToolChecker.prototype, "resolve").resolves({ name: "Teams App Test Tool", type: DepsType.TestTool, isInstalled: true, @@ -339,6 +339,14 @@ describe("Tools Install Driver test", () => { if (res.isOk()) { chai.assert.isEmpty(res.value); } + chai.assert.isTrue( + resolveStub.calledWith({ + versionRange: "~0.1.0", + symlinkDir: "./devTools/testTool", + releaseType: TestToolReleaseType.Npm, + projectPath: mockedDriverContext.projectPath, + }) + ); }); // it("Install test tool failed without error", async () => { @@ -398,6 +406,13 @@ describe("Tools Install Driver test", () => { args: { testTool: { version: "~1", symlinkDir: 1 } }, expected: false, }, + { + name: "invalid releaseType", + args: { + testTool: { version: "~1", symlinkDir: "./devTools/testTool", releaseType: "bin" }, + }, + expected: false, + }, ]; for (const c of cases) { it("Install test tool args check " + c.name, async () => { From 75ea7a74d8ff9c559eb67f1599bdaaed32d81afd Mon Sep 17 00:00:00 2001 From: Ning Tang Date: Thu, 16 Jan 2025 16:24:41 +0800 Subject: [PATCH 4/5] feat(template): make test tool default option in python template --- .../.vscode/launch.json.tpl | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/templates/python/custom-copilot-basic/.vscode/launch.json.tpl b/templates/python/custom-copilot-basic/.vscode/launch.json.tpl index 1b7a40296e..368cb1b852 100644 --- a/templates/python/custom-copilot-basic/.vscode/launch.json.tpl +++ b/templates/python/custom-copilot-basic/.vscode/launch.json.tpl @@ -7,7 +7,7 @@ "request": "launch", "url": "https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&${account-hint}", "presentation": { - "group": "1-Teams", + "group": "2-Teams", "order": 4 }, "internalConsoleOptions": "neverOpen" @@ -18,7 +18,7 @@ "request": "launch", "url": "https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&${account-hint}", "presentation": { - "group": "1-Teams", + "group": "2-Teams", "order": 5 }, "internalConsoleOptions": "neverOpen" @@ -29,7 +29,7 @@ "request": "launch", "preLaunchTask": "Start Teams App in Desktop Client (Remote)", "presentation": { - "group": "1-Teams", + "group": "2-Teams", "order": 6 }, "internalConsoleOptions": "neverOpen" @@ -63,18 +63,6 @@ "program": "${workspaceFolder}/src/app.py", "cwd": "${workspaceFolder}/src", "console": "integratedTerminal" - }, - { - "name": "Start Test Tool", - "type": "node", - "request": "launch", - "program": "${workspaceFolder}/devTools/teamsapptester/node_modules/@microsoft/teams-app-test-tool/cli.js", - "args": [ - "start" - ], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen" {{#CEAEnabled}} }, { @@ -118,7 +106,7 @@ "cascadeTerminateToConfigurations": ["Start Python"], "preLaunchTask": "Start Teams App Locally", "presentation": { - "group": "1-Teams", + "group": "2-Teams", "order": 1 }, "stopAll": true @@ -129,7 +117,7 @@ "cascadeTerminateToConfigurations": ["Start Python"], "preLaunchTask": "Start Teams App Locally", "presentation": { - "group": "1-Teams", + "group": "2-Teams", "order": 2 }, "stopAll": true @@ -139,7 +127,7 @@ "configurations": ["Start Python"], "preLaunchTask": "Start Teams App in Desktop Client", "presentation": { - "group": "1-Teams", + "group": "2-Teams", "order": 3 }, "stopAll": true @@ -151,7 +139,7 @@ ], "preLaunchTask": "Test Tool", "presentation": { - "group": "2-local", + "group": "1-local", "order": 1 }, "stopAll": true From 4f7fb35ed85cf4e98a7722ac5033f0f0842f53ad Mon Sep 17 00:00:00 2001 From: Ning Tang Date: Tue, 21 Jan 2025 17:02:12 +0800 Subject: [PATCH 5/5] fix: schema change --- packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json | 4 ---- packages/fx-core/resource/yaml-schema/yaml.schema.json | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json b/packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json index 674cf064df..709ee98960 100644 --- a/packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json +++ b/packages/fx-core/resource/yaml-schema/v1.8/yaml.schema.json @@ -1304,10 +1304,6 @@ "symlinkDir": { "type": "string", "description": "The path of the symlink target for the folder containing Teams App Test Tool binaries." - }, - "releaseType": { - "type": "string", - "description": "The release type of Teams App Test Tool: binary or npm. Default to 'npm'." } } } diff --git a/packages/fx-core/resource/yaml-schema/yaml.schema.json b/packages/fx-core/resource/yaml-schema/yaml.schema.json index 7fc8e669ce..df17cc4a29 100644 --- a/packages/fx-core/resource/yaml-schema/yaml.schema.json +++ b/packages/fx-core/resource/yaml-schema/yaml.schema.json @@ -1277,6 +1277,10 @@ "symlinkDir": { "type": "string", "description": "The path of the symlink target for the folder containing Azure Functions Core Tools binaries." + }, + "releaseType": { + "type": "string", + "description": "The release type of Teams App Test Tool: binary or npm. Default to 'npm'." } } },