eng: add a lint rule for ensureNoDisposablesAreLeakedInTestSuite (#200089)

Adds a lint rule that ensures ensureNoDisposablesAreLeakedInTestSuite
is called in suites. It grandfathers in existing files that were lacking
the call entirely.

This PR also includes manual fixes to files that used the function
already but were missing it in one or more suites, which the lint rule
detects.
This commit is contained in:
Connor Peet 2023-12-05 14:35:27 -08:00 committed by GitHub
parent 4728954baa
commit 16c469a671
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 531 additions and 234 deletions

View File

@ -0,0 +1,38 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { Node } from 'estree';
export = new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
type: 'problem',
messages: {
ensure: 'Suites should include a call to `ensureNoDisposablesAreLeakedInTestSuite()` to ensure no disposables are leaked in tests.'
}
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
const config = <{ exclude: string[] }>context.options[0];
const needle = context.getFilename().replace(/\\/g, '/');
if (config.exclude.some((e) => needle.endsWith(e))) {
return {};
}
return {
[`Program > ExpressionStatement > CallExpression[callee.name='suite']`]: (node: Node) => {
const src = context.getSourceCode().getText(node)
if (!src.includes('ensureNoDisposablesAreLeakedInTestSuite(')) {
context.report({
node,
messageId: 'ensure',
});
}
},
};
}
};

View File

@ -136,6 +136,226 @@
]
}
},
{
"files": [
"src/vs/**/*.test.ts"
],
"rules": {
"local/code-ensure-no-disposables-leak-in-test": [
"warn",
{
// Files should (only) be removed from the list they adopt the leak detector
"exclude": [
"src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts",
"src/vs/base/test/browser/browser.test.ts",
"src/vs/base/test/browser/comparers.test.ts",
"src/vs/base/test/browser/dom.test.ts",
"src/vs/base/test/browser/formattedTextRenderer.test.ts",
"src/vs/base/test/browser/hash.test.ts",
"src/vs/base/test/browser/iconLabels.test.ts",
"src/vs/base/test/browser/indexedDB.test.ts",
"src/vs/base/test/browser/ui/contextview/contextview.test.ts",
"src/vs/base/test/browser/ui/menu/menubar.test.ts",
"src/vs/base/test/browser/ui/scrollbar/scrollableElement.test.ts",
"src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts",
"src/vs/base/test/common/arrays.test.ts",
"src/vs/base/test/common/arraysFind.test.ts",
"src/vs/base/test/common/assert.test.ts",
"src/vs/base/test/common/cache.test.ts",
"src/vs/base/test/common/charCode.test.ts",
"src/vs/base/test/common/collections.test.ts",
"src/vs/base/test/common/color.test.ts",
"src/vs/base/test/common/console.test.ts",
"src/vs/base/test/common/decorators.test.ts",
"src/vs/base/test/common/diff/diff.test.ts",
"src/vs/base/test/common/errors.test.ts",
"src/vs/base/test/common/filters.perf.test.ts",
"src/vs/base/test/common/filters.test.ts",
"src/vs/base/test/common/iconLabels.test.ts",
"src/vs/base/test/common/iterator.test.ts",
"src/vs/base/test/common/json.test.ts",
"src/vs/base/test/common/jsonEdit.test.ts",
"src/vs/base/test/common/jsonFormatter.test.ts",
"src/vs/base/test/common/keybindings.test.ts",
"src/vs/base/test/common/keyCodes.test.ts",
"src/vs/base/test/common/lazy.test.ts",
"src/vs/base/test/common/linkedList.test.ts",
"src/vs/base/test/common/linkedText.test.ts",
"src/vs/base/test/common/map.test.ts",
"src/vs/base/test/common/markdownString.test.ts",
"src/vs/base/test/common/marshalling.test.ts",
"src/vs/base/test/common/mime.test.ts",
"src/vs/base/test/common/naturalLanguage/korean.test.ts",
"src/vs/base/test/common/network.test.ts",
"src/vs/base/test/common/normalization.test.ts",
"src/vs/base/test/common/objects.test.ts",
"src/vs/base/test/common/observable.test.ts",
"src/vs/base/test/common/path.test.ts",
"src/vs/base/test/common/prefixTree.test.ts",
"src/vs/base/test/common/resources.test.ts",
"src/vs/base/test/common/resourceTree.test.ts",
"src/vs/base/test/common/scrollable.test.ts",
"src/vs/base/test/common/skipList.test.ts",
"src/vs/base/test/common/strings.test.ts",
"src/vs/base/test/common/stripComments.test.ts",
"src/vs/base/test/common/ternarySearchtree.test.ts",
"src/vs/base/test/common/tfIdf.test.ts",
"src/vs/base/test/common/types.test.ts",
"src/vs/base/test/common/uri.test.ts",
"src/vs/base/test/common/uuid.test.ts",
"src/vs/base/test/node/crypto.test.ts",
"src/vs/base/test/node/css.build.test.ts",
"src/vs/base/test/node/id.test.ts",
"src/vs/base/test/node/nodeStreams.test.ts",
"src/vs/base/test/node/port.test.ts",
"src/vs/base/test/node/powershell.test.ts",
"src/vs/base/test/node/snapshot.test.ts",
"src/vs/base/test/node/unc.test.ts",
"src/vs/code/test/electron-sandbox/issue/testReporterModel.test.ts",
"src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts",
"src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts",
"src/vs/editor/contrib/dropOrPasteInto/test/browser/editSort.test.ts",
"src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts",
"src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts",
"src/vs/editor/contrib/folding/test/browser/indentFold.test.ts",
"src/vs/editor/contrib/folding/test/browser/indentRangeProvider.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/snippetParser.test.ts",
"src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts",
"src/vs/editor/contrib/snippet/test/browser/snippetVariables.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",
"src/vs/editor/test/node/diffing/fixtures.test.ts",
"src/vs/platform/configuration/test/common/configuration.test.ts",
"src/vs/platform/configuration/test/common/configurationModels.test.ts",
"src/vs/platform/configuration/test/common/configurationRegistry.test.ts",
"src/vs/platform/contextkey/test/common/contextkey.test.ts",
"src/vs/platform/contextkey/test/common/parser.test.ts",
"src/vs/platform/contextkey/test/common/scanner.test.ts",
"src/vs/platform/dialogs/test/common/dialog.test.ts",
"src/vs/platform/environment/test/node/argv.test.ts",
"src/vs/platform/environment/test/node/userDataPath.test.ts",
"src/vs/platform/extensionManagement/test/common/configRemotes.test.ts",
"src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts",
"src/vs/platform/extensions/test/common/extensionValidator.test.ts",
"src/vs/platform/externalTerminal/electron-main/externalTerminalService.test.ts",
"src/vs/platform/instantiation/test/common/graph.test.ts",
"src/vs/platform/instantiation/test/common/instantiationService.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/telemetry/test/browser/telemetryService.test.ts",
"src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts",
"src/vs/platform/undoRedo/test/common/undoRedoService.test.ts",
"src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts",
"src/vs/platform/userDataSync/test/common/globalStateMerge.test.ts",
"src/vs/platform/userDataSync/test/common/settingsMerge.test.ts",
"src/vs/platform/userDataSync/test/common/snippetsMerge.test.ts",
"src/vs/platform/userDataSync/test/common/userDataProfilesManifestMerge.test.ts",
"src/vs/platform/workspace/test/common/workspace.test.ts",
"src/vs/platform/workspaces/test/common/workspaces.test.ts",
"src/vs/platform/workspaces/test/electron-main/workspaces.test.ts",
"src/vs/server/test/node/serverConnectionToken.test.ts",
"src/vs/workbench/api/test/browser/extHost.api.impl.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/extHostCommands.test.ts",
"src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts",
"src/vs/workbench/api/test/browser/extHostMessagerService.test.ts",
"src/vs/workbench/api/test/browser/extHostTelemetry.test.ts",
"src/vs/workbench/api/test/browser/extHostTextEditor.test.ts",
"src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts",
"src/vs/workbench/api/test/browser/extHostTypes.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",
"src/vs/workbench/api/test/common/extensionHostMain.test.ts",
"src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts",
"src/vs/workbench/api/test/node/extHostTunnelService.test.ts",
"src/vs/workbench/contrib/bulkEdit/test/browser/bulkCellEdits.test.ts",
"src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts",
"src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts",
"src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts",
"src/vs/workbench/contrib/debug/test/browser/callStack.test.ts",
"src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts",
"src/vs/workbench/contrib/debug/test/browser/repl.test.ts",
"src/vs/workbench/contrib/debug/test/common/debugModel.test.ts",
"src/vs/workbench/contrib/debug/test/node/debugger.test.ts",
"src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts",
"src/vs/workbench/contrib/debug/test/node/terminals.test.ts",
"src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts",
"src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts",
"src/vs/workbench/contrib/extensions/test/electron-sandbox/extension.test.ts",
"src/vs/workbench/contrib/files/test/browser/explorerFileNestingTrie.test.ts",
"src/vs/workbench/contrib/files/test/browser/explorerModel.test.ts",
"src/vs/workbench/contrib/files/test/browser/explorerView.test.ts",
"src/vs/workbench/contrib/files/test/browser/fileActions.test.ts",
"src/vs/workbench/contrib/notebook/test/browser/cellDnd.test.ts",
"src/vs/workbench/contrib/notebook/test/browser/contrib/contributedStatusBarItemController.test.ts",
"src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts",
"src/vs/workbench/contrib/notebook/test/browser/contrib/layoutActions.test.ts",
"src/vs/workbench/contrib/notebook/test/browser/contrib/outputCopyTests.test.ts",
"src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.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/notebook/test/browser/notebookTextModel.test.ts",
"src/vs/workbench/contrib/search/test/common/cacheState.test.ts",
"src/vs/workbench/contrib/search/test/common/extractRange.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/tags/test/node/workspaceTags.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/contrib/terminal/test/browser/terminalActions.test.ts",
"src/vs/workbench/contrib/themes/test/node/colorRegistryExport.test.ts",
"src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts",
"src/vs/workbench/contrib/welcomeGettingStarted/test/browser/gettingStartedMarkdownRenderer.test.ts",
"src/vs/workbench/services/commands/test/common/commandService.test.ts",
"src/vs/workbench/services/configuration/test/common/configurationModels.test.ts",
"src/vs/workbench/services/configurationResolver/test/electron-sandbox/configurationResolverService.test.ts",
"src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts",
"src/vs/workbench/services/editor/test/browser/editorResolverService.test.ts",
"src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts",
"src/vs/workbench/services/keybinding/test/browser/keybindingIO.test.ts",
"src/vs/workbench/services/keybinding/test/node/fallbackKeyboardMapper.test.ts",
"src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts",
"src/vs/workbench/services/keybinding/test/node/windowsKeyboardMapper.test.ts",
"src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts",
"src/vs/workbench/services/preferences/test/common/preferencesValidation.test.ts",
"src/vs/workbench/services/search/test/browser/queryBuilder.test.ts",
"src/vs/workbench/services/search/test/common/ignoreFile.test.ts",
"src/vs/workbench/services/search/test/common/queryBuilder.test.ts",
"src/vs/workbench/services/search/test/common/replace.test.ts",
"src/vs/workbench/services/search/test/common/search.test.ts",
"src/vs/workbench/services/search/test/common/searchHelpers.test.ts",
"src/vs/workbench/services/search/test/node/ripgrepFileSearch.test.ts",
"src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts",
"src/vs/workbench/services/search/test/node/textSearchManager.test.ts",
"src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts",
"src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts",
"src/vs/workbench/services/textMate/test/browser/arrayOperation.test.ts",
"src/vs/workbench/services/themes/test/node/tokenStyleResolving.test.ts",
"src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts",
"src/vs/workbench/services/workspaces/test/browser/workspaces.test.ts",
"src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts",
"src/vs/workbench/test/browser/quickAccess.test.ts",
"src/vs/workbench/test/browser/webview.test.ts"
]
}
]
}
},
{
"files": [
"**/vscode.d.ts",

View File

@ -571,6 +571,8 @@ flakySuite('IPC, create handle', () => {
suite('WebSocketNodeSocket', () => {
const ds = ensureNoDisposablesAreLeakedInTestSuite();
function toUint8Array(data: number[]): Uint8Array {
const result = new Uint8Array(data.length);
for (let i = 0; i < data.length; i++) {
@ -724,15 +726,15 @@ suite('WebSocketNodeSocket', () => {
server.close();
const webSocketNodeSocket = new WebSocketNodeSocket(new NodeSocket(socket), true, null, false);
webSocketNodeSocket.onData((data) => {
ds.add(webSocketNodeSocket.onData((data) => {
receivingSideOnDataCallCount++;
receivingSideTotalBytes += data.byteLength;
});
}));
webSocketNodeSocket.onClose(() => {
ds.add(webSocketNodeSocket.onClose(() => {
webSocketNodeSocket.dispose();
receivingSideSocketClosedBarrier.open();
});
}));
});
const socket = connect({

View File

@ -361,6 +361,8 @@ suite('RangeMap', () => {
suite('RangeMap with top padding', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('empty', () => {
const rangeMap = new RangeMap(10);
assert.strictEqual(rangeMap.size, 10);

View File

@ -250,12 +250,14 @@ suite('CompressibleObjectTree', function () {
disposeTemplate(): void { }
}
const ds = ensureNoDisposablesAreLeakedInTestSuite();
test('empty', function () {
const container = document.createElement('div');
container.style.width = '200px';
container.style.height = '200px';
const tree = new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]);
const tree = ds.add(new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]));
tree.layout(200);
assert.strictEqual(getRowsTextContent(container).length, 0);
@ -266,7 +268,7 @@ suite('CompressibleObjectTree', function () {
container.style.width = '200px';
container.style.height = '200px';
const tree = new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]);
const tree = ds.add(new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]));
tree.layout(200);
tree.setChildren(null, [
@ -289,7 +291,7 @@ suite('CompressibleObjectTree', function () {
container.style.width = '200px';
container.style.height = '200px';
const tree = new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]);
const tree = ds.add(new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]));
tree.layout(200);
tree.setChildren(null, [
@ -341,7 +343,7 @@ suite('CompressibleObjectTree', function () {
container.style.width = '200px';
container.style.height = '200px';
const tree = new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]);
const tree = ds.add(new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]));
tree.layout(200);
tree.setChildren(null, [

File diff suppressed because it is too large Load Diff

View File

@ -184,6 +184,8 @@ suite('History Navigator', () => {
suite('History Navigator 2', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('constructor', () => {
const testObject = new HistoryNavigator2(['1', '2', '3', '4']);

View File

@ -13,8 +13,9 @@ class Disposable implements IDisposable {
dispose() { this.isDisposed = true; }
}
// Leaks are allowed here since we test lifecycle stuff:
// eslint-disable-next-line local/code-ensure-no-disposables-leak-in-test
suite('Lifecycle', () => {
test('dispose single disposable', () => {
const disposable = new Disposable();
@ -129,6 +130,8 @@ suite('Lifecycle', () => {
});
suite('DisposableStore', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('dispose should call all child disposes even if a child throws on dispose', () => {
const disposedValues = new Set<number>();
@ -221,6 +224,8 @@ suite('DisposableStore', () => {
});
suite('Reference Collection', () => {
ensureNoDisposablesAreLeakedInTestSuite();
class Collection extends ReferenceCollection<number> {
private _count = 0;
get count() { return this._count; }

View File

@ -83,6 +83,8 @@ function fromRange(rng: Range): number[] {
}
suite('Multicursor selection', () => {
ensureNoDisposablesAreLeakedInTestSuite();
const serviceCollection = new ServiceCollection();
serviceCollection.set(IStorageService, new InMemoryStorageService());

View File

@ -348,6 +348,8 @@ suite('NativeExtensionsScanerService Test', () => {
suite('ExtensionScannerInput', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('compare inputs - location', () => {
const anInput = (location: URI, mtime: number | undefined) => new ExtensionScannerInput(location, mtime, undefined, undefined, false, undefined, ExtensionType.User, true, true, '1.1.1', undefined, undefined, true, undefined, {});

View File

@ -4,25 +4,25 @@
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { IFileService, FileChangeType, IFileChange, IFileSystemProviderWithFileReadWriteCapability, IStat, FileType, FileSystemProviderCapabilities, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileOpenOptions, IFileSystemProviderWithFileReadStreamCapability, IFileReadStreamOptions } from 'vs/platform/files/common/files';
import { FileService } from 'vs/platform/files/common/fileService';
import { NullLogService } from 'vs/platform/log/common/log';
import { Schemas } from 'vs/base/common/network';
import { URI } from 'vs/base/common/uri';
import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataProvider';
import { dirname, isEqual, joinPath } from 'vs/base/common/resources';
import { VSBuffer } from 'vs/base/common/buffer';
import { DisposableStore, IDisposable, Disposable } from 'vs/base/common/lifecycle';
import { Emitter, Event } from 'vs/base/common/event';
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
import { AbstractNativeEnvironmentService } from 'vs/platform/environment/common/environmentService';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import product from 'vs/platform/product/common/product';
import { IUserDataProfilesService, UserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile';
import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { CancellationToken } from 'vs/base/common/cancellation';
import { Emitter, Event } from 'vs/base/common/event';
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
import { Schemas } from 'vs/base/common/network';
import { dirname, isEqual, joinPath } from 'vs/base/common/resources';
import { ReadableStreamEvents } from 'vs/base/common/stream';
import { URI } from 'vs/base/common/uri';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { AbstractNativeEnvironmentService } from 'vs/platform/environment/common/environmentService';
import { FileService } from 'vs/platform/files/common/fileService';
import { FileChangeType, FileSystemProviderCapabilities, FileType, IFileChange, IFileOpenOptions, IFileReadStreamOptions, IFileService, IFileSystemProviderWithFileReadStreamCapability, IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithOpenReadWriteCloseCapability, IStat } from 'vs/platform/files/common/files';
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
import { NullLogService } from 'vs/platform/log/common/log';
import product from 'vs/platform/product/common/product';
import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService';
import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataProvider';
import { IUserDataProfilesService, UserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile';
const ROOT = URI.file('tests').with({ scheme: 'vscode-tests' });
@ -315,7 +315,7 @@ class TestFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapa
suite('FileUserDataProvider - Watching', () => {
let testObject: FileUserDataProvider;
const disposables = new DisposableStore();
const disposables = ensureNoDisposablesAreLeakedInTestSuite();
const rootFileResource = joinPath(ROOT, 'User');
const rootUserDataResource = rootFileResource.with({ scheme: Schemas.vscodeUserData });
@ -332,8 +332,6 @@ suite('FileUserDataProvider - Watching', () => {
testObject = disposables.add(new FileUserDataProvider(rootFileResource.scheme, new TestFileSystemProvider(fileEventEmitter.event), Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()));
});
teardown(() => disposables.clear());
test('file added change event', done => {
disposables.add(testObject.watch(rootUserDataResource, { excludes: [], recursive: false }));
const expected = joinPath(rootUserDataResource, 'settings.json');
@ -427,7 +425,7 @@ suite('FileUserDataProvider - Watching', () => {
test('event is not triggered if not watched', async () => {
const target = joinPath(rootFileResource, 'settings.json');
let triggered = false;
testObject.onDidChangeFile(() => triggered = true);
disposables.add(testObject.onDidChangeFile(() => triggered = true));
fileEventEmitter.fire([{
resource: target,
type: FileChangeType.DELETED
@ -441,7 +439,7 @@ suite('FileUserDataProvider - Watching', () => {
disposables.add(testObject.watch(rootUserDataResource, { excludes: [], recursive: false }));
const target = joinPath(dirname(rootFileResource), 'settings.json');
let triggered = false;
testObject.onDidChangeFile(() => triggered = true);
disposables.add(testObject.onDidChangeFile(() => triggered = true));
fileEventEmitter.fire([{
resource: target,
type: FileChangeType.DELETED

View File

@ -417,6 +417,9 @@ suite('UserDataSyncRequestsSession', () => {
async loadCertificates() { return []; }
};
ensureNoDisposablesAreLeakedInTestSuite();
test('too many requests are thrown when limit exceeded', async () => {
const testObject = new RequestsSession(1, 500, requestService, new NullLogService());
await testObject.request('url', {}, CancellationToken.None);

View File

@ -441,6 +441,8 @@ suite('ExtHostDocumentData updates line mapping', () => {
testLineMappingDirectionAfterEvents(lines, '\r\n', AssertDocumentLineMappingDirection.OffsetToPosition, e);
}
ensureNoDisposablesAreLeakedInTestSuite();
test('line mapping', () => {
testLineMappingAfterEvents([
'This is line one',

View File

@ -122,6 +122,8 @@ suite('ChatModel', () => {
});
suite('Response', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('content, markdown', async () => {
const response = new Response([]);
response.updateContent({ content: 'text', kind: 'content' });

View File

@ -305,6 +305,8 @@ suite('NotebookCommon', () => {
suite('CellUri', function () {
ensureNoDisposablesAreLeakedInTestSuite();
test('parse, generate (file-scheme)', function () {
const nb = URI.parse('file:///bar/følder/file.nb');
@ -348,6 +350,8 @@ suite('CellUri', function () {
suite('CellRange', function () {
ensureNoDisposablesAreLeakedInTestSuite();
test('Cell range to index', function () {
assert.deepStrictEqual(cellRangesToIndexes([]), []);
assert.deepStrictEqual(cellRangesToIndexes([{ start: 0, end: 0 }]), []);
@ -398,6 +402,7 @@ suite('CellRange', function () {
});
suite('NotebookWorkingCopyTypeIdentifier', function () {
ensureNoDisposablesAreLeakedInTestSuite();
test('works', function () {
const viewType = 'testViewType';

View File

@ -15,12 +15,15 @@ import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/uti
import { DisposableStore } from 'vs/base/common/lifecycle';
suite('NotebookSelection', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('focus is never empty', function () {
const selectionCollection = new NotebookCellSelectionCollection();
assert.deepStrictEqual(selectionCollection.focus, { start: 0, end: 0 });
selectionCollection.setState(null, [], true, 'model');
assert.deepStrictEqual(selectionCollection.focus, { start: 0, end: 0 });
selectionCollection.dispose();
});
});

View File

@ -28,6 +28,8 @@ suite('URI Label', () => {
labelService = new LabelService(TestEnvironmentService, new TestContextService(), new TestPathService(URI.file('/foobar')), new TestRemoteAgentService(), storageService, new TestLifecycleService());
});
ensureNoDisposablesAreLeakedInTestSuite();
test('custom scheme', function () {
labelService.registerFormatter({
scheme: 'vscode',