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
17 changed files with 531 additions and 234 deletions
@@ -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',
});
}
},
};
}
};
+220
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",
@@ -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({
@@ -361,6 +361,8 @@ suite('RangeMap', () => {
suite('RangeMap with top padding', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('empty', () => {
const rangeMap = new RangeMap(10);
assert.strictEqual(rangeMap.size, 10);
@@ -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
+2
View File
@@ -184,6 +184,8 @@ suite('History Navigator', () => {
suite('History Navigator 2', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('constructor', () => {
const testObject = new HistoryNavigator2(['1', '2', '3', '4']);
+6 -1
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; }
@@ -83,6 +83,8 @@ function fromRange(rng: Range): number[] {
}
suite('Multicursor selection', () => {
ensureNoDisposablesAreLeakedInTestSuite();
const serviceCollection = new ServiceCollection();
serviceCollection.set(IStorageService, new InMemoryStorageService());
@@ -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, {});
@@ -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
@@ -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);
@@ -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',
@@ -122,6 +122,8 @@ suite('ChatModel', () => {
});
suite('Response', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('content, markdown', async () => {
const response = new Response([]);
response.updateContent({ content: 'text', kind: 'content' });
@@ -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';
@@ -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();
});
});
@@ -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',