blob: 0b0fa8662eeb83656731fa3cd448379c632e1143 [file] [log] [blame]
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +01001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "src/trace_processor/export_json.h"
18
Primiano Tucci2c5488f2019-06-01 03:27:28 +010019#include "perfetto/ext/base/temp_file.h"
Eric Secklerc34c8fc2019-08-02 10:57:59 +010020#include "src/trace_processor/args_tracker.h"
21#include "src/trace_processor/trace_processor_context.h"
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +010022
Hector Dearmancdfd85b2019-05-31 16:49:14 +010023#include <gmock/gmock.h>
24#include <gtest/gtest.h>
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +010025
26#include <json/reader.h>
27#include <json/value.h>
28
Mikhail Khokhlovc8344972019-07-09 15:46:57 +010029#include <limits>
30
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +010031namespace perfetto {
32namespace trace_processor {
33namespace json {
34namespace {
35
36std::string ReadFile(FILE* input) {
37 fseek(input, 0, SEEK_SET);
38 const int kBufSize = 1000;
39 char buffer[kBufSize];
Lalit Magantid9983462019-05-09 18:10:09 +010040 size_t ret = fread(buffer, sizeof(char), kBufSize, input);
Primiano Tucci225a4e62019-06-06 11:13:57 +010041 EXPECT_GT(ret, 0u);
Lalit Magantid9983462019-05-09 18:10:09 +010042 return std::string(buffer, ret);
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +010043}
44
45TEST(ExportJsonTest, EmptyStorage) {
46 TraceStorage storage;
47
48 base::TempFile temp_file = base::TempFile::Create();
49 FILE* output = fopen(temp_file.path().c_str(), "w+");
50 int code = ExportJson(&storage, output);
51
52 EXPECT_EQ(code, kResultOk);
53
54 Json::Reader reader;
55 Json::Value result;
56
57 EXPECT_TRUE(reader.parse(ReadFile(output), result));
Primiano Tucci225a4e62019-06-06 11:13:57 +010058 EXPECT_EQ(result["traceEvents"].size(), 0u);
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +010059}
60
61TEST(ExportJsonTest, StorageWithOneSlice) {
62 const int64_t kTimestamp = 10000000;
63 const int64_t kDuration = 10000;
Mikhail Khokhlov7db04912019-07-18 16:11:11 +010064 const int64_t kThreadTimestamp = 20000000;
65 const int64_t kThreadDuration = 20000;
Eric Seckler77fb1d22019-07-31 17:02:51 +010066 const int64_t kThreadInstructionCount = 30000000;
67 const int64_t kThreadInstructionDelta = 30000;
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +010068 const int64_t kThreadID = 100;
69 const char* kCategory = "cat";
70 const char* kName = "name";
71
72 TraceStorage storage;
73 UniqueTid utid = storage.AddEmptyThread(kThreadID);
74 StringId cat_id = storage.InternString(base::StringView(kCategory));
75 StringId name_id = storage.InternString(base::StringView(kName));
76 storage.mutable_nestable_slices()->AddSlice(
77 kTimestamp, kDuration, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
Eric Seckler77fb1d22019-07-31 17:02:51 +010078 storage.mutable_thread_slices()->AddThreadSlice(
79 0, kThreadTimestamp, kThreadDuration, kThreadInstructionCount,
80 kThreadInstructionDelta);
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +010081
82 base::TempFile temp_file = base::TempFile::Create();
83 FILE* output = fopen(temp_file.path().c_str(), "w+");
84 int code = ExportJson(&storage, output);
85
86 EXPECT_EQ(code, kResultOk);
87
88 Json::Reader reader;
89 Json::Value result;
90 EXPECT_TRUE(reader.parse(ReadFile(output), result));
Primiano Tucci225a4e62019-06-06 11:13:57 +010091 EXPECT_EQ(result["traceEvents"].size(), 1u);
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +010092
93 Json::Value event = result["traceEvents"][0];
94 EXPECT_EQ(event["ph"].asString(), "X");
95 EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000);
96 EXPECT_EQ(event["dur"].asInt64(), kDuration / 1000);
Mikhail Khokhlov7db04912019-07-18 16:11:11 +010097 EXPECT_EQ(event["tts"].asInt64(), kThreadTimestamp / 1000);
98 EXPECT_EQ(event["tdur"].asInt64(), kThreadDuration / 1000);
Eric Seckler77fb1d22019-07-31 17:02:51 +010099 EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount);
100 EXPECT_EQ(event["tidelta"].asInt64(), kThreadInstructionDelta);
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +0100101 EXPECT_EQ(event["tid"].asUInt(), kThreadID);
102 EXPECT_EQ(event["cat"].asString(), kCategory);
103 EXPECT_EQ(event["name"].asString(), kName);
Eric Seckler206db472019-07-25 12:05:27 +0100104 EXPECT_FALSE(event.isMember("args"));
105}
106TEST(ExportJsonTest, StorageWithOneUnfinishedSlice) {
107 const int64_t kTimestamp = 10000000;
108 const int64_t kDuration = -1;
109 const int64_t kThreadTimestamp = 20000000;
110 const int64_t kThreadDuration = -1;
Eric Seckler77fb1d22019-07-31 17:02:51 +0100111 const int64_t kThreadInstructionCount = 30000000;
112 const int64_t kThreadInstructionDelta = -1;
Eric Seckler206db472019-07-25 12:05:27 +0100113 const int64_t kThreadID = 100;
114 const char* kCategory = "cat";
115 const char* kName = "name";
116
117 TraceStorage storage;
118 UniqueTid utid = storage.AddEmptyThread(kThreadID);
119 StringId cat_id = storage.InternString(base::StringView(kCategory));
120 StringId name_id = storage.InternString(base::StringView(kName));
121 storage.mutable_nestable_slices()->AddSlice(
122 kTimestamp, kDuration, utid, RefType::kRefUtid, cat_id, name_id, 0, 0, 0);
Eric Seckler77fb1d22019-07-31 17:02:51 +0100123 storage.mutable_thread_slices()->AddThreadSlice(
124 0, kThreadTimestamp, kThreadDuration, kThreadInstructionCount,
125 kThreadInstructionDelta);
Eric Seckler206db472019-07-25 12:05:27 +0100126
127 base::TempFile temp_file = base::TempFile::Create();
128 FILE* output = fopen(temp_file.path().c_str(), "w+");
129 int code = ExportJson(&storage, output);
130
131 EXPECT_EQ(code, kResultOk);
132
133 Json::Reader reader;
134 Json::Value result;
135 EXPECT_TRUE(reader.parse(ReadFile(output), result));
136 EXPECT_EQ(result["traceEvents"].size(), 1u);
137
138 Json::Value event = result["traceEvents"][0];
139 EXPECT_EQ(event["ph"].asString(), "B");
140 EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000);
141 EXPECT_FALSE(event.isMember("dur"));
142 EXPECT_EQ(event["tts"].asInt64(), kThreadTimestamp / 1000);
143 EXPECT_FALSE(event.isMember("tdur"));
Eric Seckler77fb1d22019-07-31 17:02:51 +0100144 EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount);
145 EXPECT_FALSE(event.isMember("tidelta"));
Eric Seckler206db472019-07-25 12:05:27 +0100146 EXPECT_EQ(event["tid"].asUInt(), kThreadID);
147 EXPECT_EQ(event["cat"].asString(), kCategory);
148 EXPECT_EQ(event["name"].asString(), kName);
149 EXPECT_FALSE(event.isMember("args"));
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +0100150}
151
152TEST(ExportJsonTest, StorageWithThreadName) {
153 const int64_t kThreadID = 100;
154 const char* kName = "thread";
155
156 TraceStorage storage;
157 UniqueTid utid = storage.AddEmptyThread(kThreadID);
158 StringId name_id = storage.InternString(base::StringView(kName));
159 storage.GetMutableThread(utid)->name_id = name_id;
160
161 base::TempFile temp_file = base::TempFile::Create();
162 FILE* output = fopen(temp_file.path().c_str(), "w+");
163 int code = ExportJson(&storage, output);
164
165 EXPECT_EQ(code, kResultOk);
166
167 Json::Reader reader;
168 Json::Value result;
169 EXPECT_TRUE(reader.parse(ReadFile(output), result));
Primiano Tucci225a4e62019-06-06 11:13:57 +0100170 EXPECT_EQ(result["traceEvents"].size(), 1u);
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +0100171
172 Json::Value event = result["traceEvents"][0];
173 EXPECT_EQ(event["ph"].asString(), "M");
174 EXPECT_EQ(event["tid"].asUInt(), kThreadID);
175 EXPECT_EQ(event["name"].asString(), "thread_name");
176 EXPECT_EQ(event["args"]["name"].asString(), kName);
177}
178
179TEST(ExportJsonTest, WrongRefType) {
180 TraceStorage storage;
Mikhail Khokhlova09872d2019-07-19 10:27:49 +0100181 StringId cat_id = storage.InternString("cat");
182 StringId name_id = storage.InternString("name");
183 storage.mutable_nestable_slices()->AddSlice(0, 0, 0, RefType::kRefCpuId,
184 cat_id, name_id, 0, 0, 0);
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +0100185
186 base::TempFile temp_file = base::TempFile::Create();
187 FILE* output = fopen(temp_file.path().c_str(), "w+");
188 int code = ExportJson(&storage, output);
189
190 EXPECT_EQ(code, kResultWrongRefType);
191}
192
Mikhail Khokhlovdb84f102019-05-24 15:25:47 +0100193TEST(ExportJsonTest, StorageWithMetadata) {
194 const char* kDescription = "description";
195 const char* kBenchmarkName = "benchmark name";
196 const char* kStoryName = "story name";
197 const char* kStoryTag1 = "tag1";
198 const char* kStoryTag2 = "tag2";
199 const int64_t kBenchmarkStart = 1000000;
200 const int64_t kStoryStart = 2000000;
201 const bool kHadFailures = true;
202
203 TraceStorage storage;
204
205 StringId desc_id = storage.InternString(base::StringView(kDescription));
206 Variadic description = Variadic::String(desc_id);
207 storage.SetMetadata(metadata::benchmark_description, description);
208
209 StringId benchmark_name_id =
210 storage.InternString(base::StringView(kBenchmarkName));
211 Variadic benchmark_name = Variadic::String(benchmark_name_id);
212 storage.SetMetadata(metadata::benchmark_name, benchmark_name);
213
214 StringId story_name_id = storage.InternString(base::StringView(kStoryName));
215 Variadic story_name = Variadic::String(story_name_id);
216 storage.SetMetadata(metadata::benchmark_story_name, story_name);
217
218 StringId tag1_id = storage.InternString(base::StringView(kStoryTag1));
219 StringId tag2_id = storage.InternString(base::StringView(kStoryTag2));
220 Variadic tag1 = Variadic::String(tag1_id);
221 Variadic tag2 = Variadic::String(tag2_id);
222 storage.AppendMetadata(metadata::benchmark_story_tags, tag1);
223 storage.AppendMetadata(metadata::benchmark_story_tags, tag2);
224
225 Variadic benchmark_start = Variadic::Integer(kBenchmarkStart);
226 storage.SetMetadata(metadata::benchmark_start_time_us, benchmark_start);
227
228 Variadic story_start = Variadic::Integer(kStoryStart);
229 storage.SetMetadata(metadata::benchmark_story_run_time_us, story_start);
230
231 Variadic had_failures = Variadic::Integer(kHadFailures);
232 storage.SetMetadata(metadata::benchmark_had_failures, had_failures);
233
234 base::TempFile temp_file = base::TempFile::Create();
235 FILE* output = fopen(temp_file.path().c_str(), "w+");
236 int code = ExportJson(&storage, output);
237
238 EXPECT_EQ(code, kResultOk);
239
240 Json::Reader reader;
241 Json::Value result;
242
243 EXPECT_TRUE(reader.parse(ReadFile(output), result));
244 EXPECT_TRUE(result.isMember("metadata"));
245 EXPECT_TRUE(result["metadata"].isMember("telemetry"));
246 Json::Value telemetry_metadata = result["metadata"]["telemetry"];
247
Primiano Tucci225a4e62019-06-06 11:13:57 +0100248 EXPECT_EQ(telemetry_metadata["benchmarkDescriptions"].size(), 1u);
Mikhail Khokhlovdb84f102019-05-24 15:25:47 +0100249 EXPECT_EQ(telemetry_metadata["benchmarkDescriptions"][0].asString(),
250 kDescription);
251
Primiano Tucci225a4e62019-06-06 11:13:57 +0100252 EXPECT_EQ(telemetry_metadata["benchmarks"].size(), 1u);
Mikhail Khokhlovdb84f102019-05-24 15:25:47 +0100253 EXPECT_EQ(telemetry_metadata["benchmarks"][0].asString(), kBenchmarkName);
254
Primiano Tucci225a4e62019-06-06 11:13:57 +0100255 EXPECT_EQ(telemetry_metadata["stories"].size(), 1u);
Mikhail Khokhlovdb84f102019-05-24 15:25:47 +0100256 EXPECT_EQ(telemetry_metadata["stories"][0].asString(), kStoryName);
257
Primiano Tucci225a4e62019-06-06 11:13:57 +0100258 EXPECT_EQ(telemetry_metadata["storyTags"].size(), 2u);
Mikhail Khokhlovdb84f102019-05-24 15:25:47 +0100259 EXPECT_EQ(telemetry_metadata["storyTags"][0].asString(), kStoryTag1);
260 EXPECT_EQ(telemetry_metadata["storyTags"][1].asString(), kStoryTag2);
261
262 EXPECT_EQ(telemetry_metadata["benchmarkStart"].asInt(),
263 kBenchmarkStart / 1000.0);
264
265 EXPECT_EQ(telemetry_metadata["traceStart"].asInt(), kStoryStart / 1000.0);
266
Primiano Tucci225a4e62019-06-06 11:13:57 +0100267 EXPECT_EQ(telemetry_metadata["hadFailures"].size(), 1u);
Mikhail Khokhlovdb84f102019-05-24 15:25:47 +0100268 EXPECT_EQ(telemetry_metadata["hadFailures"][0].asBool(), kHadFailures);
269}
270
Mikhail Khokhlova6f97242019-08-08 13:48:31 +0100271TEST(ExportJsonTest, StorageWithStats) {
272 int64_t kProducers = 10;
273 int64_t kBufferSize0 = 1000;
274 int64_t kBufferSize1 = 2000;
275
276 TraceStorage storage;
277
278 storage.SetStats(stats::traced_producers_connected, kProducers);
279 storage.SetIndexedStats(stats::traced_buf_buffer_size, 0, kBufferSize0);
280 storage.SetIndexedStats(stats::traced_buf_buffer_size, 1, kBufferSize1);
281
282 base::TempFile temp_file = base::TempFile::Create();
283 FILE* output = fopen(temp_file.path().c_str(), "w+");
284 int code = ExportJson(&storage, output);
Mikhail Khokhlova6f97242019-08-08 13:48:31 +0100285 EXPECT_EQ(code, kResultOk);
286
287 Json::Reader reader;
288 Json::Value result;
289
290 EXPECT_TRUE(reader.parse(ReadFile(output), result));
291 EXPECT_TRUE(result.isMember("metadata"));
292 EXPECT_TRUE(result["metadata"].isMember("perfetto_trace_stats"));
293 Json::Value stats = result["metadata"]["perfetto_trace_stats"];
294
295 EXPECT_EQ(stats["producers_connected"].asInt(), kProducers);
296 EXPECT_EQ(stats["buffer_stats"].size(), 2u);
297 EXPECT_EQ(stats["buffer_stats"][0]["buffer_size"].asInt(), kBufferSize0);
298 EXPECT_EQ(stats["buffer_stats"][1]["buffer_size"].asInt(), kBufferSize1);
299}
300
Mikhail Khokhlov8fefc5b2019-08-08 17:53:53 +0100301TEST(ExportJsonTest, StorageWithChromeMetadata) {
302 const char* kName1 = "name1";
303 const char* kName2 = "name2";
304 const char* kValue1 = "value1";
305 const int kValue2 = 222;
306
307 TraceProcessorContext context;
308 context.storage.reset(new TraceStorage());
309 TraceStorage* storage = context.storage.get();
310 ArgsTracker args(&context);
311
312 RowId row_id = storage->mutable_raw_events()->AddRawEvent(
313 0, storage->InternString("chrome_event.metadata"), 0, 0);
314
315 StringId name1_id = storage->InternString(base::StringView(kName1));
316 StringId name2_id = storage->InternString(base::StringView(kName2));
317 StringId value1_id = storage->InternString(base::StringView(kValue1));
318 args.AddArg(row_id, name1_id, name1_id, Variadic::String(value1_id));
319 args.AddArg(row_id, name2_id, name2_id, Variadic::Integer(kValue2));
320 args.Flush();
321
322 base::TempFile temp_file = base::TempFile::Create();
323 FILE* output = fopen(temp_file.path().c_str(), "w+");
324 int code = ExportJson(storage, output);
325 EXPECT_EQ(code, kResultOk);
326
327 Json::Reader reader;
328 Json::Value result;
329
330 EXPECT_TRUE(reader.parse(ReadFile(output), result));
331 EXPECT_TRUE(result.isMember("metadata"));
332 Json::Value metadata = result["metadata"];
333
334 EXPECT_EQ(metadata[kName1].asString(), kValue1);
335 EXPECT_EQ(metadata[kName2].asInt(), kValue2);
336}
337
Mikhail Khokhlovc8344972019-07-09 15:46:57 +0100338TEST(ExportJsonTest, StorageWithArgs) {
339 const char* kCategory = "cat";
340 const char* kName = "name";
341 const char* kSrc = "source_file.cc";
342
343 TraceStorage storage;
344 UniqueTid utid = storage.AddEmptyThread(0);
345 StringId cat_id = storage.InternString(base::StringView(kCategory));
346 StringId name_id = storage.InternString(base::StringView(kName));
347 storage.mutable_nestable_slices()->AddSlice(0, 0, utid, RefType::kRefUtid,
348 cat_id, name_id, 0, 0, 0);
349
350 StringId arg_key_id =
351 storage.InternString(base::StringView("task.posted_from.file_name"));
352 StringId arg_value_id = storage.InternString(base::StringView(kSrc));
353 TraceStorage::Args::Arg arg;
354 arg.flat_key = arg_key_id;
355 arg.key = arg_key_id;
356 arg.value = Variadic::String(arg_value_id);
357 storage.mutable_args()->AddArgSet({arg}, 0, 1);
358 storage.mutable_nestable_slices()->set_arg_set_id(0, 1);
359
360 base::TempFile temp_file = base::TempFile::Create();
361 FILE* output = fopen(temp_file.path().c_str(), "w+");
362 int code = ExportJson(&storage, output);
363
364 EXPECT_EQ(code, kResultOk);
365
366 Json::Reader reader;
367 Json::Value result;
368 EXPECT_TRUE(reader.parse(ReadFile(output), result));
369 EXPECT_EQ(result["traceEvents"].size(), 1u);
370
371 Json::Value event = result["traceEvents"][0];
372 EXPECT_EQ(event["cat"].asString(), kCategory);
373 EXPECT_EQ(event["name"].asString(), kName);
374 EXPECT_EQ(event["args"]["src"].asString(), kSrc);
375}
376
377TEST(ExportJsonTest, StorageWithListArgs) {
378 const char* kCategory = "cat";
379 const char* kName = "name";
380 double kValues[] = {1.234, 2.345};
381
382 TraceStorage storage;
383 UniqueTid utid = storage.AddEmptyThread(0);
384 StringId cat_id = storage.InternString(base::StringView(kCategory));
385 StringId name_id = storage.InternString(base::StringView(kName));
386 storage.mutable_nestable_slices()->AddSlice(0, 0, utid, RefType::kRefUtid,
387 cat_id, name_id, 0, 0, 0);
388
389 StringId arg_flat_key_id =
390 storage.InternString(base::StringView("debug.draw_duration_ms"));
391 StringId arg_key0_id =
392 storage.InternString(base::StringView("debug.draw_duration_ms[0]"));
393 StringId arg_key1_id =
394 storage.InternString(base::StringView("debug.draw_duration_ms[1]"));
395 TraceStorage::Args::Arg arg0;
396 arg0.flat_key = arg_flat_key_id;
397 arg0.key = arg_key0_id;
398 arg0.value = Variadic::Real(kValues[0]);
399 TraceStorage::Args::Arg arg1;
400 arg1.flat_key = arg_flat_key_id;
401 arg1.key = arg_key1_id;
402 arg1.value = Variadic::Real(kValues[1]);
403 storage.mutable_args()->AddArgSet({arg0, arg1}, 0, 2);
404 storage.mutable_nestable_slices()->set_arg_set_id(0, 1);
405
406 base::TempFile temp_file = base::TempFile::Create();
407 FILE* output = fopen(temp_file.path().c_str(), "w+");
408 int code = ExportJson(&storage, output);
409
410 EXPECT_EQ(code, kResultOk);
411
412 Json::Reader reader;
413 Json::Value result;
414 EXPECT_TRUE(reader.parse(ReadFile(output), result));
415 EXPECT_EQ(result["traceEvents"].size(), 1u);
416
417 Json::Value event = result["traceEvents"][0];
418 EXPECT_EQ(event["cat"].asString(), kCategory);
419 EXPECT_EQ(event["name"].asString(), kName);
Mikhail Khokhlovc4544ea2019-07-10 14:41:25 +0100420 EXPECT_EQ(event["args"]["draw_duration_ms"].size(), 2u);
Mikhail Khokhlovc8344972019-07-09 15:46:57 +0100421 EXPECT_EQ(event["args"]["draw_duration_ms"][0].asDouble(), kValues[0]);
422 EXPECT_EQ(event["args"]["draw_duration_ms"][1].asDouble(), kValues[1]);
423}
424
425TEST(ExportJsonTest, StorageWithMultiplePointerArgs) {
426 const char* kCategory = "cat";
427 const char* kName = "name";
428 uint64_t kValue0 = 1;
429 uint64_t kValue1 = std::numeric_limits<uint64_t>::max();
430
431 TraceStorage storage;
432 UniqueTid utid = storage.AddEmptyThread(0);
433 StringId cat_id = storage.InternString(base::StringView(kCategory));
434 StringId name_id = storage.InternString(base::StringView(kName));
435 storage.mutable_nestable_slices()->AddSlice(0, 0, utid, RefType::kRefUtid,
436 cat_id, name_id, 0, 0, 0);
437
438 StringId arg_key0_id = storage.InternString(base::StringView("arg0"));
439 StringId arg_key1_id = storage.InternString(base::StringView("arg1"));
440 TraceStorage::Args::Arg arg0;
441 arg0.flat_key = arg_key0_id;
442 arg0.key = arg_key0_id;
443 arg0.value = Variadic::Pointer(kValue0);
444 TraceStorage::Args::Arg arg1;
445 arg1.flat_key = arg_key1_id;
446 arg1.key = arg_key1_id;
447 arg1.value = Variadic::Pointer(kValue1);
448 storage.mutable_args()->AddArgSet({arg0, arg1}, 0, 2);
449 storage.mutable_nestable_slices()->set_arg_set_id(0, 1);
450
451 base::TempFile temp_file = base::TempFile::Create();
452 FILE* output = fopen(temp_file.path().c_str(), "w+");
453 int code = ExportJson(&storage, output);
454
455 EXPECT_EQ(code, kResultOk);
456
457 Json::Reader reader;
458 Json::Value result;
459 EXPECT_TRUE(reader.parse(ReadFile(output), result));
460 EXPECT_EQ(result["traceEvents"].size(), 1u);
461
462 Json::Value event = result["traceEvents"][0];
463 EXPECT_EQ(event["cat"].asString(), kCategory);
464 EXPECT_EQ(event["name"].asString(), kName);
465 EXPECT_EQ(event["args"]["arg0"].asString(), "0x1");
466 EXPECT_EQ(event["args"]["arg1"].asString(), "0xffffffffffffffff");
467}
468
469TEST(ExportJsonTest, StorageWithObjectListArgs) {
470 const char* kCategory = "cat";
471 const char* kName = "name";
472 int kValues[] = {123, 234};
473
474 TraceStorage storage;
475 UniqueTid utid = storage.AddEmptyThread(0);
476 StringId cat_id = storage.InternString(base::StringView(kCategory));
477 StringId name_id = storage.InternString(base::StringView(kName));
478 storage.mutable_nestable_slices()->AddSlice(0, 0, utid, RefType::kRefUtid,
479 cat_id, name_id, 0, 0, 0);
480
481 StringId arg_flat_key_id = storage.InternString(base::StringView("a.b"));
482 StringId arg_key0_id = storage.InternString(base::StringView("a[0].b"));
483 StringId arg_key1_id = storage.InternString(base::StringView("a[1].b"));
484 TraceStorage::Args::Arg arg0;
485 arg0.flat_key = arg_flat_key_id;
486 arg0.key = arg_key0_id;
487 arg0.value = Variadic::Integer(kValues[0]);
488 TraceStorage::Args::Arg arg1;
489 arg1.flat_key = arg_flat_key_id;
490 arg1.key = arg_key1_id;
491 arg1.value = Variadic::Integer(kValues[1]);
492 storage.mutable_args()->AddArgSet({arg0, arg1}, 0, 2);
493 storage.mutable_nestable_slices()->set_arg_set_id(0, 1);
494
495 base::TempFile temp_file = base::TempFile::Create();
496 FILE* output = fopen(temp_file.path().c_str(), "w+");
497 int code = ExportJson(&storage, output);
498
499 EXPECT_EQ(code, kResultOk);
500
501 Json::Reader reader;
502 Json::Value result;
503 EXPECT_TRUE(reader.parse(ReadFile(output), result));
504 EXPECT_EQ(result["traceEvents"].size(), 1u);
505
506 Json::Value event = result["traceEvents"][0];
507 EXPECT_EQ(event["cat"].asString(), kCategory);
508 EXPECT_EQ(event["name"].asString(), kName);
Mikhail Khokhlovc4544ea2019-07-10 14:41:25 +0100509 EXPECT_EQ(event["args"]["a"].size(), 2u);
Mikhail Khokhlovc8344972019-07-09 15:46:57 +0100510 EXPECT_EQ(event["args"]["a"][0]["b"].asInt(), kValues[0]);
511 EXPECT_EQ(event["args"]["a"][1]["b"].asInt(), kValues[1]);
512}
513
514TEST(ExportJsonTest, StorageWithNestedListArgs) {
515 const char* kCategory = "cat";
516 const char* kName = "name";
517 int kValues[] = {123, 234};
518
519 TraceStorage storage;
520 UniqueTid utid = storage.AddEmptyThread(0);
521 StringId cat_id = storage.InternString(base::StringView(kCategory));
522 StringId name_id = storage.InternString(base::StringView(kName));
523 storage.mutable_nestable_slices()->AddSlice(0, 0, utid, RefType::kRefUtid,
524 cat_id, name_id, 0, 0, 0);
525
526 StringId arg_flat_key_id = storage.InternString(base::StringView("a"));
527 StringId arg_key0_id = storage.InternString(base::StringView("a[0][0]"));
528 StringId arg_key1_id = storage.InternString(base::StringView("a[0][1]"));
529 TraceStorage::Args::Arg arg0;
530 arg0.flat_key = arg_flat_key_id;
531 arg0.key = arg_key0_id;
532 arg0.value = Variadic::Integer(kValues[0]);
533 TraceStorage::Args::Arg arg1;
534 arg1.flat_key = arg_flat_key_id;
535 arg1.key = arg_key1_id;
536 arg1.value = Variadic::Integer(kValues[1]);
537 storage.mutable_args()->AddArgSet({arg0, arg1}, 0, 2);
538 storage.mutable_nestable_slices()->set_arg_set_id(0, 1);
539
540 base::TempFile temp_file = base::TempFile::Create();
541 FILE* output = fopen(temp_file.path().c_str(), "w+");
542 int code = ExportJson(&storage, output);
543
544 EXPECT_EQ(code, kResultOk);
545
546 Json::Reader reader;
547 Json::Value result;
548 EXPECT_TRUE(reader.parse(ReadFile(output), result));
549 EXPECT_EQ(result["traceEvents"].size(), 1u);
550
551 Json::Value event = result["traceEvents"][0];
552 EXPECT_EQ(event["cat"].asString(), kCategory);
553 EXPECT_EQ(event["name"].asString(), kName);
Mikhail Khokhlovc4544ea2019-07-10 14:41:25 +0100554 EXPECT_EQ(event["args"]["a"].size(), 1u);
555 EXPECT_EQ(event["args"]["a"][0].size(), 2u);
Mikhail Khokhlovc8344972019-07-09 15:46:57 +0100556 EXPECT_EQ(event["args"]["a"][0][0].asInt(), kValues[0]);
557 EXPECT_EQ(event["args"]["a"][0][1].asInt(), kValues[1]);
558}
559
560TEST(ExportJsonTest, StorageWithLegacyJsonArgs) {
561 const char* kCategory = "cat";
562 const char* kName = "name";
563
564 TraceStorage storage;
565 UniqueTid utid = storage.AddEmptyThread(0);
566 StringId cat_id = storage.InternString(base::StringView(kCategory));
567 StringId name_id = storage.InternString(base::StringView(kName));
568 storage.mutable_nestable_slices()->AddSlice(0, 0, utid, RefType::kRefUtid,
569 cat_id, name_id, 0, 0, 0);
570
571 StringId arg_key_id = storage.InternString(base::StringView("a"));
572 StringId arg_value_id = storage.InternString(base::StringView("{\"b\":123}"));
573 TraceStorage::Args::Arg arg;
574 arg.flat_key = arg_key_id;
575 arg.key = arg_key_id;
576 arg.value = Variadic::Json(arg_value_id);
577 storage.mutable_args()->AddArgSet({arg}, 0, 1);
578 storage.mutable_nestable_slices()->set_arg_set_id(0, 1);
579
580 base::TempFile temp_file = base::TempFile::Create();
581 FILE* output = fopen(temp_file.path().c_str(), "w+");
582 int code = ExportJson(&storage, output);
583
584 EXPECT_EQ(code, kResultOk);
585
586 Json::Reader reader;
587 Json::Value result;
588 EXPECT_TRUE(reader.parse(ReadFile(output), result));
589 EXPECT_EQ(result["traceEvents"].size(), 1u);
590
591 Json::Value event = result["traceEvents"][0];
592 EXPECT_EQ(event["cat"].asString(), kCategory);
593 EXPECT_EQ(event["name"].asString(), kName);
594 EXPECT_EQ(event["args"]["a"]["b"].asInt(), 123);
595}
596
Mikhail Khokhlov1fad8952019-07-11 14:18:33 +0100597TEST(ExportJsonTest, InstantEvent) {
598 const int64_t kTimestamp = 10000000;
599 const char* kCategory = "cat";
600 const char* kName = "name";
601
602 TraceStorage storage;
603 StringId cat_id = storage.InternString(base::StringView(kCategory));
604 StringId name_id = storage.InternString(base::StringView(kName));
605 storage.mutable_nestable_slices()->AddSlice(
606 kTimestamp, 0, 0, RefType::kRefNoRef, cat_id, name_id, 0, 0, 0);
607
608 base::TempFile temp_file = base::TempFile::Create();
609 FILE* output = fopen(temp_file.path().c_str(), "w+");
610 int code = ExportJson(&storage, output);
611
612 EXPECT_EQ(code, kResultOk);
613
614 Json::Reader reader;
615 Json::Value result;
616 EXPECT_TRUE(reader.parse(ReadFile(output), result));
617 EXPECT_EQ(result["traceEvents"].size(), 1u);
618
619 Json::Value event = result["traceEvents"][0];
620 EXPECT_EQ(event["ph"].asString(), "i");
621 EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000);
622 EXPECT_EQ(event["s"].asString(), "g");
623 EXPECT_EQ(event["cat"].asString(), kCategory);
624 EXPECT_EQ(event["name"].asString(), kName);
625}
626
627TEST(ExportJsonTest, AsyncEvent) {
628 const int64_t kTimestamp = 10000000;
629 const int64_t kDuration = 100000;
630 const int64_t kProcessID = 100;
631 const char* kCategory = "cat";
632 const char* kName = "name";
633 const char* kArgName = "arg_name";
634 const int kArgValue = 123;
635
636 TraceStorage storage;
637 UniquePid upid = storage.AddEmptyProcess(kProcessID);
638 StringId cat_id = storage.InternString(base::StringView(kCategory));
639 StringId name_id = storage.InternString(base::StringView(kName));
Lalit Magantid11d3e02019-07-26 12:32:09 +0530640 TrackId track_id = storage.mutable_tracks()->AddTrack(name_id);
641 storage.mutable_virtual_tracks()->AddVirtualTrack(
642 track_id, VirtualTrackScope::kProcess, upid);
Mikhail Khokhlov1fad8952019-07-11 14:18:33 +0100643 storage.mutable_nestable_slices()->AddSlice(kTimestamp, kDuration, track_id,
644 RefType::kRefTrack, cat_id,
645 name_id, 0, 0, 0);
646 StringId arg_key_id = storage.InternString(base::StringView(kArgName));
647 TraceStorage::Args::Arg arg;
648 arg.flat_key = arg_key_id;
649 arg.key = arg_key_id;
650 arg.value = Variadic::Integer(kArgValue);
651 storage.mutable_args()->AddArgSet({arg}, 0, 1);
652 storage.mutable_nestable_slices()->set_arg_set_id(0, 1);
653
654 base::TempFile temp_file = base::TempFile::Create();
655 FILE* output = fopen(temp_file.path().c_str(), "w+");
656 int code = ExportJson(&storage, output);
657
658 EXPECT_EQ(code, kResultOk);
659
660 Json::Reader reader;
661 Json::Value result;
662 EXPECT_TRUE(reader.parse(ReadFile(output), result));
663 EXPECT_EQ(result["traceEvents"].size(), 2u);
664
665 Json::Value begin_event = result["traceEvents"][0];
666 EXPECT_EQ(begin_event["ph"].asString(), "b");
667 EXPECT_EQ(begin_event["ts"].asInt64(), kTimestamp / 1000);
668 EXPECT_EQ(begin_event["pid"].asInt64(), kProcessID);
669 EXPECT_EQ(begin_event["id2"]["local"].asString(), "0x0");
670 EXPECT_EQ(begin_event["cat"].asString(), kCategory);
671 EXPECT_EQ(begin_event["name"].asString(), kName);
672 EXPECT_EQ(begin_event["args"][kArgName].asInt(), kArgValue);
Eric Secklerc63a3af2019-07-25 11:17:37 +0100673 EXPECT_FALSE(begin_event.isMember("tts"));
674 EXPECT_FALSE(begin_event.isMember("use_async_tts"));
Mikhail Khokhlov1fad8952019-07-11 14:18:33 +0100675
676 Json::Value end_event = result["traceEvents"][1];
677 EXPECT_EQ(end_event["ph"].asString(), "e");
678 EXPECT_EQ(end_event["ts"].asInt64(), (kTimestamp + kDuration) / 1000);
679 EXPECT_EQ(end_event["pid"].asInt64(), kProcessID);
680 EXPECT_EQ(end_event["id2"]["local"].asString(), "0x0");
681 EXPECT_EQ(end_event["cat"].asString(), kCategory);
682 EXPECT_EQ(end_event["name"].asString(), kName);
683 EXPECT_FALSE(end_event.isMember("args"));
Eric Secklerc63a3af2019-07-25 11:17:37 +0100684 EXPECT_FALSE(end_event.isMember("tts"));
685 EXPECT_FALSE(end_event.isMember("use_async_tts"));
686}
687
688TEST(ExportJsonTest, AsyncEventWithThreadTimestamp) {
689 const int64_t kTimestamp = 10000000;
690 const int64_t kDuration = 100000;
691 const int64_t kThreadTimestamp = 10000001;
692 const int64_t kThreadDuration = 99998;
693 const int64_t kProcessID = 100;
694 const char* kCategory = "cat";
695 const char* kName = "name";
696
697 TraceStorage storage;
698 UniquePid upid = storage.AddEmptyProcess(kProcessID);
699 StringId cat_id = storage.InternString(base::StringView(kCategory));
700 StringId name_id = storage.InternString(base::StringView(kName));
Lalit Magantid11d3e02019-07-26 12:32:09 +0530701 TrackId track_id = storage.mutable_tracks()->AddTrack(name_id);
702 storage.mutable_virtual_tracks()->AddVirtualTrack(
703 track_id, VirtualTrackScope::kProcess, upid);
Eric Secklerc63a3af2019-07-25 11:17:37 +0100704 auto slice_id = storage.mutable_nestable_slices()->AddSlice(
705 kTimestamp, kDuration, track_id, RefType::kRefTrack, cat_id, name_id, 0,
706 0, 0);
707 storage.mutable_virtual_track_slices()->AddVirtualTrackSlice(
708 slice_id, kThreadTimestamp, kThreadDuration, 0, 0);
709
710 base::TempFile temp_file = base::TempFile::Create();
711 FILE* output = fopen(temp_file.path().c_str(), "w+");
712 int code = ExportJson(&storage, output);
713
714 EXPECT_EQ(code, kResultOk);
715
716 Json::Reader reader;
717 Json::Value result;
718 EXPECT_TRUE(reader.parse(ReadFile(output), result));
719 EXPECT_EQ(result["traceEvents"].size(), 2u);
720
721 Json::Value begin_event = result["traceEvents"][0];
722 EXPECT_EQ(begin_event["ph"].asString(), "b");
723 EXPECT_EQ(begin_event["ts"].asInt64(), kTimestamp / 1000);
724 EXPECT_EQ(begin_event["tts"].asInt64(), kThreadTimestamp / 1000);
725 EXPECT_EQ(begin_event["use_async_tts"].asInt(), 1);
726 EXPECT_EQ(begin_event["pid"].asInt64(), kProcessID);
727 EXPECT_EQ(begin_event["id2"]["local"].asString(), "0x0");
728 EXPECT_EQ(begin_event["cat"].asString(), kCategory);
729 EXPECT_EQ(begin_event["name"].asString(), kName);
730
731 Json::Value end_event = result["traceEvents"][1];
732 EXPECT_EQ(end_event["ph"].asString(), "e");
733 EXPECT_EQ(end_event["ts"].asInt64(), (kTimestamp + kDuration) / 1000);
734 EXPECT_EQ(end_event["tts"].asInt64(),
735 (kThreadTimestamp + kThreadDuration) / 1000);
736 EXPECT_EQ(end_event["use_async_tts"].asInt(), 1);
737 EXPECT_EQ(end_event["pid"].asInt64(), kProcessID);
738 EXPECT_EQ(end_event["id2"]["local"].asString(), "0x0");
739 EXPECT_EQ(end_event["cat"].asString(), kCategory);
740 EXPECT_EQ(end_event["name"].asString(), kName);
Mikhail Khokhlov1fad8952019-07-11 14:18:33 +0100741}
742
Eric Seckler206db472019-07-25 12:05:27 +0100743TEST(ExportJsonTest, UnfinishedAsyncEvent) {
744 const int64_t kTimestamp = 10000000;
745 const int64_t kDuration = -1;
746 const int64_t kThreadTimestamp = 10000001;
747 const int64_t kThreadDuration = -1;
748 const int64_t kProcessID = 100;
749 const char* kCategory = "cat";
750 const char* kName = "name";
751
752 TraceStorage storage;
753 UniquePid upid = storage.AddEmptyProcess(kProcessID);
754 StringId cat_id = storage.InternString(base::StringView(kCategory));
755 StringId name_id = storage.InternString(base::StringView(kName));
Lalit Magantid11d3e02019-07-26 12:32:09 +0530756 TrackId track_id = storage.mutable_tracks()->AddTrack(name_id);
757 storage.mutable_virtual_tracks()->AddVirtualTrack(
758 track_id, VirtualTrackScope::kProcess, upid);
Eric Seckler206db472019-07-25 12:05:27 +0100759 auto slice_id = storage.mutable_nestable_slices()->AddSlice(
760 kTimestamp, kDuration, track_id, RefType::kRefTrack, cat_id, name_id, 0,
761 0, 0);
762 storage.mutable_virtual_track_slices()->AddVirtualTrackSlice(
763 slice_id, kThreadTimestamp, kThreadDuration, 0, 0);
764
765 base::TempFile temp_file = base::TempFile::Create();
766 FILE* output = fopen(temp_file.path().c_str(), "w+");
767 int code = ExportJson(&storage, output);
768
769 EXPECT_EQ(code, kResultOk);
770
771 Json::Reader reader;
772 Json::Value result;
773 EXPECT_TRUE(reader.parse(ReadFile(output), result));
774 EXPECT_EQ(result["traceEvents"].size(), 1u);
775
776 Json::Value begin_event = result["traceEvents"][0];
777 EXPECT_EQ(begin_event["ph"].asString(), "b");
778 EXPECT_EQ(begin_event["ts"].asInt64(), kTimestamp / 1000);
779 EXPECT_EQ(begin_event["tts"].asInt64(), kThreadTimestamp / 1000);
780 EXPECT_EQ(begin_event["use_async_tts"].asInt(), 1);
781 EXPECT_EQ(begin_event["pid"].asInt64(), kProcessID);
782 EXPECT_EQ(begin_event["id2"]["local"].asString(), "0x0");
783 EXPECT_EQ(begin_event["cat"].asString(), kCategory);
784 EXPECT_EQ(begin_event["name"].asString(), kName);
785}
786
Mikhail Khokhlov1fad8952019-07-11 14:18:33 +0100787TEST(ExportJsonTest, AsyncInstantEvent) {
788 const int64_t kTimestamp = 10000000;
789 const int64_t kProcessID = 100;
790 const char* kCategory = "cat";
791 const char* kName = "name";
792 const char* kArgName = "arg_name";
793 const int kArgValue = 123;
794
795 TraceStorage storage;
796 UniquePid upid = storage.AddEmptyProcess(kProcessID);
797 StringId cat_id = storage.InternString(base::StringView(kCategory));
798 StringId name_id = storage.InternString(base::StringView(kName));
Lalit Magantid11d3e02019-07-26 12:32:09 +0530799 TrackId track_id = storage.mutable_tracks()->AddTrack(name_id);
800 storage.mutable_virtual_tracks()->AddVirtualTrack(
801 track_id, VirtualTrackScope::kProcess, upid);
Mikhail Khokhlov1fad8952019-07-11 14:18:33 +0100802 storage.mutable_nestable_slices()->AddSlice(
803 kTimestamp, 0, track_id, RefType::kRefTrack, cat_id, name_id, 0, 0, 0);
804 StringId arg_key_id = storage.InternString(base::StringView("arg_name"));
805 TraceStorage::Args::Arg arg;
806 arg.flat_key = arg_key_id;
807 arg.key = arg_key_id;
808 arg.value = Variadic::Integer(kArgValue);
809 storage.mutable_args()->AddArgSet({arg}, 0, 1);
810 storage.mutable_nestable_slices()->set_arg_set_id(0, 1);
811
812 base::TempFile temp_file = base::TempFile::Create();
813 FILE* output = fopen(temp_file.path().c_str(), "w+");
814 int code = ExportJson(&storage, output);
815
816 EXPECT_EQ(code, kResultOk);
817
818 Json::Reader reader;
819 Json::Value result;
820 EXPECT_TRUE(reader.parse(ReadFile(output), result));
821 EXPECT_EQ(result["traceEvents"].size(), 1u);
822
823 Json::Value event = result["traceEvents"][0];
824 EXPECT_EQ(event["ph"].asString(), "n");
825 EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000);
826 EXPECT_EQ(event["pid"].asInt64(), kProcessID);
827 EXPECT_EQ(event["id2"]["local"].asString(), "0x0");
828 EXPECT_EQ(event["cat"].asString(), kCategory);
829 EXPECT_EQ(event["name"].asString(), kName);
830 EXPECT_EQ(event["args"][kArgName].asInt(), kArgValue);
831}
832
Eric Secklerc34c8fc2019-08-02 10:57:59 +0100833TEST(ExportJsonTest, RawEvent) {
834 const int64_t kTimestamp = 10000000;
835 const int64_t kDuration = 10000;
836 const int64_t kThreadTimestamp = 20000000;
837 const int64_t kThreadDuration = 20000;
838 const int64_t kThreadInstructionCount = 30000000;
839 const int64_t kThreadInstructionDelta = 30000;
840 const int64_t kProcessID = 100;
841 const int64_t kThreadID = 200;
842 const char* kCategory = "cat";
843 const char* kName = "name";
844 const char* kPhase = "?";
845 const uint64_t kGlobalId = 0xaaffaaffaaffaaff;
846 const char* kIdScope = "my_id";
847 const uint64_t kBindId = 0xaa00aa00aa00aa00;
848 const char* kFlowDirection = "inout";
849 const char* kArgName = "arg_name";
850 const int kArgValue = 123;
851
852 TraceProcessorContext context;
853 context.storage.reset(new TraceStorage());
854 TraceStorage* storage = context.storage.get();
855
856 UniquePid upid = storage->AddEmptyProcess(kProcessID);
857 UniqueTid utid = storage->AddEmptyThread(kThreadID);
858 storage->GetMutableThread(utid)->upid = upid;
859
860 RowId row_id = storage->mutable_raw_events()->AddRawEvent(
861 kTimestamp, storage->InternString("track_event.legacy_event"), /*cpu=*/0,
862 utid);
863
864 ArgsTracker args(&context);
865 auto add_arg = [&](const char* key, Variadic value) {
866 StringId key_id = storage->InternString(key);
867 args.AddArg(row_id, key_id, key_id, value);
868 };
869
870 StringId cat_id = storage->InternString(base::StringView(kCategory));
871 add_arg("legacy_event.category", Variadic::String(cat_id));
872 StringId name_id = storage->InternString(base::StringView(kName));
873 add_arg("legacy_event.name", Variadic::String(name_id));
874 StringId phase_id = storage->InternString(base::StringView(kPhase));
875 add_arg("legacy_event.phase", Variadic::String(phase_id));
876
877 add_arg("legacy_event.duration_ns", Variadic::Integer(kDuration));
878 add_arg("legacy_event.thread_timestamp_ns",
879 Variadic::Integer(kThreadTimestamp));
880 add_arg("legacy_event.thread_duration_ns",
881 Variadic::Integer(kThreadDuration));
882 add_arg("legacy_event.thread_instruction_count",
883 Variadic::Integer(kThreadInstructionCount));
884 add_arg("legacy_event.thread_instruction_delta",
885 Variadic::Integer(kThreadInstructionDelta));
886 add_arg("legacy_event.use_async_tts", Variadic::Boolean(true));
887 add_arg("legacy_event.global_id", Variadic::UnsignedInteger(kGlobalId));
888 StringId scope_id = storage->InternString(base::StringView(kIdScope));
889 add_arg("legacy_event.id_scope", Variadic::String(scope_id));
890 add_arg("legacy_event.bind_id", Variadic::UnsignedInteger(kBindId));
891 add_arg("legacy_event.bind_to_enclosing", Variadic::Boolean(true));
892 StringId flow_direction_id = storage->InternString(kFlowDirection);
893 add_arg("legacy_event.flow_direction", Variadic::String(flow_direction_id));
894
895 add_arg(kArgName, Variadic::Integer(kArgValue));
896
897 args.Flush();
898
899 base::TempFile temp_file = base::TempFile::Create();
900 FILE* output = fopen(temp_file.path().c_str(), "w+");
901 int code = ExportJson(storage, output);
902
903 EXPECT_EQ(code, kResultOk);
904
905 Json::Reader reader;
906 Json::Value result;
907 EXPECT_TRUE(reader.parse(ReadFile(output), result));
908 EXPECT_EQ(result["traceEvents"].size(), 1u);
909
910 Json::Value event = result["traceEvents"][0];
911 EXPECT_EQ(event["ph"].asString(), kPhase);
912 EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000);
913 EXPECT_EQ(event["dur"].asInt64(), kDuration / 1000);
914 EXPECT_EQ(event["tts"].asInt64(), kThreadTimestamp / 1000);
915 EXPECT_EQ(event["tdur"].asInt64(), kThreadDuration / 1000);
916 EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount);
917 EXPECT_EQ(event["tidelta"].asInt64(), kThreadInstructionDelta);
918 EXPECT_EQ(event["tid"].asUInt(), kThreadID);
919 EXPECT_EQ(event["cat"].asString(), kCategory);
920 EXPECT_EQ(event["name"].asString(), kName);
921 EXPECT_EQ(event["use_async_tts"].asInt(), 1);
922 EXPECT_EQ(event["id2"]["global"].asString(), "0xaaffaaffaaffaaff");
923 EXPECT_EQ(event["scope"].asString(), kIdScope);
924 EXPECT_EQ(event["bind_id"].asString(), "0xaa00aa00aa00aa00");
925 EXPECT_EQ(event["bp"].asString(), "e");
926 EXPECT_EQ(event["flow_in"].asBool(), true);
927 EXPECT_EQ(event["flow_out"].asBool(), true);
928 EXPECT_EQ(event["args"][kArgName].asInt(), kArgValue);
929}
930
Mikhail Khokhlova8d310d2019-05-07 17:34:21 +0100931} // namespace
932} // namespace json
933} // namespace trace_processor
934} // namespace perfetto