diff --git a/packages/core/src/test/codewhisperer/commands/startSecurityScan.test.ts b/packages/core/src/test/codewhisperer/startSecurityScan.test.ts similarity index 65% rename from packages/core/src/test/codewhisperer/commands/startSecurityScan.test.ts rename to packages/core/src/test/codewhisperer/startSecurityScan.test.ts index f3efda3e040..fadd1063aa8 100644 --- a/packages/core/src/test/codewhisperer/commands/startSecurityScan.test.ts +++ b/packages/core/src/test/codewhisperer/startSecurityScan.test.ts @@ -7,130 +7,28 @@ import assert from 'assert' import * as vscode from 'vscode' import * as sinon from 'sinon' import * as semver from 'semver' -import { DefaultCodeWhispererClient } from '../../../codewhisperer/client/codewhisperer' -import * as startSecurityScan from '../../../codewhisperer/commands/startSecurityScan' -import { SecurityPanelViewProvider } from '../../../codewhisperer/views/securityPanelViewProvider' -import { FakeExtensionContext } from '../../fakeExtensionContext' -import * as diagnosticsProvider from '../../../codewhisperer/service/diagnosticsProvider' -import { getTestWorkspaceFolder } from '../../../testInteg/integrationTestsUtilities' +import * as startSecurityScan from '../../codewhisperer/commands/startSecurityScan' +import { SecurityPanelViewProvider } from '../../codewhisperer/views/securityPanelViewProvider' +import { FakeExtensionContext } from '../fakeExtensionContext' +import * as diagnosticsProvider from '../../codewhisperer/service/diagnosticsProvider' +import { getTestWorkspaceFolder } from '../../testInteg/integrationTestsUtilities' import { join } from 'path' -import { - assertTelemetry, - closeAllEditors, - createTestWorkspaceFolder, - getFetchStubWithResponse, - toFile, -} from '../../testUtil' -import { stub } from '../../utilities/stubber' -import { AWSError, HttpResponse } from 'aws-sdk' -import { getTestWindow } from '../../shared/vscode/window' -import { SeverityLevel } from '../../shared/vscode/message' -import { cancel } from '../../../shared/localizedText' +import { assertTelemetry, closeAllEditors, getFetchStubWithResponse } from '../testUtil' +import { AWSError } from 'aws-sdk' +import { getTestWindow } from '../shared/vscode/window' +import { SeverityLevel } from '../shared/vscode/message' +import { cancel } from '../../shared/localizedText' import { showScannedFilesMessage, stopScanMessage, CodeAnalysisScope, projectScansLimitReached, -} from '../../../codewhisperer/models/constants' -import * as model from '../../../codewhisperer/models/model' -import { CodewhispererSecurityScan } from '../../../shared/telemetry/telemetry.gen' -import * as errors from '../../../shared/errors' -import * as timeoutUtils from '../../../shared/utilities/timeoutUtils' -import { performanceTest } from '../../../shared/performance/performance' - -const mockCreateCodeScanResponse = { - $response: { - data: { - jobId: 'jobId', - status: 'Pending', - }, - requestId: 'requestId', - hasNextPage: () => false, - error: undefined, - nextPage: () => undefined, - redirectCount: 0, - retryCount: 0, - httpResponse: new HttpResponse(), - }, - jobId: 'jobId', - status: 'Pending', -} - -const mockCreateUploadUrlResponse = { - $response: { - data: { - uploadId: 'uploadId', - uploadUrl: 'uploadUrl', - }, - requestId: 'requestId', - hasNextPage: () => false, - error: undefined, - nextPage: () => undefined, - redirectCount: 0, - retryCount: 0, - httpResponse: new HttpResponse(), - }, - uploadId: 'uploadId', - uploadUrl: 'https://test.com', -} - -const mockGetCodeScanResponse = { - $response: { - data: { - status: 'Completed', - }, - requestId: 'requestId', - hasNextPage: () => false, - error: undefined, - nextPage: () => undefined, - redirectCount: 0, - retryCount: 0, - httpResponse: new HttpResponse(), - }, - status: 'Completed', -} - -const mockCodeScanFindings = JSON.stringify([ - { - filePath: 'workspaceFolder/python3.7-plain-sam-app/hello_world/app.py', - startLine: 1, - endLine: 1, - title: 'title', - description: { - text: 'text', - markdown: 'markdown', - }, - detectorId: 'detectorId', - detectorName: 'detectorName', - findingId: 'findingId', - relatedVulnerabilities: [], - severity: 'High', - remediation: { - recommendation: { - text: 'text', - url: 'url', - }, - suggestedFixes: [], - }, - codeSnippet: [], - } satisfies model.RawCodeScanIssue, -]) - -const mockListCodeScanFindingsResponse = { - $response: { - data: { - codeScanFindings: mockCodeScanFindings, - }, - requestId: 'requestId', - hasNextPage: () => false, - error: undefined, - nextPage: () => undefined, - redirectCount: 0, - retryCount: 0, - httpResponse: new HttpResponse(), - }, - codeScanFindings: mockCodeScanFindings, -} +} from '../../codewhisperer/models/constants' +import * as model from '../../codewhisperer/models/model' +import { CodewhispererSecurityScan } from '../../shared/telemetry/telemetry.gen' +import * as errors from '../../shared/errors' +import * as timeoutUtils from '../../shared/utilities/timeoutUtils' +import { createClient, mockGetCodeScanResponse } from './testUtil' let extensionContext: FakeExtensionContext let mockSecurityPanelViewProvider: SecurityPanelViewProvider @@ -155,15 +53,6 @@ describe('startSecurityScan', function () { after(async function () { await closeAllEditors() }) - const createClient = () => { - const mockClient = stub(DefaultCodeWhispererClient) - - mockClient.createCodeScan.resolves(mockCreateCodeScanResponse) - mockClient.createUploadUrl.resolves(mockCreateUploadUrlResponse) - mockClient.getCodeScan.resolves(mockGetCodeScanResponse) - mockClient.listCodeScanFindings.resolves(mockListCodeScanFindingsResponse) - return mockClient - } const openTestFile = async (filePath: string) => { const doc = await vscode.workspace.openTextDocument(filePath) @@ -454,78 +343,3 @@ describe('startSecurityScan', function () { } as unknown as CodewhispererSecurityScan) }) }) - -describe('startSecurityScanPerformanceTest', function () { - beforeEach(async function () { - extensionContext = await FakeExtensionContext.create() - mockSecurityPanelViewProvider = new SecurityPanelViewProvider(extensionContext) - const folder = await createTestWorkspaceFolder() - const mockFilePath = join(folder.uri.fsPath, 'app.py') - await toFile('hello_world', mockFilePath) - appCodePath = mockFilePath - editor = await openTestFile(appCodePath) - await model.CodeScansState.instance.setScansEnabled(false) - sinon.stub(timeoutUtils, 'sleep') - }) - - afterEach(function () { - sinon.restore() - }) - - after(async function () { - await closeAllEditors() - }) - - const createClient = () => { - const mockClient = stub(DefaultCodeWhispererClient) - mockClient.createCodeScan.resolves(mockCreateCodeScanResponse) - mockClient.createUploadUrl.resolves(mockCreateUploadUrlResponse) - mockClient.getCodeScan.resolves(mockGetCodeScanResponse) - mockClient.listCodeScanFindings.resolves(mockListCodeScanFindingsResponse) - return mockClient - } - - const openTestFile = async (filePath: string) => { - const doc = await vscode.workspace.openTextDocument(filePath) - return await vscode.window.showTextDocument(doc, { - selection: new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 1)), - }) - } - - performanceTest({}, 'Should calculate cpu and memory usage for file scans', function () { - return { - setup: async () => { - getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) - const commandSpy = sinon.spy(vscode.commands, 'executeCommand') - const securityScanRenderSpy = sinon.spy(diagnosticsProvider, 'initSecurityScanRender') - await model.CodeScansState.instance.setScansEnabled(true) - return { commandSpy, securityScanRenderSpy } - }, - execute: async () => { - await startSecurityScan.startSecurityScan( - mockSecurityPanelViewProvider, - editor, - createClient(), - extensionContext, - CodeAnalysisScope.FILE - ) - }, - verify: ({ - commandSpy, - securityScanRenderSpy, - }: { - commandSpy: sinon.SinonSpy - securityScanRenderSpy: sinon.SinonSpy - }) => { - assert.ok(commandSpy.neverCalledWith('workbench.action.problems.focus')) - assert.ok(securityScanRenderSpy.calledOnce) - const warnings = getTestWindow().shownMessages.filter((m) => m.severity === SeverityLevel.Warning) - assert.strictEqual(warnings.length, 0) - assertTelemetry('codewhisperer_securityScan', { - codewhispererCodeScanScope: 'FILE', - passive: true, - }) - }, - } - }) -}) diff --git a/packages/core/src/test/codewhisperer/testUtil.ts b/packages/core/src/test/codewhisperer/testUtil.ts index b2a347cad9f..e752c7c93b8 100644 --- a/packages/core/src/test/codewhisperer/testUtil.ts +++ b/packages/core/src/test/codewhisperer/testUtil.ts @@ -19,11 +19,13 @@ import globals from '../../shared/extensionGlobals' import { session } from '../../codewhisperer/util/codeWhispererSession' import { DefaultAWSClientBuilder, ServiceOptions } from '../../shared/awsClientBuilder' import { FakeAwsContext } from '../utilities/fakeAwsContext' -import { Service } from 'aws-sdk' +import { HttpResponse, Service } from 'aws-sdk' import userApiConfig = require('./../../codewhisperer/client/user-service-2.json') import CodeWhispererUserClient = require('../../codewhisperer/client/codewhispereruserclient') import { codeWhispererClient } from '../../codewhisperer/client/codewhisperer' import { RecommendationHandler } from '../../codewhisperer/service/recommendationHandler' +import * as model from '../../codewhisperer/models/model' +import { stub } from '../utilities/stubber' import { Dirent } from 'fs' // eslint-disable-line no-restricted-imports export async function resetCodeWhispererGlobalVariables() { @@ -208,6 +210,109 @@ export function createMockDirentFile(fileName: string): Dirent { return dirent } +export const mockGetCodeScanResponse = { + $response: { + data: { + status: 'Completed', + }, + requestId: 'requestId', + hasNextPage: () => false, + error: undefined, + nextPage: () => undefined, + redirectCount: 0, + retryCount: 0, + httpResponse: new HttpResponse(), + }, + status: 'Completed', +} + +export function createClient() { + const mockClient = stub(codewhispererClient.DefaultCodeWhispererClient) + + const mockCreateCodeScanResponse = { + $response: { + data: { + jobId: 'jobId', + status: 'Pending', + }, + requestId: 'requestId', + hasNextPage: () => false, + error: undefined, + nextPage: () => undefined, + redirectCount: 0, + retryCount: 0, + httpResponse: new HttpResponse(), + }, + jobId: 'jobId', + status: 'Pending', + } + const mockCreateUploadUrlResponse = { + $response: { + data: { + uploadId: 'uploadId', + uploadUrl: 'uploadUrl', + }, + requestId: 'requestId', + hasNextPage: () => false, + error: undefined, + nextPage: () => undefined, + redirectCount: 0, + retryCount: 0, + httpResponse: new HttpResponse(), + }, + uploadId: 'uploadId', + uploadUrl: 'https://test.com', + } + + const mockCodeScanFindings = JSON.stringify([ + { + filePath: 'workspaceFolder/python3.7-plain-sam-app/hello_world/app.py', + startLine: 1, + endLine: 1, + title: 'title', + description: { + text: 'text', + markdown: 'markdown', + }, + detectorId: 'detectorId', + detectorName: 'detectorName', + findingId: 'findingId', + relatedVulnerabilities: [], + severity: 'High', + remediation: { + recommendation: { + text: 'text', + url: 'url', + }, + suggestedFixes: [], + }, + codeSnippet: [], + } satisfies model.RawCodeScanIssue, + ]) + + const mockListCodeScanFindingsResponse = { + $response: { + data: { + codeScanFindings: mockCodeScanFindings, + }, + requestId: 'requestId', + hasNextPage: () => false, + error: undefined, + nextPage: () => undefined, + redirectCount: 0, + retryCount: 0, + httpResponse: new HttpResponse(), + }, + codeScanFindings: mockCodeScanFindings, + } + + mockClient.createCodeScan.resolves(mockCreateCodeScanResponse) + mockClient.createUploadUrl.resolves(mockCreateUploadUrlResponse) + mockClient.getCodeScan.resolves(mockGetCodeScanResponse) + mockClient.listCodeScanFindings.resolves(mockListCodeScanFindingsResponse) + return mockClient +} + export function aStringWithLineCount(lineCount: number, start: number = 0): string { let s = '' for (let i = start; i < start + lineCount; i++) { diff --git a/packages/core/src/testInteg/buildIndex.test.ts b/packages/core/src/testInteg/perf/buildIndex.test.ts similarity index 87% rename from packages/core/src/testInteg/buildIndex.test.ts rename to packages/core/src/testInteg/perf/buildIndex.test.ts index 261327e5145..29f07e28587 100644 --- a/packages/core/src/testInteg/buildIndex.test.ts +++ b/packages/core/src/testInteg/perf/buildIndex.test.ts @@ -3,15 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { performanceTest } from '../shared/performance/performance' +import { performanceTest } from '../../shared/performance/performance' import * as sinon from 'sinon' import * as vscode from 'vscode' import assert from 'assert' -import { LspClient, LspController } from '../amazonq' +import { LspClient, LspController } from '../../amazonq' import { LanguageClient, ServerOptions } from 'vscode-languageclient' -import { createTestWorkspace } from '../test/testUtil' -import { GetUsageRequestType, IndexRequestType } from '../amazonq/lsp/types' -import { getRandomString } from '../shared' +import { createTestWorkspace } from '../../test/testUtil' +import { GetUsageRequestType, IndexRequestType } from '../../amazonq/lsp/types' +import { getRandomString } from '../../shared' interface SetupResult { clientReqStub: sinon.SinonStub diff --git a/packages/core/src/testInteg/perf/collectFiles.test.ts b/packages/core/src/testInteg/perf/collectFiles.test.ts new file mode 100644 index 00000000000..3e9914898f5 --- /dev/null +++ b/packages/core/src/testInteg/perf/collectFiles.test.ts @@ -0,0 +1,62 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import assert from 'assert' +import * as vscode from 'vscode' +import * as sinon from 'sinon' +import { performanceTest } from '../../shared/performance/performance' +import { createTestWorkspaceFolder, toFile } from '../../test/testUtil' +import path from 'path' +import { randomUUID } from '../../shared' +import { collectFiles } from '../../shared/utilities/workspaceUtils' + +performanceTest( + // collecting all files in the workspace and zipping them is pretty resource intensive + { + linux: { + userCpuUsage: 85, + heapTotal: 2, + duration: 0.8, + }, + }, + 'calculate cpu and memory usage', + function () { + const totalFiles = 100 + return { + setup: async () => { + const workspace = await createTestWorkspaceFolder() + + sinon.stub(vscode.workspace, 'workspaceFolders').value([workspace]) + + const fileContent = randomUUID() + for (let x = 0; x < totalFiles; x++) { + await toFile(fileContent, path.join(workspace.uri.fsPath, `file.${x}`)) + } + + return { + workspace, + } + }, + execute: async ({ workspace }: { workspace: vscode.WorkspaceFolder }) => { + return { + result: await collectFiles([workspace.uri.fsPath], [workspace], true), + } + }, + verify: ( + _: { workspace: vscode.WorkspaceFolder }, + { result }: { result: Awaited> } + ) => { + assert.deepStrictEqual(result.length, totalFiles) + const sortedFiles = [...result].sort((a, b) => { + const numA = parseInt(a.relativeFilePath.split('.')[1]) + const numB = parseInt(b.relativeFilePath.split('.')[1]) + return numA - numB + }) + for (let x = 0; x < totalFiles; x++) { + assert.deepStrictEqual(sortedFiles[x].relativeFilePath, `file.${x}`) + } + }, + } + } +) diff --git a/packages/core/src/test/amazonqFeatureDev/prepareRepoData.test.ts b/packages/core/src/testInteg/perf/prepareRepoData.test.ts similarity index 97% rename from packages/core/src/test/amazonqFeatureDev/prepareRepoData.test.ts rename to packages/core/src/testInteg/perf/prepareRepoData.test.ts index 50a4093ceca..3e10a1bec42 100644 --- a/packages/core/src/test/amazonqFeatureDev/prepareRepoData.test.ts +++ b/packages/core/src/testInteg/perf/prepareRepoData.test.ts @@ -5,7 +5,7 @@ import assert from 'assert' import { WorkspaceFolder } from 'vscode' import { performanceTest } from '../../shared/performance/performance' -import { createTestWorkspace } from '../testUtil' +import { createTestWorkspace } from '../../test/testUtil' import { prepareRepoData, TelemetryHelper } from '../../amazonqFeatureDev' import { AmazonqCreateUpload, getRandomString } from '../../shared' import { Span } from '../../shared/telemetry' diff --git a/packages/core/src/testInteg/perf/startSecurityScan.test.ts b/packages/core/src/testInteg/perf/startSecurityScan.test.ts new file mode 100644 index 00000000000..79209322d31 --- /dev/null +++ b/packages/core/src/testInteg/perf/startSecurityScan.test.ts @@ -0,0 +1,96 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import * as sinon from 'sinon' +import * as startSecurityScan from '../../codewhisperer/commands/startSecurityScan' +import * as diagnosticsProvider from '../../codewhisperer/service/diagnosticsProvider' +import * as model from '../../codewhisperer/models/model' +import * as timeoutUtils from '../../shared/utilities/timeoutUtils' +import assert from 'assert' +import { SecurityPanelViewProvider } from '../../codewhisperer/views/securityPanelViewProvider' +import { FakeExtensionContext } from '../../test/fakeExtensionContext' +import { join } from 'path' +import { + assertTelemetry, + closeAllEditors, + createTestWorkspaceFolder, + getFetchStubWithResponse, + toFile, +} from '../../test/testUtil' +import { getTestWindow } from '../../test/shared/vscode/window' +import { SeverityLevel } from '../../test/shared/vscode/message' +import { CodeAnalysisScope } from '../../codewhisperer' +import { performanceTest } from '../../shared/performance/performance' +import { createClient } from '../../test/codewhisperer/testUtil' + +describe('startSecurityScanPerformanceTest', function () { + let extensionContext: FakeExtensionContext + let mockSecurityPanelViewProvider: SecurityPanelViewProvider + let appCodePath: string + let editor: vscode.TextEditor + beforeEach(async function () { + extensionContext = await FakeExtensionContext.create() + mockSecurityPanelViewProvider = new SecurityPanelViewProvider(extensionContext) + const folder = await createTestWorkspaceFolder() + const mockFilePath = join(folder.uri.fsPath, 'app.py') + await toFile('hello_world', mockFilePath) + appCodePath = mockFilePath + editor = await openTestFile(appCodePath) + await model.CodeScansState.instance.setScansEnabled(false) + sinon.stub(timeoutUtils, 'sleep') + }) + + afterEach(function () { + sinon.restore() + }) + + after(async function () { + await closeAllEditors() + }) + + const openTestFile = async (filePath: string) => { + const doc = await vscode.workspace.openTextDocument(filePath) + return await vscode.window.showTextDocument(doc, { + selection: new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 1)), + }) + } + + performanceTest({}, 'Should calculate cpu and memory usage for file scans', function () { + return { + setup: async () => { + getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) + const commandSpy = sinon.spy(vscode.commands, 'executeCommand') + const securityScanRenderSpy = sinon.spy(diagnosticsProvider, 'initSecurityScanRender') + await model.CodeScansState.instance.setScansEnabled(true) + return { commandSpy, securityScanRenderSpy } + }, + execute: async () => { + await startSecurityScan.startSecurityScan( + mockSecurityPanelViewProvider, + editor, + createClient(), + extensionContext, + CodeAnalysisScope.FILE + ) + }, + verify: ({ + commandSpy, + securityScanRenderSpy, + }: { + commandSpy: sinon.SinonSpy + securityScanRenderSpy: sinon.SinonSpy + }) => { + assert.ok(commandSpy.neverCalledWith('workbench.action.problems.focus')) + assert.ok(securityScanRenderSpy.calledOnce) + const warnings = getTestWindow().shownMessages.filter((m) => m.severity === SeverityLevel.Warning) + assert.strictEqual(warnings.length, 0) + assertTelemetry('codewhisperer_securityScan', { + codewhispererCodeScanScope: 'FILE', + passive: true, + }) + }, + } + }) +}) diff --git a/packages/core/src/testInteg/tryInstallLsp.test.ts b/packages/core/src/testInteg/perf/tryInstallLsp.test.ts similarity index 94% rename from packages/core/src/testInteg/tryInstallLsp.test.ts rename to packages/core/src/testInteg/perf/tryInstallLsp.test.ts index 9a5f8b808db..7cc9c18b2c4 100644 --- a/packages/core/src/testInteg/tryInstallLsp.test.ts +++ b/packages/core/src/testInteg/perf/tryInstallLsp.test.ts @@ -7,10 +7,10 @@ import sinon from 'sinon' import { Content } from 'aws-sdk/clients/codecommit' import AdmZip from 'adm-zip' import path from 'path' -import { LspController } from '../amazonq' -import { fs, getRandomString, globals } from '../shared' -import { createTestWorkspace } from '../test/testUtil' -import { performanceTest } from '../shared/performance/performance' +import { LspController } from '../../amazonq' +import { fs, getRandomString, globals } from '../../shared' +import { createTestWorkspace } from '../../test/testUtil' +import { performanceTest } from '../../shared/performance/performance' // fakeFileContent is matched to fakeQServerContent based on hash. const fakeHash = '4eb2865c8f40a322aa04e17d8d83bdaa605d6f1cb363af615240a5442a010e0aef66e21bcf4c88f20fabff06efe8a214' diff --git a/packages/core/src/testInteg/zipcode.test.ts b/packages/core/src/testInteg/perf/zipcode.test.ts similarity index 87% rename from packages/core/src/testInteg/zipcode.test.ts rename to packages/core/src/testInteg/perf/zipcode.test.ts index 685c26c02e8..1883861f222 100644 --- a/packages/core/src/testInteg/zipcode.test.ts +++ b/packages/core/src/testInteg/perf/zipcode.test.ts @@ -4,12 +4,12 @@ */ import assert from 'assert' import * as sinon from 'sinon' -import { TransformByQState, ZipManifest } from '../codewhisperer' -import { fs, getRandomString, globals } from '../shared' -import { createTestWorkspace } from '../test/testUtil' -import * as CodeWhispererConstants from '../codewhisperer/models/constants' -import { performanceTest } from '../shared/performance/performance' -import { zipCode } from '../codewhisperer/indexNode' +import { TransformByQState, ZipManifest } from '../../codewhisperer' +import { fs, getRandomString, globals } from '../../shared' +import { createTestWorkspace } from '../../test/testUtil' +import * as CodeWhispererConstants from '../../codewhisperer/models/constants' +import { performanceTest } from '../../shared/performance/performance' +import { zipCode } from '../../codewhisperer/indexNode' interface SetupResult { tempDir: string diff --git a/packages/core/src/testInteg/shared/utilities/workspaceUtils.test.ts b/packages/core/src/testInteg/shared/utilities/workspaceUtils.test.ts index 19dd0d965a1..95619f0599c 100644 --- a/packages/core/src/testInteg/shared/utilities/workspaceUtils.test.ts +++ b/packages/core/src/testInteg/shared/utilities/workspaceUtils.test.ts @@ -18,8 +18,6 @@ import globals from '../../../shared/extensionGlobals' import { CodelensRootRegistry } from '../../../shared/fs/codelensRootRegistry' import { createTestWorkspace, createTestWorkspaceFolder, toFile } from '../../../test/testUtil' import sinon from 'sinon' -import { performanceTest } from '../../../shared/performance/performance' -import { randomUUID } from '../../../shared/crypto' import { fs } from '../../../shared' describe('findParentProjectFile', async function () { @@ -326,56 +324,6 @@ describe('collectFiles', function () { assert.deepStrictEqual(1, result.length) assert.deepStrictEqual('non-license.md', result[0].relativeFilePath) }) - - performanceTest( - // collecting all files in the workspace and zipping them is pretty resource intensive - { - linux: { - userCpuUsage: 85, - heapTotal: 2, - duration: 0.8, - }, - }, - 'calculate cpu and memory usage', - function () { - const totalFiles = 100 - return { - setup: async () => { - const workspace = await createTestWorkspaceFolder() - - sinon.stub(vscode.workspace, 'workspaceFolders').value([workspace]) - - const fileContent = randomUUID() - for (let x = 0; x < totalFiles; x++) { - await toFile(fileContent, path.join(workspace.uri.fsPath, `file.${x}`)) - } - - return { - workspace, - } - }, - execute: async ({ workspace }: { workspace: vscode.WorkspaceFolder }) => { - return { - result: await collectFiles([workspace.uri.fsPath], [workspace], true), - } - }, - verify: ( - _: { workspace: vscode.WorkspaceFolder }, - { result }: { result: Awaited> } - ) => { - assert.deepStrictEqual(result.length, totalFiles) - const sortedFiles = [...result].sort((a, b) => { - const numA = parseInt(a.relativeFilePath.split('.')[1]) - const numB = parseInt(b.relativeFilePath.split('.')[1]) - return numA - numB - }) - for (let x = 0; x < totalFiles; x++) { - assert.deepStrictEqual(sortedFiles[x].relativeFilePath, `file.${x}`) - } - }, - } - } - ) }) describe('getWorkspaceFoldersByPrefixes', function () {