OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/bind.h" |
| 6 #include "base/test/trace_event_analyzer.h" |
| 7 #include "testing/gmock/include/gmock/gmock.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 |
| 10 namespace trace_analyzer { |
| 11 |
| 12 namespace { |
| 13 |
| 14 class TraceEventAnalyzerTest : public testing::Test { |
| 15 public: |
| 16 void ManualSetUp(); |
| 17 void OnTraceDataCollected( |
| 18 scoped_refptr<base::debug::TraceLog::RefCountedString> json_events_str); |
| 19 |
| 20 std::string trace_string_; |
| 21 }; |
| 22 |
| 23 void TraceEventAnalyzerTest::ManualSetUp() { |
| 24 base::debug::TraceLog::Resurrect(); |
| 25 base::debug::TraceLog* tracelog = base::debug::TraceLog::GetInstance(); |
| 26 ASSERT_TRUE(tracelog); |
| 27 tracelog->SetOutputCallback( |
| 28 base::Bind(&TraceEventAnalyzerTest::OnTraceDataCollected, |
| 29 base::Unretained(this))); |
| 30 } |
| 31 |
| 32 void TraceEventAnalyzerTest::OnTraceDataCollected( |
| 33 scoped_refptr<base::debug::TraceLog::RefCountedString> json_events_str) { |
| 34 trace_string_ = json_events_str->data; |
| 35 } |
| 36 |
| 37 } // namespace |
| 38 |
| 39 // Test that the TraceAnalyzer works. |
| 40 TEST_F(TraceEventAnalyzerTest, TraceAnalyzerBasic) { |
| 41 using namespace trace_analyzer; |
| 42 ManualSetUp(); |
| 43 |
| 44 base::debug::TraceLog::GetInstance()->SetEnabled(true); |
| 45 { |
| 46 TRACE_EVENT_END0("cat3", "name7"); |
| 47 TRACE_EVENT2("cat1", "name1", "arg1", 1111, "arg2", "string1"); |
| 48 { |
| 49 TRACE_EVENT2("cat2", "name2", "arg1", 2222, "arg2", "string2"); |
| 50 TRACE_EVENT_INSTANT1("cat1", "name3", "arg1", 3333); |
| 51 base::PlatformThread::Sleep(200); |
| 52 TRACE_EVENT0("cat2", "name6"); |
| 53 } |
| 54 TRACE_EVENT_INSTANT1("cat2", "name4", "arg1", 4444); |
| 55 TRACE_EVENT_INSTANT1("cat2", "name5", "arg1", 1111); |
| 56 TRACE_EVENT_BEGIN0("cat3", "name7"); |
| 57 TRACE_EVENT_INSTANT2("cat4", "math1", "a", 10, "b", 5); |
| 58 TRACE_EVENT_INSTANT2("cat4", "math2", "a", 10, "b", 10); |
| 59 } |
| 60 base::debug::TraceLog::GetInstance()->SetEnabled(false); |
| 61 |
| 62 const TraceEvent* event = NULL; |
| 63 TraceAnalyzer* analyzer = TraceAnalyzer::Create(trace_string_); |
| 64 ASSERT_TRUE(!!analyzer); |
| 65 analyzer->AssociateBeginEndEvents(); |
| 66 |
| 67 TraceAnalyzer::TraceEventVector found; |
| 68 |
| 69 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat1", &found); |
| 70 EXPECT_EQ(3u, found.size()); |
| 71 |
| 72 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat1" && |
| 73 Query(EVENT_ARG, "arg1") == 1111, &found); |
| 74 ASSERT_EQ(1u, found.size()); |
| 75 EXPECT_STREQ("name1", found.front()->name.c_str()); |
| 76 |
| 77 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == 1111 || |
| 78 Query(EVENT_ARG, "arg1") == 2222, &found); |
| 79 EXPECT_EQ(3u, found.size()); |
| 80 |
| 81 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == 1111 && |
| 82 Query(EVENT_NAME) != "name1", &found); |
| 83 ASSERT_EQ(1u, found.size()); |
| 84 EXPECT_STREQ("name5", found.front()->name.c_str()); |
| 85 |
| 86 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == 1111 && |
| 87 !(Query(EVENT_NAME) != "name1"), &found); |
| 88 ASSERT_EQ(1u, found.size()); |
| 89 EXPECT_STREQ("name1", found.front()->name.c_str()); |
| 90 |
| 91 analyzer->FindEvents(Query::MatchBeginWithEnd() && |
| 92 Query(EVENT_DURATION) > 180000 && |
| 93 (Query(EVENT_CATEGORY) == "cat1" || |
| 94 Query(EVENT_CATEGORY) == "cat2" || |
| 95 Query(EVENT_CATEGORY) == "cat3"), &found); |
| 96 EXPECT_EQ(2u, found.size()); |
| 97 |
| 98 analyzer->FindEvents(Query(EVENT_ARG, "arg1") <= 3333, &found); |
| 99 EXPECT_EQ(4u, found.size()); |
| 100 |
| 101 analyzer->FindEvents(Query(EVENT_ARG, "arg1") >= 3333, &found); |
| 102 EXPECT_EQ(2u, found.size()); |
| 103 |
| 104 analyzer->FindEvents(Query(EVENT_HAS_ARG, "arg1"), &found); |
| 105 EXPECT_EQ(5u, found.size()); |
| 106 |
| 107 analyzer->FindEvents(Query(EVENT_ARG, "arg2") == "string1", &found); |
| 108 ASSERT_EQ(1u, found.size()); |
| 109 EXPECT_STREQ("name1", found.front()->name.c_str()); |
| 110 |
| 111 analyzer->FindEvents(Query(EVENT_ARG, "arg2") == Query::Pattern("string?"), |
| 112 &found); |
| 113 EXPECT_EQ(2u, found.size()); |
| 114 |
| 115 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::Pattern("cat?") && |
| 116 Query(EVENT_NAME) != Query::Pattern("*"), |
| 117 &found); |
| 118 EXPECT_EQ(0u, found.size()); |
| 119 |
| 120 analyzer->FindEvents(!Query(EVENT_HAS_OTHER) && |
| 121 Query(EVENT_CATEGORY) == "cat2", &found); |
| 122 EXPECT_EQ(2u, found.size()); |
| 123 |
| 124 event = analyzer->FindOneEvent(Query(OTHER_ARG, "arg1") == 1111); |
| 125 ASSERT_TRUE(event); |
| 126 EXPECT_STREQ("name1", event->name.c_str()); |
| 127 |
| 128 // Verify that matching END..BEGIN does not get associated. |
| 129 ASSERT_TRUE(!analyzer->FindOneEvent(Query::MatchBeginName("name7"))); |
| 130 |
| 131 ASSERT_TRUE(!analyzer->FindOneEvent(Query(EVENT_ARG, "arg1") < 1111)); |
| 132 |
| 133 // Verify that arithmetic operators function: |
| 134 |
| 135 analyzer->FindEvents(Query(EVENT_ARG, "a") + Query(EVENT_ARG, "b") == 20, |
| 136 &found); |
| 137 EXPECT_EQ(1u, found.size()); |
| 138 EXPECT_STREQ("math2", found.front()->name.c_str()); |
| 139 |
| 140 analyzer->FindEvents(Query(EVENT_ARG, "a") - Query(EVENT_ARG, "b") == 5, |
| 141 &found); |
| 142 EXPECT_EQ(1u, found.size()); |
| 143 EXPECT_STREQ("math1", found.front()->name.c_str()); |
| 144 |
| 145 analyzer->FindEvents(Query(EVENT_ARG, "a") * Query(EVENT_ARG, "b") == 50, |
| 146 &found); |
| 147 EXPECT_EQ(1u, found.size()); |
| 148 EXPECT_STREQ("math1", found.front()->name.c_str()); |
| 149 |
| 150 analyzer->FindEvents(Query(EVENT_ARG, "a") / Query(EVENT_ARG, "b") == 2, |
| 151 &found); |
| 152 EXPECT_EQ(1u, found.size()); |
| 153 EXPECT_STREQ("math1", found.front()->name.c_str()); |
| 154 |
| 155 analyzer->FindEvents(Query(EVENT_ARG, "a") % Query(EVENT_ARG, "b") == 0, |
| 156 &found); |
| 157 EXPECT_EQ(2u, found.size()); |
| 158 |
| 159 analyzer->FindEvents(-Query(EVENT_ARG, "b") == -10, &found); |
| 160 EXPECT_EQ(1u, found.size()); |
| 161 EXPECT_STREQ("math2", found.front()->name.c_str()); |
| 162 } |
| 163 |
| 164 // Test that the TraceAnalyzer custom associations work. |
| 165 TEST_F(TraceEventAnalyzerTest, TraceAnalyzerAssociations) { |
| 166 using namespace trace_analyzer; |
| 167 ManualSetUp(); |
| 168 |
| 169 base::debug::TraceLog::GetInstance()->SetEnabled(true); |
| 170 { |
| 171 TRACE_EVENT_INSTANT1("cat1", "end", "id", 1); |
| 172 TRACE_EVENT_INSTANT1("cat2", "begin", "id", 2); |
| 173 TRACE_EVENT_INSTANT1("cat3", "begin", "id", 3); |
| 174 TRACE_EVENT_INSTANT1("cat4", "end", "id", 2); |
| 175 TRACE_EVENT_INSTANT1("cat5", "end", "id", 3); |
| 176 TRACE_EVENT_INSTANT1("cat6", "begin", "id", 1); |
| 177 } |
| 178 base::debug::TraceLog::GetInstance()->SetEnabled(false); |
| 179 |
| 180 TraceAnalyzer* analyzer = TraceAnalyzer::Create(trace_string_); |
| 181 ASSERT_TRUE(!!analyzer); |
| 182 |
| 183 Query begin(Query(EVENT_NAME) == "begin"); |
| 184 Query end(Query(EVENT_NAME) == "end"); |
| 185 Query match(Query(EVENT_ARG, "id") == Query(OTHER_ARG, "id")); |
| 186 analyzer->AssociateEvents(begin, end, match); |
| 187 |
| 188 TraceAnalyzer::TraceEventVector found; |
| 189 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat1" && |
| 190 Query(EVENT_HAS_OTHER), &found); |
| 191 EXPECT_EQ(0u, found.size()); |
| 192 |
| 193 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat1" && |
| 194 !Query(EVENT_HAS_OTHER), &found); |
| 195 EXPECT_EQ(1u, found.size()); |
| 196 |
| 197 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat6" && |
| 198 !Query(EVENT_HAS_OTHER), &found); |
| 199 EXPECT_EQ(1u, found.size()); |
| 200 |
| 201 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat2" && |
| 202 Query(OTHER_CATEGORY) == "cat4", &found); |
| 203 EXPECT_EQ(1u, found.size()); |
| 204 |
| 205 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat4" && |
| 206 Query(OTHER_CATEGORY) == "cat2", &found); |
| 207 EXPECT_EQ(1u, found.size()); |
| 208 |
| 209 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat3" && |
| 210 Query(OTHER_CATEGORY) == "cat5", &found); |
| 211 EXPECT_EQ(1u, found.size()); |
| 212 |
| 213 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat5" && |
| 214 Query(OTHER_CATEGORY) == "cat3", &found); |
| 215 EXPECT_EQ(1u, found.size()); |
| 216 |
| 217 // Verify that literals and types are properly casted. |
| 218 |
| 219 // Since these queries don't refer to the event data, the dummy event below |
| 220 // will never be accessed. |
| 221 TraceEvent dummy; |
| 222 char char_num = 5; |
| 223 short short_num = -5; |
| 224 EXPECT_TRUE((Query(5.0) == char_num).Evaluate(dummy)); |
| 225 EXPECT_TRUE((Query(-5.0) == short_num).Evaluate(dummy)); |
| 226 EXPECT_TRUE((Query(1.0) == 1u).Evaluate(dummy)); |
| 227 EXPECT_TRUE((Query(1.0) == 1).Evaluate(dummy)); |
| 228 EXPECT_TRUE((Query(-1.0) == -1).Evaluate(dummy)); |
| 229 EXPECT_TRUE((Query(1.0) == 1.0f).Evaluate(dummy)); |
| 230 EXPECT_TRUE((Query(true) == 1).Evaluate(dummy)); |
| 231 EXPECT_TRUE((Query(false) == 0).Evaluate(dummy)); |
| 232 EXPECT_TRUE((Query(true) == 1.0f).Evaluate(dummy)); |
| 233 EXPECT_TRUE((Query(false) == 0.0f).Evaluate(dummy)); |
| 234 } |
| 235 |
| 236 |
| 237 } // namespace trace_analyzer |
| 238 |
OLD | NEW |