Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Side by Side Diff: base/debug/blame_context_unittest.cc

Issue 1776673002: base: Add blame context (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Bring back the base. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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/debug/blame_context.h"
6
7 #include "base/json/json_writer.h"
8 #include "base/memory/ref_counted_memory.h"
9 #include "base/run_loop.h"
10 #include "base/test/trace_event_analyzer.h"
11 #include "base/trace_event/trace_buffer.h"
12 #include "base/trace_event/trace_event_argument.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace base {
16 namespace debug {
17 namespace {
18
19 const char kTestBlameCategory[] = "test";
20 const char kDisabledTestBlameCategory[] = "disabled-by-default-test";
21 const char kTestBlameName[] = "TestBlameContext";
22 const char kTestBlameScope[] = "TestBlameScope";
23
24 class TestBlameContext : public BlameContext {
25 public:
26 explicit TestBlameContext(int id)
27 : BlameContext(kTestBlameCategory, kTestBlameName, kTestBlameScope, id) {}
28
29 TestBlameContext(int id, const TestBlameContext& parent)
30 : BlameContext(kTestBlameCategory,
31 kTestBlameName,
32 kTestBlameScope,
33 id,
34 parent) {}
35
36 protected:
37 void AsValueInto(trace_event::TracedValue* state) override {
38 BlameContext::AsValueInto(state);
39 state->SetBoolean("crossStreams", false);
40 }
41 };
42
43 class DisabledTestBlameContext : public BlameContext {
44 public:
45 explicit DisabledTestBlameContext(int id)
46 : BlameContext(kDisabledTestBlameCategory,
47 kTestBlameName,
48 kTestBlameScope,
49 id) {}
50 };
51
52 void OnTraceDataCollected(Closure quit_closure,
53 trace_event::TraceResultBuffer* buffer,
54 const scoped_refptr<RefCountedString>& json,
55 bool has_more_events) {
56 buffer->AddFragment(json->data());
57 if (!has_more_events)
58 quit_closure.Run();
59 }
60
61 class BlameContextTest : public testing::Test {
62 public:
63 void StartTracing();
64 void StopTracing();
65 scoped_ptr<trace_analyzer::TraceAnalyzer> CreateTraceAnalyzer();
66 };
67
68 void BlameContextTest::StartTracing() {
69 trace_event::TraceLog::GetInstance()->SetEnabled(
70 trace_event::TraceConfig("*"), trace_event::TraceLog::RECORDING_MODE);
71 }
72
73 void BlameContextTest::StopTracing() {
74 trace_event::TraceLog::GetInstance()->SetDisabled();
75 }
76
77 scoped_ptr<trace_analyzer::TraceAnalyzer>
78 BlameContextTest::CreateTraceAnalyzer() {
79 trace_event::TraceResultBuffer buffer;
80 trace_event::TraceResultBuffer::SimpleOutput trace_output;
81 buffer.SetOutputCallback(trace_output.GetCallback());
82 RunLoop run_loop;
83 buffer.Start();
84 trace_event::TraceLog::GetInstance()->Flush(
85 Bind(&OnTraceDataCollected, run_loop.QuitClosure(), Unretained(&buffer)));
86 run_loop.Run();
87 buffer.Finish();
88
89 return make_scoped_ptr(
90 trace_analyzer::TraceAnalyzer::Create(trace_output.json_output));
91 }
92
93 TEST_F(BlameContextTest, EnterAndLeave) {
94 using trace_analyzer::Query;
95 StartTracing();
96 {
97 TestBlameContext blame_context(0x1234);
98 blame_context.Enter();
99 blame_context.Leave();
100 }
101 StopTracing();
102 scoped_ptr<trace_analyzer::TraceAnalyzer> analyzer = CreateTraceAnalyzer();
103
104 trace_analyzer::TraceEventVector events;
105 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) ||
106 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT);
107 analyzer->FindEvents(q, &events);
108
109 EXPECT_EQ(2u, events.size());
110 EXPECT_EQ(TRACE_EVENT_PHASE_ENTER_CONTEXT, events[0]->phase);
111 EXPECT_EQ(kTestBlameCategory, events[0]->category);
112 EXPECT_EQ(kTestBlameName, events[0]->name);
113 EXPECT_EQ("0x1234", events[0]->id);
114 EXPECT_EQ(TRACE_EVENT_PHASE_LEAVE_CONTEXT, events[1]->phase);
115 EXPECT_EQ(kTestBlameCategory, events[1]->category);
116 EXPECT_EQ(kTestBlameName, events[1]->name);
117 EXPECT_EQ("0x1234", events[1]->id);
118 }
119
120 TEST_F(BlameContextTest, DifferentCategories) {
121 // Ensure there is no cross talk between blame contexts from different
122 // categories.
123 using trace_analyzer::Query;
124 StartTracing();
125 {
126 TestBlameContext blame_context(0x1234);
127 DisabledTestBlameContext disabled_blame_context(0x5678);
128 blame_context.Enter();
129 blame_context.Leave();
130 disabled_blame_context.Enter();
131 disabled_blame_context.Leave();
132 }
133 StopTracing();
134 scoped_ptr<trace_analyzer::TraceAnalyzer> analyzer = CreateTraceAnalyzer();
135
136 trace_analyzer::TraceEventVector events;
137 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) ||
138 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT);
139 analyzer->FindEvents(q, &events);
140
141 // None of the events from the disabled-by-default category should show up.
142 EXPECT_EQ(2u, events.size());
143 EXPECT_EQ(TRACE_EVENT_PHASE_ENTER_CONTEXT, events[0]->phase);
144 EXPECT_EQ(kTestBlameCategory, events[0]->category);
145 EXPECT_EQ(kTestBlameName, events[0]->name);
146 EXPECT_EQ("0x1234", events[0]->id);
147 EXPECT_EQ(TRACE_EVENT_PHASE_LEAVE_CONTEXT, events[1]->phase);
148 EXPECT_EQ(kTestBlameCategory, events[1]->category);
149 EXPECT_EQ(kTestBlameName, events[1]->name);
150 EXPECT_EQ("0x1234", events[1]->id);
151 }
152
153 TEST_F(BlameContextTest, TakeSnapshot) {
154 using trace_analyzer::Query;
155 StartTracing();
156 {
157 TestBlameContext parent_blame_context(0x5678);
158 TestBlameContext blame_context(0x1234, parent_blame_context);
159 blame_context.TakeSnapshot();
160 }
161 StopTracing();
162 scoped_ptr<trace_analyzer::TraceAnalyzer> analyzer = CreateTraceAnalyzer();
163
164 trace_analyzer::TraceEventVector events;
165 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_SNAPSHOT_OBJECT);
166 analyzer->FindEvents(q, &events);
167
168 EXPECT_EQ(1u, events.size());
169 EXPECT_EQ(kTestBlameCategory, events[0]->category);
170 EXPECT_EQ(kTestBlameName, events[0]->name);
171 EXPECT_EQ("0x1234", events[0]->id);
172 EXPECT_TRUE(events[0]->HasArg("snapshot"));
173
174 const char kExpectedSnapshotJson[] =
175 "{"
176 "\"crossStreams\":false,"
177 "\"parent\":{"
178 "\"id_ref\":\"0x5678\","
179 "\"scope\":\"TestBlameScope\""
180 "}"
181 "}";
182
183 std::string snapshot_json;
184 JSONWriter::Write(*events[0]->GetKnownArgAsValue("snapshot"), &snapshot_json);
185 EXPECT_EQ(kExpectedSnapshotJson, snapshot_json);
186 }
187
188 } // namepace
189 } // namespace debug
190 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698