// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include <cstring>

#include "platform/assert.h"

#include "vm/dart_api_impl.h"
#include "vm/dart_api_state.h"
#include "vm/globals.h"
#include "vm/timeline.h"
#include "vm/timeline_analysis.h"
#include "vm/unit_test.h"

namespace dart {

class TimelineRecorderOverride : public ValueObject {
 public:
  explicit TimelineRecorderOverride(TimelineEventRecorder* new_recorder)
      : recorder_(Timeline::recorder()) {
    Timeline::recorder_ = new_recorder;
  }

  ~TimelineRecorderOverride() {
    Timeline::recorder_ = recorder_;
  }

 private:
  TimelineEventRecorder* recorder_;
};


class TimelineTestHelper : public AllStatic {
 public:
  static void SetStream(TimelineEvent* event, TimelineStream* stream) {
    event->StreamInit(stream);
  }

  static TimelineEvent* FakeThreadEvent(
      TimelineEventBlock* block,
      intptr_t ftid,
      const char* label = "fake",
      TimelineStream* stream = NULL) {
    TimelineEvent* event = block->StartEvent();
    ASSERT(event != NULL);
    event->DurationBegin(label);
    event->thread_ = OSThread::ThreadIdFromIntPtr(ftid);
    if (stream != NULL) {
      event->StreamInit(stream);
    }
    return event;
  }

  static void FakeDuration(
      TimelineEventRecorder* recorder,
      const char* label,
      int64_t start,
      int64_t end) {
    ASSERT(recorder != NULL);
    ASSERT(start < end);
    ASSERT(label != NULL);
    TimelineEvent* event = recorder->StartEvent();
    ASSERT(event != NULL);
    event->Duration(label, start, end);
  }

  static void Clear(TimelineEventEndlessRecorder* recorder) {
    ASSERT(recorder != NULL);
    recorder->Clear();
  }

  static void FinishBlock(TimelineEventBlock* block) {
    block->Finish();
  }
};


TEST_CASE(TimelineEventIsValid) {
  // Create a test stream.
  TimelineStream stream;
  stream.Init("testStream", true);

  TimelineEvent event;
  TimelineTestHelper::SetStream(&event, &stream);

  // Starts invalid.
  EXPECT(!event.IsValid());

  // Becomes valid.
  event.Instant("hello");
  EXPECT(event.IsValid());

  // Becomes invalid.
  event.Reset();
  EXPECT(!event.IsValid());
}


TEST_CASE(TimelineEventDuration) {
  // Create a test stream.
  TimelineStream stream;
  stream.Init("testStream", true);

  // Create a test event.
  TimelineEvent event;
  TimelineTestHelper::SetStream(&event, &stream);
  event.DurationBegin("apple");
  // Measure the duration.
  int64_t current_duration = event.TimeDuration();
  event.DurationEnd();
  // Verify that duration is larger.
  EXPECT_GE(event.TimeDuration(), current_duration);
}


TEST_CASE(TimelineEventDurationPrintJSON) {
  // Create a test stream.
  TimelineStream stream;
  stream.Init("testStream", true);

  // Create a test event.
  TimelineEvent event;
  TimelineTestHelper::SetStream(&event, &stream);
  event.DurationBegin("apple");
  {
    // Test printing to JSON.
    JSONStream js;
    event.PrintJSON(&js);
    // Check category
    EXPECT_SUBSTRING("\"cat\":\"testStream\"", js.ToCString());
    // Check name.
    EXPECT_SUBSTRING("\"name\":\"apple\"", js.ToCString());
    // Check phase.
    EXPECT_SUBSTRING("\"ph\":\"X\"", js.ToCString());
    // Check that ts key is present.
    EXPECT_SUBSTRING("\"ts\":", js.ToCString());
    // Check that dur key is present.
    EXPECT_SUBSTRING("\"dur\":", js.ToCString());
  }
  event.DurationEnd();
}


TEST_CASE(TimelineEventArguments) {
  // Create a test stream.
  TimelineStream stream;
  stream.Init("testStream", true);

  // Create a test event.
  TimelineEvent event;
  TimelineTestHelper::SetStream(&event, &stream);

  // Allocate room for four arguments.
  event.SetNumArguments(4);
  // Reset.
  event.Reset();

  event.DurationBegin("apple");
  event.SetNumArguments(2);
  event.CopyArgument(0, "arg1", "value1");
  event.CopyArgument(1, "arg2", "value2");
  event.DurationEnd();
}


TEST_CASE(TimelineEventArgumentsPrintJSON) {
  // Create a test stream.
  TimelineStream stream;
  stream.Init("testStream", true);

  // Create a test event.
  TimelineEvent event;
  TimelineTestHelper::SetStream(&event, &stream);

  event.DurationBegin("apple");
  event.SetNumArguments(2);
  event.CopyArgument(0, "arg1", "value1");
  event.CopyArgument(1, "arg2", "value2");
  event.DurationEnd();

  {
    // Test printing to JSON.
    JSONStream js;
    event.PrintJSON(&js);

    // Check both arguments.
    EXPECT_SUBSTRING("\"arg1\":\"value1\"", js.ToCString());
    EXPECT_SUBSTRING("\"arg2\":\"value2\"", js.ToCString());
  }
}


TEST_CASE(TimelineEventBufferPrintJSON) {
  TimelineEventRecorder* recorder = Timeline::recorder();
  JSONStream js;
  TimelineEventFilter filter;
  recorder->PrintJSON(&js, &filter);
  // Check the type. This test will fail if we ever make Timeline public.
  EXPECT_SUBSTRING("\"type\":\"_Timeline\"", js.ToCString());
  // Check that there is a traceEvents array.
  EXPECT_SUBSTRING("\"traceEvents\":[", js.ToCString());
}


// Count the number of each event type seen.
class EventCounterRecorder : public TimelineEventStreamingRecorder {
 public:
  EventCounterRecorder() {
    for (intptr_t i = 0; i < TimelineEvent::kNumEventTypes; i++) {
      counts_[i] = 0;
    }
  }

  void StreamEvent(TimelineEvent* event) {
    counts_[event->event_type()]++;
  }

  intptr_t CountFor(TimelineEvent::EventType type) {
    return counts_[type];
  }

 private:
  intptr_t counts_[TimelineEvent::kNumEventTypes];
};


TEST_CASE(TimelineEventStreamingRecorderBasic) {
  EventCounterRecorder* recorder = new EventCounterRecorder();
  TimelineRecorderOverride override(recorder);

  // Initial counts are all zero.
  for (intptr_t i = TimelineEvent::kNone + 1;
       i < TimelineEvent::kNumEventTypes;
       i++) {
    EXPECT_EQ(0, recorder->CountFor(static_cast<TimelineEvent::EventType>(i)));
  }

  // Create a test stream.
  TimelineStream stream;
  stream.Init("testStream", true);

  TimelineEvent* event = NULL;

  event = stream.StartEvent();
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration));
  event->DurationBegin("cabbage");
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration));
  event->DurationEnd();
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kDuration));
  event->Complete();
  EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kDuration));

  event = stream.StartEvent();
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kInstant));
  event->Instant("instantCabbage");
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kInstant));
  event->Complete();
  EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kInstant));

  event = stream.StartEvent();
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncBegin));
  int64_t async_id = recorder->GetNextAsyncId();
  EXPECT(async_id >= 0);
  event->AsyncBegin("asyncBeginCabbage", async_id);
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncBegin));
  event->Complete();
  EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncBegin));

  event = stream.StartEvent();
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncInstant));
  event->AsyncInstant("asyncInstantCabbage", async_id);
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncInstant));
  event->Complete();
  EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncInstant));

  event = stream.StartEvent();
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncEnd));
  event->AsyncEnd("asyncEndCabbage", async_id);
  EXPECT_EQ(0, recorder->CountFor(TimelineEvent::kAsyncEnd));
  event->Complete();
  EXPECT_EQ(1, recorder->CountFor(TimelineEvent::kAsyncEnd));
}


static bool LabelMatch(TimelineEvent* event, const char* label) {
  ASSERT(event != NULL);
  return strcmp(event->label(), label) == 0;
}


TEST_CASE(TimelineAnalysis_ThreadBlockCount) {
  TimelineEventEndlessRecorder* recorder = new TimelineEventEndlessRecorder();
  ASSERT(recorder != NULL);
  // Blocks owned by thread "1".
  TimelineEventBlock* block_1_0 = recorder->GetNewBlock();
  TimelineEventBlock* block_1_1 = recorder->GetNewBlock();
  TimelineEventBlock* block_1_2 = recorder->GetNewBlock();
  // Blocks owned by thread "2".
  TimelineEventBlock* block_2_0 = recorder->GetNewBlock();
  // Blocks owned by thread "3".
  TimelineEventBlock* block_3_0 = recorder->GetNewBlock();
  USE(block_3_0);

  // Add events to each block for thread 1.
  TimelineTestHelper::FakeThreadEvent(block_1_2, 1, "B1");
  TimelineTestHelper::FakeThreadEvent(block_1_2, 1, "B2");
  TimelineTestHelper::FakeThreadEvent(block_1_2, 1, "B3");
  // Sleep to ensure timestamps differ.
  OS::Sleep(1);
  TimelineTestHelper::FakeThreadEvent(block_1_0, 1, "A1");
  OS::Sleep(1);
  TimelineTestHelper::FakeThreadEvent(block_1_1, 1, "C1");
  TimelineTestHelper::FakeThreadEvent(block_1_1, 1, "C2");
  OS::Sleep(1);

  // Add events to each block for thread 2.
  TimelineTestHelper::FakeThreadEvent(block_2_0, 2, "A");
  TimelineTestHelper::FakeThreadEvent(block_2_0, 2, "B");
  TimelineTestHelper::FakeThreadEvent(block_2_0, 2, "C");
  TimelineTestHelper::FakeThreadEvent(block_2_0, 2, "D");
  TimelineTestHelper::FakeThreadEvent(block_2_0, 2, "E");
  TimelineTestHelper::FakeThreadEvent(block_2_0, 2, "F");

  Zone* zone = thread->zone();
  Isolate* isolate = thread->isolate();

  // Discover threads in recorder.
  TimelineAnalysis ta(zone, isolate, recorder);
  ta.BuildThreads();
  // block_3_0 is never used by a thread, so we only have two threads.
  EXPECT_EQ(2, ta.NumThreads());

  // Extract both threads.
  TimelineAnalysisThread* thread_1 =
      ta.GetThread(OSThread::ThreadIdFromIntPtr(1));
  TimelineAnalysisThread* thread_2 =
      ta.GetThread(OSThread::ThreadIdFromIntPtr(2));
  EXPECT_EQ(OSThread::ThreadIdFromIntPtr(1), thread_1->id());
  EXPECT_EQ(OSThread::ThreadIdFromIntPtr(2), thread_2->id());

  // Thread "1" should have three blocks.
  EXPECT_EQ(3, thread_1->NumBlocks());

  // Verify that blocks for thread "1" are sorted based on start time.
  EXPECT_EQ(thread_1->At(0), block_1_2);
  EXPECT_EQ(thread_1->At(1), block_1_0);
  EXPECT_EQ(thread_1->At(2), block_1_1);

  // Verify that block_1_2 has three events.
  EXPECT_EQ(3, block_1_2->length());

  // Verify that block_1_0 has one events.
  EXPECT_EQ(1, block_1_0->length());

  // Verify that block_1_1 has two events.
  EXPECT_EQ(2, block_1_1->length());

  // Thread '2" should have one block.'
  EXPECT_EQ(1, thread_2->NumBlocks());
  EXPECT_EQ(thread_2->At(0), block_2_0);
  // Verify that block_2_0 has six events.
  EXPECT_EQ(6, block_2_0->length());

  {
    TimelineAnalysisThreadEventIterator it(thread_1);
    // Six events spread across three blocks.
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "B1"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "B2"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "B3"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "A1"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "C1"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "C2"));
    EXPECT(!it.HasNext());
  }

  {
    TimelineAnalysisThreadEventIterator it(thread_2);
    // Six events spread across three blocks.
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "A"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "B"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "C"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "D"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "E"));
    EXPECT(it.HasNext());
    EXPECT(LabelMatch(it.Next(), "F"));
    EXPECT(!it.HasNext());
  }
}


TEST_CASE(TimelineRingRecorderJSONOrder) {
  TimelineStream stream;
  stream.Init("testStream", true);

  TimelineEventRingRecorder* recorder =
      new TimelineEventRingRecorder(TimelineEventBlock::kBlockSize * 2);

  TimelineEventBlock* block_0 = recorder->GetNewBlock();
  EXPECT(block_0 != NULL);
  TimelineEventBlock* block_1 = recorder->GetNewBlock();
  EXPECT(block_1 != NULL);
  // Test that we wrapped.
  EXPECT(block_0 == recorder->GetNewBlock());

  // Emit the earlier event into block_1.
  TimelineTestHelper::FakeThreadEvent(block_1, 2, "Alpha", &stream);
  OS::Sleep(1);
  // Emit the later event into block_0.
  TimelineTestHelper::FakeThreadEvent(block_0, 2, "Beta", &stream);

  TimelineTestHelper::FinishBlock(block_0);
  TimelineTestHelper::FinishBlock(block_1);

  JSONStream js;
  TimelineEventFilter filter;
  recorder->PrintJSON(&js, &filter);
  // trace-event has a requirement that events for a thread must have
  // monotonically increasing timestamps.
  // Verify that "Alpha" comes before "Beta" even though "Beta" is in the first
  // block.
  const char* alpha = strstr(js.ToCString(), "Alpha");
  const char* beta = strstr(js.ToCString(), "Beta");
  EXPECT(alpha < beta);
}


TEST_CASE(TimelinePauses_Basic) {
  TimelineEventEndlessRecorder* recorder = new TimelineEventEndlessRecorder();
  ASSERT(recorder != NULL);
  Zone* zone = thread->zone();
  Isolate* isolate = thread->isolate();
  ThreadId tid = OSThread::GetCurrentThreadTraceId();

  // Test case.
  TimelineTestHelper::FakeDuration(recorder, "a", 0, 10);
  {
    TimelinePauses pauses(zone, isolate, recorder);
    pauses.Setup();
    pauses.CalculatePauseTimesForThread(tid);
    EXPECT(!pauses.has_error());
    EXPECT_EQ(10, pauses.InclusiveTime("a"));
    EXPECT_EQ(10, pauses.ExclusiveTime("a"));
    EXPECT_EQ(10, pauses.MaxInclusiveTime("a"));
    EXPECT_EQ(10, pauses.MaxExclusiveTime("a"));
  }
  TimelineTestHelper::Clear(recorder);

  // Test case.
  TimelineTestHelper::FakeDuration(recorder, "a", 0, 10);
  TimelineTestHelper::FakeDuration(recorder, "b", 0, 10);
  {
    TimelinePauses pauses(zone, isolate, recorder);
    pauses.Setup();
    pauses.CalculatePauseTimesForThread(tid);
    EXPECT(!pauses.has_error());
    EXPECT_EQ(10, pauses.InclusiveTime("a"));
    EXPECT_EQ(0, pauses.ExclusiveTime("a"));
    EXPECT_EQ(10, pauses.MaxInclusiveTime("a"));
    EXPECT_EQ(0, pauses.MaxExclusiveTime("a"));
    EXPECT_EQ(10, pauses.InclusiveTime("b"));
    EXPECT_EQ(10, pauses.ExclusiveTime("b"));
    EXPECT_EQ(10, pauses.MaxInclusiveTime("b"));
    EXPECT_EQ(10, pauses.MaxExclusiveTime("b"));
  }
  TimelineTestHelper::Clear(recorder);

  // Test case.
  TimelineTestHelper::FakeDuration(recorder, "a", 0, 10);
  TimelineTestHelper::FakeDuration(recorder, "b", 1, 8);
  {
    TimelinePauses pauses(zone, isolate, recorder);
    pauses.Setup();
    pauses.CalculatePauseTimesForThread(tid);
    EXPECT(!pauses.has_error());
    EXPECT_EQ(10, pauses.InclusiveTime("a"));
    EXPECT_EQ(3, pauses.ExclusiveTime("a"));
    EXPECT_EQ(10, pauses.MaxInclusiveTime("a"));
    EXPECT_EQ(3, pauses.MaxExclusiveTime("a"));
    EXPECT_EQ(7, pauses.InclusiveTime("b"));
    EXPECT_EQ(7, pauses.ExclusiveTime("b"));
    EXPECT_EQ(7, pauses.MaxInclusiveTime("b"));
    EXPECT_EQ(7, pauses.MaxExclusiveTime("b"));
  }
  TimelineTestHelper::Clear(recorder);

  // Test case.
  TimelineTestHelper::FakeDuration(recorder, "a", 0, 10);
  TimelineTestHelper::FakeDuration(recorder, "b", 0, 1);
  TimelineTestHelper::FakeDuration(recorder, "b", 1, 2);
  TimelineTestHelper::FakeDuration(recorder, "b", 2, 3);
  TimelineTestHelper::FakeDuration(recorder, "b", 3, 4);
  TimelineTestHelper::FakeDuration(recorder, "b", 4, 5);
  TimelineTestHelper::FakeDuration(recorder, "b", 5, 6);
  TimelineTestHelper::FakeDuration(recorder, "b", 6, 7);
  TimelineTestHelper::FakeDuration(recorder, "b", 7, 8);
  TimelineTestHelper::FakeDuration(recorder, "b", 8, 9);
  TimelineTestHelper::FakeDuration(recorder, "b", 9, 10);
  {
    TimelinePauses pauses(zone, isolate, recorder);
    pauses.Setup();
    pauses.CalculatePauseTimesForThread(tid);
    EXPECT(!pauses.has_error());
    EXPECT_EQ(10, pauses.InclusiveTime("a"));
    EXPECT_EQ(0, pauses.ExclusiveTime("a"));
    EXPECT_EQ(10, pauses.MaxInclusiveTime("a"));
    EXPECT_EQ(0, pauses.MaxExclusiveTime("a"));
    EXPECT_EQ(10, pauses.InclusiveTime("b"));
    EXPECT_EQ(10, pauses.ExclusiveTime("b"));
    EXPECT_EQ(1, pauses.MaxInclusiveTime("b"));
    EXPECT_EQ(1, pauses.MaxExclusiveTime("b"));
  }
  TimelineTestHelper::Clear(recorder);

  // Test case.
  TimelineTestHelper::FakeDuration(recorder, "a", 0, 10);
  TimelineTestHelper::FakeDuration(recorder, "b", 0, 5);
  TimelineTestHelper::FakeDuration(recorder, "c", 1, 4);
  TimelineTestHelper::FakeDuration(recorder, "d", 5, 10);

  {
    TimelinePauses pauses(zone, isolate, recorder);
    pauses.Setup();
    pauses.CalculatePauseTimesForThread(tid);
    EXPECT(!pauses.has_error());
    EXPECT_EQ(10, pauses.InclusiveTime("a"));
    EXPECT_EQ(0, pauses.ExclusiveTime("a"));
    EXPECT_EQ(10, pauses.MaxInclusiveTime("a"));
    EXPECT_EQ(0, pauses.MaxExclusiveTime("a"));
    EXPECT_EQ(5, pauses.InclusiveTime("b"));
    EXPECT_EQ(2, pauses.ExclusiveTime("b"));
    EXPECT_EQ(5, pauses.MaxInclusiveTime("b"));
    EXPECT_EQ(2, pauses.MaxExclusiveTime("b"));
    EXPECT_EQ(3, pauses.InclusiveTime("c"));
    EXPECT_EQ(3, pauses.ExclusiveTime("c"));
    EXPECT_EQ(3, pauses.MaxInclusiveTime("c"));
    EXPECT_EQ(3, pauses.MaxExclusiveTime("c"));
    EXPECT_EQ(5, pauses.InclusiveTime("d"));
    EXPECT_EQ(5, pauses.ExclusiveTime("d"));
    EXPECT_EQ(5, pauses.MaxInclusiveTime("d"));
    EXPECT_EQ(5, pauses.MaxExclusiveTime("d"));
  }
  TimelineTestHelper::Clear(recorder);

  // Test case.
  TimelineTestHelper::FakeDuration(recorder, "a", 0, 10);
  TimelineTestHelper::FakeDuration(recorder, "b", 1, 9);
  TimelineTestHelper::FakeDuration(recorder, "c", 2, 8);
  TimelineTestHelper::FakeDuration(recorder, "d", 3, 7);
  TimelineTestHelper::FakeDuration(recorder, "e", 4, 6);

  {
    TimelinePauses pauses(zone, isolate, recorder);
    pauses.Setup();
    pauses.CalculatePauseTimesForThread(tid);
    EXPECT(!pauses.has_error());
    EXPECT_EQ(10, pauses.InclusiveTime("a"));
    EXPECT_EQ(2, pauses.ExclusiveTime("a"));
    EXPECT_EQ(10, pauses.MaxInclusiveTime("a"));
    EXPECT_EQ(2, pauses.MaxExclusiveTime("a"));
    EXPECT_EQ(8, pauses.InclusiveTime("b"));
    EXPECT_EQ(2, pauses.ExclusiveTime("b"));
    EXPECT_EQ(8, pauses.MaxInclusiveTime("b"));
    EXPECT_EQ(2, pauses.MaxExclusiveTime("b"));
    EXPECT_EQ(6, pauses.InclusiveTime("c"));
    EXPECT_EQ(2, pauses.ExclusiveTime("c"));
    EXPECT_EQ(6, pauses.MaxInclusiveTime("c"));
    EXPECT_EQ(2, pauses.MaxExclusiveTime("c"));
    EXPECT_EQ(4, pauses.InclusiveTime("d"));
    EXPECT_EQ(2, pauses.ExclusiveTime("d"));
    EXPECT_EQ(4, pauses.MaxInclusiveTime("d"));
    EXPECT_EQ(2, pauses.MaxExclusiveTime("d"));
    EXPECT_EQ(2, pauses.InclusiveTime("e"));
    EXPECT_EQ(2, pauses.ExclusiveTime("e"));
    EXPECT_EQ(2, pauses.MaxInclusiveTime("e"));
    EXPECT_EQ(2, pauses.MaxExclusiveTime("e"));
  }
  TimelineTestHelper::Clear(recorder);

  // Test case.
  TimelineTestHelper::FakeDuration(recorder, "a", 0, 10);
  TimelineTestHelper::FakeDuration(recorder, "a", 1, 9);

  {
    TimelinePauses pauses(zone, isolate, recorder);
    pauses.Setup();
    pauses.CalculatePauseTimesForThread(tid);
    EXPECT(!pauses.has_error());
    EXPECT_EQ(10, pauses.InclusiveTime("a"));
    EXPECT_EQ(10, pauses.ExclusiveTime("a"));
    EXPECT_EQ(10, pauses.MaxInclusiveTime("a"));
    EXPECT_EQ(8, pauses.MaxExclusiveTime("a"));
  }
  TimelineTestHelper::Clear(recorder);
}

}  // namespace dart
