forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
scheduler_unittest.js
102 lines (90 loc) · 2.76 KB
/
scheduler_unittest.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
/**
* Fake global clock used to record the "time" at which a task was run.
*/
let globalTime = 0;
function setUp() {
globalTime = 0;
}
/**
* @typedef{{
* cancelCallCount: number,
* runTime: number,
* }}
*/
let FakeImageRequestTask;
/**
* @param {string} taskId
* @return {!FakeImageRequestTask}
*/
function newTask(taskId, priority) {
return /** @type !FakeImageRequestTask */ ({
// Counts how many times cancel method was called.
// Used to test multiple cancellation of the same task.
cancelCallCount: 0,
// Records value of globalTime variable at the time the main method,
// loadFromCacheAndProcess is called. Used to test if the task was
// executed and in what orders tasks were executed.
runTime: 0,
getId() {
return taskId;
},
getPriority() {
return priority;
},
cancel() {
++this.cancelCallCount;
},
loadFromCacheAndProcess(resolve, reject) {
this.runTime = ++globalTime;
setTimeout(resolve);
},
});
}
/**
* Checks that adding and removing tasks before the scheduler is started works.
*/
function testIdleSchedulerAddRemove() {
const scheduler = new Scheduler();
const fakeTask = newTask('task-1', 0);
scheduler.add(/** @type {!ImageRequestTask} */ (fakeTask));
assertEquals(0, fakeTask.cancelCallCount);
scheduler.remove('task-1');
assertEquals(1, fakeTask.cancelCallCount);
scheduler.remove('task-1');
assertEquals(1, fakeTask.cancelCallCount);
}
/**
* Checks that tasks that were in newTasks are correctly copied to pending
* tasks when scheduler is started. They also should be executed in the
* order of their priorities.
*/
function testNewTasksMovedAndRunInPriorityOrder() {
const fakeTask1 = newTask('task-1', 1);
const fakeTask2 = newTask('task-2', 0);
const scheduler = new Scheduler();
scheduler.add(/** @type {!ImageRequestTask} */ (fakeTask1));
scheduler.add(/** @type {!ImageRequestTask} */ (fakeTask2));
scheduler.start();
assertEquals(2, fakeTask1.runTime);
assertEquals(1, fakeTask2.runTime);
}
/**
* Checks that the scheduler only launches MAXIMUM_IN_PARALLEL tasks.
*/
function testParallelTasks() {
const scheduler = new Scheduler();
const taskList = [];
for (let i = 0; i <= Scheduler.MAXIMUM_IN_PARALLEL; ++i) {
taskList.push(newTask(`task-${i}`, 0));
scheduler.add(/** @type {!ImageRequestTask} */ (taskList[i]));
}
scheduler.start();
for (let i = 0; i < Scheduler.MAXIMUM_IN_PARALLEL; ++i) {
assertEquals(i + 1, taskList[i].runTime, `task ${i} did not run`);
}
assertEquals(0, taskList[Scheduler.MAXIMUM_IN_PARALLEL].runTime);
}