Index: base/test/trace_event_analyzer_unittest.cc |
diff --git a/base/test/trace_event_analyzer_unittest.cc b/base/test/trace_event_analyzer_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2047b120b83f084345c648f8a577a2ec0b6a0605 |
--- /dev/null |
+++ b/base/test/trace_event_analyzer_unittest.cc |
@@ -0,0 +1,502 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/bind.h" |
+#include "base/test/trace_event_analyzer.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace trace_analyzer { |
+ |
+namespace { |
+ |
+class TraceEventAnalyzerTest : public testing::Test { |
+ public: |
+ void ManualSetUp(); |
+ void OnTraceDataCollected( |
+ scoped_refptr<base::debug::TraceLog::RefCountedString> json_events_str); |
+ void BeginTracing(); |
+ void EndTracing(); |
+ |
+ base::debug::TraceResultBuffer::SimpleOutput output_; |
+ base::debug::TraceResultBuffer buffer_; |
+}; |
+ |
+void TraceEventAnalyzerTest::ManualSetUp() { |
+ base::debug::TraceLog::Resurrect(); |
+ base::debug::TraceLog* tracelog = base::debug::TraceLog::GetInstance(); |
+ ASSERT_TRUE(tracelog); |
+ tracelog->SetOutputCallback( |
+ base::Bind(&TraceEventAnalyzerTest::OnTraceDataCollected, |
+ base::Unretained(this))); |
+ buffer_.SetOutputCallback(output_.GetCallback()); |
+ output_.json_output.clear(); |
+} |
+ |
+void TraceEventAnalyzerTest::OnTraceDataCollected( |
+ scoped_refptr<base::debug::TraceLog::RefCountedString> json_events_str) { |
+ buffer_.AddFragment(json_events_str->data); |
+} |
+ |
+void TraceEventAnalyzerTest::BeginTracing() { |
+ output_.json_output.clear(); |
+ buffer_.Start(); |
+ base::debug::TraceLog::GetInstance()->SetEnabled(true); |
+} |
+ |
+void TraceEventAnalyzerTest::EndTracing() { |
+ base::debug::TraceLog::GetInstance()->SetEnabled(false); |
+ buffer_.Finish(); |
+} |
+ |
+} // namespace |
+ |
+TEST_F(TraceEventAnalyzerTest, NoEvents) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ // Create an empty JSON event string: |
+ buffer_.Start(); |
+ buffer_.Finish(); |
+ |
+ scoped_ptr<TraceAnalyzer> |
+ analyzer(TraceAnalyzer::Create(output_.json_output)); |
+ ASSERT_TRUE(analyzer.get()); |
+ |
+ // Search for all events and verify that nothing is returned. |
+ TraceAnalyzer::TraceEventVector found; |
+ analyzer->FindEvents(Query::Bool(true), &found); |
+ EXPECT_EQ(0u, found.size()); |
+} |
+ |
+TEST_F(TraceEventAnalyzerTest, QueryEventMember) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ TraceEvent event; |
+ event.thread.process_id = 3; |
+ event.thread.thread_id = 4; |
+ event.timestamp = 1.5; |
+ event.phase = base::debug::TRACE_EVENT_PHASE_BEGIN; |
+ event.category = "category"; |
+ event.name = "name"; |
+ event.arg_numbers["num"] = 7.0; |
+ event.arg_strings["str"] = "the string"; |
+ |
+ // Other event with all different members: |
+ TraceEvent other; |
+ other.thread.process_id = 5; |
+ other.thread.thread_id = 6; |
+ other.timestamp = 2.5; |
+ other.phase = base::debug::TRACE_EVENT_PHASE_END; |
+ other.category = "category2"; |
+ other.name = "name2"; |
+ other.arg_numbers["num2"] = 8.0; |
+ other.arg_strings["str2"] = "the string 2"; |
+ |
+ event.other_event = &other; |
+ double duration; |
+ ASSERT_TRUE(event.GetAbsTimeToOtherEvent(&duration)); |
+ |
+ Query event_pid = (Query(EVENT_PID) == Query::Int(event.thread.process_id)); |
+ Query event_tid = (Query(EVENT_TID) == Query::Int(event.thread.thread_id)); |
+ Query event_time = (Query(EVENT_TIME) == Query::Double(event.timestamp)); |
+ Query event_duration = (Query(EVENT_DURATION) == Query::Double(duration)); |
+ Query event_phase = (Query(EVENT_PHASE) == Query::Phase(event.phase)); |
+ Query event_category = |
+ (Query(EVENT_CATEGORY) == Query::String(event.category)); |
+ Query event_name = (Query(EVENT_NAME) == Query::String(event.name)); |
+ Query event_has_arg1 = Query(EVENT_HAS_ARG, "num"); |
+ Query event_has_arg2 = Query(EVENT_HAS_ARG, "str"); |
+ Query event_arg1 = |
+ (Query(EVENT_ARG, "num") == Query::Double(event.arg_numbers["num"])); |
+ Query event_arg2 = |
+ (Query(EVENT_ARG, "str") == Query::String(event.arg_strings["str"])); |
+ Query event_has_other = Query(EVENT_HAS_OTHER); |
+ Query other_pid = (Query(OTHER_PID) == Query::Int(other.thread.process_id)); |
+ Query other_tid = (Query(OTHER_TID) == Query::Int(other.thread.thread_id)); |
+ Query other_time = (Query(OTHER_TIME) == Query::Double(other.timestamp)); |
+ Query other_phase = (Query(OTHER_PHASE) == Query::Phase(other.phase)); |
+ Query other_category = |
+ (Query(OTHER_CATEGORY) == Query::String(other.category)); |
+ Query other_name = (Query(OTHER_NAME) == Query::String(other.name)); |
+ Query other_has_arg1 = Query(OTHER_HAS_ARG, "num2"); |
+ Query other_has_arg2 = Query(OTHER_HAS_ARG, "str2"); |
+ Query other_arg1 = |
+ (Query(OTHER_ARG, "num2") == Query::Double(other.arg_numbers["num2"])); |
+ Query other_arg2 = |
+ (Query(OTHER_ARG, "str2") == Query::String(other.arg_strings["str2"])); |
+ |
+ EXPECT_TRUE(event_pid.Evaluate(event)); |
+ EXPECT_TRUE(event_tid.Evaluate(event)); |
+ EXPECT_TRUE(event_time.Evaluate(event)); |
+ EXPECT_TRUE(event_duration.Evaluate(event)); |
+ EXPECT_TRUE(event_phase.Evaluate(event)); |
+ EXPECT_TRUE(event_category.Evaluate(event)); |
+ EXPECT_TRUE(event_name.Evaluate(event)); |
+ EXPECT_TRUE(event_has_arg1.Evaluate(event)); |
+ EXPECT_TRUE(event_has_arg2.Evaluate(event)); |
+ EXPECT_TRUE(event_arg1.Evaluate(event)); |
+ EXPECT_TRUE(event_arg2.Evaluate(event)); |
+ EXPECT_TRUE(event_has_other.Evaluate(event)); |
+ EXPECT_TRUE(other_pid.Evaluate(event)); |
+ EXPECT_TRUE(other_tid.Evaluate(event)); |
+ EXPECT_TRUE(other_time.Evaluate(event)); |
+ EXPECT_TRUE(other_phase.Evaluate(event)); |
+ EXPECT_TRUE(other_category.Evaluate(event)); |
+ EXPECT_TRUE(other_name.Evaluate(event)); |
+ EXPECT_TRUE(other_has_arg1.Evaluate(event)); |
+ EXPECT_TRUE(other_has_arg2.Evaluate(event)); |
+ EXPECT_TRUE(other_arg1.Evaluate(event)); |
+ EXPECT_TRUE(other_arg2.Evaluate(event)); |
+ |
+ // Evaluate event queries against other to verify the queries fail when the |
+ // event members are wrong. |
+ EXPECT_FALSE(event_pid.Evaluate(other)); |
+ EXPECT_FALSE(event_tid.Evaluate(other)); |
+ EXPECT_FALSE(event_time.Evaluate(other)); |
+ EXPECT_FALSE(event_duration.Evaluate(other)); |
+ EXPECT_FALSE(event_phase.Evaluate(other)); |
+ EXPECT_FALSE(event_category.Evaluate(other)); |
+ EXPECT_FALSE(event_name.Evaluate(other)); |
+ EXPECT_FALSE(event_has_arg1.Evaluate(other)); |
+ EXPECT_FALSE(event_has_arg2.Evaluate(other)); |
+ EXPECT_FALSE(event_arg1.Evaluate(other)); |
+ EXPECT_FALSE(event_arg2.Evaluate(other)); |
+ EXPECT_FALSE(event_has_other.Evaluate(other)); |
+} |
+ |
+TEST_F(TraceEventAnalyzerTest, BooleanOperators) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ BeginTracing(); |
+ { |
+ TRACE_EVENT_INSTANT1("cat1", "name1", "num", 1); |
+ TRACE_EVENT_INSTANT1("cat1", "name2", "num", 2); |
+ TRACE_EVENT_INSTANT1("cat2", "name3", "num", 3); |
+ TRACE_EVENT_INSTANT1("cat2", "name4", "num", 4); |
+ } |
+ EndTracing(); |
+ |
+ scoped_ptr<TraceAnalyzer> |
+ analyzer(TraceAnalyzer::Create(output_.json_output)); |
+ ASSERT_TRUE(!!analyzer.get()); |
+ |
+ TraceAnalyzer::TraceEventVector found; |
+ |
+ // == |
+ |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1"), &found); |
+ ASSERT_EQ(2u, found.size()); |
+ EXPECT_STREQ("name1", found[0]->name.c_str()); |
+ EXPECT_STREQ("name2", found[1]->name.c_str()); |
+ |
+ analyzer->FindEvents(Query(EVENT_ARG, "num") == Query::Int(2), &found); |
+ ASSERT_EQ(1u, found.size()); |
+ EXPECT_STREQ("name2", found[0]->name.c_str()); |
+ |
+ // != |
+ |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) != Query::String("cat1"), &found); |
+ ASSERT_EQ(2u, found.size()); |
+ EXPECT_STREQ("name3", found[0]->name.c_str()); |
+ EXPECT_STREQ("name4", found[1]->name.c_str()); |
+ |
+ analyzer->FindEvents(Query(EVENT_ARG, "num") != Query::Int(2), &found); |
+ ASSERT_EQ(3u, found.size()); |
+ EXPECT_STREQ("name1", found[0]->name.c_str()); |
+ EXPECT_STREQ("name3", found[1]->name.c_str()); |
+ EXPECT_STREQ("name4", found[2]->name.c_str()); |
+ |
+ // < |
+ analyzer->FindEvents(Query(EVENT_ARG, "num") < Query::Int(2), &found); |
+ ASSERT_EQ(1u, found.size()); |
+ EXPECT_STREQ("name1", found[0]->name.c_str()); |
+ |
+ // <= |
+ analyzer->FindEvents(Query(EVENT_ARG, "num") <= Query::Int(2), &found); |
+ ASSERT_EQ(2u, found.size()); |
+ EXPECT_STREQ("name1", found[0]->name.c_str()); |
+ EXPECT_STREQ("name2", found[1]->name.c_str()); |
+ |
+ // > |
+ analyzer->FindEvents(Query(EVENT_ARG, "num") > Query::Int(3), &found); |
+ ASSERT_EQ(1u, found.size()); |
+ EXPECT_STREQ("name4", found[0]->name.c_str()); |
+ |
+ // >= |
+ analyzer->FindEvents(Query(EVENT_ARG, "num") >= Query::Int(4), &found); |
+ ASSERT_EQ(1u, found.size()); |
+ EXPECT_STREQ("name4", found[0]->name.c_str()); |
+ |
+ // && |
+ analyzer->FindEvents(Query(EVENT_NAME) != Query::String("name1") && |
+ Query(EVENT_ARG, "num") < Query::Int(3), &found); |
+ ASSERT_EQ(1u, found.size()); |
+ EXPECT_STREQ("name2", found[0]->name.c_str()); |
+ |
+ // || |
+ analyzer->FindEvents(Query(EVENT_NAME) == Query::String("name1") || |
+ Query(EVENT_ARG, "num") == Query::Int(3), &found); |
+ ASSERT_EQ(2u, found.size()); |
+ EXPECT_STREQ("name1", found[0]->name.c_str()); |
+ EXPECT_STREQ("name3", found[1]->name.c_str()); |
+ |
+ // ! |
+ analyzer->FindEvents(!(Query(EVENT_NAME) == Query::String("name1") || |
+ Query(EVENT_ARG, "num") == Query::Int(3)), &found); |
+ ASSERT_EQ(2u, found.size()); |
+ EXPECT_STREQ("name2", found[0]->name.c_str()); |
+ EXPECT_STREQ("name4", found[1]->name.c_str()); |
+} |
+ |
+TEST_F(TraceEventAnalyzerTest, ArithmeticOperators) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ BeginTracing(); |
+ { |
+ // These events are searched for: |
+ TRACE_EVENT_INSTANT2("cat1", "math1", "a", 10, "b", 5); |
+ TRACE_EVENT_INSTANT2("cat1", "math2", "a", 10, "b", 10); |
+ // Extra events that never match, for noise: |
+ TRACE_EVENT_INSTANT2("noise", "math3", "a", 1, "b", 3); |
+ TRACE_EVENT_INSTANT2("noise", "math4", "c", 10, "d", 5); |
+ } |
+ EndTracing(); |
+ |
+ scoped_ptr<TraceAnalyzer> |
+ analyzer(TraceAnalyzer::Create(output_.json_output)); |
+ ASSERT_TRUE(analyzer.get()); |
+ |
+ TraceAnalyzer::TraceEventVector found; |
+ |
+ // Verify that arithmetic operators function: |
+ |
+ // + |
+ analyzer->FindEvents(Query(EVENT_ARG, "a") + Query(EVENT_ARG, "b") == |
+ Query::Int(20), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ EXPECT_STREQ("math2", found.front()->name.c_str()); |
+ |
+ // - |
+ analyzer->FindEvents(Query(EVENT_ARG, "a") - Query(EVENT_ARG, "b") == |
+ Query::Int(5), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ EXPECT_STREQ("math1", found.front()->name.c_str()); |
+ |
+ // * |
+ analyzer->FindEvents(Query(EVENT_ARG, "a") * Query(EVENT_ARG, "b") == |
+ Query::Int(50), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ EXPECT_STREQ("math1", found.front()->name.c_str()); |
+ |
+ // / |
+ analyzer->FindEvents(Query(EVENT_ARG, "a") / Query(EVENT_ARG, "b") == |
+ Query::Int(2), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ EXPECT_STREQ("math1", found.front()->name.c_str()); |
+ |
+ // % |
+ analyzer->FindEvents(Query(EVENT_ARG, "a") % Query(EVENT_ARG, "b") == |
+ Query::Int(0), &found); |
+ EXPECT_EQ(2u, found.size()); |
+ |
+ // - (negate) |
+ analyzer->FindEvents(-Query(EVENT_ARG, "b") == Query::Int(-10), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ EXPECT_STREQ("math2", found.front()->name.c_str()); |
+} |
+ |
+TEST_F(TraceEventAnalyzerTest, StringPattern) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ BeginTracing(); |
+ { |
+ TRACE_EVENT_INSTANT0("cat1", "name1"); |
+ TRACE_EVENT_INSTANT0("cat1", "name2"); |
+ TRACE_EVENT_INSTANT0("cat1", "no match"); |
+ TRACE_EVENT_INSTANT0("cat1", "name3x"); |
+ } |
+ EndTracing(); |
+ |
+ scoped_ptr<TraceAnalyzer> |
+ analyzer(TraceAnalyzer::Create(output_.json_output)); |
+ ASSERT_TRUE(analyzer.get()); |
+ |
+ TraceAnalyzer::TraceEventVector found; |
+ |
+ analyzer->FindEvents(Query(EVENT_NAME) == Query::Pattern("name?"), &found); |
+ ASSERT_EQ(2u, found.size()); |
+ EXPECT_STREQ("name1", found[0]->name.c_str()); |
+ EXPECT_STREQ("name2", found[1]->name.c_str()); |
+ |
+ analyzer->FindEvents(Query(EVENT_NAME) == Query::Pattern("name*"), &found); |
+ ASSERT_EQ(3u, found.size()); |
+ EXPECT_STREQ("name1", found[0]->name.c_str()); |
+ EXPECT_STREQ("name2", found[1]->name.c_str()); |
+ EXPECT_STREQ("name3x", found[2]->name.c_str()); |
+ |
+ analyzer->FindEvents(Query(EVENT_NAME) != Query::Pattern("name*"), &found); |
+ ASSERT_EQ(1u, found.size()); |
+ EXPECT_STREQ("no match", found[0]->name.c_str()); |
+} |
+ |
+// Test that duration queries work. |
+TEST_F(TraceEventAnalyzerTest, Duration) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ int sleep_time_us = 200000; |
+ // We will search for events that have a duration of greater than 90% of the |
+ // sleep time, so that there is no flakiness. |
+ int duration_cutoff_us = (sleep_time_us * 9) / 10; |
+ |
+ BeginTracing(); |
+ { |
+ TRACE_EVENT0("cat1", "name1"); // found by duration query |
+ TRACE_EVENT0("noise", "name2"); // not searched for, just noise |
+ { |
+ TRACE_EVENT0("cat2", "name3"); // found by duration query |
+ TRACE_EVENT_INSTANT0("noise", "name4"); // not searched for, just noise |
+ base::PlatformThread::Sleep(sleep_time_us / 1000); |
+ TRACE_EVENT0("cat2", "name5"); // not found (duration too short) |
+ } |
+ } |
+ EndTracing(); |
+ |
+ scoped_ptr<TraceAnalyzer> |
+ analyzer(TraceAnalyzer::Create(output_.json_output)); |
+ ASSERT_TRUE(analyzer.get()); |
+ analyzer->AssociateBeginEndEvents(); |
+ |
+ TraceAnalyzer::TraceEventVector found; |
+ analyzer->FindEvents(Query::MatchBeginWithEnd() && |
+ Query(EVENT_DURATION) > Query::Int(duration_cutoff_us) && |
+ (Query(EVENT_CATEGORY) == Query::String("cat1") || |
+ Query(EVENT_CATEGORY) == Query::String("cat2") || |
+ Query(EVENT_CATEGORY) == Query::String("cat3")), &found); |
+ ASSERT_EQ(2u, found.size()); |
+ EXPECT_STREQ("name1", found[0]->name.c_str()); |
+ EXPECT_STREQ("name3", found[1]->name.c_str()); |
+} |
+ |
+// Test that arithmetic operators work. |
+TEST_F(TraceEventAnalyzerTest, BeginEndAssocations) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ BeginTracing(); |
+ { |
+ TRACE_EVENT_END0("cat1", "name1"); // does not match out of order begin |
+ TRACE_EVENT0("cat1", "name2"); |
+ TRACE_EVENT_INSTANT0("cat1", "name3"); |
+ TRACE_EVENT_BEGIN0("cat1", "name1"); |
+ } |
+ EndTracing(); |
+ |
+ scoped_ptr<TraceAnalyzer> |
+ analyzer(TraceAnalyzer::Create(output_.json_output)); |
+ ASSERT_TRUE(analyzer.get()); |
+ analyzer->AssociateBeginEndEvents(); |
+ |
+ TraceAnalyzer::TraceEventVector found; |
+ analyzer->FindEvents(Query::MatchBeginWithEnd(), &found); |
+ ASSERT_EQ(1u, found.size()); |
+ EXPECT_STREQ("name2", found[0]->name.c_str()); |
+} |
+ |
+// Test that the TraceAnalyzer custom associations work. |
+TEST_F(TraceEventAnalyzerTest, CustomAssociations) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ // Add events that begin/end in pipelined ordering with unique ID parameter |
+ // to match up the begin/end pairs. |
+ BeginTracing(); |
+ { |
+ TRACE_EVENT_INSTANT1("cat1", "end", "id", 1); // no begin match |
+ TRACE_EVENT_INSTANT1("cat2", "begin", "id", 2); // end is cat4 |
+ TRACE_EVENT_INSTANT1("cat3", "begin", "id", 3); // end is cat5 |
+ TRACE_EVENT_INSTANT1("cat4", "end", "id", 2); |
+ TRACE_EVENT_INSTANT1("cat5", "end", "id", 3); |
+ TRACE_EVENT_INSTANT1("cat6", "begin", "id", 1); // no end match |
+ } |
+ EndTracing(); |
+ |
+ scoped_ptr<TraceAnalyzer> |
+ analyzer(TraceAnalyzer::Create(output_.json_output)); |
+ ASSERT_TRUE(analyzer.get()); |
+ |
+ // begin, end, and match queries to find proper begin/end pairs. |
+ Query begin(Query(EVENT_NAME) == Query::String("begin")); |
+ Query end(Query(EVENT_NAME) == Query::String("end")); |
+ Query match(Query(EVENT_ARG, "id") == Query(OTHER_ARG, "id")); |
+ analyzer->AssociateEvents(begin, end, match); |
+ |
+ TraceAnalyzer::TraceEventVector found; |
+ |
+ // cat1 has no other_event. |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && |
+ Query(EVENT_HAS_OTHER), &found); |
+ EXPECT_EQ(0u, found.size()); |
+ |
+ // cat1 has no other_event. |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && |
+ !Query(EVENT_HAS_OTHER), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ |
+ // cat6 has no other_event. |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat6") && |
+ !Query(EVENT_HAS_OTHER), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ |
+ // cat2 and cat4 are a associated. |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat2") && |
+ Query(OTHER_CATEGORY) == Query::String("cat4"), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ |
+ // cat4 and cat2 are a associated. |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat4") && |
+ Query(OTHER_CATEGORY) == Query::String("cat2"), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ |
+ // cat3 and cat5 are a associated. |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat3") && |
+ Query(OTHER_CATEGORY) == Query::String("cat5"), &found); |
+ EXPECT_EQ(1u, found.size()); |
+ |
+ // cat5 and cat3 are a associated. |
+ analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat5") && |
+ Query(OTHER_CATEGORY) == Query::String("cat3"), &found); |
+ EXPECT_EQ(1u, found.size()); |
+} |
+ |
+// Verify that Query literals and types are properly casted. |
+TEST_F(TraceEventAnalyzerTest, Literals) { |
+ using namespace trace_analyzer; |
+ ManualSetUp(); |
+ |
+ // Since these queries don't refer to the event data, the dummy event below |
+ // will never be accessed. |
+ TraceEvent dummy; |
+ char char_num = 5; |
+ short short_num = -5; |
+ EXPECT_TRUE((Query::Double(5.0) == Query::Int(char_num)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Double(-5.0) == Query::Int(short_num)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Double(1.0) == Query::Uint(1u)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Double(1.0) == Query::Int(1)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Double(-1.0) == Query::Int(-1)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Double(1.0) == Query::Double(1.0f)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Bool(true) == Query::Int(1)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Bool(false) == Query::Int(0)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy)); |
+ EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy)); |
+} |
+ |
+ |
+} // namespace trace_analyzer |
+ |