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

Side by Side Diff: test/cctest/libplatform/test-tracing.cc

Issue 2137013006: [Tracing] V8 Tracing Controller (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Start/StopTracing + TestTracingController Created 4 years, 5 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 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
5 #include "include/libplatform/v8-tracing.h"
6 #include "src/tracing/trace-event.h"
7 #include "test/cctest/cctest.h"
8
9 namespace v8 {
10 namespace platform {
11 namespace tracing {
12
13 const char* test_trace_config_str =
14 "{\"record_mode\":\"record-until-full\",\"enable_sampling\":1,\"enable_"
15 "systrace\":0,\"enable_argument_filter\":1,\"included_categories\":[\"v8."
16 "cpu_profile\",\"v8.cpu_profile.hires\"],\"excluded_categories\":[\"v8."
17 "runtime\"]}";
18
19 TEST(TestTraceConfigConstructor) {
20 LocalContext env;
21 TraceConfig* trace_config_from_JSON = TraceConfig::CreateTraceConfigFromJSON(
22 env->GetIsolate(), test_trace_config_str);
23 CHECK_EQ(trace_config_from_JSON->IsSamplingEnabled(), true);
24 CHECK_EQ(trace_config_from_JSON->IsSystraceEnabled(), false);
25 CHECK_EQ(trace_config_from_JSON->IsArgumentFilterEnabled(), true);
26 CHECK_EQ(trace_config_from_JSON->IsCategoryGroupEnabled("v8"), false);
27 CHECK_EQ(trace_config_from_JSON->IsCategoryGroupEnabled("v8.cpu_profile"),
28 true);
29 CHECK_EQ(
30 trace_config_from_JSON->IsCategoryGroupEnabled("v8.cpu_profile.hires"),
31 true);
32 CHECK_EQ(trace_config_from_JSON->IsCategoryGroupEnabled("v8.runtime"), false);
33 delete trace_config_from_JSON;
34
35 TraceConfig* trace_config_default = TraceConfig::CreateDefaultTraceConfig();
36 CHECK_EQ(trace_config_default->IsSamplingEnabled(), false);
37 CHECK_EQ(trace_config_default->IsSystraceEnabled(), false);
38 CHECK_EQ(trace_config_default->IsArgumentFilterEnabled(), false);
39 CHECK_EQ(trace_config_default->IsCategoryGroupEnabled("v8"), true);
40 CHECK_EQ(trace_config_default->IsCategoryGroupEnabled("v8.cpu_profile"),
41 false);
42 CHECK_EQ(trace_config_default->IsCategoryGroupEnabled("v8.cpu_profile.hires"),
43 false);
44 CHECK_EQ(trace_config_default->IsCategoryGroupEnabled("v8.runtime"), false);
45 delete trace_config_default;
46 }
47
48 TEST(TestTraceObject) {
49 TraceObject trace_object;
50 trace_object.Initialize('X', "Test.Trace", "v8-cat", 42, 123, 0, 0);
51 CHECK_EQ('X', trace_object.phase());
52 CHECK_EQ("Test.Trace", trace_object.name());
53 CHECK_EQ("v8-cat", trace_object.category_group());
54 CHECK_EQ(0, trace_object.duration());
55 CHECK_EQ(0, trace_object.cpu_duration());
56 }
57
58 class MockTraceWriter : public TraceWriter {
59 public:
60 void AppendTraceEvent(TraceObject* trace_event) override {
61 events_.push_back(trace_event->name());
62 }
63
64 void Flush() override {}
65
66 std::vector<std::string> events() { return events_; }
67
68 private:
69 std::vector<std::string> events_;
70 };
71
72 TEST(TestTraceBufferRingBuffer) {
73 MockTraceWriter* writer = new MockTraceWriter();
74 TraceBuffer* ring_buffer =
75 TraceBuffer::CreateTraceBufferRingBuffer(2, writer);
76
77 // We should be able to add kChunkSize * 2 + 1 trace events.
78 std::vector<uint64_t> handles(TraceBufferChunk::kChunkSize * 2 + 1);
79 for (size_t i = 0; i < handles.size(); ++i) {
80 TraceObject* trace_object = ring_buffer->AddTraceEvent(&handles[i]);
81 CHECK_NOT_NULL(trace_object);
82 std::string name = "Test.Trace" + std::to_string(i);
83 trace_object->Initialize('X', name, "v8-cat", 42, 123, 0, 0);
84 trace_object = ring_buffer->GetEventByHandle(handles[i]);
85 CHECK_NOT_NULL(trace_object);
86 CHECK_EQ('X', trace_object->phase());
87 CHECK_EQ(name, trace_object->name());
88 CHECK_EQ("v8-cat", trace_object->category_group());
89 }
90
91 // We should only be able to retrieve the last kChunkSize + 1.
92 for (size_t i = 0; i < TraceBufferChunk::kChunkSize; ++i) {
93 CHECK_NULL(ring_buffer->GetEventByHandle(handles[i]));
94 }
95
96 for (size_t i = TraceBufferChunk::kChunkSize; i < handles.size(); ++i) {
97 TraceObject* trace_object = ring_buffer->GetEventByHandle(handles[i]);
98 CHECK_NOT_NULL(trace_object);
99 // The object properties should be correct.
100 CHECK_EQ('X', trace_object->phase());
101 CHECK_EQ("Test.Trace" + std::to_string(i), trace_object->name());
102 CHECK_EQ("v8-cat", trace_object->category_group());
103 }
104
105 // Check Flush(), that the writer wrote the last kChunkSize 1 event names.
106 ring_buffer->Flush();
107 auto events = writer->events();
108 CHECK_EQ(TraceBufferChunk::kChunkSize + 1, events.size());
109 for (size_t i = TraceBufferChunk::kChunkSize; i < handles.size(); ++i) {
110 CHECK_EQ("Test.Trace" + std::to_string(i),
111 events[i - TraceBufferChunk::kChunkSize]);
112 }
113 delete ring_buffer;
114 }
115
116 TEST(TestJSONTraceWriter) {
117 std::ostringstream stream;
118 TraceWriter* writer = TraceWriter::CreateJSONTraceWriter(stream);
119 TraceObject trace_object;
120 trace_object.InitializeForTesting('X', "Test0", "v8-cat", 42, 123, 0, 0, 11,
121 22, 100, 50, 33, 44);
122 writer->AppendTraceEvent(&trace_object);
123 trace_object.InitializeForTesting('Y', "Test1", "v8-cat", 43, 456, 0, 0, 55,
124 66, 110, 55, 77, 88);
125 writer->AppendTraceEvent(&trace_object);
126 writer->Flush();
127 delete writer;
128
129 std::string trace_str = stream.str();
130 std::string expected_trace_str =
131 "{\"traceEvents\":[{\"pid\":11,\"tid\":22,\"ts\":100,\"tts\":50,"
132 "\"ph\":\"X\",\"cat\":\"v8-cat\",\"name\":\"Test0\",\"args\":{},"
133 "\"dur\":33,\"tdur\":44},{\"pid\":55,\"tid\":66,\"ts\":110,\"tts\":55,"
134 "\"ph\":\"Y\",\"cat\":\"v8-cat\",\"name\":\"Test1\",\"args\":{},\"dur\":"
135 "77,\"tdur\":88}]}";
136 CHECK_EQ(expected_trace_str, trace_str);
137 }
138
139 TEST(TestTracingController) {
140 v8::Platform* old_platform = i::V8::GetCurrentPlatform();
141 v8::Platform* default_platform = v8::platform::CreateDefaultPlatform();
142 i::V8::SetPlatformForTesting(default_platform);
143
144 TracingController tracing_controller;
145 platform::SetTracingController(default_platform, &tracing_controller);
146
147 MockTraceWriter* writer = new MockTraceWriter();
148 TraceBuffer* ring_buffer =
149 TraceBuffer::CreateTraceBufferRingBuffer(1, writer);
150 tracing_controller.Initialize(ring_buffer);
151 tracing_controller.StartTracing(TraceConfig::CreateDefaultTraceConfig());
152 TRACE_EVENT0("v8", "v8.Test");
153 // cat category is not included in default config
154 TRACE_EVENT0("cat", "v8.Test2");
155 TRACE_EVENT0("v8", "v8.Test3");
156 tracing_controller.StopTracing();
157
158 CHECK_EQ(2, writer->events().size());
159 CHECK_EQ("v8.Test", writer->events()[0]);
160 CHECK_EQ("v8.Test3", writer->events()[1]);
161
162 i::V8::SetPlatformForTesting(old_platform);
163 }
164
165 } // namespace tracing
166 } // namespace platform
167 } // namespace v8
OLDNEW
« src/libplatform/tracing/tracing-controller.cc ('K') | « test/cctest/cctest.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698