15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event_unittest.h"
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/trace_event_analyzer.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace trace_analyzer {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TraceEventAnalyzerTest : public testing::Test {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ManualSetUp();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnTraceDataCollected(
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::WaitableEvent* flush_complete_event,
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const scoped_refptr<base::RefCountedString>& json_events_str,
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      bool has_more_events);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BeginTracing();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndTracing();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::debug::TraceResultBuffer::SimpleOutput output_;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::debug::TraceResultBuffer buffer_;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraceEventAnalyzerTest::ManualSetUp() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(base::debug::TraceLog::GetInstance());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_.SetOutputCallback(output_.GetCallback());
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output_.json_output.clear();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraceEventAnalyzerTest::OnTraceDataCollected(
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::WaitableEvent* flush_complete_event,
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const scoped_refptr<base::RefCountedString>& json_events_str,
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool has_more_events) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_.AddFragment(json_events_str->data());
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!has_more_events)
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    flush_complete_event->Signal();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraceEventAnalyzerTest::BeginTracing() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output_.json_output.clear();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_.Start();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::debug::TraceLog::GetInstance()->SetEnabled(
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::debug::CategoryFilter("*"),
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::debug::TraceLog::RECORDING_MODE,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::debug::TraceLog::RECORD_UNTIL_FULL);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraceEventAnalyzerTest::EndTracing() {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::debug::TraceLog::GetInstance()->SetDisabled();
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::WaitableEvent flush_complete_event(false, false);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::debug::TraceLog::GetInstance()->Flush(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TraceEventAnalyzerTest::OnTraceDataCollected,
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 base::Unretained(this),
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 base::Unretained(&flush_complete_event)));
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  flush_complete_event.Wait();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_.Finish();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, NoEvents) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an empty JSON event string:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_.Start();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_.Finish();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Search for all events and verify that nothing is returned.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::Bool(true), &found);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, found.size());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, TraceEvent) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int int_num = 2;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double double_num = 3.5;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* str = "the string";
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEvent event;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.arg_numbers["false"] = 0.0;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.arg_numbers["true"] = 1.0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.arg_numbers["int"] = static_cast<double>(int_num);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.arg_numbers["double"] = double_num;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.arg_strings["string"] = str;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(event.HasNumberArg("false"));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(event.HasNumberArg("true"));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(event.HasNumberArg("int"));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(event.HasNumberArg("double"));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(event.HasStringArg("string"));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(event.HasNumberArg("notfound"));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(event.HasStringArg("notfound"));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event.GetKnownArgAsBool("false"));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event.GetKnownArgAsBool("true"));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(int_num, event.GetKnownArgAsInt("int"));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(double_num, event.GetKnownArgAsDouble("double"));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(str, event.GetKnownArgAsString("string").c_str());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, QueryEventMember) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEvent event;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.thread.process_id = 3;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.thread.thread_id = 4;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.timestamp = 1.5;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.phase = TRACE_EVENT_PHASE_BEGIN;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.category = "category";
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.name = "name";
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.id = "1";
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.arg_numbers["num"] = 7.0;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.arg_strings["str"] = "the string";
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other event with all different members:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEvent other;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.thread.process_id = 5;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.thread.thread_id = 6;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.timestamp = 2.5;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.phase = TRACE_EVENT_PHASE_END;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.category = "category2";
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.name = "name2";
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.id = "2";
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.arg_numbers["num2"] = 8.0;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  other.arg_strings["str2"] = "the string 2";
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.other_event = &other;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(event.has_other_event());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double duration = event.GetAbsTimeToOtherEvent();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_pid = Query::EventPidIs(event.thread.process_id);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_tid = Query::EventTidIs(event.thread.thread_id);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_time = Query::EventTimeIs(event.timestamp);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_duration = Query::EventDurationIs(duration);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_phase = Query::EventPhaseIs(event.phase);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_category = Query::EventCategoryIs(event.category);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_name = Query::EventNameIs(event.name);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_id = Query::EventIdIs(event.id);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_has_arg1 = Query::EventHasNumberArg("num");
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_has_arg2 = Query::EventHasStringArg("str");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_arg1 =
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (Query::EventArg("num") == Query::Double(event.arg_numbers["num"]));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_arg2 =
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (Query::EventArg("str") == Query::String(event.arg_strings["str"]));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query event_has_other = Query::EventHasOther();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_pid = Query::OtherPidIs(other.thread.process_id);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_tid = Query::OtherTidIs(other.thread.thread_id);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_time = Query::OtherTimeIs(other.timestamp);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_phase = Query::OtherPhaseIs(other.phase);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_category = Query::OtherCategoryIs(other.category);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_name = Query::OtherNameIs(other.name);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_id = Query::OtherIdIs(other.id);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_has_arg1 = Query::OtherHasNumberArg("num2");
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_has_arg2 = Query::OtherHasStringArg("str2");
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_arg1 =
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (Query::OtherArg("num2") == Query::Double(other.arg_numbers["num2"]));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query other_arg2 =
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (Query::OtherArg("str2") == Query::String(other.arg_strings["str2"]));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_pid.Evaluate(event));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_tid.Evaluate(event));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_time.Evaluate(event));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_duration.Evaluate(event));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_phase.Evaluate(event));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_category.Evaluate(event));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_name.Evaluate(event));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_id.Evaluate(event));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_has_arg1.Evaluate(event));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_has_arg2.Evaluate(event));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_arg1.Evaluate(event));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_arg2.Evaluate(event));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(event_has_other.Evaluate(event));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_pid.Evaluate(event));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_tid.Evaluate(event));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_time.Evaluate(event));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_phase.Evaluate(event));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_category.Evaluate(event));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_name.Evaluate(event));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_id.Evaluate(event));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_has_arg1.Evaluate(event));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_has_arg2.Evaluate(event));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_arg1.Evaluate(event));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(other_arg2.Evaluate(event));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Evaluate event queries against other to verify the queries fail when the
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event members are wrong.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_pid.Evaluate(other));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_tid.Evaluate(other));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_time.Evaluate(other));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_duration.Evaluate(other));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_phase.Evaluate(other));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_category.Evaluate(other));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_name.Evaluate(other));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_id.Evaluate(other));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_has_arg1.Evaluate(other));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_has_arg2.Evaluate(other));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_arg1.Evaluate(other));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_arg2.Evaluate(other));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(event_has_other.Evaluate(other));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, BooleanOperators) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat1", "name1", TRACE_EVENT_SCOPE_THREAD, "num", 1);
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat1", "name2", TRACE_EVENT_SCOPE_THREAD, "num", 2);
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat2", "name3", TRACE_EVENT_SCOPE_THREAD, "num", 3);
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat2", "name4", TRACE_EVENT_SCOPE_THREAD, "num", 4);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(!!analyzer.get());
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  analyzer->SetIgnoreMetadataEvents(true);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ==
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() == Query::String("cat1"), &found);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, found.size());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name2", found[1]->name.c_str());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("num") == Query::Int(2), &found);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, found.size());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name2", found[0]->name.c_str());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // !=
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() != Query::String("cat1"), &found);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, found.size());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name3", found[0]->name.c_str());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name4", found[1]->name.c_str());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("num") != Query::Int(2), &found);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, found.size());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name3", found[1]->name.c_str());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name4", found[2]->name.c_str());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // <
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("num") < Query::Int(2), &found);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, found.size());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // <=
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("num") <= Query::Int(2), &found);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, found.size());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name2", found[1]->name.c_str());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // >
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("num") > Query::Int(3), &found);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, found.size());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name4", found[0]->name.c_str());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // >=
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("num") >= Query::Int(4), &found);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, found.size());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name4", found[0]->name.c_str());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // &&
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventName() != Query::String("name1") &&
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::EventArg("num") < Query::Int(3), &found);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, found.size());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name2", found[0]->name.c_str());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ||
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventName() == Query::String("name1") ||
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::EventArg("num") == Query::Int(3), &found);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, found.size());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name3", found[1]->name.c_str());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // !
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(!(Query::EventName() == Query::String("name1") ||
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         Query::EventArg("num") == Query::Int(3)), &found);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, found.size());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name2", found[0]->name.c_str());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name4", found[1]->name.c_str());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, ArithmeticOperators) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These events are searched for:
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT2("cat1", "math1", TRACE_EVENT_SCOPE_THREAD,
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "a", 10, "b", 5);
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT2("cat1", "math2", TRACE_EVENT_SCOPE_THREAD,
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "a", 10, "b", 10);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Extra events that never match, for noise:
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT2("noise", "math3", TRACE_EVENT_SCOPE_THREAD,
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "a", 1,  "b", 3);
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT2("noise", "math4", TRACE_EVENT_SCOPE_THREAD,
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         "c", 10, "d", 5);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that arithmetic operators function:
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // +
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("a") + Query::EventArg("b") ==
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::Int(20), &found);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("math2", found.front()->name.c_str());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("a") - Query::EventArg("b") ==
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::Int(5), &found);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("math1", found.front()->name.c_str());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // *
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("a") * Query::EventArg("b") ==
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::Int(50), &found);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("math1", found.front()->name.c_str());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // /
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("a") / Query::EventArg("b") ==
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::Int(2), &found);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("math1", found.front()->name.c_str());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // %
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventArg("a") % Query::EventArg("b") ==
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::Int(0), &found);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, found.size());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - (negate)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(-Query::EventArg("b") == Query::Int(-10), &found);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("math2", found.front()->name.c_str());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, StringPattern) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT0("cat1", "name1", TRACE_EVENT_SCOPE_THREAD);
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT0("cat1", "name2", TRACE_EVENT_SCOPE_THREAD);
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT0("cat1", "no match", TRACE_EVENT_SCOPE_THREAD);
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT0("cat1", "name3x", TRACE_EVENT_SCOPE_THREAD);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  analyzer->SetIgnoreMetadataEvents(true);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventName() == Query::Pattern("name?"), &found);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, found.size());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name2", found[1]->name.c_str());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventName() == Query::Pattern("name*"), &found);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, found.size());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name2", found[1]->name.c_str());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name3x", found[2]->name.c_str());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventName() != Query::Pattern("name*"), &found);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, found.size());
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("no match", found[0]->name.c_str());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that duration queries work.
3968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(TraceEventAnalyzerTest, BeginEndDuration) {
3978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ManualSetUp();
3988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const base::TimeDelta kSleepTime = base::TimeDelta::FromMilliseconds(200);
4008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // We will search for events that have a duration of greater than 90% of the
4018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // sleep time, so that there is no flakiness.
4028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int duration_cutoff_us = (kSleepTime.InMicroseconds() * 9) / 10;
4038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  BeginTracing();
4058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  {
4068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    TRACE_EVENT_BEGIN0("cat1", "name1"); // found by duration query
4078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    TRACE_EVENT_BEGIN0("noise", "name2"); // not searched for, just noise
4088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    {
4098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      TRACE_EVENT_BEGIN0("cat2", "name3"); // found by duration query
4108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      // next event not searched for, just noise
4118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      TRACE_EVENT_INSTANT0("noise", "name4", TRACE_EVENT_SCOPE_THREAD);
4128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      base::debug::HighResSleepForTraceTest(kSleepTime);
4138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      TRACE_EVENT_BEGIN0("cat2", "name5"); // not found (duration too short)
4148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      TRACE_EVENT_END0("cat2", "name5"); // not found (duration too short)
4158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      TRACE_EVENT_END0("cat2", "name3"); // found by duration query
4168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
4178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    TRACE_EVENT_END0("noise", "name2"); // not searched for, just noise
4188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    TRACE_EVENT_END0("cat1", "name1"); // found by duration query
4198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
4208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EndTracing();
4218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<TraceAnalyzer>
4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
4248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(analyzer.get());
4258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  analyzer->AssociateBeginEndEvents();
4268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  TraceEventVector found;
4288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  analyzer->FindEvents(
4298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      Query::MatchBeginWithEnd() &&
4308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      Query::EventDuration() > Query::Int(duration_cutoff_us) &&
4318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      (Query::EventCategory() == Query::String("cat1") ||
4328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)       Query::EventCategory() == Query::String("cat2") ||
4338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)       Query::EventCategory() == Query::String("cat3")),
4348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &found);
4358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_EQ(2u, found.size());
4368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
4378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_STREQ("name3", found[1]->name.c_str());
4388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Test that duration queries work.
4418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(TraceEventAnalyzerTest, CompleteDuration) {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::TimeDelta kSleepTime = base::TimeDelta::FromMilliseconds(200);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We will search for events that have a duration of greater than 90% of the
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sleep time, so that there is no flakiness.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int duration_cutoff_us = (kSleepTime.InMicroseconds() * 9) / 10;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT0("cat1", "name1"); // found by duration query
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT0("noise", "name2"); // not searched for, just noise
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TRACE_EVENT0("cat2", "name3"); // found by duration query
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // next event not searched for, just noise
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TRACE_EVENT_INSTANT0("noise", "name4", TRACE_EVENT_SCOPE_THREAD);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::debug::HighResSleepForTraceTest(kSleepTime);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TRACE_EVENT0("cat2", "name5"); // not found (duration too short)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->AssociateBeginEndEvents();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(
4708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      Query::EventCompleteDuration() > Query::Int(duration_cutoff_us) &&
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (Query::EventCategory() == Query::String("cat1") ||
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       Query::EventCategory() == Query::String("cat2") ||
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       Query::EventCategory() == Query::String("cat3")),
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &found);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, found.size());
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name1", found[0]->name.c_str());
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name3", found[1]->name.c_str());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test AssociateBeginEndEvents
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, BeginEndAssocations) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_END0("cat1", "name1"); // does not match out of order begin
4878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    TRACE_EVENT_BEGIN0("cat1", "name2");
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT0("cat1", "name3", TRACE_EVENT_SCOPE_THREAD);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_BEGIN0("cat1", "name1");
4908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    TRACE_EVENT_END0("cat1", "name2");
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->AssociateBeginEndEvents();
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::MatchBeginWithEnd(), &found);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, found.size());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("name2", found[0]->name.c_str());
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test MergeAssociatedEventArgs
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, MergeAssociatedEventArgs) {
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* arg_string = "arg_string";
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_BEGIN0("cat1", "name1");
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_END1("cat1", "name1", "arg", arg_string);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->AssociateBeginEndEvents();
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::MatchBeginName("name1"), &found);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, found.size());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string arg_actual;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(found[0]->GetArgAsString("arg", &arg_actual));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->MergeAssociatedEventArgs();
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(found[0]->GetArgAsString("arg", &arg_actual));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(arg_string, arg_actual.c_str());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test AssociateAsyncBeginEndEvents
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, AsyncBeginEndAssocations) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_END0("cat1", "name1", 0xA); // no match / out of order
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0("cat1", "name1", 0xB);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0("cat1", "name1", 0xC);
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT0("cat1", "name1", TRACE_EVENT_SCOPE_THREAD); // noise
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT0("cat1", "name1"); // noise
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_END0("cat1", "name1", 0xB);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_END0("cat1", "name1", 0xC);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0("cat1", "name1", 0xA); // no match / out of order
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->AssociateAsyncBeginEndEvents();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::MatchAsyncBeginWithNext(), &found);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, found.size());
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STRCASEEQ("0xb", found[0]->id.c_str());
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STRCASEEQ("0xc", found[1]->id.c_str());
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test AssociateAsyncBeginEndEvents
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, AsyncBeginEndAssocationsWithSteps) {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TRACE_EVENT_ASYNC_STEP_INTO0("c", "n", 0xA, "s1");
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_END0("c", "n", 0xA);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0("c", "n", 0xB);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0("c", "n", 0xC);
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TRACE_EVENT_ASYNC_STEP_PAST0("c", "n", 0xB, "s1");
5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TRACE_EVENT_ASYNC_STEP_INTO0("c", "n", 0xC, "s1");
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TRACE_EVENT_ASYNC_STEP_INTO1("c", "n", 0xC, "s2", "a", 1);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_END0("c", "n", 0xB);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_END0("c", "n", 0xC);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TRACE_EVENT_ASYNC_BEGIN0("c", "n", 0xA);
5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TRACE_EVENT_ASYNC_STEP_INTO0("c", "n", 0xA, "s2");
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->AssociateAsyncBeginEndEvents();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::MatchAsyncBeginWithNext(), &found);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, found.size());
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STRCASEEQ("0xb", found[0]->id.c_str());
5921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_STEP_PAST, found[0]->other_event->phase);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(found[0]->other_event->other_event);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_END,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            found[0]->other_event->other_event->phase);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STRCASEEQ("0xc", found[1]->id.c_str());
5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, found[1]->other_event->phase);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(found[1]->other_event->other_event);
6001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_STEP_INTO,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            found[1]->other_event->other_event->phase);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double arg_actual = 0;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(found[1]->other_event->other_event->GetArgAsNumber(
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "a", &arg_actual));
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0, arg_actual);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(found[1]->other_event->other_event->other_event);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_END,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            found[1]->other_event->other_event->other_event->phase);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STRCASEEQ("0xa", found[2]->id.c_str());
6111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, found[2]->other_event->phase);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the TraceAnalyzer custom associations work.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, CustomAssociations) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add events that begin/end in pipelined ordering with unique ID parameter
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to match up the begin/end pairs.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginTracing();
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // no begin match
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat1", "end", TRACE_EVENT_SCOPE_THREAD, "id", 1);
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // end is cat4
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat2", "begin", TRACE_EVENT_SCOPE_THREAD, "id", 2);
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // end is cat5
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat3", "begin", TRACE_EVENT_SCOPE_THREAD, "id", 3);
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat4", "end", TRACE_EVENT_SCOPE_THREAD, "id", 2);
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat5", "end", TRACE_EVENT_SCOPE_THREAD, "id", 3);
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // no end match
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TRACE_EVENT_INSTANT1("cat6", "begin", TRACE_EVENT_SCOPE_THREAD, "id", 1);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndTracing();
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer>
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      analyzer(TraceAnalyzer::Create(output_.json_output));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(analyzer.get());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // begin, end, and match queries to find proper begin/end pairs.
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query begin(Query::EventName() == Query::String("begin"));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query end(Query::EventName() == Query::String("end"));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query match(Query::EventArg("id") == Query::OtherArg("id"));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->AssociateEvents(begin, end, match);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector found;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cat1 has no other_event.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() == Query::String("cat1") &&
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::EventHasOther(), &found);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, found.size());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cat1 has no other_event.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() == Query::String("cat1") &&
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       !Query::EventHasOther(), &found);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cat6 has no other_event.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() == Query::String("cat6") &&
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       !Query::EventHasOther(), &found);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cat2 and cat4 are associated.
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() == Query::String("cat2") &&
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::OtherCategory() == Query::String("cat4"), &found);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cat4 and cat2 are not associated.
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() == Query::String("cat4") &&
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::OtherCategory() == Query::String("cat2"), &found);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, found.size());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cat3 and cat5 are associated.
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() == Query::String("cat3") &&
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::OtherCategory() == Query::String("cat5"), &found);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, found.size());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cat5 and cat3 are not associated.
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  analyzer->FindEvents(Query::EventCategory() == Query::String("cat5") &&
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::OtherCategory() == Query::String("cat3"), &found);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, found.size());
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that Query literals and types are properly casted.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, Literals) {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ManualSetUp();
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since these queries don't refer to the event data, the dummy event below
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will never be accessed.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEvent dummy;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char char_num = 5;
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  short short_num = -5;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Double(5.0) == Query::Int(char_num)).Evaluate(dummy));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Double(-5.0) == Query::Int(short_num)).Evaluate(dummy));
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Double(1.0) == Query::Uint(1u)).Evaluate(dummy));
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Double(1.0) == Query::Int(1)).Evaluate(dummy));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Double(-1.0) == Query::Int(-1)).Evaluate(dummy));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Double(1.0) == Query::Double(1.0f)).Evaluate(dummy));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Bool(true) == Query::Int(1)).Evaluate(dummy));
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Bool(false) == Query::Int(0)).Evaluate(dummy));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy));
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test GetRateStats.
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, RateStats) {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<TraceEvent> events;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events.reserve(100);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector event_ptrs;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEvent event;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.timestamp = 0.0;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double little_delta = 1.0;
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double big_delta = 10.0;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double tiny_delta = 0.1;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RateStats stats;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RateStatsOptions options;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert 10 events, each apart by little_delta.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 10; ++i) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.timestamp += little_delta;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    events.push_back(event);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event_ptrs.push_back(&events.back());
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetRateStats(event_ptrs, &stats, NULL));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.mean_us);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.min_us);
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.max_us);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, stats.standard_deviation_us);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an event apart by big_delta.
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.timestamp += big_delta;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events.push_back(event);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_ptrs.push_back(&events.back());
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetRateStats(event_ptrs, &stats, NULL));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(little_delta, stats.mean_us);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.min_us);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(big_delta, stats.max_us);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(0.0, stats.standard_deviation_us);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trim off the biggest delta and verify stats.
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.trim_min = 0;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.trim_max = 1;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options));
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.mean_us);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.min_us);
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.max_us);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, stats.standard_deviation_us);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an event apart by tiny_delta.
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.timestamp += tiny_delta;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events.push_back(event);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_ptrs.push_back(&events.back());
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trim off both the biggest and tiniest delta and verify stats.
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.trim_min = 1;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.trim_max = 1;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.mean_us);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.min_us);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(little_delta, stats.max_us);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, stats.standard_deviation_us);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify smallest allowed number of events.
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector few_event_ptrs;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  few_event_ptrs.push_back(&event);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  few_event_ptrs.push_back(&event);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, NULL));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  few_event_ptrs.push_back(&event);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetRateStats(few_event_ptrs, &stats, NULL));
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trim off more than allowed and verify failure.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.trim_min = 0;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.trim_max = 1;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, &options));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test FindFirstOf and FindLastOf.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, FindOf) {
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_events = 100;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t index = 0;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector event_ptrs;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 0, &index));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 10, &index));
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(true), 0, &index));
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(true), 10, &index));
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<TraceEvent> events;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events.resize(num_events);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < events.size(); ++i)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event_ptrs.push_back(&events[i]);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t bam_index = num_events/2;
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events[bam_index].name = "bam";
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query query_bam = Query::EventName() == Query::String(events[bam_index].name);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FindFirstOf
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(false), 0, &index));
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindFirstOf(event_ptrs, Query::Bool(true), 0, &index));
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, index);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindFirstOf(event_ptrs, Query::Bool(true), 5, &index));
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5u, index);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindFirstOf(event_ptrs, query_bam, bam_index + 1, &index));
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindFirstOf(event_ptrs, query_bam, 0, &index));
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bam_index, index);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindFirstOf(event_ptrs, query_bam, bam_index, &index));
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bam_index, index);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FindLastOf
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(false), 1000, &index));
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindLastOf(event_ptrs, Query::Bool(true), 1000, &index));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(num_events - 1, index);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindLastOf(event_ptrs, Query::Bool(true), num_events - 5,
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         &index));
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(num_events - 5, index);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindLastOf(event_ptrs, query_bam, bam_index - 1, &index));
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindLastOf(event_ptrs, query_bam, num_events, &index));
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bam_index, index);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindLastOf(event_ptrs, query_bam, bam_index, &index));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bam_index, index);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test FindClosest.
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, FindClosest) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t index_1 = 0;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t index_2 = 0;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector event_ptrs;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindClosest(event_ptrs, Query::Bool(true), 0,
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           &index_1, &index_2));
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_events = 5;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<TraceEvent> events;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events.resize(num_events);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < events.size(); ++i) {
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // timestamps go up exponentially so the lower index is always closer in
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // time than the higher index.
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    events[i].timestamp = static_cast<double>(i) * static_cast<double>(i);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event_ptrs.push_back(&events[i]);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events[0].name = "one";
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events[2].name = "two";
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events[4].name = "three";
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Query query_named = Query::EventName() != Query::String(std::string());
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query query_one = Query::EventName() == Query::String("one");
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only one event matches query_one, so two closest can't be found.
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindClosest(event_ptrs, query_one, 0, &index_1, &index_2));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindClosest(event_ptrs, query_one, 3, &index_1, NULL));
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, index_1);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindClosest(event_ptrs, query_named, 1, &index_1, &index_2));
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, index_1);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, index_2);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindClosest(event_ptrs, query_named, 4, &index_1, &index_2));
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, index_1);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, index_2);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindClosest(event_ptrs, query_named, 3, &index_1, &index_2));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, index_1);
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, index_2);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test CountMatches.
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TraceEventAnalyzerTest, CountMatches) {
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector event_ptrs;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, CountMatches(event_ptrs, Query::Bool(true), 0, 10));
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_events = 5;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_named = 3;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<TraceEvent> events;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events.resize(num_events);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < events.size(); ++i)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event_ptrs.push_back(&events[i]);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events[0].name = "one";
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events[2].name = "two";
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  events[4].name = "three";
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Query query_named = Query::EventName() != Query::String(std::string());
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query query_one = Query::EventName() == Query::String("one");
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, CountMatches(event_ptrs, Query::Bool(false)));
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(num_events, CountMatches(event_ptrs, Query::Bool(true)));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, Query::Bool(true),
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         1, num_events));
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, CountMatches(event_ptrs, query_one));
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, !query_one));
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(num_named, CountMatches(event_ptrs, query_named));
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace trace_analyzer
894