1// Copyright 2020 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import { Timeline } from "../../../tools/system-analyzer/timeline.mjs";
6import { LogEntry} from "../../../tools/system-analyzer/log/log.mjs";
7
8
9class TestLogEntry extends LogEntry {
10  toString() {
11    return `TestLogEntry(${this.id}, ${this.time})`;
12  }
13}
14
15(function testTimeline() {
16  let timeline = new Timeline();
17  assertTrue(timeline.isEmpty());
18
19  let id1 = "0x3e7e082470cd";
20  let id2 = "0x3e7e082470ad";
21  let time = 10;
22
23  let entry1 = new TestLogEntry(id1, time + 0);
24  let entry2 = new TestLogEntry(id1, time + 1);
25  let entry3 = new TestLogEntry(id1, time + 2);
26  let entry4 = new TestLogEntry(id1, time + 3);
27  let entry5 = new TestLogEntry(id2, time + 3);
28  let entry6 = new TestLogEntry(id1, time + 4);
29
30  timeline.push(entry1);
31  assertFalse(timeline.isEmpty());
32  assertEquals(timeline.first(), entry1);
33  assertEquals(timeline.at(0), entry1);
34  assertEquals(timeline.last(), entry1);
35
36  timeline.push(entry2);
37  assertEquals(timeline.first(), entry1);
38  assertEquals(timeline.at(1), entry2);
39  assertEquals(timeline.last(), entry2);
40
41  timeline.push(entry3);
42  timeline.push(entry4);
43  timeline.push(entry5);
44  timeline.push(entry6);
45
46  assertEquals(timeline.first(), entry1);
47  assertEquals(timeline.at(0), entry1);
48  assertEquals(timeline.at(1), entry2);
49  assertEquals(timeline.at(2), entry3);
50  assertEquals(timeline.at(3), entry4);
51  assertEquals(timeline.at(4), entry5);
52  assertEquals(timeline.at(5), entry6);
53  assertEquals(timeline.last(), entry6);
54
55  assertEquals(timeline.length, 6);
56  assertEquals(timeline.all.length, 6);
57
58  assertEquals(timeline.startTime, entry1.time);
59  assertEquals(timeline.endTime, entry6.time);
60  assertEquals(timeline.duration(), 4);
61
62  assertEquals(timeline.findFirst(time - 1), 0);
63  assertEquals(timeline.findFirst(time + 0), 0);
64  assertEquals(timeline.findFirst(time + 1), 1);
65  assertEquals(timeline.findFirst(time + 2), 2);
66  assertEquals(timeline.findFirst(time + 3), 3);
67  assertEquals(timeline.findFirst(time + 4), 5);
68  assertEquals(timeline.findFirst(time + 5), 5);
69
70  assertEquals(timeline.findFirst(time + 2.00), 2);
71  assertEquals(timeline.findFirst(time + 2.01), 3);
72  assertEquals(timeline.findFirst(time + 2.90), 3);
73  assertEquals(timeline.findFirst(time + 3.01), 5);
74  assertEquals(timeline.findFirst(time + 3.90), 5);
75  assertEquals(timeline.findFirst(time + 4.00), 5);
76
77  assertEquals(timeline.findLast(time - 1), -1);
78  assertEquals(timeline.findLast(time + 0), 0);
79  assertEquals(timeline.findLast(time + 1), 1);
80  assertEquals(timeline.findLast(time + 2), 2);
81  assertEquals(timeline.findLast(time + 3), 4);
82  assertEquals(timeline.findLast(time + 4), 5);
83  assertEquals(timeline.findLast(time + 5), 5);
84
85  assertEquals(timeline.findLast(time + 2.00), 2);
86  assertEquals(timeline.findLast(time + 2.01), 2);
87  assertEquals(timeline.findLast(time + 2.90), 2);
88  assertEquals(timeline.findLast(time + 3.01), 4);
89  assertEquals(timeline.findLast(time + 3.90), 4);
90  assertEquals(timeline.findLast(time + 4.00), 5);
91
92  let startTime = time;
93  let endTime = time + 2;
94  timeline.selectTimeRange(startTime, endTime);
95  assertArrayEquals(timeline.selection.startTime, startTime);
96  assertArrayEquals(timeline.selection.endTime, endTime);
97  assertArrayEquals(timeline.selection.values, [entry1, entry2]);
98  let entryIdx = timeline.find(time + 1);
99  let entry = timeline.at(entryIdx);
100  assertEquals(entry.time, time + 1);
101})();
102
103
104(function testChunks() {
105  const id1 = "0x3e7e082470cd";
106  const time = 10;
107
108  const entry1 = new TestLogEntry(id1, time + 0);
109  const entry2 = new TestLogEntry(id1, time + 1);
110  const entry3 = new TestLogEntry(id1, time + 2);
111  const entry4 = new TestLogEntry(id1, time + 3);
112  const entries = [entry1, entry2, entry3, entry4];
113
114  const timeline1 = new Timeline(TestLogEntry, entries);
115  assertEquals(timeline1.length, 4);
116  assertEquals(timeline1.startTime, time);
117  assertEquals(timeline1.endTime, time + 3);
118
119  const chunks1_1 = timeline1.chunks(1);
120  assertEquals(chunks1_1.length, 1);
121  assertEquals(chunks1_1[0].start, timeline1.startTime);
122  assertEquals(chunks1_1[0].end, timeline1.endTime);
123  assertArrayEquals(chunks1_1[0].items, entries);
124
125  const chunks1_4 = timeline1.chunks(4);
126  assertEquals(chunks1_4.length, 4);
127  assertEquals(chunks1_4[0].start, timeline1.startTime);
128  assertArrayEquals(chunks1_4[0].items, [entry1]);
129  assertEquals(chunks1_4[1].start, 10.75);
130  assertArrayEquals(chunks1_4[1].items, [entry2]);
131  assertEquals(chunks1_4[2].start, 11.5);
132  assertArrayEquals(chunks1_4[2].items, [entry3]);
133  assertEquals(chunks1_4[3].end, timeline1.endTime);
134  assertArrayEquals(chunks1_4[3].items, [entry4]);
135
136  const timeline2 = new Timeline(TestLogEntry, entries, 0, 100);
137  assertEquals(timeline2.length, 4);
138  assertEquals(timeline2.startTime, 0);
139  assertEquals(timeline2.endTime, 100);
140  assertEquals(timeline2.duration(), 100);
141
142  const chunks2_1 = timeline2.chunks(1);
143  assertEquals(chunks2_1.length, 1);
144  assertEquals(chunks2_1[0].start, timeline2.startTime);
145  assertEquals(chunks2_1[0].end, timeline2.endTime);
146  assertArrayEquals(chunks1_1[0].items, entries);
147
148  const chunks2_2 = timeline2.chunks(2);
149  assertEquals(chunks2_2.length, 2);
150  assertEquals(chunks2_2[0].start, 0);
151  assertEquals(chunks2_2[0].end, 50);
152  assertArrayEquals(chunks2_2[0].items, entries);
153  assertEquals(chunks2_2[1].start, 50);
154  assertEquals(chunks2_2[1].end, 100);
155  assertArrayEquals(chunks2_2[1].items, []);
156
157  const chunks2_4 = timeline2.chunks(4);
158  assertEquals(chunks2_4.length, 4);
159  assertEquals(chunks2_4[0].start, 0);
160  assertEquals(chunks2_4[0].end, 25);
161  assertArrayEquals(chunks2_4[0].items, entries);
162  assertEquals(chunks2_4[1].start, 25);
163  assertEquals(chunks2_4[1].end, 50);
164  assertArrayEquals(chunks2_4[1].items, []);
165  assertEquals(chunks2_4[2].start, 50);
166  assertEquals(chunks2_4[2].end, 75);
167  assertArrayEquals(chunks2_4[2].items, []);
168  assertEquals(chunks2_4[3].start, 75);
169  assertEquals(chunks2_4[3].end, 100);
170  assertArrayEquals(chunks2_4[3].items, []);
171})();