From 345437d1e803b8a6e5f2589698a5362f63251474 Mon Sep 17 00:00:00 2001 From: Jacob Chung Date: Fri, 14 Mar 2025 10:29:00 -0700 Subject: [PATCH 1/3] show customer facing message changelog logic --- ...-7bb4ae68-204d-48a1-a510-490d2a2a938a.json | 4 +++ .../amazonqTest/chat/controller/controller.ts | 33 +++++-------------- .../src/amazonqTest/chat/session/session.ts | 1 - .../commands/startTestGeneration.ts | 9 +---- .../codewhisperer/service/testGenHandler.ts | 14 ++++++-- 5 files changed, 24 insertions(+), 37 deletions(-) create mode 100644 packages/amazonq/.changes/next-release/Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json diff --git a/packages/amazonq/.changes/next-release/Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json b/packages/amazonq/.changes/next-release/Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json new file mode 100644 index 00000000000..a6f1a80ac0a --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "/test: show customer facing error message" +} diff --git a/packages/core/src/amazonqTest/chat/controller/controller.ts b/packages/core/src/amazonqTest/chat/controller/controller.ts index 4e29bb31464..80f43702ab0 100644 --- a/packages/core/src/amazonqTest/chat/controller/controller.ts +++ b/packages/core/src/amazonqTest/chat/controller/controller.ts @@ -284,10 +284,7 @@ export class TestController { this.messenger.sendUpdatePromptProgress(data.tabID, null) const session = this.sessionStorage.getSession() const isCancel = data.error.uiMessage === unitTestGenerationCancelMessage - let telemetryErrorMessage = getTelemetryReasonDesc(data.error) - if (session.stopIteration) { - telemetryErrorMessage = getTelemetryReasonDesc(data.error.uiMessage.replaceAll('```', '')) - } + const telemetryErrorMessage = getTelemetryReasonDesc(data.error.uiMessage.replaceAll('```', '')) TelemetryHelper.instance.sendTestGenerationToolkitEvent( session, session.isSupportedLanguage, @@ -309,26 +306,13 @@ export class TestController { undefined, isCancel ? 'CANCELLED' : 'FAILED' ) - if (session.stopIteration) { - // Error from Science - this.messenger.sendMessage( - data.error.uiMessage.replaceAll('```', ''), - data.tabID, - 'answer', - 'testGenErrorMessage', - this.getFeedbackButtons() - ) - } else { - isCancel - ? this.messenger.sendMessage( - data.error.uiMessage, - data.tabID, - 'answer', - 'testGenErrorMessage', - this.getFeedbackButtons() - ) - : this.sendErrorMessage(data) - } + this.messenger.sendMessage( + data.error.uiMessage.replaceAll('```', ''), + data.tabID, + 'answer', + 'testGenErrorMessage', + this.getFeedbackButtons() + ) await this.sessionCleanUp() return } @@ -1398,7 +1382,6 @@ export class TestController { session.sourceFilePath = '' session.generatedFilePath = '' session.projectRootPath = '' - session.stopIteration = false session.fileLanguage = undefined ChatSessionManager.Instance.setIsInProgress(false) session.linesOfCodeGenerated = 0 diff --git a/packages/core/src/amazonqTest/chat/session/session.ts b/packages/core/src/amazonqTest/chat/session/session.ts index 4e3780e6f99..b10ab22b4fa 100644 --- a/packages/core/src/amazonqTest/chat/session/session.ts +++ b/packages/core/src/amazonqTest/chat/session/session.ts @@ -42,7 +42,6 @@ export class Session { public generatedFilePath: string = '' public projectRootPath: string = '' public fileLanguage: string | undefined = 'plaintext' - public stopIteration: boolean = false public targetFileInfo: TargetFileInfo | undefined public jobSummary: string = '' diff --git a/packages/core/src/codewhisperer/commands/startTestGeneration.ts b/packages/core/src/codewhisperer/commands/startTestGeneration.ts index abc8c8ec74c..29e7148a17b 100644 --- a/packages/core/src/codewhisperer/commands/startTestGeneration.ts +++ b/packages/core/src/codewhisperer/commands/startTestGeneration.ts @@ -20,8 +20,6 @@ import { ChatSessionManager } from '../../amazonqTest/chat/storages/chatSession' import { ChildProcess, spawn } from 'child_process' // eslint-disable-line no-restricted-imports import { BuildStatus } from '../../amazonqTest/chat/session/session' import { fs } from '../../shared/fs/fs' -import { TestGenerationJobStatus } from '../models/constants' -import { TestGenFailedError } from '../../amazonqTest/error' import { Range } from '../client/codewhispereruserclient' // eslint-disable-next-line unicorn/no-null @@ -112,18 +110,13 @@ export async function startTestGenerationProcess( if (!shouldContinueRunning(tabID)) { return } - const jobStatus = await pollTestJobStatus( + await pollTestJobStatus( testJob.testGenerationJob.testGenerationJobId, testJob.testGenerationJob.testGenerationJobGroupName, filePath, initialExecution ) // TODO: Send status to test summary - if (jobStatus === TestGenerationJobStatus.FAILED) { - session.numberOfTestsGenerated = 0 - logger.verbose(`Test generation failed.`) - throw new TestGenFailedError() - } throwIfCancelled() if (!shouldContinueRunning(tabID)) { return diff --git a/packages/core/src/codewhisperer/service/testGenHandler.ts b/packages/core/src/codewhisperer/service/testGenHandler.ts index bd3f2167d83..a91b08ef7c0 100644 --- a/packages/core/src/codewhisperer/service/testGenHandler.ts +++ b/packages/core/src/codewhisperer/service/testGenHandler.ts @@ -18,6 +18,7 @@ import { CreateUploadUrlError, ExportResultsArchiveError, InvalidSourceZipError, + TestGenFailedError, TestGenStoppedError, TestGenTimedOutError, } from '../../amazonqTest/error' @@ -193,9 +194,16 @@ export async function pollTestJobStatus( } } ChatSessionManager.Instance.getSession().targetFileInfo = targetFileInfo - if (resp.testGenerationJob?.status !== CodeWhispererConstants.TestGenerationJobStatus.IN_PROGRESS) { - // This can be FAILED or COMPLETED - status = resp.testGenerationJob?.status as CodeWhispererConstants.TestGenerationJobStatus + status = resp.testGenerationJob?.status as CodeWhispererConstants.TestGenerationJobStatus + if (status === CodeWhispererConstants.TestGenerationJobStatus.FAILED) { + session.numberOfTestsGenerated = 0 + logger.verbose(`Test generation failed.`) + if (resp.testGenerationJob?.jobStatusReason) { + throw new TestGenFailedError(resp.testGenerationJob?.jobStatusReason) + } else { + throw new TestGenFailedError() + } + } else if (status === CodeWhispererConstants.TestGenerationJobStatus.COMPLETED) { logger.verbose(`testgen job status: ${status}`) logger.verbose(`Complete polling test job status.`) break From 86c143ffa83bf3e1c4b1b5b3023a2b45051b58ed Mon Sep 17 00:00:00 2001 From: chungjac Date: Mon, 17 Mar 2025 12:12:59 -0700 Subject: [PATCH 2/3] Update Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json --- .../Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/amazonq/.changes/next-release/Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json b/packages/amazonq/.changes/next-release/Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json index a6f1a80ac0a..b7f9ab81cc7 100644 --- a/packages/amazonq/.changes/next-release/Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json +++ b/packages/amazonq/.changes/next-release/Bug Fix-7bb4ae68-204d-48a1-a510-490d2a2a938a.json @@ -1,4 +1,4 @@ { "type": "Bug Fix", - "description": "/test: show customer facing error message" + "description": "/test: show descriptive error message" } From b8448334fa870abdbe7e9729bd2beeffdb355f2e Mon Sep 17 00:00:00 2001 From: Jacob Chung Date: Tue, 18 Mar 2025 13:46:28 -0700 Subject: [PATCH 3/3] backend error handling --- .../amazonqTest/chat/controller/controller.ts | 33 ++++++++++++++----- .../src/amazonqTest/chat/session/session.ts | 1 + .../codewhisperer/service/testGenHandler.ts | 1 + 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/packages/core/src/amazonqTest/chat/controller/controller.ts b/packages/core/src/amazonqTest/chat/controller/controller.ts index 80f43702ab0..4e29bb31464 100644 --- a/packages/core/src/amazonqTest/chat/controller/controller.ts +++ b/packages/core/src/amazonqTest/chat/controller/controller.ts @@ -284,7 +284,10 @@ export class TestController { this.messenger.sendUpdatePromptProgress(data.tabID, null) const session = this.sessionStorage.getSession() const isCancel = data.error.uiMessage === unitTestGenerationCancelMessage - const telemetryErrorMessage = getTelemetryReasonDesc(data.error.uiMessage.replaceAll('```', '')) + let telemetryErrorMessage = getTelemetryReasonDesc(data.error) + if (session.stopIteration) { + telemetryErrorMessage = getTelemetryReasonDesc(data.error.uiMessage.replaceAll('```', '')) + } TelemetryHelper.instance.sendTestGenerationToolkitEvent( session, session.isSupportedLanguage, @@ -306,13 +309,26 @@ export class TestController { undefined, isCancel ? 'CANCELLED' : 'FAILED' ) - this.messenger.sendMessage( - data.error.uiMessage.replaceAll('```', ''), - data.tabID, - 'answer', - 'testGenErrorMessage', - this.getFeedbackButtons() - ) + if (session.stopIteration) { + // Error from Science + this.messenger.sendMessage( + data.error.uiMessage.replaceAll('```', ''), + data.tabID, + 'answer', + 'testGenErrorMessage', + this.getFeedbackButtons() + ) + } else { + isCancel + ? this.messenger.sendMessage( + data.error.uiMessage, + data.tabID, + 'answer', + 'testGenErrorMessage', + this.getFeedbackButtons() + ) + : this.sendErrorMessage(data) + } await this.sessionCleanUp() return } @@ -1382,6 +1398,7 @@ export class TestController { session.sourceFilePath = '' session.generatedFilePath = '' session.projectRootPath = '' + session.stopIteration = false session.fileLanguage = undefined ChatSessionManager.Instance.setIsInProgress(false) session.linesOfCodeGenerated = 0 diff --git a/packages/core/src/amazonqTest/chat/session/session.ts b/packages/core/src/amazonqTest/chat/session/session.ts index b10ab22b4fa..4e3780e6f99 100644 --- a/packages/core/src/amazonqTest/chat/session/session.ts +++ b/packages/core/src/amazonqTest/chat/session/session.ts @@ -42,6 +42,7 @@ export class Session { public generatedFilePath: string = '' public projectRootPath: string = '' public fileLanguage: string | undefined = 'plaintext' + public stopIteration: boolean = false public targetFileInfo: TargetFileInfo | undefined public jobSummary: string = '' diff --git a/packages/core/src/codewhisperer/service/testGenHandler.ts b/packages/core/src/codewhisperer/service/testGenHandler.ts index a91b08ef7c0..3f4825d37ca 100644 --- a/packages/core/src/codewhisperer/service/testGenHandler.ts +++ b/packages/core/src/codewhisperer/service/testGenHandler.ts @@ -199,6 +199,7 @@ export async function pollTestJobStatus( session.numberOfTestsGenerated = 0 logger.verbose(`Test generation failed.`) if (resp.testGenerationJob?.jobStatusReason) { + session.stopIteration = true throw new TestGenFailedError(resp.testGenerationJob?.jobStatusReason) } else { throw new TestGenFailedError()