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, 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::debug::TraceOptions()); 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