Path: blob/main/src/vs/workbench/contrib/debug/test/browser/debugSession.test.ts
3296 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 { ThreadStatusScheduler } from '../../browser/debugSession.js';8910suite('DebugSession - ThreadStatusScheduler', () => {11const ds = ensureNoDisposablesAreLeakedInTestSuite();1213test('cancel base case', async () => {14const scheduler = ds.add(new ThreadStatusScheduler());1516await scheduler.run(Promise.resolve([1]), async (threadId, token) => {17assert.strictEqual(threadId, 1);18assert.strictEqual(token.isCancellationRequested, false);19scheduler.cancel([1]);20assert.strictEqual(token.isCancellationRequested, true);21});22});2324test('cancel global', async () => {25const scheduler = ds.add(new ThreadStatusScheduler());2627await scheduler.run(Promise.resolve([1]), async (threadId, token) => {28assert.strictEqual(threadId, 1);29assert.strictEqual(token.isCancellationRequested, false);30scheduler.cancel(undefined);31assert.strictEqual(token.isCancellationRequested, true);32});33});3435test('cancels when new work comes in', async () => {36const scheduler = ds.add(new ThreadStatusScheduler());37let innerCalled = false;3839await scheduler.run(Promise.resolve([1]), async (threadId, token1) => {40assert.strictEqual(threadId, 1);41assert.strictEqual(token1.isCancellationRequested, false);42await scheduler.run(Promise.resolve([1]), async (_threadId, token2) => {43innerCalled = true;44assert.strictEqual(token1.isCancellationRequested, true);45assert.strictEqual(token2.isCancellationRequested, false);46});47});4849assert.strictEqual(innerCalled, true);50});5152test('cancels slower lookups when new lookup is made', async () => {53const scheduler = ds.add(new ThreadStatusScheduler());54const innerCalled1: number[] = [];55const innerCalled2: number[] = [];5657await Promise.all([58scheduler.run(Promise.resolve().then(() => { }).then(() => [1, 3]), async threadId => {59innerCalled1.push(threadId);60}),61scheduler.run(Promise.resolve([1, 2]), async threadId => {62innerCalled2.push(threadId);63})64]);6566assert.deepEqual(innerCalled1, [3]);67assert.deepEqual(innerCalled2, [1, 2]);68});6970test('allows work with other IDs', async () => {71const scheduler = ds.add(new ThreadStatusScheduler());72let innerCalled = false;7374await scheduler.run(Promise.resolve([1]), async (threadId, token1) => {75assert.strictEqual(threadId, 1);76assert.strictEqual(token1.isCancellationRequested, false);77await scheduler.run(Promise.resolve([2]), async (_threadId, token2) => {78innerCalled = true;79assert.strictEqual(token1.isCancellationRequested, false);80assert.strictEqual(token2.isCancellationRequested, false);81});82});8384assert.strictEqual(innerCalled, true);85});8687test('cancels when called during reslution', async () => {88const scheduler = ds.add(new ThreadStatusScheduler());89let innerCalled = false;9091await scheduler.run(Promise.resolve().then(() => scheduler.cancel([1])).then(() => [1]), async () => {92innerCalled = true;93});9495assert.strictEqual(innerCalled, false);96});9798test('global cancels when called during reslution', async () => {99const scheduler = ds.add(new ThreadStatusScheduler());100let innerCalled = false;101102await scheduler.run(Promise.resolve().then(() => scheduler.cancel(undefined)).then(() => [1]), async () => {103innerCalled = true;104});105106assert.strictEqual(innerCalled, false);107});108});109110111