add more leakage checks in tests (#203525)

re https://github.com/microsoft/vscode/issues/200091
This commit is contained in:
Johannes Rieken 2024-01-26 13:59:40 +01:00 committed by GitHub
parent e1f27e691f
commit fb5a1aca6d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 74 additions and 30 deletions

View File

@ -154,10 +154,6 @@
"src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts",
"src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts",
"src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts",
"src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts",
"src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts",
"src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts",
"src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts",
"src/vs/editor/test/common/services/languageService.test.ts",
"src/vs/editor/test/node/classification/typescript.test.ts",
"src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts",
@ -167,22 +163,15 @@
"src/vs/platform/contextkey/test/common/parser.test.ts",
"src/vs/platform/contextkey/test/common/scanner.test.ts",
"src/vs/platform/extensions/test/common/extensionValidator.test.ts",
"src/vs/platform/instantiation/test/common/graph.test.ts",
"src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts",
"src/vs/platform/keybinding/test/common/keybindingLabels.test.ts",
"src/vs/platform/keybinding/test/common/keybindingResolver.test.ts",
"src/vs/platform/markers/test/common/markerService.test.ts",
"src/vs/platform/opener/test/common/opener.test.ts",
"src/vs/platform/progress/test/common/progress.test.ts",
"src/vs/platform/registry/test/common/platform.test.ts",
"src/vs/platform/remote/test/common/remoteHosts.test.ts",
"src/vs/platform/telemetry/test/browser/1dsAppender.test.ts",
"src/vs/platform/workspace/test/common/workspace.test.ts",
"src/vs/platform/workspaces/test/electron-main/workspaces.test.ts",
"src/vs/workbench/api/test/browser/extHostApiCommands.test.ts",
"src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts",
"src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts",
"src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts",
"src/vs/workbench/api/test/browser/extHostWorkspace.test.ts",
"src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts",
"src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts",
@ -194,9 +183,6 @@
"src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts",
"src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts",
"src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts",
"src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts",
"src/vs/workbench/contrib/snippets/test/browser/snippetsRegistry.test.ts",
"src/vs/workbench/contrib/snippets/test/browser/snippetsRewrite.test.ts",
"src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts",
"src/vs/workbench/contrib/tasks/test/common/taskConfiguration.test.ts",
"src/vs/workbench/services/commands/test/common/commandService.test.ts",

View File

@ -19,6 +19,7 @@ import { createModelServices } from 'vs/editor/test/common/testTextModel';
import { javascriptOnEnterRules } from 'vs/editor/test/common/modes/supports/javascriptOnEnterRules';
import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry';
import { ILanguageSelection, ILanguageService } from 'vs/editor/common/languages/language';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
class StaticLanguageSelector implements ILanguageSelection {
readonly onDidChange: Event<string> = Event.None;
@ -64,6 +65,8 @@ suite('SmartSelect', () => {
disposables.dispose();
});
ensureNoDisposablesAreLeakedInTestSuite();
async function assertGetRangesToPosition(text: string[], lineNumber: number, column: number, ranges: Range[], selectLeadingAndTrailingWhitespace = true): Promise<void> {
const uri = URI.file('test.js');
const model = modelService.createModel(text.join('\n'), new StaticLanguageSelector(languageId), uri);

View File

@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { mock } from 'vs/base/test/common/mock';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser';
import { IPosition, Position } from 'vs/editor/common/core/position';
import { Range } from 'vs/editor/common/core/range';
@ -58,6 +59,8 @@ suite('SnippetSession', function () {
editor.dispose();
});
ensureNoDisposablesAreLeakedInTestSuite();
test('normalize whitespace', function () {
function assertNormalized(position: IPosition, input: string, expected: string): void {

View File

@ -3,6 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { EditorOptions, InternalSuggestOptions } from 'vs/editor/common/config/editorOptions';
import { IPosition } from 'vs/editor/common/core/position';
import * as languages from 'vs/editor/common/languages';
@ -83,6 +84,8 @@ suite('CompletionModel', function () {
}, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined);
});
ensureNoDisposablesAreLeakedInTestSuite();
test('filtering - cached', function () {
const itemsNow = model.items;

View File

@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { IPosition } from 'vs/editor/common/core/position';
import { ITextModel } from 'vs/editor/common/model';
import { CompletionItem } from 'vs/editor/contrib/suggest/browser/suggest';
@ -30,6 +31,8 @@ suite('SuggestMemories', function () {
buffer.dispose();
});
ensureNoDisposablesAreLeakedInTestSuite();
test('AbstractMemory, select', function () {
const mem = new class extends Memory {

View File

@ -3,15 +3,19 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { Graph } from 'vs/platform/instantiation/common/graph';
suite('Graph', () => {
let graph: Graph<string>;
setup(() => {
graph = new Graph<string>(s => s);
});
ensureNoDisposablesAreLeakedInTestSuite();
test('is possible to lookup nodes that don\'t exist', function () {
assert.strictEqual(graph.lookup('ddd'), undefined);
});

View File

@ -5,6 +5,7 @@
import * as assert from 'assert';
import { URI } from 'vs/base/common/uri';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers';
import * as markerService from 'vs/platform/markers/common/markerService';
@ -21,9 +22,17 @@ function randomMarkerData(severity = MarkerSeverity.Error): IMarkerData {
suite('Marker Service', () => {
let service: markerService.MarkerService;
teardown(function () {
service.dispose();
});
ensureNoDisposablesAreLeakedInTestSuite();
test('query', () => {
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
service.changeAll('far', [{
resource: URI.parse('file:///c/test/file.cs'),
@ -55,7 +64,7 @@ suite('Marker Service', () => {
test('changeOne override', () => {
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
service.changeOne('far', URI.parse('file:///path/only.cs'), [randomMarkerData()]);
assert.strictEqual(service.read().length, 1);
assert.strictEqual(service.read({ owner: 'far' }).length, 1);
@ -73,7 +82,7 @@ suite('Marker Service', () => {
test('changeOne/All clears', () => {
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
service.changeOne('far', URI.parse('file:///path/only.cs'), [randomMarkerData()]);
service.changeOne('boo', URI.parse('file:///path/only.cs'), [randomMarkerData()]);
assert.strictEqual(service.read({ owner: 'far' }).length, 1);
@ -93,7 +102,7 @@ suite('Marker Service', () => {
test('changeAll sends event for cleared', () => {
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
service.changeAll('far', [{
resource: URI.parse('file:///d/path'),
marker: randomMarkerData()
@ -104,17 +113,19 @@ suite('Marker Service', () => {
assert.strictEqual(service.read({ owner: 'far' }).length, 2);
service.onMarkerChanged(changedResources => {
const d = service.onMarkerChanged(changedResources => {
assert.strictEqual(changedResources.length, 1);
changedResources.forEach(u => assert.strictEqual(u.toString(), 'file:///d/path'));
assert.strictEqual(service.read({ owner: 'far' }).length, 0);
});
service.changeAll('far', []);
d.dispose();
});
test('changeAll merges', () => {
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
service.changeAll('far', [{
resource: URI.parse('file:///c/test/file.cs'),
@ -128,7 +139,7 @@ suite('Marker Service', () => {
});
test('changeAll must not break integrety, issue #12635', () => {
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
service.changeAll('far', [{
resource: URI.parse('scheme:path1'),
@ -158,7 +169,7 @@ suite('Marker Service', () => {
test('invalid marker data', () => {
const data = randomMarkerData();
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
data.message = undefined!;
service.changeOne('far', URI.parse('some:uri/path'), [data]);
@ -174,7 +185,7 @@ suite('Marker Service', () => {
});
test('MapMap#remove returns bad values, https://github.com/microsoft/vscode/issues/13548', () => {
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
service.changeOne('o', URI.parse('some:uri/1'), [randomMarkerData()]);
service.changeOne('o', URI.parse('some:uri/2'), []);
@ -192,7 +203,7 @@ suite('Marker Service', () => {
severity: 0 as MarkerSeverity,
source: 'me'
};
const service = new markerService.MarkerService();
service = new markerService.MarkerService();
service.changeOne('far', URI.parse('some:thing'), [data]);
const marker = service.read({ resource: URI.parse('some:thing') });

View File

@ -5,9 +5,13 @@
import * as assert from 'assert';
import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { AsyncProgress } from 'vs/platform/progress/common/progress';
suite('Progress', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('multiple report calls are processed in sequence', async () => {
await runWithFakedTimers({ useFakeTimers: true, maxTaskCount: 100 }, async () => {
const executionOrder: string[] = [];

View File

@ -34,7 +34,6 @@ import { mock } from 'vs/base/test/common/mock';
import { NullApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService';
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService';
import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService';
import { IExtHostFileSystemInfo } from 'vs/workbench/api/common/extHostFileSystemInfo';
import { URITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService';
@ -62,7 +61,7 @@ import { IExtHostTelemetry } from 'vs/workbench/api/common/extHostTelemetry';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { ensureFileSystemProviderError } from 'vs/platform/files/common/files';
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
function assertRejects(fn: () => Promise<any>, message: string = 'Expected rejection') {
return fn().then(() => assert.ok(false, message), _err => assert.ok(true));
@ -77,6 +76,7 @@ suite('ExtHostLanguageFeatureCommands', function () {
const defaultSelector = { scheme: 'far' };
let model: ITextModel;
let insta: TestInstantiationService;
let rpcProtocol: TestRPCProtocol;
let extHost: ExtHostLanguageFeatures;
let mainThread: MainThreadLanguageFeatures;
@ -153,7 +153,7 @@ suite('ExtHostLanguageFeatureCommands', function () {
services.set(IOutlineModelService, new SyncDescriptor(OutlineModelService));
services.set(IConfigurationService, new TestConfigurationService());
const insta = new InstantiationService(services);
insta = new TestInstantiationService(services);
const extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(rpcProtocol, new NullLogService());
extHostDocumentsAndEditors.$acceptDocumentsAndEditorsDelta({
@ -197,6 +197,9 @@ suite('ExtHostLanguageFeatureCommands', function () {
setUnexpectedErrorHandler(originalErrorHandler);
model.dispose();
mainThread.dispose();
(<OutlineModelService>insta.get(IOutlineModelService)).dispose();
insta.dispose();
});
teardown(() => {
@ -204,7 +207,7 @@ suite('ExtHostLanguageFeatureCommands', function () {
return rpcProtocol.sync();
});
ensureFileSystemProviderError();
// ensureNoDisposablesAreLeakedInTestSuite();
// --- workspace symbols

View File

@ -12,6 +12,7 @@ import { SingleProxyRPCProtocol, TestRPCProtocol } from 'vs/workbench/api/test/c
import { NullLogService } from 'vs/platform/log/common/log';
import { ExtHostBulkEdits } from 'vs/workbench/api/common/extHostBulkEdits';
import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
suite('ExtHostBulkEdits.applyWorkspaceEdit', () => {
@ -43,6 +44,8 @@ suite('ExtHostBulkEdits.applyWorkspaceEdit', () => {
bulkEdits = new ExtHostBulkEdits(rpcProtocol, documentsAndEditors);
});
ensureNoDisposablesAreLeakedInTestSuite();
test('uses version id if document available', async () => {
const edit = new extHostTypes.WorkspaceEdit();
edit.replace(resource, new extHostTypes.Range(0, 0, 0, 0), 'hello');

View File

@ -14,8 +14,12 @@ import { SaveReason } from 'vs/workbench/common/editor';
import type * as vscode from 'vscode';
import { mock } from 'vs/base/test/common/mock';
import { NullLogService } from 'vs/platform/log/common/log';
import { timeout } from 'vs/base/common/async';
import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
function timeout(n: number) {
return new Promise(resolve => setTimeout(resolve, n));
}
suite('ExtHostDocumentSaveParticipant', () => {
@ -39,6 +43,8 @@ suite('ExtHostDocumentSaveParticipant', () => {
documents = new ExtHostDocuments(SingleProxyRPCProtocol(null), documentsAndEditors);
});
ensureNoDisposablesAreLeakedInTestSuite();
test('no listeners, no problem', () => {
const participant = new ExtHostDocumentSaveParticipant(nullLogService, documents, mainThreadBulkEdits);
return participant.$participateInSave(resource, SaveReason.EXPLICIT).then(() => assert.ok(true));

View File

@ -8,11 +8,14 @@ import * as assert from 'assert';
import * as extHostTypes from 'vs/workbench/api/common/extHostTypes';
import { MarkdownString, NotebookCellOutputItem, NotebookData, LanguageSelector, WorkspaceEdit } from 'vs/workbench/api/common/extHostTypeConverters';
import { isEmptyObject } from 'vs/base/common/types';
import { LogLevel as _MainLogLevel } from 'vs/platform/log/common/log';
import { URI } from 'vs/base/common/uri';
import { IWorkspaceTextEditDto } from 'vs/workbench/api/common/extHost.protocol';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
suite('ExtHostTypeConverter', function () {
ensureNoDisposablesAreLeakedInTestSuite();
function size<T>(from: Record<any, any>): number {
let count = 0;
for (const key in from) {

View File

@ -8,6 +8,7 @@ import { BoundModelReferenceCollection } from 'vs/workbench/api/browser/mainThre
import { timeout } from 'vs/base/common/async';
import { URI } from 'vs/base/common/uri';
import { extUri } from 'vs/base/common/resources';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
suite('BoundModelReferenceCollection', function () {
@ -21,6 +22,8 @@ suite('BoundModelReferenceCollection', function () {
col.dispose();
});
ensureNoDisposablesAreLeakedInTestSuite();
test('max age', async function () {
let didDispose = false;

View File

@ -8,9 +8,12 @@ import { SnippetFile, Snippet, SnippetSource } from 'vs/workbench/contrib/snippe
import { URI } from 'vs/base/common/uri';
import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser';
import { generateUuid } from 'vs/base/common/uuid';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
suite('Snippets', function () {
ensureNoDisposablesAreLeakedInTestSuite();
class TestSnippetFile extends SnippetFile {
constructor(filepath: URI, snippets: Snippet[]) {
super(SnippetSource.Extension, filepath, undefined, undefined, undefined!, undefined!);

View File

@ -6,9 +6,12 @@
import * as assert from 'assert';
import { getNonWhitespacePrefix } from 'vs/workbench/contrib/snippets/browser/snippetsService';
import { Position } from 'vs/editor/common/core/position';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
suite('getNonWhitespacePrefix', () => {
ensureNoDisposablesAreLeakedInTestSuite();
function assertGetNonWhitespacePrefix(line: string, column: number, expected: string): void {
const model = {
getLineContent: (lineNumber: number) => line

View File

@ -5,10 +5,13 @@
import * as assert from 'assert';
import { generateUuid } from 'vs/base/common/uuid';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile';
suite('SnippetRewrite', function () {
ensureNoDisposablesAreLeakedInTestSuite();
function assertRewrite(input: string, expected: string | boolean): void {
const actual = new Snippet(false, ['foo'], 'foo', 'foo', 'foo', input, 'foo', SnippetSource.User, generateUuid());
if (typeof expected === 'boolean') {