requestQueue.test.ts 4.6 KB
Newer Older
1 2 3 4 5 6 7
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import * as assert from 'assert';
import 'mocha';
8
import { RequestQueue, RequestQueueingType } from '../../tsServer/requestQueue';
9 10 11 12 13

suite('RequestQueue', () => {
	test('should be empty on creation', async () => {
		const queue = new RequestQueue();
		assert.strictEqual(queue.length, 0);
M
Matt Bierner 已提交
14
		assert.strictEqual(queue.dequeue(), undefined);
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
	});

	suite('RequestQueue.createRequest', () => {
		test('should create items with increasing sequence numbers', async () => {
			const queue = new RequestQueue();

			for (let i = 0; i < 100; ++i) {
				const command = `command-${i}`;
				const request = queue.createRequest(command, i);
				assert.strictEqual(request.seq, i);
				assert.strictEqual(request.command, command);
				assert.strictEqual(request.arguments, i);
			}
		});
	});

	test('should queue normal requests in first in first out order', async () => {
		const queue = new RequestQueue();
		assert.strictEqual(queue.length, 0);

		const request1 = queue.createRequest('a', 1);
M
Matt Bierner 已提交
36
		queue.enqueue({ request: request1, expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.Normal });
37 38 39
		assert.strictEqual(queue.length, 1);

		const request2 = queue.createRequest('b', 2);
M
Matt Bierner 已提交
40
		queue.enqueue({ request: request2, expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.Normal });
41 42 43
		assert.strictEqual(queue.length, 2);

		{
M
Matt Bierner 已提交
44
			const item = queue.dequeue();
45 46 47 48
			assert.strictEqual(queue.length, 1);
			assert.strictEqual(item!.request.command, 'a');
		}
		{
M
Matt Bierner 已提交
49
			const item = queue.dequeue();
50 51 52 53
			assert.strictEqual(queue.length, 0);
			assert.strictEqual(item!.request.command, 'b');
		}
		{
M
Matt Bierner 已提交
54
			const item = queue.dequeue();
55 56 57 58 59 60 61 62 63
			assert.strictEqual(item, undefined);
			assert.strictEqual(queue.length, 0);
		}
	});

	test('should put normal requests in front of low priority requests', async () => {
		const queue = new RequestQueue();
		assert.strictEqual(queue.length, 0);

M
Matt Bierner 已提交
64 65 66 67
		queue.enqueue({ request: queue.createRequest('low-1', 1), expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.LowPriority });
		queue.enqueue({ request: queue.createRequest('low-2', 1), expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.LowPriority });
		queue.enqueue({ request: queue.createRequest('normal-1', 2), expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.Normal });
		queue.enqueue({ request: queue.createRequest('normal-2', 2), expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.Normal });
68

M
Matt Bierner 已提交
69
		{
M
Matt Bierner 已提交
70
			const item = queue.dequeue();
M
Matt Bierner 已提交
71 72 73 74
			assert.strictEqual(queue.length, 3);
			assert.strictEqual(item!.request.command, 'normal-1');
		}
		{
M
Matt Bierner 已提交
75
			const item = queue.dequeue();
M
Matt Bierner 已提交
76 77 78 79
			assert.strictEqual(queue.length, 2);
			assert.strictEqual(item!.request.command, 'normal-2');
		}
		{
M
Matt Bierner 已提交
80
			const item = queue.dequeue();
M
Matt Bierner 已提交
81 82 83 84
			assert.strictEqual(queue.length, 1);
			assert.strictEqual(item!.request.command, 'low-1');
		}
		{
M
Matt Bierner 已提交
85
			const item = queue.dequeue();
M
Matt Bierner 已提交
86 87 88 89 90 91 92 93 94
			assert.strictEqual(queue.length, 0);
			assert.strictEqual(item!.request.command, 'low-2');
		}
	});

	test('should not push fence requests front of low priority requests', async () => {
		const queue = new RequestQueue();
		assert.strictEqual(queue.length, 0);

M
Matt Bierner 已提交
95 96 97 98
		queue.enqueue({ request: queue.createRequest('low-1', 0), expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.LowPriority });
		queue.enqueue({ request: queue.createRequest('fence', 0), expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.Fence });
		queue.enqueue({ request: queue.createRequest('low-2', 0), expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.LowPriority });
		queue.enqueue({ request: queue.createRequest('normal', 0), expectsResponse: true, isAsync: false, queueingType: RequestQueueingType.Normal });
99

M
Matt Bierner 已提交
100
		{
M
Matt Bierner 已提交
101
			const item = queue.dequeue();
M
Matt Bierner 已提交
102 103 104 105
			assert.strictEqual(queue.length, 3);
			assert.strictEqual(item!.request.command, 'low-1');
		}
		{
M
Matt Bierner 已提交
106
			const item = queue.dequeue();
M
Matt Bierner 已提交
107 108 109
			assert.strictEqual(queue.length, 2);
			assert.strictEqual(item!.request.command, 'fence');
		}
110
		{
M
Matt Bierner 已提交
111
			const item = queue.dequeue();
112 113 114 115
			assert.strictEqual(queue.length, 1);
			assert.strictEqual(item!.request.command, 'normal');
		}
		{
M
Matt Bierner 已提交
116
			const item = queue.dequeue();
117
			assert.strictEqual(queue.length, 0);
M
Matt Bierner 已提交
118
			assert.strictEqual(item!.request.command, 'low-2');
119 120 121 122
		}
	});
});