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

Side by Side Diff: test/unittests/tracing/trace-event-unittest.cc

Issue 988893003: Implement tracing interface for v8 (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Minor Created 5 years, 3 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 2015 the V8 project 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 #include "include/v8-tracing.h"
5 #include "src/list.h"
6 #include "src/list-inl.h"
7 #include "testing/gtest-support.h"
8
9 static uint64_t isolate_id = 42;
10 static uint64_t MockIsolateId() { return isolate_id; }
11 #define INTERNAL_GET_TRACE_CONTEXT_ID MockIsolateId
12 #include "src/tracing/trace-event.h"
13
14 #define GET_TRACE_OBJECTS_LIST mock_event_tracer->GetMockTraceObjects()
15
16 #define GET_TRACE_OBJECT(Index) GET_TRACE_OBJECTS_LIST->at(Index)
17
18 namespace v8 {
19 namespace internal {
20 namespace tracing {
21
22 struct MockTraceObject {
23 char phase;
24 const char* name;
25 uint64_t id;
26 uint64_t context_id;
27 uint64_t bind_id;
28 int numArgs;
29 unsigned int flags;
30 MockTraceObject(char phase, const char* name, uint64_t id,
31 uint64_t context_id, uint64_t bind_id, int numArgs, int flags)
32 : phase(phase),
33 name(name),
34 id(id),
35 context_id(context_id),
36 bind_id(bind_id),
37 numArgs(numArgs),
38 flags(flags) {}
39 };
40
41 typedef List<MockTraceObject*> MockTraceObjectList;
42
43 class MockEventTracer : public v8::EventTracer {
44 virtual v8::EventTracer::Handle AddTraceEvent(
45 char phase, const uint8_t* categoryEnabledFlag, const char* name,
46 uint64_t id, uint64_t context_id, uint64_t bind_id, int numArgs,
47 const char** argNames, const uint8_t* argTypes, const uint64_t* argValues,
48 unsigned int flags) {
49 MockTraceObject* to = new MockTraceObject(phase, name, id, context_id,
50 bind_id, numArgs, flags);
51 trace_object_list_.Add(to);
52 return 0;
53 }
54
55 virtual void UpdateTraceEventDuration(const uint8_t* categoryEnabledFlag,
56 const char* name,
57 EventTracer::Handle handle) {}
58
59 virtual const uint8_t* GetCategoryGroupEnabled(const char* name) {
60 if (strcmp(name, "v8-cat")) {
61 static uint8_t no = 0;
62 return &no;
63 } else {
64 static uint8_t yes = 0x7;
65 return &yes;
66 }
67 }
68
69 virtual const char* GetCategoryGroupName(const uint8_t* categoryEnabledFlag) {
70 static const char* dummy = "dummy";
71 return dummy;
72 }
73
74 MockTraceObjectList trace_object_list_;
75
76 public:
77 ~MockEventTracer() {
78 for (int i = 0; i < trace_object_list_.length(); ++i) {
79 delete trace_object_list_[i];
80 }
81 trace_object_list_.Clear();
82 }
83
84 MockTraceObjectList* GetMockTraceObjects() { return &trace_object_list_; }
85 };
86
87
88 TEST(TraceEvent, TraceEventDisabledCategory) {
89 MockEventTracer* mock_event_tracer = new MockEventTracer();
90 v8::EventTracer::SetInstance(mock_event_tracer);
91
92 // Disabled category, will not add events.
93 TRACE_EVENT_BEGIN0("cat", "e1");
94 TRACE_EVENT_END0("cat", "e1");
95 EXPECT_EQ(0, GET_TRACE_OBJECTS_LIST->length());
96 }
97
98
99 TEST(TraceEvent, TraceEventNoArgs) {
100 MockEventTracer* mock_event_tracer = new MockEventTracer();
101 v8::EventTracer::SetInstance(mock_event_tracer);
102
103 // Enabled category will add 2 events.
104 TRACE_EVENT_BEGIN0("v8-cat", "e1");
105 TRACE_EVENT_END0("v8-cat", "e1");
106
107 EXPECT_EQ(2, GET_TRACE_OBJECTS_LIST->length());
108 EXPECT_EQ('B', GET_TRACE_OBJECT(0)->phase);
109 EXPECT_EQ("e1", GET_TRACE_OBJECT(0)->name);
110 EXPECT_EQ(0, GET_TRACE_OBJECT(0)->numArgs);
111
112 EXPECT_EQ('E', GET_TRACE_OBJECT(1)->phase);
113 EXPECT_EQ("e1", GET_TRACE_OBJECT(1)->name);
114 EXPECT_EQ(0, GET_TRACE_OBJECT(1)->numArgs);
115 }
116
117
118 TEST(TraceEvent, TraceEventWithOneArg) {
119 MockEventTracer* mock_event_tracer = new MockEventTracer();
120 v8::EventTracer::SetInstance(mock_event_tracer);
121
122 TRACE_EVENT_BEGIN1("v8-cat", "e1", "arg1", 42);
123 TRACE_EVENT_END1("v8-cat", "e1", "arg1", 42);
124 TRACE_EVENT_BEGIN1("v8-cat", "e2", "arg1", "abc");
125 TRACE_EVENT_END1("v8-cat", "e2", "arg1", "abc");
126
127 EXPECT_EQ(4, GET_TRACE_OBJECTS_LIST->length());
128
129 EXPECT_EQ(1, GET_TRACE_OBJECT(0)->numArgs);
130 EXPECT_EQ(1, GET_TRACE_OBJECT(1)->numArgs);
131 EXPECT_EQ(1, GET_TRACE_OBJECT(2)->numArgs);
132 EXPECT_EQ(1, GET_TRACE_OBJECT(3)->numArgs);
133 }
134
135
136 TEST(TraceEvent, TraceEventWithTwoArgs) {
137 MockEventTracer* mock_event_tracer = new MockEventTracer();
138 v8::EventTracer::SetInstance(mock_event_tracer);
139
140 TRACE_EVENT_BEGIN2("v8-cat", "e1", "arg1", 42, "arg2", "abc");
141 TRACE_EVENT_END2("v8-cat", "e1", "arg1", 42, "arg2", "abc");
142 TRACE_EVENT_BEGIN2("v8-cat", "e2", "arg1", "abc", "arg2", 43);
143 TRACE_EVENT_END2("v8-cat", "e2", "arg1", "abc", "arg2", 43);
144
145 EXPECT_EQ(4, GET_TRACE_OBJECTS_LIST->length());
146
147 EXPECT_EQ(2, GET_TRACE_OBJECT(0)->numArgs);
148 EXPECT_EQ(2, GET_TRACE_OBJECT(1)->numArgs);
149 EXPECT_EQ(2, GET_TRACE_OBJECT(2)->numArgs);
150 EXPECT_EQ(2, GET_TRACE_OBJECT(3)->numArgs);
151 }
152
153
154 TEST(TraceEvent, ScopedTraceEvent) {
155 MockEventTracer* mock_event_tracer = new MockEventTracer();
156 v8::EventTracer::SetInstance(mock_event_tracer);
157
158 { TRACE_EVENT0("v8-cat", "e"); }
159
160 EXPECT_EQ(1, GET_TRACE_OBJECTS_LIST->length());
161 EXPECT_EQ(0, GET_TRACE_OBJECT(0)->numArgs);
162
163 { TRACE_EVENT1("v8-cat", "e1", "arg1", "abc"); }
164
165 EXPECT_EQ(2, GET_TRACE_OBJECTS_LIST->length());
166 EXPECT_EQ(1, GET_TRACE_OBJECT(1)->numArgs);
167
168 { TRACE_EVENT2("v8-cat", "e1", "arg1", "abc", "arg2", 42); }
169
170 EXPECT_EQ(3, GET_TRACE_OBJECTS_LIST->length());
171 EXPECT_EQ(2, GET_TRACE_OBJECT(2)->numArgs);
172 }
173
174
175 TEST(TraceEvent, TestMultipleIsolates) {
176 MockEventTracer* mock_event_tracer = new MockEventTracer();
177 v8::EventTracer::SetInstance(mock_event_tracer);
178
179 isolate_id = 42;
180 TRACE_EVENT_INSTANT0("v8-cat", "i1", TRACE_EVENT_SCOPE_THREAD);
181 isolate_id = 43;
182 TRACE_EVENT_INSTANT0("v8-cat", "i2", TRACE_EVENT_SCOPE_THREAD);
183
184 EXPECT_EQ(2, GET_TRACE_OBJECTS_LIST->length());
185 EXPECT_EQ(42, GET_TRACE_OBJECT(0)->context_id);
186 EXPECT_EQ(TRACE_EVENT_FLAG_HAS_CONTEXT_ID | TRACE_EVENT_SCOPE_THREAD,
187 GET_TRACE_OBJECT(0)->flags);
188 EXPECT_EQ(43, GET_TRACE_OBJECT(1)->context_id);
189 EXPECT_EQ(TRACE_EVENT_FLAG_HAS_CONTEXT_ID | TRACE_EVENT_SCOPE_THREAD,
190 GET_TRACE_OBJECT(1)->flags);
191 }
192
193
194 TEST(TraceEvent, TestEventWithFlow) {
195 MockEventTracer* mock_event_tracer = new MockEventTracer();
196 v8::EventTracer::SetInstance(mock_event_tracer);
197
198 static uint64_t bind_id = 21;
199 {
200 TRACE_EVENT_WITH_FLOW0("v8-cat", "f1", bind_id, TRACE_EVENT_FLAG_FLOW_OUT);
201 }
202 {
203 TRACE_EVENT_WITH_FLOW0(
204 "v8-cat", "f2", bind_id,
205 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
206 }
207 { TRACE_EVENT_WITH_FLOW0("v8-cat", "f3", bind_id, TRACE_EVENT_FLAG_FLOW_IN); }
208
209 EXPECT_EQ(3, GET_TRACE_OBJECTS_LIST->length());
210 EXPECT_EQ(bind_id, GET_TRACE_OBJECT(0)->bind_id);
211 EXPECT_EQ(TRACE_EVENT_FLAG_HAS_CONTEXT_ID | TRACE_EVENT_FLAG_FLOW_OUT,
212 GET_TRACE_OBJECT(0)->flags);
213 EXPECT_EQ(bind_id, GET_TRACE_OBJECT(1)->bind_id);
214 EXPECT_EQ(TRACE_EVENT_FLAG_HAS_CONTEXT_ID | TRACE_EVENT_FLAG_FLOW_IN |
215 TRACE_EVENT_FLAG_FLOW_OUT,
216 GET_TRACE_OBJECT(1)->flags);
217 EXPECT_EQ(bind_id, GET_TRACE_OBJECT(2)->bind_id);
218 EXPECT_EQ(TRACE_EVENT_FLAG_HAS_CONTEXT_ID | TRACE_EVENT_FLAG_FLOW_IN,
219 GET_TRACE_OBJECT(2)->flags);
220 }
221
222
223 TEST(TraceEvent, TestEventWithId) {
224 MockEventTracer* mock_event_tracer = new MockEventTracer();
225 v8::EventTracer::SetInstance(mock_event_tracer);
226
227 static uint64_t event_id = 21;
228 TRACE_EVENT_ASYNC_BEGIN0("v8-cat", "a1", event_id);
229 TRACE_EVENT_ASYNC_END0("v8-cat", "a1", event_id);
230
231 EXPECT_EQ(2, GET_TRACE_OBJECTS_LIST->length());
232 EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_BEGIN, GET_TRACE_OBJECT(0)->phase);
233 EXPECT_EQ(event_id, GET_TRACE_OBJECT(0)->id);
234 EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_END, GET_TRACE_OBJECT(1)->phase);
235 EXPECT_EQ(event_id, GET_TRACE_OBJECT(1)->id);
236 }
237
238 } // namespace tracing
239 } // namespace internal
240 } // namespace v8
241
242 #undef INTERNAL_GET_TRACE_CONTEXT_ID
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698