Path: blob/main/src/vs/workbench/api/test/browser/mainThreadVariableProvider.test.ts
4780 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';7import { TestMainThreadNotebookKernels } from './TestMainThreadNotebookKernels.js';8import { ExtHostNotebookKernelsShape } from '../../common/extHost.protocol.js';9import { mock } from '../../../test/common/workbenchTestServices.js';10import { CancellationToken, CancellationTokenSource } from '../../../../base/common/cancellation.js';11import { URI, UriComponents } from '../../../../base/common/uri.js';12import { SingleProxyRPCProtocol } from '../common/testRPCProtocol.js';13import { AsyncIterableProducer } from '../../../../base/common/async.js';14import { VariablesResult } from '../../../contrib/notebook/common/notebookKernelService.js';1516type variableGetter = () => Promise<VariablesResult>;1718suite('MainThreadNotebookKernelVariableProvider', function () {19let mainThreadKernels: TestMainThreadNotebookKernels;20let variables: (VariablesResult | variableGetter)[];2122teardown(function () {23});2425const store = ensureNoDisposablesAreLeakedInTestSuite();2627setup(async function () {28const proxy = new class extends mock<ExtHostNotebookKernelsShape>() {29override async $provideVariables(handle: number, requestId: string, notebookUri: UriComponents, parentId: number | undefined, kind: 'named' | 'indexed', start: number, token: CancellationToken): Promise<void> {30for (const variable of variables) {31if (token.isCancellationRequested) {32return;33}34const result = typeof variable === 'function'35? await variable()36: variable;37mainThreadKernels.instance.$receiveVariable(requestId, result);38}39}40};41const extHostContext = SingleProxyRPCProtocol(proxy);42variables = [];43mainThreadKernels = store.add(new TestMainThreadNotebookKernels(extHostContext));44});4546test('get variables from kernel', async function () {47await mainThreadKernels.addKernel('test-kernel');4849const kernel = mainThreadKernels.getKernel('test-kernel');50assert.ok(kernel, 'Kernel should be registered');5152variables.push(createVariable(1));53variables.push(createVariable(2));54const vars = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, CancellationToken.None);5556await verifyVariables(vars, [1, 2]);57});5859test('get variables twice', async function () {60await mainThreadKernels.addKernel('test-kernel');6162const kernel = mainThreadKernels.getKernel('test-kernel');63assert.ok(kernel, 'Kernel should be registered');6465variables.push(createVariable(1));66variables.push(createVariable(2));67const vars = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, CancellationToken.None);68const vars2 = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, CancellationToken.None);6970await verifyVariables(vars, [1, 2]);71await verifyVariables(vars2, [1, 2]);72});7374test('gets all variables async', async function () {75await mainThreadKernels.addKernel('test-kernel');7677const kernel = mainThreadKernels.getKernel('test-kernel');78assert.ok(kernel, 'Kernel should be registered');7980variables.push(createVariable(1));81const result = createVariable(2);82variables.push(async () => {83await new Promise(resolve => setTimeout(resolve, 5));84return result;85});86variables.push(createVariable(3));87const vars = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, CancellationToken.None);8889await verifyVariables(vars, [1, 2, 3]);90});9192test('cancel while getting variables', async function () {93await mainThreadKernels.addKernel('test-kernel');9495const kernel = mainThreadKernels.getKernel('test-kernel');96assert.ok(kernel, 'Kernel should be registered');9798variables.push(createVariable(1));99const result = createVariable(2);100variables.push(async () => {101await new Promise(resolve => setTimeout(resolve, 50));102return result;103});104variables.push(createVariable(3));105const cancellation = new CancellationTokenSource();106const vars = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, cancellation.token);107cancellation.cancel();108109await verifyVariables(vars, [1, 2]);110});111});112113async function verifyVariables(variables: AsyncIterableProducer<VariablesResult>, expectedIds: number[]) {114let varIx = 0;115116for await (const variable of variables) {117assert.ok(expectedIds[varIx], 'more variables than expected');118assert.strictEqual(variable.id, expectedIds[varIx++]);119}120}121122function createVariable(id: number) {123return {124id,125name: `var${id}`,126value: `${id}`,127type: 'number',128expression: `var${id}`,129hasNamedChildren: false,130indexedChildrenCount: 0,131extensionId: 'extension-id1',132};133}134135136