Line data Source code
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 <stdlib.h>
5 : #include <string.h>
6 :
7 : #include "src/v8.h"
8 :
9 : #include "test/cctest/cctest.h"
10 :
11 : #include "src/tracing/trace-event.h"
12 :
13 : #define GET_TRACE_OBJECTS_LIST platform.GetMockTraceObjects()
14 :
15 : #define GET_TRACE_OBJECT(Index) GET_TRACE_OBJECTS_LIST->at(Index)
16 :
17 :
18 : struct MockTraceObject {
19 : char phase;
20 : std::string name;
21 : uint64_t id;
22 : uint64_t bind_id;
23 : int num_args;
24 : unsigned int flags;
25 : MockTraceObject(char phase, std::string name, uint64_t id, uint64_t bind_id,
26 : int num_args, int flags)
27 : : phase(phase),
28 : name(name),
29 : id(id),
30 : bind_id(bind_id),
31 : num_args(num_args),
32 126 : flags(flags) {}
33 : };
34 :
35 : typedef std::vector<MockTraceObject*> MockTraceObjectList;
36 :
37 : class MockTracingController : public v8::TracingController {
38 : public:
39 48 : MockTracingController() = default;
40 48 : ~MockTracingController() {
41 348 : for (size_t i = 0; i < trace_object_list_.size(); ++i) {
42 426 : delete trace_object_list_[i];
43 : }
44 : trace_object_list_.clear();
45 48 : }
46 :
47 126 : uint64_t AddTraceEvent(
48 : char phase, const uint8_t* category_enabled_flag, const char* name,
49 : const char* scope, uint64_t id, uint64_t bind_id, int num_args,
50 : const char** arg_names, const uint8_t* arg_types,
51 : const uint64_t* arg_values,
52 : std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
53 : unsigned int flags) override {
54 : MockTraceObject* to = new MockTraceObject(phase, std::string(name), id,
55 378 : bind_id, num_args, flags);
56 126 : trace_object_list_.push_back(to);
57 126 : return 0;
58 : }
59 :
60 42 : void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
61 42 : const char* name, uint64_t handle) override {}
62 :
63 138 : const uint8_t* GetCategoryGroupEnabled(const char* name) override {
64 138 : if (strcmp(name, "v8-cat")) {
65 : static uint8_t no = 0;
66 : return &no;
67 : } else {
68 : static uint8_t yes = 0x7;
69 126 : return &yes;
70 : }
71 : }
72 :
73 : MockTraceObjectList* GetMockTraceObjects() { return &trace_object_list_; }
74 :
75 : private:
76 : MockTraceObjectList trace_object_list_;
77 :
78 : DISALLOW_COPY_AND_ASSIGN(MockTracingController);
79 : };
80 :
81 : class MockTracingPlatform : public TestPlatform {
82 : public:
83 96 : MockTracingPlatform() {
84 : // Now that it's completely constructed, make this the current platform.
85 48 : i::V8::SetPlatformForTesting(this);
86 48 : }
87 96 : virtual ~MockTracingPlatform() {}
88 :
89 306 : v8::TracingController* GetTracingController() override {
90 306 : return &tracing_controller_;
91 : }
92 :
93 : MockTraceObjectList* GetMockTraceObjects() {
94 : return tracing_controller_.GetMockTraceObjects();
95 : }
96 :
97 : private:
98 : MockTracingController tracing_controller_;
99 : };
100 :
101 :
102 23724 : TEST(TraceEventDisabledCategory) {
103 6 : MockTracingPlatform platform;
104 :
105 : // Disabled category, will not add events.
106 12 : TRACE_EVENT_BEGIN0("cat", "e1");
107 12 : TRACE_EVENT_END0("cat", "e1");
108 6 : CHECK(GET_TRACE_OBJECTS_LIST->empty());
109 6 : }
110 :
111 :
112 23724 : TEST(TraceEventNoArgs) {
113 6 : MockTracingPlatform platform;
114 :
115 : // Enabled category will add 2 events.
116 12 : TRACE_EVENT_BEGIN0("v8-cat", "e1");
117 12 : TRACE_EVENT_END0("v8-cat", "e1");
118 :
119 12 : CHECK_EQ(2, GET_TRACE_OBJECTS_LIST->size());
120 6 : CHECK_EQ('B', GET_TRACE_OBJECT(0)->phase);
121 12 : CHECK_EQ("e1", GET_TRACE_OBJECT(0)->name);
122 6 : CHECK_EQ(0, GET_TRACE_OBJECT(0)->num_args);
123 :
124 6 : CHECK_EQ('E', GET_TRACE_OBJECT(1)->phase);
125 12 : CHECK_EQ("e1", GET_TRACE_OBJECT(1)->name);
126 6 : CHECK_EQ(0, GET_TRACE_OBJECT(1)->num_args);
127 6 : }
128 :
129 :
130 23724 : TEST(TraceEventWithOneArg) {
131 6 : MockTracingPlatform platform;
132 :
133 18 : TRACE_EVENT_BEGIN1("v8-cat", "e1", "arg1", 42);
134 18 : TRACE_EVENT_END1("v8-cat", "e1", "arg1", 42);
135 12 : TRACE_EVENT_BEGIN1("v8-cat", "e2", "arg1", "abc");
136 12 : TRACE_EVENT_END1("v8-cat", "e2", "arg1", "abc");
137 :
138 12 : CHECK_EQ(4, GET_TRACE_OBJECTS_LIST->size());
139 :
140 6 : CHECK_EQ(1, GET_TRACE_OBJECT(0)->num_args);
141 6 : CHECK_EQ(1, GET_TRACE_OBJECT(1)->num_args);
142 6 : CHECK_EQ(1, GET_TRACE_OBJECT(2)->num_args);
143 6 : CHECK_EQ(1, GET_TRACE_OBJECT(3)->num_args);
144 6 : }
145 :
146 :
147 23724 : TEST(TraceEventWithTwoArgs) {
148 6 : MockTracingPlatform platform;
149 :
150 18 : TRACE_EVENT_BEGIN2("v8-cat", "e1", "arg1", 42, "arg2", "abc");
151 18 : TRACE_EVENT_END2("v8-cat", "e1", "arg1", 42, "arg2", "abc");
152 18 : TRACE_EVENT_BEGIN2("v8-cat", "e2", "arg1", "abc", "arg2", 43);
153 18 : TRACE_EVENT_END2("v8-cat", "e2", "arg1", "abc", "arg2", 43);
154 :
155 12 : CHECK_EQ(4, GET_TRACE_OBJECTS_LIST->size());
156 :
157 6 : CHECK_EQ(2, GET_TRACE_OBJECT(0)->num_args);
158 6 : CHECK_EQ(2, GET_TRACE_OBJECT(1)->num_args);
159 6 : CHECK_EQ(2, GET_TRACE_OBJECT(2)->num_args);
160 6 : CHECK_EQ(2, GET_TRACE_OBJECT(3)->num_args);
161 6 : }
162 :
163 :
164 23724 : TEST(ScopedTraceEvent) {
165 6 : MockTracingPlatform platform;
166 :
167 18 : { TRACE_EVENT0("v8-cat", "e"); }
168 :
169 12 : CHECK_EQ(1, GET_TRACE_OBJECTS_LIST->size());
170 6 : CHECK_EQ(0, GET_TRACE_OBJECT(0)->num_args);
171 :
172 18 : { TRACE_EVENT1("v8-cat", "e1", "arg1", "abc"); }
173 :
174 12 : CHECK_EQ(2, GET_TRACE_OBJECTS_LIST->size());
175 6 : CHECK_EQ(1, GET_TRACE_OBJECT(1)->num_args);
176 :
177 24 : { TRACE_EVENT2("v8-cat", "e1", "arg1", "abc", "arg2", 42); }
178 :
179 12 : CHECK_EQ(3, GET_TRACE_OBJECTS_LIST->size());
180 6 : CHECK_EQ(2, GET_TRACE_OBJECT(2)->num_args);
181 6 : }
182 :
183 :
184 23724 : TEST(TestEventWithFlow) {
185 6 : MockTracingPlatform platform;
186 :
187 : static uint64_t bind_id = 21;
188 : {
189 18 : TRACE_EVENT_WITH_FLOW0("v8-cat", "f1", bind_id, TRACE_EVENT_FLAG_FLOW_OUT);
190 : }
191 : {
192 12 : TRACE_EVENT_WITH_FLOW0(
193 : "v8-cat", "f2", bind_id,
194 6 : TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
195 : }
196 18 : { TRACE_EVENT_WITH_FLOW0("v8-cat", "f3", bind_id, TRACE_EVENT_FLAG_FLOW_IN); }
197 :
198 12 : CHECK_EQ(3, GET_TRACE_OBJECTS_LIST->size());
199 6 : CHECK_EQ(bind_id, GET_TRACE_OBJECT(0)->bind_id);
200 6 : CHECK_EQ(TRACE_EVENT_FLAG_FLOW_OUT, GET_TRACE_OBJECT(0)->flags);
201 6 : CHECK_EQ(bind_id, GET_TRACE_OBJECT(1)->bind_id);
202 6 : CHECK_EQ(TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
203 : GET_TRACE_OBJECT(1)->flags);
204 6 : CHECK_EQ(bind_id, GET_TRACE_OBJECT(2)->bind_id);
205 6 : CHECK_EQ(TRACE_EVENT_FLAG_FLOW_IN, GET_TRACE_OBJECT(2)->flags);
206 6 : }
207 :
208 :
209 23724 : TEST(TestEventWithId) {
210 6 : MockTracingPlatform platform;
211 :
212 : static uint64_t event_id = 21;
213 12 : TRACE_EVENT_ASYNC_BEGIN0("v8-cat", "a1", event_id);
214 12 : TRACE_EVENT_ASYNC_END0("v8-cat", "a1", event_id);
215 :
216 12 : CHECK_EQ(2, GET_TRACE_OBJECTS_LIST->size());
217 6 : CHECK_EQ(TRACE_EVENT_PHASE_ASYNC_BEGIN, GET_TRACE_OBJECT(0)->phase);
218 6 : CHECK_EQ(event_id, GET_TRACE_OBJECT(0)->id);
219 6 : CHECK_EQ(TRACE_EVENT_PHASE_ASYNC_END, GET_TRACE_OBJECT(1)->phase);
220 6 : CHECK_EQ(event_id, GET_TRACE_OBJECT(1)->id);
221 6 : }
222 :
223 23724 : TEST(TestEventInContext) {
224 6 : MockTracingPlatform platform;
225 :
226 : static uint64_t isolate_id = 0x20151021;
227 : {
228 54 : TRACE_EVENT_SCOPED_CONTEXT("v8-cat", "Isolate", isolate_id);
229 18 : TRACE_EVENT0("v8-cat", "e");
230 : }
231 :
232 12 : CHECK_EQ(3, GET_TRACE_OBJECTS_LIST->size());
233 6 : CHECK_EQ(TRACE_EVENT_PHASE_ENTER_CONTEXT, GET_TRACE_OBJECT(0)->phase);
234 12 : CHECK_EQ("Isolate", GET_TRACE_OBJECT(0)->name);
235 6 : CHECK_EQ(isolate_id, GET_TRACE_OBJECT(0)->id);
236 6 : CHECK_EQ(TRACE_EVENT_PHASE_COMPLETE, GET_TRACE_OBJECT(1)->phase);
237 12 : CHECK_EQ("e", GET_TRACE_OBJECT(1)->name);
238 6 : CHECK_EQ(TRACE_EVENT_PHASE_LEAVE_CONTEXT, GET_TRACE_OBJECT(2)->phase);
239 12 : CHECK_EQ("Isolate", GET_TRACE_OBJECT(2)->name);
240 6 : CHECK_EQ(isolate_id, GET_TRACE_OBJECT(2)->id);
241 71160 : }
|