Skip to content

Commit 62d6c88

Browse files
Hweinstocktverney
authored andcommitted
refactor(tests): move performance tests to testInteg/perf/ aws#5735
## Problem Performance test involve running the same code 10 times, and often its demanding code. This should live with integ rather than unit tests to avoid slow down. ## Solution - Move https://github.com/aws/aws-toolkit-vscode/blob/master/packages/core/src/test/amazonqFeatureDev/prepareRepoData.test.ts into integ folder. - Move https://github.com/aws/aws-toolkit-vscode/blob/master/packages/core/src/test/codewhisperer/commands/startSecurityScan.test.ts into integ folder.
1 parent b3dbfd1 commit 62d6c88

File tree

9 files changed

+296
-271
lines changed

9 files changed

+296
-271
lines changed

packages/core/src/test/codewhisperer/commands/startSecurityScan.test.ts renamed to packages/core/src/test/codewhisperer/startSecurityScan.test.ts

Lines changed: 16 additions & 202 deletions
Original file line numberDiff line numberDiff line change
@@ -7,130 +7,28 @@ import assert from 'assert'
77
import * as vscode from 'vscode'
88
import * as sinon from 'sinon'
99
import * as semver from 'semver'
10-
import { DefaultCodeWhispererClient } from '../../../codewhisperer/client/codewhisperer'
11-
import * as startSecurityScan from '../../../codewhisperer/commands/startSecurityScan'
12-
import { SecurityPanelViewProvider } from '../../../codewhisperer/views/securityPanelViewProvider'
13-
import { FakeExtensionContext } from '../../fakeExtensionContext'
14-
import * as diagnosticsProvider from '../../../codewhisperer/service/diagnosticsProvider'
15-
import { getTestWorkspaceFolder } from '../../../testInteg/integrationTestsUtilities'
10+
import * as startSecurityScan from '../../codewhisperer/commands/startSecurityScan'
11+
import { SecurityPanelViewProvider } from '../../codewhisperer/views/securityPanelViewProvider'
12+
import { FakeExtensionContext } from '../fakeExtensionContext'
13+
import * as diagnosticsProvider from '../../codewhisperer/service/diagnosticsProvider'
14+
import { getTestWorkspaceFolder } from '../../testInteg/integrationTestsUtilities'
1615
import { join } from 'path'
17-
import {
18-
assertTelemetry,
19-
closeAllEditors,
20-
createTestWorkspaceFolder,
21-
getFetchStubWithResponse,
22-
toFile,
23-
} from '../../testUtil'
24-
import { stub } from '../../utilities/stubber'
25-
import { AWSError, HttpResponse } from 'aws-sdk'
26-
import { getTestWindow } from '../../shared/vscode/window'
27-
import { SeverityLevel } from '../../shared/vscode/message'
28-
import { cancel } from '../../../shared/localizedText'
16+
import { assertTelemetry, closeAllEditors, getFetchStubWithResponse } from '../testUtil'
17+
import { AWSError } from 'aws-sdk'
18+
import { getTestWindow } from '../shared/vscode/window'
19+
import { SeverityLevel } from '../shared/vscode/message'
20+
import { cancel } from '../../shared/localizedText'
2921
import {
3022
showScannedFilesMessage,
3123
stopScanMessage,
3224
CodeAnalysisScope,
3325
projectScansLimitReached,
34-
} from '../../../codewhisperer/models/constants'
35-
import * as model from '../../../codewhisperer/models/model'
36-
import { CodewhispererSecurityScan } from '../../../shared/telemetry/telemetry.gen'
37-
import * as errors from '../../../shared/errors'
38-
import * as timeoutUtils from '../../../shared/utilities/timeoutUtils'
39-
import { performanceTest } from '../../../shared/performance/performance'
40-
41-
const mockCreateCodeScanResponse = {
42-
$response: {
43-
data: {
44-
jobId: 'jobId',
45-
status: 'Pending',
46-
},
47-
requestId: 'requestId',
48-
hasNextPage: () => false,
49-
error: undefined,
50-
nextPage: () => undefined,
51-
redirectCount: 0,
52-
retryCount: 0,
53-
httpResponse: new HttpResponse(),
54-
},
55-
jobId: 'jobId',
56-
status: 'Pending',
57-
}
58-
59-
const mockCreateUploadUrlResponse = {
60-
$response: {
61-
data: {
62-
uploadId: 'uploadId',
63-
uploadUrl: 'uploadUrl',
64-
},
65-
requestId: 'requestId',
66-
hasNextPage: () => false,
67-
error: undefined,
68-
nextPage: () => undefined,
69-
redirectCount: 0,
70-
retryCount: 0,
71-
httpResponse: new HttpResponse(),
72-
},
73-
uploadId: 'uploadId',
74-
uploadUrl: 'https://test.com',
75-
}
76-
77-
const mockGetCodeScanResponse = {
78-
$response: {
79-
data: {
80-
status: 'Completed',
81-
},
82-
requestId: 'requestId',
83-
hasNextPage: () => false,
84-
error: undefined,
85-
nextPage: () => undefined,
86-
redirectCount: 0,
87-
retryCount: 0,
88-
httpResponse: new HttpResponse(),
89-
},
90-
status: 'Completed',
91-
}
92-
93-
const mockCodeScanFindings = JSON.stringify([
94-
{
95-
filePath: 'workspaceFolder/python3.7-plain-sam-app/hello_world/app.py',
96-
startLine: 1,
97-
endLine: 1,
98-
title: 'title',
99-
description: {
100-
text: 'text',
101-
markdown: 'markdown',
102-
},
103-
detectorId: 'detectorId',
104-
detectorName: 'detectorName',
105-
findingId: 'findingId',
106-
relatedVulnerabilities: [],
107-
severity: 'High',
108-
remediation: {
109-
recommendation: {
110-
text: 'text',
111-
url: 'url',
112-
},
113-
suggestedFixes: [],
114-
},
115-
codeSnippet: [],
116-
} satisfies model.RawCodeScanIssue,
117-
])
118-
119-
const mockListCodeScanFindingsResponse = {
120-
$response: {
121-
data: {
122-
codeScanFindings: mockCodeScanFindings,
123-
},
124-
requestId: 'requestId',
125-
hasNextPage: () => false,
126-
error: undefined,
127-
nextPage: () => undefined,
128-
redirectCount: 0,
129-
retryCount: 0,
130-
httpResponse: new HttpResponse(),
131-
},
132-
codeScanFindings: mockCodeScanFindings,
133-
}
26+
} from '../../codewhisperer/models/constants'
27+
import * as model from '../../codewhisperer/models/model'
28+
import { CodewhispererSecurityScan } from '../../shared/telemetry/telemetry.gen'
29+
import * as errors from '../../shared/errors'
30+
import * as timeoutUtils from '../../shared/utilities/timeoutUtils'
31+
import { createClient, mockGetCodeScanResponse } from './testUtil'
13432

13533
let extensionContext: FakeExtensionContext
13634
let mockSecurityPanelViewProvider: SecurityPanelViewProvider
@@ -155,15 +53,6 @@ describe('startSecurityScan', function () {
15553
after(async function () {
15654
await closeAllEditors()
15755
})
158-
const createClient = () => {
159-
const mockClient = stub(DefaultCodeWhispererClient)
160-
161-
mockClient.createCodeScan.resolves(mockCreateCodeScanResponse)
162-
mockClient.createUploadUrl.resolves(mockCreateUploadUrlResponse)
163-
mockClient.getCodeScan.resolves(mockGetCodeScanResponse)
164-
mockClient.listCodeScanFindings.resolves(mockListCodeScanFindingsResponse)
165-
return mockClient
166-
}
16756

16857
const openTestFile = async (filePath: string) => {
16958
const doc = await vscode.workspace.openTextDocument(filePath)
@@ -454,78 +343,3 @@ describe('startSecurityScan', function () {
454343
} as unknown as CodewhispererSecurityScan)
455344
})
456345
})
457-
458-
describe('startSecurityScanPerformanceTest', function () {
459-
beforeEach(async function () {
460-
extensionContext = await FakeExtensionContext.create()
461-
mockSecurityPanelViewProvider = new SecurityPanelViewProvider(extensionContext)
462-
const folder = await createTestWorkspaceFolder()
463-
const mockFilePath = join(folder.uri.fsPath, 'app.py')
464-
await toFile('hello_world', mockFilePath)
465-
appCodePath = mockFilePath
466-
editor = await openTestFile(appCodePath)
467-
await model.CodeScansState.instance.setScansEnabled(false)
468-
sinon.stub(timeoutUtils, 'sleep')
469-
})
470-
471-
afterEach(function () {
472-
sinon.restore()
473-
})
474-
475-
after(async function () {
476-
await closeAllEditors()
477-
})
478-
479-
const createClient = () => {
480-
const mockClient = stub(DefaultCodeWhispererClient)
481-
mockClient.createCodeScan.resolves(mockCreateCodeScanResponse)
482-
mockClient.createUploadUrl.resolves(mockCreateUploadUrlResponse)
483-
mockClient.getCodeScan.resolves(mockGetCodeScanResponse)
484-
mockClient.listCodeScanFindings.resolves(mockListCodeScanFindingsResponse)
485-
return mockClient
486-
}
487-
488-
const openTestFile = async (filePath: string) => {
489-
const doc = await vscode.workspace.openTextDocument(filePath)
490-
return await vscode.window.showTextDocument(doc, {
491-
selection: new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 1)),
492-
})
493-
}
494-
495-
performanceTest({}, 'Should calculate cpu and memory usage for file scans', function () {
496-
return {
497-
setup: async () => {
498-
getFetchStubWithResponse({ status: 200, statusText: 'testing stub' })
499-
const commandSpy = sinon.spy(vscode.commands, 'executeCommand')
500-
const securityScanRenderSpy = sinon.spy(diagnosticsProvider, 'initSecurityScanRender')
501-
await model.CodeScansState.instance.setScansEnabled(true)
502-
return { commandSpy, securityScanRenderSpy }
503-
},
504-
execute: async () => {
505-
await startSecurityScan.startSecurityScan(
506-
mockSecurityPanelViewProvider,
507-
editor,
508-
createClient(),
509-
extensionContext,
510-
CodeAnalysisScope.FILE
511-
)
512-
},
513-
verify: ({
514-
commandSpy,
515-
securityScanRenderSpy,
516-
}: {
517-
commandSpy: sinon.SinonSpy
518-
securityScanRenderSpy: sinon.SinonSpy
519-
}) => {
520-
assert.ok(commandSpy.neverCalledWith('workbench.action.problems.focus'))
521-
assert.ok(securityScanRenderSpy.calledOnce)
522-
const warnings = getTestWindow().shownMessages.filter((m) => m.severity === SeverityLevel.Warning)
523-
assert.strictEqual(warnings.length, 0)
524-
assertTelemetry('codewhisperer_securityScan', {
525-
codewhispererCodeScanScope: 'FILE',
526-
passive: true,
527-
})
528-
},
529-
}
530-
})
531-
})

packages/core/src/test/codewhisperer/testUtil.ts

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ import globals from '../../shared/extensionGlobals'
1919
import { session } from '../../codewhisperer/util/codeWhispererSession'
2020
import { DefaultAWSClientBuilder, ServiceOptions } from '../../shared/awsClientBuilder'
2121
import { FakeAwsContext } from '../utilities/fakeAwsContext'
22-
import { Service } from 'aws-sdk'
22+
import { HttpResponse, Service } from 'aws-sdk'
2323
import userApiConfig = require('./../../codewhisperer/client/user-service-2.json')
2424
import CodeWhispererUserClient = require('../../codewhisperer/client/codewhispereruserclient')
2525
import { codeWhispererClient } from '../../codewhisperer/client/codewhisperer'
2626
import { RecommendationHandler } from '../../codewhisperer/service/recommendationHandler'
27+
import * as model from '../../codewhisperer/models/model'
28+
import { stub } from '../utilities/stubber'
2729
import { Dirent } from 'fs' // eslint-disable-line no-restricted-imports
2830

2931
export async function resetCodeWhispererGlobalVariables() {
@@ -208,6 +210,109 @@ export function createMockDirentFile(fileName: string): Dirent {
208210
return dirent
209211
}
210212

213+
export const mockGetCodeScanResponse = {
214+
$response: {
215+
data: {
216+
status: 'Completed',
217+
},
218+
requestId: 'requestId',
219+
hasNextPage: () => false,
220+
error: undefined,
221+
nextPage: () => undefined,
222+
redirectCount: 0,
223+
retryCount: 0,
224+
httpResponse: new HttpResponse(),
225+
},
226+
status: 'Completed',
227+
}
228+
229+
export function createClient() {
230+
const mockClient = stub(codewhispererClient.DefaultCodeWhispererClient)
231+
232+
const mockCreateCodeScanResponse = {
233+
$response: {
234+
data: {
235+
jobId: 'jobId',
236+
status: 'Pending',
237+
},
238+
requestId: 'requestId',
239+
hasNextPage: () => false,
240+
error: undefined,
241+
nextPage: () => undefined,
242+
redirectCount: 0,
243+
retryCount: 0,
244+
httpResponse: new HttpResponse(),
245+
},
246+
jobId: 'jobId',
247+
status: 'Pending',
248+
}
249+
const mockCreateUploadUrlResponse = {
250+
$response: {
251+
data: {
252+
uploadId: 'uploadId',
253+
uploadUrl: 'uploadUrl',
254+
},
255+
requestId: 'requestId',
256+
hasNextPage: () => false,
257+
error: undefined,
258+
nextPage: () => undefined,
259+
redirectCount: 0,
260+
retryCount: 0,
261+
httpResponse: new HttpResponse(),
262+
},
263+
uploadId: 'uploadId',
264+
uploadUrl: 'https://test.com',
265+
}
266+
267+
const mockCodeScanFindings = JSON.stringify([
268+
{
269+
filePath: 'workspaceFolder/python3.7-plain-sam-app/hello_world/app.py',
270+
startLine: 1,
271+
endLine: 1,
272+
title: 'title',
273+
description: {
274+
text: 'text',
275+
markdown: 'markdown',
276+
},
277+
detectorId: 'detectorId',
278+
detectorName: 'detectorName',
279+
findingId: 'findingId',
280+
relatedVulnerabilities: [],
281+
severity: 'High',
282+
remediation: {
283+
recommendation: {
284+
text: 'text',
285+
url: 'url',
286+
},
287+
suggestedFixes: [],
288+
},
289+
codeSnippet: [],
290+
} satisfies model.RawCodeScanIssue,
291+
])
292+
293+
const mockListCodeScanFindingsResponse = {
294+
$response: {
295+
data: {
296+
codeScanFindings: mockCodeScanFindings,
297+
},
298+
requestId: 'requestId',
299+
hasNextPage: () => false,
300+
error: undefined,
301+
nextPage: () => undefined,
302+
redirectCount: 0,
303+
retryCount: 0,
304+
httpResponse: new HttpResponse(),
305+
},
306+
codeScanFindings: mockCodeScanFindings,
307+
}
308+
309+
mockClient.createCodeScan.resolves(mockCreateCodeScanResponse)
310+
mockClient.createUploadUrl.resolves(mockCreateUploadUrlResponse)
311+
mockClient.getCodeScan.resolves(mockGetCodeScanResponse)
312+
mockClient.listCodeScanFindings.resolves(mockListCodeScanFindingsResponse)
313+
return mockClient
314+
}
315+
211316
export function aStringWithLineCount(lineCount: number, start: number = 0): string {
212317
let s = ''
213318
for (let i = start; i < start + lineCount; i++) {

packages/core/src/testInteg/buildIndex.test.ts renamed to packages/core/src/testInteg/perf/buildIndex.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import { performanceTest } from '../shared/performance/performance'
6+
import { performanceTest } from '../../shared/performance/performance'
77
import * as sinon from 'sinon'
88
import * as vscode from 'vscode'
99
import assert from 'assert'
10-
import { LspClient, LspController } from '../amazonq'
10+
import { LspClient, LspController } from '../../amazonq'
1111
import { LanguageClient, ServerOptions } from 'vscode-languageclient'
12-
import { createTestWorkspace } from '../test/testUtil'
13-
import { GetUsageRequestType, IndexRequestType } from '../amazonq/lsp/types'
14-
import { getRandomString } from '../shared'
12+
import { createTestWorkspace } from '../../test/testUtil'
13+
import { GetUsageRequestType, IndexRequestType } from '../../amazonq/lsp/types'
14+
import { getRandomString } from '../../shared'
1515

1616
interface SetupResult {
1717
clientReqStub: sinon.SinonStub

0 commit comments

Comments
 (0)