Skip to content

Commit 2a20e3c

Browse files
authored
config(amazonq): lower timeout for auto reviews (aws#6397)
## Problem Auto review timeout is too long ## Solution Decrease the timeout for auto reviews from 10 to 1 minute. `/review` will still use 10 minute timeout. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent bcdfcdd commit 2a20e3c

File tree

5 files changed

+64
-10
lines changed

5 files changed

+64
-10
lines changed

packages/amazonq/test/unit/codewhisperer/service/securityScanHandler.test.ts

+56
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ import {
1313
mapToAggregatedList,
1414
DefaultCodeWhispererClient,
1515
ListCodeScanFindingsResponse,
16+
pollScanJobStatus,
17+
SecurityScanTimedOutError,
1618
} from 'aws-core-vscode/codewhisperer'
19+
import { timeoutUtils } from 'aws-core-vscode/shared'
1720
import assert from 'assert'
1821
import sinon from 'sinon'
1922
import * as vscode from 'vscode'
@@ -239,4 +242,57 @@ describe('securityScanHandler', function () {
239242
assert.strictEqual(codeScanIssueMap.get('file1.ts')?.length, 1)
240243
})
241244
})
245+
246+
describe('pollScanJobStatus', function () {
247+
let mockClient: Stub<DefaultCodeWhispererClient>
248+
let clock: sinon.SinonFakeTimers
249+
const mockJobId = 'test-job-id'
250+
const mockStartTime = Date.now()
251+
252+
beforeEach(function () {
253+
mockClient = stub(DefaultCodeWhispererClient)
254+
clock = sinon.useFakeTimers({
255+
shouldAdvanceTime: true,
256+
})
257+
sinon.stub(timeoutUtils, 'sleep').resolves()
258+
})
259+
260+
afterEach(function () {
261+
sinon.restore()
262+
clock.restore()
263+
})
264+
265+
it('should return status when scan completes successfully', async function () {
266+
mockClient.getCodeScan
267+
.onFirstCall()
268+
.resolves({ status: 'Pending', $response: { requestId: 'req1' } })
269+
.onSecondCall()
270+
.resolves({ status: 'Completed', $response: { requestId: 'req2' } })
271+
272+
const result = await pollScanJobStatus(mockClient, mockJobId, CodeAnalysisScope.FILE_AUTO, mockStartTime)
273+
assert.strictEqual(result, 'Completed')
274+
})
275+
276+
it('should throw SecurityScanTimedOutError when polling exceeds timeout for express scans', async function () {
277+
mockClient.getCodeScan.resolves({ status: 'Pending', $response: { requestId: 'req1' } })
278+
279+
const pollPromise = pollScanJobStatus(mockClient, mockJobId, CodeAnalysisScope.FILE_AUTO, mockStartTime)
280+
281+
const expectedTimeoutMs = 60_000
282+
clock.tick(expectedTimeoutMs + 1000)
283+
284+
await assert.rejects(() => pollPromise, SecurityScanTimedOutError)
285+
})
286+
287+
it('should throw SecurityScanTimedOutError when polling exceeds timeout for standard scans', async function () {
288+
mockClient.getCodeScan.resolves({ status: 'Pending', $response: { requestId: 'req1' } })
289+
290+
const pollPromise = pollScanJobStatus(mockClient, mockJobId, CodeAnalysisScope.PROJECT, mockStartTime)
291+
292+
const expectedTimeoutMs = 600_000
293+
clock.tick(expectedTimeoutMs + 1000)
294+
295+
await assert.rejects(() => pollPromise, SecurityScanTimedOutError)
296+
})
297+
})
242298
})

packages/core/src/codewhisperer/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export { DocumentChangedSource, KeyStrokeHandler, DefaultDocumentChangedType } f
7373
export { ReferenceLogViewProvider } from './service/referenceLogViewProvider'
7474
export { LicenseUtil } from './util/licenseUtil'
7575
export { SecurityIssueProvider } from './service/securityIssueProvider'
76-
export { listScanResults, mapToAggregatedList } from './service/securityScanHandler'
76+
export { listScanResults, mapToAggregatedList, pollScanJobStatus } from './service/securityScanHandler'
7777
export { CodeWhispererCodeCoverageTracker } from './tracker/codewhispererCodeCoverageTracker'
7878
export { TelemetryHelper } from './util/telemetryHelper'
7979
export { LineSelection, LineTracker } from './tracker/lineTracker'
@@ -97,7 +97,7 @@ export * as supplementalContextUtil from './util/supplementalContext/supplementa
9797
export * from './service/diagnosticsProvider'
9898
export * as diagnosticsProvider from './service/diagnosticsProvider'
9999
export * from './ui/codeWhispererNodes'
100-
export { SecurityScanError } from '../codewhisperer/models/errors'
100+
export { SecurityScanError, SecurityScanTimedOutError } from '../codewhisperer/models/errors'
101101
export * as CodeWhispererConstants from '../codewhisperer/models/constants'
102102
export { getSelectedCustomization, setSelectedCustomization, baseCustomization } from './util/customizationUtil'
103103
export { Container } from './service/serviceContainer'

packages/core/src/codewhisperer/models/constants.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,9 @@ export const codeScanZipExt = '.zip'
258258

259259
export const contextTruncationTimeoutSeconds = 10
260260

261-
export const codeScanJobTimeoutSeconds = 60 * 10 // 10 minutes
261+
export const standardScanTimeoutMs = 600_000 // 10 minutes
262262

263-
export const codeFileScanJobTimeoutSeconds = 60 * 10 // 10 minutes
263+
export const expressScanTimeoutMs = 60_000
264264

265265
export const codeFixJobTimeoutMs = 60_000
266266

packages/core/src/codewhisperer/service/securityScanHandler.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -403,10 +403,7 @@ function getPollingDelayMsForScope(scope: CodeWhispererConstants.CodeAnalysisSco
403403
}
404404

405405
function getPollingTimeoutMsForScope(scope: CodeWhispererConstants.CodeAnalysisScope) {
406-
return (
407-
(scope === CodeWhispererConstants.CodeAnalysisScope.FILE_AUTO ||
408-
scope === CodeWhispererConstants.CodeAnalysisScope.FILE_ON_DEMAND
409-
? CodeWhispererConstants.codeFileScanJobTimeoutSeconds
410-
: CodeWhispererConstants.codeScanJobTimeoutSeconds) * 1000
411-
)
406+
return scope === CodeWhispererConstants.CodeAnalysisScope.FILE_AUTO
407+
? CodeWhispererConstants.expressScanTimeoutMs
408+
: CodeWhispererConstants.standardScanTimeoutMs
412409
}

packages/core/src/shared/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export { getMachineId } from './vscode/env'
2222
export { getLogger } from './logger/logger'
2323
export { activateExtension, openUrl } from './utilities/vsCodeUtils'
2424
export { waitUntil, sleep, Timeout } from './utilities/timeoutUtils'
25+
export * as timeoutUtils from './utilities/timeoutUtils'
2526
export { Prompter } from './ui/prompter'
2627
export { VirtualFileSystem } from './virtualFilesystem'
2728
export { VirtualMemoryFile } from './virtualMemoryFile'

0 commit comments

Comments
 (0)