Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 | 6 |
| 7 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
| 8 #include "vm/dart_api_state.h" | 8 #include "vm/dart_api_state.h" |
| 9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
| 10 #include "vm/timeline.h" | 10 #include "vm/timeline.h" |
| 11 #include "vm/timeline_analysis.h" | |
| 11 #include "vm/unit_test.h" | 12 #include "vm/unit_test.h" |
| 12 | 13 |
| 13 namespace dart { | 14 namespace dart { |
| 14 | 15 |
| 15 class TimelineTestHelper : public AllStatic { | 16 class TimelineTestHelper : public AllStatic { |
| 16 public: | 17 public: |
| 17 static void SetStream(TimelineEvent* event, TimelineStream* stream) { | 18 static void SetStream(TimelineEvent* event, TimelineStream* stream) { |
| 18 event->StreamInit(stream); | 19 event->StreamInit(stream); |
| 19 } | 20 } |
| 21 | |
| 22 static TimelineEvent* FakeThreadEvent( | |
| 23 TimelineEventBlock* block, intptr_t ftid) { | |
| 24 TimelineEvent* event = block->StartEvent(); | |
| 25 ASSERT(event != NULL); | |
| 26 event->DurationBegin("fake"); | |
| 27 event->thread_ = static_cast<ThreadId>(ftid); | |
| 28 return event; | |
| 29 } | |
| 20 }; | 30 }; |
| 21 | 31 |
| 22 | 32 |
| 23 TEST_CASE(TimelineEventIsValid) { | 33 TEST_CASE(TimelineEventIsValid) { |
| 24 // Create a test stream. | 34 // Create a test stream. |
| 25 TimelineStream stream; | 35 TimelineStream stream; |
| 26 stream.Init("testStream", true); | 36 stream.Init("testStream", true); |
| 27 | 37 |
| 28 TimelineEvent event; | 38 TimelineEvent event; |
| 29 TimelineTestHelper::SetStream(&event, &stream); | 39 TimelineTestHelper::SetStream(&event, &stream); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 218 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncInstant)); | 228 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncInstant)); |
| 219 | 229 |
| 220 event = stream.StartEvent(); | 230 event = stream.StartEvent(); |
| 221 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncEnd)); | 231 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncEnd)); |
| 222 event->AsyncEnd("asyncEndCabbage", async_id); | 232 event->AsyncEnd("asyncEndCabbage", async_id); |
| 223 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncEnd)); | 233 EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncEnd)); |
| 224 event->Complete(); | 234 event->Complete(); |
| 225 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncEnd)); | 235 EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncEnd)); |
| 226 } | 236 } |
| 227 | 237 |
| 238 | |
| 239 TEST_CASE(TimelineAnalysis_ThreadBlockCount) { | |
| 240 TimelineEventEndlessRecorder* recorder = new TimelineEventEndlessRecorder(); | |
| 241 ASSERT(recorder != NULL); | |
| 242 // Blocks owned by thread "1". | |
| 243 TimelineEventBlock* block_1_0 = recorder->GetNewBlock(); | |
| 244 TimelineEventBlock* block_1_1 = recorder->GetNewBlock(); | |
| 245 TimelineEventBlock* block_1_2 = recorder->GetNewBlock(); | |
| 246 // Blocks owned by thread "2". | |
| 247 TimelineEventBlock* block_2_0 = recorder->GetNewBlock(); | |
| 248 // Blocks owned by thread "3". | |
| 249 TimelineEventBlock* block_3_0 = recorder->GetNewBlock(); | |
| 250 USE(block_3_0); | |
| 251 | |
| 252 // Add events to each block for thread 1. | |
| 253 TimelineTestHelper::FakeThreadEvent(block_1_2, 1); | |
| 254 TimelineTestHelper::FakeThreadEvent(block_1_2, 1); | |
| 255 TimelineTestHelper::FakeThreadEvent(block_1_2, 1); | |
| 256 // Sleep to ensure timestamps differ. | |
| 257 OS::Sleep(1); | |
| 258 TimelineTestHelper::FakeThreadEvent(block_1_0, 1); | |
| 259 OS::Sleep(1); | |
| 260 TimelineTestHelper::FakeThreadEvent(block_1_1, 1); | |
| 261 TimelineTestHelper::FakeThreadEvent(block_1_1, 1); | |
| 262 OS::Sleep(1); | |
| 263 | |
| 264 // Add events to each block for thread 2. | |
| 265 TimelineTestHelper::FakeThreadEvent(block_2_0, 2); | |
| 266 TimelineTestHelper::FakeThreadEvent(block_2_0, 2); | |
| 267 TimelineTestHelper::FakeThreadEvent(block_2_0, 2); | |
| 268 TimelineTestHelper::FakeThreadEvent(block_2_0, 2); | |
| 269 TimelineTestHelper::FakeThreadEvent(block_2_0, 2); | |
| 270 TimelineTestHelper::FakeThreadEvent(block_2_0, 2); | |
| 271 | |
| 272 Thread* thread = Thread::Current(); | |
| 273 Zone* zone = thread->zone(); | |
| 274 Isolate* isolate = thread->isolate(); | |
| 275 | |
| 276 // Discover threads in recorder. | |
| 277 TimelineAnalysis ta(zone, isolate, recorder); | |
| 278 ta.BuildThreads(); | |
| 279 // block_c_0 is never used by a thread, so we only have two threads. | |
|
rmacnak
2015/08/12 19:51:47
block_3_0
Cutch
2015/08/12 20:31:19
Done.
| |
| 280 EXPECT_EQ(2, ta.NumThreads()); | |
| 281 | |
| 282 // Extract both threads. | |
| 283 TimelineAnalysisThread* thread_1 = ta.GetThread(static_cast<ThreadId>(1)); | |
| 284 TimelineAnalysisThread* thread_2 = ta.GetThread(static_cast<ThreadId>(2)); | |
| 285 EXPECT_EQ(static_cast<ThreadId>(1), thread_1->id()); | |
| 286 EXPECT_EQ(static_cast<ThreadId>(2), thread_2->id()); | |
| 287 | |
| 288 // Thread "1" should have three blocks. | |
| 289 EXPECT_EQ(3, thread_1->NumBlocks()); | |
| 290 | |
| 291 // Verify that blocks for thread "1" are sorted based on start time. | |
| 292 EXPECT_EQ(thread_1->At(0), block_1_2); | |
| 293 EXPECT_EQ(thread_1->At(1), block_1_0); | |
| 294 EXPECT_EQ(thread_1->At(2), block_1_1); | |
| 295 | |
| 296 // Verify that block_1_2 has three events. | |
| 297 EXPECT_EQ(3, block_1_2->length()); | |
| 298 | |
| 299 // Verify that block_1_0 has one events. | |
| 300 EXPECT_EQ(1, block_1_0->length()); | |
| 301 | |
| 302 // Verify that block_1_1 has two events. | |
| 303 EXPECT_EQ(2, block_1_1->length()); | |
| 304 | |
| 305 // Thread '2" should have one block.' | |
| 306 EXPECT_EQ(1, thread_2->NumBlocks()); | |
| 307 EXPECT_EQ(thread_2->At(0), block_2_0); | |
| 308 // Verify that block_2_0 has six events. | |
| 309 EXPECT_EQ(6, block_2_0->length()); | |
| 310 } | |
| 311 | |
| 228 } // namespace dart | 312 } // namespace dart |
| OLD | NEW |