Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: runtime/vm/timeline_test.cc

Issue 1294023009: Switch to a VM wide timeline recorder (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« runtime/vm/timeline.cc ('K') | « runtime/vm/timeline.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <cstring> 5 #include <cstring>
6 6
7 #include "platform/assert.h" 7 #include "platform/assert.h"
8 8
9 #include "vm/dart_api_impl.h" 9 #include "vm/dart_api_impl.h"
10 #include "vm/dart_api_state.h" 10 #include "vm/dart_api_state.h"
11 #include "vm/globals.h" 11 #include "vm/globals.h"
12 #include "vm/timeline.h" 12 #include "vm/timeline.h"
13 #include "vm/timeline_analysis.h" 13 #include "vm/timeline_analysis.h"
14 #include "vm/unit_test.h" 14 #include "vm/unit_test.h"
15 15
16 namespace dart { 16 namespace dart {
17 17
18 class TimelineRecorderOverride : public ValueObject {
19 public:
20 explicit TimelineRecorderOverride(TimelineEventRecorder* new_recorder)
21 : recorder_(Timeline::recorder()) {
22 Timeline::recorder_ = new_recorder;
23 }
24
25 ~TimelineRecorderOverride() {
26 Timeline::recorder_ = recorder_;
27 }
28
29 private:
30 TimelineEventRecorder* recorder_;
31 };
32
33
18 class TimelineTestHelper : public AllStatic { 34 class TimelineTestHelper : public AllStatic {
19 public: 35 public:
20 static void SetStream(TimelineEvent* event, TimelineStream* stream) { 36 static void SetStream(TimelineEvent* event, TimelineStream* stream) {
21 event->StreamInit(stream); 37 event->StreamInit(stream);
22 } 38 }
23 39
24 static TimelineEvent* FakeThreadEvent( 40 static TimelineEvent* FakeThreadEvent(
25 TimelineEventBlock* block, 41 TimelineEventBlock* block,
26 intptr_t ftid, 42 intptr_t ftid,
27 const char* label = "fake", 43 const char* label = "fake",
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 event.PrintJSON(&js); 181 event.PrintJSON(&js);
166 182
167 // Check both arguments. 183 // Check both arguments.
168 EXPECT_SUBSTRING("\"arg1\":\"value1\"", js.ToCString()); 184 EXPECT_SUBSTRING("\"arg1\":\"value1\"", js.ToCString());
169 EXPECT_SUBSTRING("\"arg2\":\"value2\"", js.ToCString()); 185 EXPECT_SUBSTRING("\"arg2\":\"value2\"", js.ToCString());
170 } 186 }
171 } 187 }
172 188
173 189
174 TEST_CASE(TimelineEventBufferPrintJSON) { 190 TEST_CASE(TimelineEventBufferPrintJSON) {
175 Isolate* isolate = Isolate::Current(); 191 TimelineEventRecorder* recorder = Timeline::recorder();
176 TimelineEventRecorder* recorder = isolate->timeline_event_recorder();
177 JSONStream js; 192 JSONStream js;
178 recorder->PrintJSON(&js); 193 TimelineEventFilter filter;
194 recorder->PrintJSON(&js, &filter);
179 // Check the type. This test will fail if we ever make Timeline public. 195 // Check the type. This test will fail if we ever make Timeline public.
180 EXPECT_SUBSTRING("\"type\":\"_Timeline\"", js.ToCString()); 196 EXPECT_SUBSTRING("\"type\":\"_Timeline\"", js.ToCString());
181 // Check that there is a traceEvents array. 197 // Check that there is a traceEvents array.
182 EXPECT_SUBSTRING("\"traceEvents\":[", js.ToCString()); 198 EXPECT_SUBSTRING("\"traceEvents\":[", js.ToCString());
183 } 199 }
184 200
185 201
186 // Count the number of each event type seen. 202 // Count the number of each event type seen.
187 class EventCounterRecorder : public TimelineEventStreamingRecorder { 203 class EventCounterRecorder : public TimelineEventStreamingRecorder {
188 public: 204 public:
(...skipping 11 matching lines...) Expand all
200 return counts_[type]; 216 return counts_[type];
201 } 217 }
202 218
203 private: 219 private:
204 intptr_t counts_[TimelineEvent::kNumEventTypes]; 220 intptr_t counts_[TimelineEvent::kNumEventTypes];
205 }; 221 };
206 222
207 223
208 TEST_CASE(TimelineEventStreamingRecorderBasic) { 224 TEST_CASE(TimelineEventStreamingRecorderBasic) {
209 EventCounterRecorder* recorder = new EventCounterRecorder(); 225 EventCounterRecorder* recorder = new EventCounterRecorder();
226 TimelineRecorderOverride override(recorder);
210 227
211 // Initial counts are all zero. 228 // Initial counts are all zero.
212 for (intptr_t i = TimelineEvent::kNone + 1; 229 for (intptr_t i = TimelineEvent::kNone + 1;
213 i < TimelineEvent::kNumEventTypes; 230 i < TimelineEvent::kNumEventTypes;
214 i++) { 231 i++) {
215 EXPECT_EQ(0, recorder->CountFor(static_cast<TimelineEvent::EventType>(i))); 232 EXPECT_EQ(0, recorder->CountFor(static_cast<TimelineEvent::EventType>(i)));
216 } 233 }
217 234
218 // Create a test stream. 235 // Create a test stream.
219 TimelineStream stream; 236 TimelineStream stream;
220 stream.Init("testStream", true); 237 stream.Init("testStream", true);
221 stream.set_recorder(recorder);
222 238
223 TimelineEvent* event = NULL; 239 TimelineEvent* event = NULL;
224 240
225 event = stream.StartEvent(); 241 event = stream.StartEvent();
226 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration)); 242 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration));
227 event->DurationBegin("cabbage"); 243 event->DurationBegin("cabbage");
228 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration)); 244 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration));
229 event->DurationEnd(); 245 event->DurationEnd();
230 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration)); 246 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration));
231 event->Complete(); 247 event->Complete();
232 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kDuration)); 248 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kDuration));
233 249
234 event = stream.StartEvent(); 250 event = stream.StartEvent();
235 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kInstant)); 251 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kInstant));
236 event->Instant("instantCabbage"); 252 event->Instant("instantCabbage");
237 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kInstant)); 253 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kInstant));
238 event->Complete(); 254 event->Complete();
239 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kInstant)); 255 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kInstant));
240 256
241 event = stream.StartEvent(); 257 event = stream.StartEvent();
242 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncBegin)); 258 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncBegin));
243 int64_t async_id = event->AsyncBegin("asyncBeginCabbage"); 259 int64_t async_id = recorder->GetNextAsyncId();
244 EXPECT(async_id >= 0); 260 EXPECT(async_id >= 0);
261 event->AsyncBegin("asyncBeginCabbage", async_id);
245 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncBegin)); 262 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncBegin));
246 event->Complete(); 263 event->Complete();
247 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncBegin)); 264 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncBegin));
248 265
249 event = stream.StartEvent(); 266 event = stream.StartEvent();
250 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncInstant)); 267 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncInstant));
251 event->AsyncInstant("asyncInstantCabbage", async_id); 268 event->AsyncInstant("asyncInstantCabbage", async_id);
252 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncInstant)); 269 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncInstant));
253 event->Complete(); 270 event->Complete();
254 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncInstant)); 271 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncInstant));
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 // Test that we wrapped. 411 // Test that we wrapped.
395 EXPECT(block_0 == recorder->GetNewBlock()); 412 EXPECT(block_0 == recorder->GetNewBlock());
396 413
397 // Emit the earlier event into block_1. 414 // Emit the earlier event into block_1.
398 TimelineTestHelper::FakeThreadEvent(block_1, 2, "Alpha", &stream); 415 TimelineTestHelper::FakeThreadEvent(block_1, 2, "Alpha", &stream);
399 OS::Sleep(1); 416 OS::Sleep(1);
400 // Emit the later event into block_0. 417 // Emit the later event into block_0.
401 TimelineTestHelper::FakeThreadEvent(block_0, 2, "Beta", &stream); 418 TimelineTestHelper::FakeThreadEvent(block_0, 2, "Beta", &stream);
402 419
403 JSONStream js; 420 JSONStream js;
404 recorder->PrintJSON(&js); 421 TimelineEventFilter filter;
422 recorder->PrintJSON(&js, &filter);
405 // trace-event has a requirement that events for a thread must have 423 // trace-event has a requirement that events for a thread must have
406 // monotonically increasing timestamps. 424 // monotonically increasing timestamps.
407 // Verify that "Alpha" comes before "Beta" even though "Beta" is in the first 425 // Verify that "Alpha" comes before "Beta" even though "Beta" is in the first
408 // block. 426 // block.
409 const char* alpha = strstr(js.ToCString(), "Alpha"); 427 const char* alpha = strstr(js.ToCString(), "Alpha");
410 const char* beta = strstr(js.ToCString(), "Beta"); 428 const char* beta = strstr(js.ToCString(), "Beta");
411 EXPECT(alpha < beta); 429 EXPECT(alpha < beta);
412 } 430 }
413 431
414 432
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 EXPECT(!pauses.has_error()); 594 EXPECT(!pauses.has_error());
577 EXPECT_EQ(10, pauses.InclusiveTime("a")); 595 EXPECT_EQ(10, pauses.InclusiveTime("a"));
578 EXPECT_EQ(10, pauses.ExclusiveTime("a")); 596 EXPECT_EQ(10, pauses.ExclusiveTime("a"));
579 EXPECT_EQ(10, pauses.MaxInclusiveTime("a")); 597 EXPECT_EQ(10, pauses.MaxInclusiveTime("a"));
580 EXPECT_EQ(8, pauses.MaxExclusiveTime("a")); 598 EXPECT_EQ(8, pauses.MaxExclusiveTime("a"));
581 } 599 }
582 TimelineTestHelper::Clear(recorder); 600 TimelineTestHelper::Clear(recorder);
583 } 601 }
584 602
585 } // namespace dart 603 } // namespace dart
OLDNEW
« runtime/vm/timeline.cc ('K') | « runtime/vm/timeline.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698