blob: 8d73050ae6c0a877f4450ba77d43276d55965912 [file] [log] [blame]
Lalit Maganti93b76362018-06-01 03:03:58 +01001/*
Lalit Magantic6bccda2018-06-25 11:05:24 +01002 * Copyright (C) 2018 The Android Open Source Project
Lalit Maganti93b76362018-06-01 03:03:58 +01003 *
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
Lalit Magantieb63b082020-09-10 14:12:20 +010017#include "src/trace_processor/importers/proto/proto_trace_reader.h"
Lalit Maganti93b76362018-06-01 03:03:58 +010018
Eric Secklerac2ea612019-10-21 16:44:39 +010019#include "perfetto/base/logging.h"
Primiano Tucci2c5488f2019-06-01 03:27:28 +010020#include "perfetto/ext/base/string_view.h"
Primiano Tuccie5f11682019-03-22 07:21:49 +000021#include "perfetto/protozero/scattered_heap_buffer.h"
Primiano Tucci3264b592021-11-08 18:20:51 +000022#include "perfetto/trace_processor/trace_blob.h"
Lalit Maganti60af4ef2020-04-15 14:27:09 +010023#include "src/trace_processor/importers/additional_modules.h"
Lalit Maganti617deae2020-04-14 21:00:49 +010024#include "src/trace_processor/importers/common/args_tracker.h"
Lalit Magantid5c45f42020-04-14 21:01:50 +010025#include "src/trace_processor/importers/common/clock_tracker.h"
26#include "src/trace_processor/importers/common/event_tracker.h"
Andrii703edd32020-08-07 13:57:56 +030027#include "src/trace_processor/importers/common/flow_tracker.h"
Lalit Maganti617deae2020-04-14 21:00:49 +010028#include "src/trace_processor/importers/common/process_tracker.h"
Lalit Magantid5c45f42020-04-14 21:01:50 +010029#include "src/trace_processor/importers/common/slice_tracker.h"
Lalit Maganti617deae2020-04-14 21:00:49 +010030#include "src/trace_processor/importers/common/track_tracker.h"
Lalit Maganti60af4ef2020-04-15 14:27:09 +010031#include "src/trace_processor/importers/default_modules.h"
Eric Secklerd3795132019-10-21 16:43:10 +010032#include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
Lalit Maganti05819e22020-04-14 21:01:38 +010033#include "src/trace_processor/importers/proto/metadata_tracker.h"
Eric Seckler137a4672019-10-24 08:51:14 +010034#include "src/trace_processor/importers/proto/proto_trace_parser.h"
Lalit Maganti05819e22020-04-14 21:01:38 +010035#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
Lalit Maganti7010b332020-02-07 10:51:15 +000036#include "src/trace_processor/storage/metadata.h"
37#include "src/trace_processor/storage/trace_storage.h"
Primiano Tuccid933d912018-09-04 09:15:07 +010038#include "src/trace_processor/trace_sorter.h"
Alexander Timin5a99b5c2021-05-11 22:48:07 +000039#include "src/trace_processor/util/descriptors.h"
Primiano Tucci919ca1e2019-08-21 20:26:58 +020040#include "test/gtest_and_gmock.h"
Primiano Tucci0d72a312018-08-07 14:42:45 +010041
Eric Secklerdc454522020-05-20 19:40:23 +010042#include "protos/perfetto/common/builtin_clock.pbzero.h"
Primiano Tucci355b8c82019-08-29 08:37:51 +020043#include "protos/perfetto/common/sys_stats_counters.pbzero.h"
Hector Dearmana1d75242020-10-02 09:47:24 +010044#include "protos/perfetto/config/trace_config.pbzero.h"
Primiano Tucci355b8c82019-08-29 08:37:51 +020045#include "protos/perfetto/trace/android/packages_list.pbzero.h"
46#include "protos/perfetto/trace/chrome/chrome_benchmark_metadata.pbzero.h"
Eric Secklered369bb2021-04-01 10:32:55 +010047#include "protos/perfetto/trace/chrome/chrome_metadata.pbzero.h"
Primiano Tucci355b8c82019-08-29 08:37:51 +020048#include "protos/perfetto/trace/chrome/chrome_trace_event.pbzero.h"
Eric Seckler15ea5df2019-10-14 13:54:07 +010049#include "protos/perfetto/trace/clock_snapshot.pbzero.h"
Primiano Tucci355b8c82019-08-29 08:37:51 +020050#include "protos/perfetto/trace/ftrace/ftrace.pbzero.h"
51#include "protos/perfetto/trace/ftrace/ftrace_event.pbzero.h"
52#include "protos/perfetto/trace/ftrace/ftrace_event_bundle.pbzero.h"
53#include "protos/perfetto/trace/ftrace/generic.pbzero.h"
54#include "protos/perfetto/trace/ftrace/power.pbzero.h"
55#include "protos/perfetto/trace/ftrace/sched.pbzero.h"
56#include "protos/perfetto/trace/ftrace/task.pbzero.h"
57#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
Oystein Eftevaag7f64c102019-08-29 10:27:31 -070058#include "protos/perfetto/trace/profiling/profile_packet.pbzero.h"
Primiano Tucci355b8c82019-08-29 08:37:51 +020059#include "protos/perfetto/trace/ps/process_tree.pbzero.h"
60#include "protos/perfetto/trace/sys_stats/sys_stats.pbzero.h"
61#include "protos/perfetto/trace/trace.pbzero.h"
62#include "protos/perfetto/trace/trace_packet.pbzero.h"
ssid812a4222021-01-07 00:52:39 -080063#include "protos/perfetto/trace/track_event/chrome_thread_descriptor.pbzero.h"
Eric Secklerf1497812020-04-30 10:43:23 +010064#include "protos/perfetto/trace/track_event/counter_descriptor.pbzero.h"
Primiano Tucci355b8c82019-08-29 08:37:51 +020065#include "protos/perfetto/trace/track_event/debug_annotation.pbzero.h"
Eric Seckler02cdcef2019-10-14 08:56:28 +010066#include "protos/perfetto/trace/track_event/log_message.pbzero.h"
Eric Seckler7d128472020-01-13 10:03:51 +000067#include "protos/perfetto/trace/track_event/process_descriptor.pbzero.h"
Eric Seckler02cdcef2019-10-14 08:56:28 +010068#include "protos/perfetto/trace/track_event/source_location.pbzero.h"
Primiano Tucci355b8c82019-08-29 08:37:51 +020069#include "protos/perfetto/trace/track_event/task_execution.pbzero.h"
70#include "protos/perfetto/trace/track_event/thread_descriptor.pbzero.h"
Eric Secklerb32cacf2019-09-27 16:51:19 +010071#include "protos/perfetto/trace/track_event/track_descriptor.pbzero.h"
Primiano Tucci355b8c82019-08-29 08:37:51 +020072#include "protos/perfetto/trace/track_event/track_event.pbzero.h"
Lalit Maganti93b76362018-06-01 03:03:58 +010073
74namespace perfetto {
75namespace trace_processor {
76namespace {
77
Primiano Tucci2da5d2e2018-08-10 14:23:31 +010078using ::testing::_;
Lalit Maganti35622b72018-06-06 12:03:11 +010079using ::testing::Args;
Primiano Tucci711de1f2019-03-04 11:11:33 +000080using ::testing::AtLeast;
Victor Costan326c9792021-01-05 14:31:28 -080081using ::testing::DoAll;
Lalit Maganti35622b72018-06-06 12:03:11 +010082using ::testing::ElementsAreArray;
83using ::testing::Eq;
Hector Dearmana1d75242020-10-02 09:47:24 +010084using ::testing::HasSubstr;
Stephen Nuskof848d462021-04-06 13:28:04 +010085using ::testing::IgnoreResult;
Eric Seckler56a007d2019-05-02 16:25:14 +010086using ::testing::InSequence;
Ryan Savitski0476ee92019-07-09 14:29:33 +010087using ::testing::Invoke;
Eric Secklerd3b89d52019-07-10 15:36:29 +010088using ::testing::InvokeArgument;
Isabelle Taylor54ce7052018-10-01 14:00:15 +010089using ::testing::NiceMock;
Eric Seckler56a007d2019-05-02 16:25:14 +010090using ::testing::Pointwise;
91using ::testing::Return;
Lalit Maganti5228f362020-01-15 13:45:56 +000092using ::testing::ReturnRef;
Ryan Savitski0476ee92019-07-09 14:29:33 +010093using ::testing::UnorderedElementsAreArray;
Lalit Maganti93b76362018-06-01 03:03:58 +010094
Eric Secklerc36f22e2019-10-28 10:08:12 +000095namespace {
Primiano Tucci919ca1e2019-08-21 20:26:58 +020096MATCHER_P(DoubleEq, exp, "Double matcher that satisfies -Wfloat-equal") {
97 // The IEEE standard says that any comparison operation involving
98 // a NAN must return false.
Primiano Tuccid3c62b42019-08-22 07:07:59 +020099 double d_exp = exp;
100 double d_arg = arg;
101 if (isnan(d_exp) || isnan(d_arg))
Primiano Tucci919ca1e2019-08-21 20:26:58 +0200102 return false;
Primiano Tuccid3c62b42019-08-22 07:07:59 +0200103 return fabs(d_arg - d_exp) < 1e-128;
Primiano Tucci919ca1e2019-08-21 20:26:58 +0200104}
Eric Secklerc36f22e2019-10-28 10:08:12 +0000105} // namespace
Primiano Tucci919ca1e2019-08-21 20:26:58 +0200106
Eric Secklerd3795132019-10-21 16:43:10 +0100107class MockSchedEventTracker : public SchedEventTracker {
108 public:
109 MockSchedEventTracker(TraceProcessorContext* context)
110 : SchedEventTracker(context) {}
Eric Secklerd3795132019-10-21 16:43:10 +0100111
112 MOCK_METHOD9(PushSchedSwitch,
113 void(uint32_t cpu,
114 int64_t timestamp,
115 uint32_t prev_pid,
116 base::StringView prev_comm,
117 int32_t prev_prio,
118 int64_t prev_state,
119 uint32_t next_pid,
120 base::StringView next_comm,
121 int32_t next_prio));
122};
123
Isabelle Taylora97c5f52018-10-23 17:36:12 +0100124class MockEventTracker : public EventTracker {
Lalit Maganti35622b72018-06-06 12:03:11 +0100125 public:
Isabelle Taylora97c5f52018-10-23 17:36:12 +0100126 MockEventTracker(TraceProcessorContext* context) : EventTracker(context) {}
127 virtual ~MockEventTracker() = default;
Lalit Maganti35622b72018-06-06 12:03:11 +0100128
Lalit Magantibeb73712019-02-08 11:28:09 +0000129 MOCK_METHOD9(PushSchedSwitch,
Lalit Maganti35622b72018-06-06 12:03:11 +0100130 void(uint32_t cpu,
Lalit Maganti85ca4a82018-12-07 17:28:02 +0000131 int64_t timestamp,
Lalit Maganti35622b72018-06-06 12:03:11 +0100132 uint32_t prev_pid,
Lalit Magantibeb73712019-02-08 11:28:09 +0000133 base::StringView prev_comm,
134 int32_t prev_prio,
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000135 int64_t prev_state,
Lalit Magantifde29042018-10-04 13:28:52 +0100136 uint32_t next_pid,
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000137 base::StringView next_comm,
Lalit Magantibeb73712019-02-08 11:28:09 +0000138 int32_t next_prio));
Isabelle Taylor15314ea2018-09-19 11:35:19 +0100139
Lalit Maganti809b2f92019-11-07 13:27:26 +0000140 MOCK_METHOD3(PushCounter,
Lalit Magantib0e11f62020-01-02 14:17:58 +0000141 base::Optional<CounterId>(int64_t timestamp,
142 double value,
143 TrackId track_id));
Isabelle Taylora0a22972018-08-03 12:06:12 +0100144};
145
146class MockProcessTracker : public ProcessTracker {
147 public:
148 MockProcessTracker(TraceProcessorContext* context)
149 : ProcessTracker(context) {}
150
Lalit Maganti4662a202020-07-08 13:09:52 +0100151 MOCK_METHOD4(SetProcessMetadata,
Lalit Maganti08884242019-02-19 12:28:32 +0000152 UniquePid(uint32_t pid,
153 base::Optional<uint32_t> ppid,
Lalit Maganti4662a202020-07-08 13:09:52 +0100154 base::StringView process_name,
155 base::StringView cmdline));
Isabelle Taylora0a22972018-08-03 12:06:12 +0100156
Mikhail Khokhlov567c0042020-07-17 17:42:44 +0100157 MOCK_METHOD3(UpdateThreadName,
158 UniqueTid(uint32_t tid,
159 StringId thread_name_id,
160 ThreadNamePriority priority));
Mikhail Khokhlov642b8352020-07-24 10:04:39 +0100161 MOCK_METHOD3(UpdateThreadNameByUtid,
162 void(UniqueTid utid,
163 StringId thread_name_id,
164 ThreadNamePriority priority));
Isabelle Taylora0a22972018-08-03 12:06:12 +0100165 MOCK_METHOD2(UpdateThread, UniqueTid(uint32_t tid, uint32_t tgid));
Eric Secklera0366df2019-06-07 14:42:56 +0100166
167 MOCK_METHOD1(GetOrCreateProcess, UniquePid(uint32_t pid));
Eric Seckler7d128472020-01-13 10:03:51 +0000168 MOCK_METHOD2(SetProcessNameIfUnset,
169 void(UniquePid upid, StringId process_name_id));
Lalit Maganti35622b72018-06-06 12:03:11 +0100170};
171
Lalit Maganti7449dc82019-12-30 15:52:35 +0000172class MockBoundInserter : public ArgsTracker::BoundInserter {
Lalit Maganti4fa7c6c2019-02-06 15:06:36 +0000173 public:
Eric Secklerc7b0c612020-02-12 18:30:35 +0000174 MockBoundInserter()
175 : ArgsTracker::BoundInserter(&tracker_, nullptr, 0u), tracker_(nullptr) {
176 ON_CALL(*this, AddArg(_, _, _, _)).WillByDefault(ReturnRef(*this));
Lalit Maganti5228f362020-01-15 13:45:56 +0000177 }
Lalit Maganti4fa7c6c2019-02-06 15:06:36 +0000178
Eric Secklerc7b0c612020-02-12 18:30:35 +0000179 MOCK_METHOD4(
180 AddArg,
181 ArgsTracker::BoundInserter&(StringId flat_key,
182 StringId key,
183 Variadic v,
184 ArgsTracker::UpdatePolicy update_policy));
185
186 private:
187 ArgsTracker tracker_;
Lalit Maganti4fa7c6c2019-02-06 15:06:36 +0000188};
189
Eric Seckler56a007d2019-05-02 16:25:14 +0100190class MockSliceTracker : public SliceTracker {
191 public:
192 MockSliceTracker(TraceProcessorContext* context) : SliceTracker(context) {}
193
Lalit Magantic7ea02e2019-12-12 14:06:49 +0000194 MOCK_METHOD5(Begin,
Lalit Magantif523f2a2021-03-01 13:58:27 +0000195 base::Optional<SliceId>(int64_t timestamp,
196 TrackId track_id,
197 StringId cat,
198 StringId name,
199 SetArgsCallback args_callback));
Lalit Maganti21b21632019-09-28 16:50:23 +0100200 MOCK_METHOD5(End,
Lalit Magantif523f2a2021-03-01 13:58:27 +0000201 base::Optional<SliceId>(int64_t timestamp,
202 TrackId track_id,
203 StringId cat,
204 StringId name,
205 SetArgsCallback args_callback));
Lalit Magantic7ea02e2019-12-12 14:06:49 +0000206 MOCK_METHOD6(Scoped,
Lalit Magantif523f2a2021-03-01 13:58:27 +0000207 base::Optional<SliceId>(int64_t timestamp,
208 TrackId track_id,
209 StringId cat,
210 StringId name,
211 int64_t duration,
212 SetArgsCallback args_callback));
Stephen Nuskof848d462021-04-06 13:28:04 +0100213 MOCK_METHOD4(StartSlice,
214 base::Optional<SliceId>(int64_t timestamp,
215 TrackId track_id,
216 SetArgsCallback args_callback,
217 std::function<SliceId()> inserter));
Eric Seckler56a007d2019-05-02 16:25:14 +0100218};
219
Andriidd07cb12020-09-10 16:09:01 +0300220class MockFlowTracker : public FlowTracker {
221 public:
222 MockFlowTracker(TraceProcessorContext* context) : FlowTracker(context) {}
223
224 MOCK_METHOD2(Begin, void(TrackId track_id, FlowId flow_id));
225 MOCK_METHOD2(Step, void(TrackId track_id, FlowId flow_id));
Andrii1b50d2e2020-10-05 16:05:30 +0300226 MOCK_METHOD4(End,
227 void(TrackId track_id,
228 FlowId flow_id,
229 bool bind_enclosing,
230 bool close_flow));
Andriidd07cb12020-09-10 16:09:01 +0300231};
232
Primiano Tuccid933d912018-09-04 09:15:07 +0100233class ProtoTraceParserTest : public ::testing::Test {
234 public:
235 ProtoTraceParserTest() {
Lalit Maganti47bc3d62020-01-15 16:21:22 +0000236 storage_ = new TraceStorage();
Ryan Savitski0476ee92019-07-09 14:29:33 +0100237 context_.storage.reset(storage_);
Lalit Maganti4ea78d92019-09-20 20:20:41 +0100238 context_.track_tracker.reset(new TrackTracker(&context_));
Lalit Maganti1908e262020-01-09 14:33:19 +0000239 context_.global_args_tracker.reset(new GlobalArgsTracker(&context_));
Florian Mayer22668742020-08-13 10:39:41 +0100240 context_.global_stack_profile_tracker.reset(
241 new GlobalStackProfileTracker());
Eric Secklerc93823e2019-06-03 16:49:19 +0100242 context_.args_tracker.reset(new ArgsTracker(&context_));
Lalit Magantiededb0e2020-01-08 12:50:34 +0000243 context_.metadata_tracker.reset(new MetadataTracker(&context_));
Isabelle Taylora97c5f52018-10-23 17:36:12 +0100244 event_ = new MockEventTracker(&context_);
245 context_.event_tracker.reset(event_);
Eric Secklerd3795132019-10-21 16:43:10 +0100246 sched_ = new MockSchedEventTracker(&context_);
247 context_.sched_tracker.reset(sched_);
Primiano Tuccid933d912018-09-04 09:15:07 +0100248 process_ = new MockProcessTracker(&context_);
249 context_.process_tracker.reset(process_);
Eric Seckler56a007d2019-05-02 16:25:14 +0100250 slice_ = new MockSliceTracker(&context_);
251 context_.slice_tracker.reset(slice_);
Andriidd07cb12020-09-10 16:09:01 +0300252 flow_ = new MockFlowTracker(&context_);
253 context_.flow_tracker.reset(flow_);
Eric Seckler15ea5df2019-10-14 13:54:07 +0100254 clock_ = new ClockTracker(&context_);
255 context_.clock_tracker.reset(clock_);
Lalit Maganti09e840c2021-09-22 15:23:17 +0100256 context_.sorter.reset(new TraceSorter(&context_, CreateParser(),
257 TraceSorter::SortingMode::kFullSort));
Alexander Timin5a99b5c2021-05-11 22:48:07 +0000258 context_.descriptor_pool_.reset(new DescriptorPool());
Mikhail Khokhlov692087e2019-12-11 10:53:45 +0000259
Eric Secklerf2de4db2020-02-14 14:17:20 +0000260 RegisterDefaultModules(&context_);
Mikhail Khokhlov692087e2019-12-11 10:53:45 +0000261 RegisterAdditionalModules(&context_);
Primiano Tuccid933d912018-09-04 09:15:07 +0100262 }
Primiano Tucci7e330292018-08-24 19:10:52 +0200263
Primiano Tuccibb371732020-08-07 17:25:11 +0200264 void ResetTraceBuffers() { trace_.Reset(); }
Primiano Tuccie5f11682019-03-22 07:21:49 +0000265
266 void SetUp() override { ResetTraceBuffers(); }
267
Eric Seckler6f263fd2019-10-24 16:48:24 +0100268 util::Status Tokenize() {
Primiano Tuccibb371732020-08-07 17:25:11 +0200269 trace_->Finalize();
270 std::vector<uint8_t> trace_bytes = trace_.SerializeAsArray();
Primiano Tuccie5f11682019-03-22 07:21:49 +0000271 std::unique_ptr<uint8_t[]> raw_trace(new uint8_t[trace_bytes.size()]);
272 memcpy(raw_trace.get(), trace_bytes.data(), trace_bytes.size());
Lalit Magantieb63b082020-09-10 14:12:20 +0100273 context_.chunk_reader.reset(new ProtoTraceReader(&context_));
Primiano Tucci3264b592021-11-08 18:20:51 +0000274 auto status = context_.chunk_reader->Parse(TraceBlobView(
275 TraceBlob::TakeOwnership(std::move(raw_trace), trace_bytes.size())));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000276
277 ResetTraceBuffers();
Eric Seckler6f263fd2019-10-24 16:48:24 +0100278 return status;
Primiano Tuccid933d912018-09-04 09:15:07 +0100279 }
280
Eric Secklerb7e26332019-07-19 12:46:17 +0100281 bool HasArg(ArgSetId set_id, StringId key_id, Variadic value) {
Lalit Maganti1908e262020-01-09 14:33:19 +0000282 const auto& args = storage_->arg_table();
283 RowMap rm = args.FilterToRowMap({args.arg_set_id().eq(set_id)});
284 bool found = false;
285 for (auto it = rm.IterateRows(); it; it.Next()) {
286 if (args.key()[it.row()] == key_id) {
287 EXPECT_EQ(args.flat_key()[it.row()], key_id);
288 if (storage_->GetArgValue(it.row()) == value) {
289 found = true;
290 break;
Eric Secklerb7e26332019-07-19 12:46:17 +0100291 }
292 }
293 }
Lalit Maganti1908e262020-01-09 14:33:19 +0000294 return found;
Eric Secklerb7e26332019-07-19 12:46:17 +0100295 }
296
Primiano Tuccid933d912018-09-04 09:15:07 +0100297 protected:
Lalit Maganti6d1f7b52020-02-27 13:16:44 +0000298 std::unique_ptr<TraceParser> CreateParser() {
299 return std::unique_ptr<TraceParser>(new ProtoTraceParser(&context_));
300 }
301
Primiano Tuccibb371732020-08-07 17:25:11 +0200302 protozero::HeapBuffered<protos::pbzero::Trace> trace_;
Primiano Tuccid933d912018-09-04 09:15:07 +0100303 TraceProcessorContext context_;
Isabelle Taylora97c5f52018-10-23 17:36:12 +0100304 MockEventTracker* event_;
Eric Secklerd3795132019-10-21 16:43:10 +0100305 MockSchedEventTracker* sched_;
Primiano Tuccid933d912018-09-04 09:15:07 +0100306 MockProcessTracker* process_;
Eric Seckler56a007d2019-05-02 16:25:14 +0100307 MockSliceTracker* slice_;
Andriidd07cb12020-09-10 16:09:01 +0300308 MockFlowTracker* flow_;
Eric Seckler15ea5df2019-10-14 13:54:07 +0100309 ClockTracker* clock_;
Lalit Maganti47bc3d62020-01-15 16:21:22 +0000310 TraceStorage* storage_;
Primiano Tuccid933d912018-09-04 09:15:07 +0100311};
312
Eric Seckler5c7866e2019-10-18 08:38:16 +0100313// TODO(eseckler): Refactor these into a new file for ftrace tests.
Eric Seckler5c7866e2019-10-18 08:38:16 +0100314
Primiano Tuccid933d912018-09-04 09:15:07 +0100315TEST_F(ProtoTraceParserTest, LoadSingleEvent) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200316 auto* bundle = trace_->add_packet()->set_ftrace_events();
Lalit Magantidf3e9262018-06-04 17:45:00 +0100317 bundle->set_cpu(10);
318
319 auto* event = bundle->add_event();
320 event->set_timestamp(1000);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000321 event->set_pid(12);
Lalit Magantidf3e9262018-06-04 17:45:00 +0100322
Lalit Magantibeb73712019-02-08 11:28:09 +0000323 static const char kProc1Name[] = "proc1";
324 static const char kProc2Name[] = "proc2";
Primiano Tuccie5f11682019-03-22 07:21:49 +0000325 auto* sched_switch = event->set_sched_switch();
Lalit Magantidf3e9262018-06-04 17:45:00 +0100326 sched_switch->set_prev_pid(10);
Lalit Magantibeb73712019-02-08 11:28:09 +0000327 sched_switch->set_prev_comm(kProc2Name);
328 sched_switch->set_prev_prio(256);
Lalit Maganti35622b72018-06-06 12:03:11 +0100329 sched_switch->set_prev_state(32);
Lalit Magantibeb73712019-02-08 11:28:09 +0000330 sched_switch->set_next_comm(kProc1Name);
Lalit Maganti35622b72018-06-06 12:03:11 +0100331 sched_switch->set_next_pid(100);
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000332 sched_switch->set_next_prio(1024);
Lalit Maganti35622b72018-06-06 12:03:11 +0100333
Eric Secklerd3795132019-10-21 16:43:10 +0100334 EXPECT_CALL(*sched_,
Lalit Magantibeb73712019-02-08 11:28:09 +0000335 PushSchedSwitch(10, 1000, 10, base::StringView(kProc2Name), 256,
336 32, 100, base::StringView(kProc1Name), 1024));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000337 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100338 context_.sorter->ExtractEventsForced();
Lalit Maganti93b76362018-06-01 03:03:58 +0100339}
340
Lalit Maganti4fa7c6c2019-02-06 15:06:36 +0000341TEST_F(ProtoTraceParserTest, LoadEventsIntoRaw) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200342 auto* bundle = trace_->add_packet()->set_ftrace_events();
Lalit Maganti1d915a62019-01-07 12:10:42 +0000343 bundle->set_cpu(10);
344
345 // This event is unknown and will only appear in
346 // raw events table.
347 auto* event = bundle->add_event();
348 event->set_timestamp(1000);
349 event->set_pid(12);
Primiano Tuccie5f11682019-03-22 07:21:49 +0000350 auto* task = event->set_task_newtask();
Lalit Maganti1d915a62019-01-07 12:10:42 +0000351 task->set_pid(123);
352 static const char task_newtask[] = "task_newtask";
353 task->set_comm(task_newtask);
354 task->set_clone_flags(12);
355 task->set_oom_score_adj(15);
356
357 // This event has specific parsing logic, but will
358 // also appear in raw events table.
359 event = bundle->add_event();
360 event->set_timestamp(1001);
361 event->set_pid(12);
Primiano Tuccie5f11682019-03-22 07:21:49 +0000362 auto* print = event->set_print();
Lalit Maganti1d915a62019-01-07 12:10:42 +0000363 print->set_ip(20);
364 static const char buf_value[] = "This is a print event";
365 print->set_buf(buf_value);
366
Lalit Magantieac7fff2020-01-10 16:42:54 +0000367 EXPECT_CALL(*process_, GetOrCreateProcess(123));
Lalit Maganti1d915a62019-01-07 12:10:42 +0000368
Primiano Tuccie5f11682019-03-22 07:21:49 +0000369 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100370 context_.sorter->ExtractEventsForced();
Ryan Savitski0476ee92019-07-09 14:29:33 +0100371
Lalit Maganti679b29d2020-01-13 13:26:28 +0000372 const auto& raw = context_.storage->raw_table();
373 ASSERT_EQ(raw.row_count(), 2u);
Lalit Maganti1908e262020-01-09 14:33:19 +0000374 const auto& args = context_.storage->arg_table();
375 ASSERT_EQ(args.row_count(), 6u);
Eric Secklerc7b0c612020-02-12 18:30:35 +0000376 // Order is by row and then by StringIds.
377 ASSERT_EQ(args.key()[0], context_.storage->InternString("comm"));
378 ASSERT_EQ(args.key()[1], context_.storage->InternString("pid"));
379 ASSERT_EQ(args.key()[2], context_.storage->InternString("oom_score_adj"));
380 ASSERT_EQ(args.key()[3], context_.storage->InternString("clone_flags"));
381 ASSERT_EQ(args.key()[4], context_.storage->InternString("ip"));
382 ASSERT_EQ(args.key()[5], context_.storage->InternString("buf"));
Lalit Maganti8c8e9972020-04-07 17:47:54 +0100383 ASSERT_STREQ(args.string_value().GetString(0).c_str(), task_newtask);
Eric Secklerc7b0c612020-02-12 18:30:35 +0000384 ASSERT_EQ(args.int_value()[1], 123);
385 ASSERT_EQ(args.int_value()[2], 15);
386 ASSERT_EQ(args.int_value()[3], 12);
Lalit Maganti1908e262020-01-09 14:33:19 +0000387 ASSERT_EQ(args.int_value()[4], 20);
Lalit Maganti8c8e9972020-04-07 17:47:54 +0100388 ASSERT_STREQ(args.string_value().GetString(5).c_str(), buf_value);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000389
Hector Dearman6d1adfe2021-04-29 21:51:39 +0100390 // TODO(hjd): Add test ftrace event with all field types
Lalit Maganti1d915a62019-01-07 12:10:42 +0000391 // and test here.
392}
393
Lalit Maganti4fa7c6c2019-02-06 15:06:36 +0000394TEST_F(ProtoTraceParserTest, LoadGenericFtrace) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200395 auto* packet = trace_->add_packet();
Lalit Maganti1d915a62019-01-07 12:10:42 +0000396 packet->set_timestamp(100);
397
Primiano Tuccie5f11682019-03-22 07:21:49 +0000398 auto* bundle = packet->set_ftrace_events();
Lalit Maganti1d915a62019-01-07 12:10:42 +0000399 bundle->set_cpu(4);
400
401 auto* ftrace = bundle->add_event();
402 ftrace->set_timestamp(100);
403 ftrace->set_pid(10);
404
Primiano Tuccie5f11682019-03-22 07:21:49 +0000405 auto* generic = ftrace->set_generic();
Lalit Maganti1d915a62019-01-07 12:10:42 +0000406 generic->set_event_name("Test");
407
408 auto* field = generic->add_field();
409 field->set_name("meta1");
410 field->set_str_value("value1");
411
412 field = generic->add_field();
413 field->set_name("meta2");
414 field->set_int_value(-2);
415
416 field = generic->add_field();
417 field->set_name("meta3");
418 field->set_uint_value(3);
419
Primiano Tuccie5f11682019-03-22 07:21:49 +0000420 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100421 context_.sorter->ExtractEventsForced();
Lalit Maganti1d915a62019-01-07 12:10:42 +0000422
Lalit Maganti679b29d2020-01-13 13:26:28 +0000423 const auto& raw = storage_->raw_table();
Lalit Maganti1d915a62019-01-07 12:10:42 +0000424
Lalit Maganti679b29d2020-01-13 13:26:28 +0000425 ASSERT_EQ(raw.row_count(), 1u);
426 ASSERT_EQ(raw.ts()[raw.row_count() - 1], 100);
427 ASSERT_EQ(storage_->thread_table().tid()[raw.utid()[raw.row_count() - 1]],
428 10u);
Lalit Maganti47bc3d62020-01-15 16:21:22 +0000429 ASSERT_EQ(raw.name().GetString(raw.row_count() - 1), "Test");
Lalit Maganti4fa7c6c2019-02-06 15:06:36 +0000430
Lalit Maganti679b29d2020-01-13 13:26:28 +0000431 auto set_id = raw.arg_set_id()[raw.row_count() - 1];
Lalit Maganti1d915a62019-01-07 12:10:42 +0000432
Lalit Maganti1908e262020-01-09 14:33:19 +0000433 const auto& args = storage_->arg_table();
434 RowMap rm = args.FilterToRowMap({args.arg_set_id().eq(set_id)});
Lalit Maganti1d915a62019-01-07 12:10:42 +0000435
Lalit Maganti1908e262020-01-09 14:33:19 +0000436 auto row = rm.Get(0);
Lalit Maganti47bc3d62020-01-15 16:21:22 +0000437
438 ASSERT_EQ(args.key().GetString(row), "meta1");
439 ASSERT_EQ(args.string_value().GetString(row++), "value1");
440
441 ASSERT_EQ(args.key().GetString(row), "meta2");
442 ASSERT_EQ(args.int_value()[row++], -2);
443
444 ASSERT_EQ(args.key().GetString(row), "meta3");
445 ASSERT_EQ(args.int_value()[row++], 3);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000446}
447
Primiano Tuccid933d912018-09-04 09:15:07 +0100448TEST_F(ProtoTraceParserTest, LoadMultipleEvents) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200449 auto* bundle = trace_->add_packet()->set_ftrace_events();
Lalit Maganti35622b72018-06-06 12:03:11 +0100450 bundle->set_cpu(10);
451
452 auto* event = bundle->add_event();
453 event->set_timestamp(1000);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000454 event->set_pid(12);
Lalit Maganti35622b72018-06-06 12:03:11 +0100455
456 static const char kProcName1[] = "proc1";
Lalit Magantibeb73712019-02-08 11:28:09 +0000457 static const char kProcName2[] = "proc2";
Primiano Tuccie5f11682019-03-22 07:21:49 +0000458 auto* sched_switch = event->set_sched_switch();
Lalit Maganti35622b72018-06-06 12:03:11 +0100459 sched_switch->set_prev_pid(10);
Lalit Magantibeb73712019-02-08 11:28:09 +0000460 sched_switch->set_prev_comm(kProcName2);
461 sched_switch->set_prev_prio(256);
Lalit Maganti35622b72018-06-06 12:03:11 +0100462 sched_switch->set_prev_state(32);
Lalit Magantifde29042018-10-04 13:28:52 +0100463 sched_switch->set_next_comm(kProcName1);
Lalit Maganti35622b72018-06-06 12:03:11 +0100464 sched_switch->set_next_pid(100);
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000465 sched_switch->set_next_prio(1024);
Lalit Maganti35622b72018-06-06 12:03:11 +0100466
467 event = bundle->add_event();
468 event->set_timestamp(1001);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000469 event->set_pid(12);
Lalit Maganti35622b72018-06-06 12:03:11 +0100470
Primiano Tuccie5f11682019-03-22 07:21:49 +0000471 sched_switch = event->set_sched_switch();
Lalit Maganti35622b72018-06-06 12:03:11 +0100472 sched_switch->set_prev_pid(100);
Lalit Magantibeb73712019-02-08 11:28:09 +0000473 sched_switch->set_prev_comm(kProcName1);
474 sched_switch->set_prev_prio(256);
Lalit Maganti35622b72018-06-06 12:03:11 +0100475 sched_switch->set_prev_state(32);
Lalit Magantifde29042018-10-04 13:28:52 +0100476 sched_switch->set_next_comm(kProcName2);
Lalit Maganti35622b72018-06-06 12:03:11 +0100477 sched_switch->set_next_pid(10);
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000478 sched_switch->set_next_prio(512);
Lalit Maganti35622b72018-06-06 12:03:11 +0100479
Eric Secklerd3795132019-10-21 16:43:10 +0100480 EXPECT_CALL(*sched_,
Lalit Magantibeb73712019-02-08 11:28:09 +0000481 PushSchedSwitch(10, 1000, 10, base::StringView(kProcName2), 256,
482 32, 100, base::StringView(kProcName1), 1024));
Lalit Maganti35622b72018-06-06 12:03:11 +0100483
Eric Secklerd3795132019-10-21 16:43:10 +0100484 EXPECT_CALL(*sched_,
Lalit Magantibeb73712019-02-08 11:28:09 +0000485 PushSchedSwitch(10, 1001, 100, base::StringView(kProcName1), 256,
486 32, 10, base::StringView(kProcName2), 512));
Lalit Maganti35622b72018-06-06 12:03:11 +0100487
Primiano Tuccie5f11682019-03-22 07:21:49 +0000488 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100489 context_.sorter->ExtractEventsForced();
Lalit Maganti35622b72018-06-06 12:03:11 +0100490}
491
Primiano Tuccid933d912018-09-04 09:15:07 +0100492TEST_F(ProtoTraceParserTest, LoadMultiplePackets) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200493 auto* bundle = trace_->add_packet()->set_ftrace_events();
Lalit Maganti35622b72018-06-06 12:03:11 +0100494 bundle->set_cpu(10);
495
496 auto* event = bundle->add_event();
497 event->set_timestamp(1000);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000498 event->set_pid(12);
Lalit Maganti35622b72018-06-06 12:03:11 +0100499
500 static const char kProcName1[] = "proc1";
Lalit Magantibeb73712019-02-08 11:28:09 +0000501 static const char kProcName2[] = "proc2";
Primiano Tuccie5f11682019-03-22 07:21:49 +0000502 auto* sched_switch = event->set_sched_switch();
Lalit Maganti35622b72018-06-06 12:03:11 +0100503 sched_switch->set_prev_pid(10);
Lalit Magantibeb73712019-02-08 11:28:09 +0000504 sched_switch->set_prev_comm(kProcName2);
505 sched_switch->set_prev_prio(256);
Lalit Maganti35622b72018-06-06 12:03:11 +0100506 sched_switch->set_prev_state(32);
Lalit Magantifde29042018-10-04 13:28:52 +0100507 sched_switch->set_next_comm(kProcName1);
Lalit Maganti35622b72018-06-06 12:03:11 +0100508 sched_switch->set_next_pid(100);
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000509 sched_switch->set_next_prio(1024);
Lalit Maganti35622b72018-06-06 12:03:11 +0100510
Primiano Tuccibb371732020-08-07 17:25:11 +0200511 bundle = trace_->add_packet()->set_ftrace_events();
Lalit Maganti35622b72018-06-06 12:03:11 +0100512 bundle->set_cpu(10);
513
514 event = bundle->add_event();
515 event->set_timestamp(1001);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000516 event->set_pid(12);
Lalit Maganti35622b72018-06-06 12:03:11 +0100517
Primiano Tuccie5f11682019-03-22 07:21:49 +0000518 sched_switch = event->set_sched_switch();
Lalit Maganti35622b72018-06-06 12:03:11 +0100519 sched_switch->set_prev_pid(100);
Lalit Magantibeb73712019-02-08 11:28:09 +0000520 sched_switch->set_prev_comm(kProcName1);
521 sched_switch->set_prev_prio(256);
Lalit Maganti35622b72018-06-06 12:03:11 +0100522 sched_switch->set_prev_state(32);
Lalit Magantifde29042018-10-04 13:28:52 +0100523 sched_switch->set_next_comm(kProcName2);
Lalit Maganti35622b72018-06-06 12:03:11 +0100524 sched_switch->set_next_pid(10);
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000525 sched_switch->set_next_prio(512);
Lalit Maganti35622b72018-06-06 12:03:11 +0100526
Eric Secklerd3795132019-10-21 16:43:10 +0100527 EXPECT_CALL(*sched_,
Lalit Magantibeb73712019-02-08 11:28:09 +0000528 PushSchedSwitch(10, 1000, 10, base::StringView(kProcName2), 256,
529 32, 100, base::StringView(kProcName1), 1024));
Lalit Maganti35622b72018-06-06 12:03:11 +0100530
Eric Secklerd3795132019-10-21 16:43:10 +0100531 EXPECT_CALL(*sched_,
Lalit Magantibeb73712019-02-08 11:28:09 +0000532 PushSchedSwitch(10, 1001, 100, base::StringView(kProcName1), 256,
533 32, 10, base::StringView(kProcName2), 512));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000534 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100535 context_.sorter->ExtractEventsForced();
Lalit Maganti93b76362018-06-01 03:03:58 +0100536}
537
Primiano Tuccid933d912018-09-04 09:15:07 +0100538TEST_F(ProtoTraceParserTest, RepeatedLoadSinglePacket) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200539 auto* bundle = trace_->add_packet()->set_ftrace_events();
Primiano Tuccid933d912018-09-04 09:15:07 +0100540 bundle->set_cpu(10);
541 auto* event = bundle->add_event();
542 event->set_timestamp(1000);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000543 event->set_pid(12);
Primiano Tuccid933d912018-09-04 09:15:07 +0100544 static const char kProcName1[] = "proc1";
Lalit Magantibeb73712019-02-08 11:28:09 +0000545 static const char kProcName2[] = "proc2";
Primiano Tuccie5f11682019-03-22 07:21:49 +0000546 auto* sched_switch = event->set_sched_switch();
Primiano Tuccid933d912018-09-04 09:15:07 +0100547 sched_switch->set_prev_pid(10);
Lalit Magantibeb73712019-02-08 11:28:09 +0000548 sched_switch->set_prev_comm(kProcName2);
549 sched_switch->set_prev_prio(256);
Primiano Tuccid933d912018-09-04 09:15:07 +0100550 sched_switch->set_prev_state(32);
Lalit Magantifde29042018-10-04 13:28:52 +0100551 sched_switch->set_next_comm(kProcName1);
Primiano Tuccid933d912018-09-04 09:15:07 +0100552 sched_switch->set_next_pid(100);
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000553 sched_switch->set_next_prio(1024);
Eric Secklerd3795132019-10-21 16:43:10 +0100554 EXPECT_CALL(*sched_,
Primiano Tuccie5f11682019-03-22 07:21:49 +0000555 PushSchedSwitch(10, 1000, 10, base::StringView(kProcName2), 256,
556 32, 100, base::StringView(kProcName1), 1024));
557 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100558 context_.sorter->ExtractEventsForced();
Lalit Maganti35622b72018-06-06 12:03:11 +0100559
Primiano Tuccibb371732020-08-07 17:25:11 +0200560 bundle = trace_->add_packet()->set_ftrace_events();
Primiano Tuccid933d912018-09-04 09:15:07 +0100561 bundle->set_cpu(10);
562 event = bundle->add_event();
563 event->set_timestamp(1001);
Lalit Maganti1d915a62019-01-07 12:10:42 +0000564 event->set_pid(12);
Primiano Tuccie5f11682019-03-22 07:21:49 +0000565 sched_switch = event->set_sched_switch();
Primiano Tuccid933d912018-09-04 09:15:07 +0100566 sched_switch->set_prev_pid(100);
Lalit Magantibeb73712019-02-08 11:28:09 +0000567 sched_switch->set_prev_comm(kProcName1);
568 sched_switch->set_prev_prio(256);
Primiano Tuccid933d912018-09-04 09:15:07 +0100569 sched_switch->set_prev_state(32);
Lalit Magantifde29042018-10-04 13:28:52 +0100570 sched_switch->set_next_comm(kProcName2);
Primiano Tuccid933d912018-09-04 09:15:07 +0100571 sched_switch->set_next_pid(10);
Lalit Maganti4af8dd82019-01-16 23:10:21 +0000572 sched_switch->set_next_prio(512);
Primiano Tuccid933d912018-09-04 09:15:07 +0100573
Eric Secklerd3795132019-10-21 16:43:10 +0100574 EXPECT_CALL(*sched_,
Lalit Magantibeb73712019-02-08 11:28:09 +0000575 PushSchedSwitch(10, 1001, 100, base::StringView(kProcName1), 256,
576 32, 10, base::StringView(kProcName2), 512));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000577 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100578 context_.sorter->ExtractEventsForced();
Lalit Maganti93b76362018-06-01 03:03:58 +0100579}
580
Eric Seckler5c7866e2019-10-18 08:38:16 +0100581TEST_F(ProtoTraceParserTest, LoadCpuFreq) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200582 auto* bundle = trace_->add_packet()->set_ftrace_events();
Eric Seckler5c7866e2019-10-18 08:38:16 +0100583 bundle->set_cpu(12);
584 auto* event = bundle->add_event();
585 event->set_timestamp(1000);
586 event->set_pid(12);
587 auto* cpu_freq = event->set_cpu_frequency();
588 cpu_freq->set_cpu_id(10);
589 cpu_freq->set_state(2000);
590
Lalit Magantib0e11f62020-01-02 14:17:58 +0000591 EXPECT_CALL(*event_, PushCounter(1000, DoubleEq(2000), TrackId{0}));
Eric Seckler5c7866e2019-10-18 08:38:16 +0100592 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100593 context_.sorter->ExtractEventsForced();
Lalit Maganti809b2f92019-11-07 13:27:26 +0000594
595 EXPECT_EQ(context_.storage->cpu_counter_track_table().cpu()[0], 10u);
Eric Seckler5c7866e2019-10-18 08:38:16 +0100596}
597
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100598TEST_F(ProtoTraceParserTest, LoadMemInfo) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200599 auto* packet = trace_->add_packet();
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100600 uint64_t ts = 1000;
601 packet->set_timestamp(ts);
Primiano Tuccie5f11682019-03-22 07:21:49 +0000602 auto* bundle = packet->set_sys_stats();
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100603 auto* meminfo = bundle->add_meminfo();
Primiano Tuccie5f11682019-03-22 07:21:49 +0000604 meminfo->set_key(protos::pbzero::MEMINFO_MEM_TOTAL);
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100605 uint32_t value = 10;
606 meminfo->set_value(value);
607
Lalit Maganti809b2f92019-11-07 13:27:26 +0000608 EXPECT_CALL(*event_, PushCounter(static_cast<int64_t>(ts),
Lalit Magantib0e11f62020-01-02 14:17:58 +0000609 DoubleEq(value * 1024.0), TrackId{0u}));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000610 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100611 context_.sorter->ExtractEventsForced();
Lalit Maganti809b2f92019-11-07 13:27:26 +0000612
Lalit Maganti7e24f062019-12-17 18:10:35 +0000613 EXPECT_EQ(context_.storage->track_table().row_count(), 1u);
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100614}
615
616TEST_F(ProtoTraceParserTest, LoadVmStats) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200617 auto* packet = trace_->add_packet();
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100618 uint64_t ts = 1000;
619 packet->set_timestamp(ts);
Primiano Tuccie5f11682019-03-22 07:21:49 +0000620 auto* bundle = packet->set_sys_stats();
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100621 auto* meminfo = bundle->add_vmstat();
Primiano Tuccie5f11682019-03-22 07:21:49 +0000622 meminfo->set_key(protos::pbzero::VMSTAT_COMPACT_SUCCESS);
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100623 uint32_t value = 10;
624 meminfo->set_value(value);
625
Lalit Magantib0e11f62020-01-02 14:17:58 +0000626 EXPECT_CALL(*event_, PushCounter(static_cast<int64_t>(ts), DoubleEq(value),
627 TrackId{0u}));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000628 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100629 context_.sorter->ExtractEventsForced();
Lalit Maganti809b2f92019-11-07 13:27:26 +0000630
Lalit Maganti7e24f062019-12-17 18:10:35 +0000631 EXPECT_EQ(context_.storage->track_table().row_count(), 1u);
Isabelle Taylor54ce7052018-10-01 14:00:15 +0100632}
633
Primiano Tuccid933d912018-09-04 09:15:07 +0100634TEST_F(ProtoTraceParserTest, LoadProcessPacket) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200635 auto* tree = trace_->add_packet()->set_process_tree();
Isabelle Taylord80932a2018-06-19 17:00:47 +0100636 auto* process = tree->add_processes();
637 static const char kProcName1[] = "proc1";
638
639 process->add_cmdline(kProcName1);
640 process->set_pid(1);
Lalit Magantib4274aa2019-07-09 14:29:48 +0100641 process->set_ppid(3);
Isabelle Taylord80932a2018-06-19 17:00:47 +0100642
Lalit Maganti08884242019-02-19 12:28:32 +0000643 EXPECT_CALL(*process_,
Lalit Maganti4662a202020-07-08 13:09:52 +0100644 SetProcessMetadata(1, Eq(3u), base::StringView(kProcName1),
645 base::StringView(kProcName1)));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000646 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100647 context_.sorter->ExtractEventsForced();
Isabelle Taylord80932a2018-06-19 17:00:47 +0100648}
649
Primiano Tuccid933d912018-09-04 09:15:07 +0100650TEST_F(ProtoTraceParserTest, LoadProcessPacket_FirstCmdline) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200651 auto* tree = trace_->add_packet()->set_process_tree();
Isabelle Taylord80932a2018-06-19 17:00:47 +0100652 auto* process = tree->add_processes();
653 static const char kProcName1[] = "proc1";
654 static const char kProcName2[] = "proc2";
655
656 process->add_cmdline(kProcName1);
657 process->add_cmdline(kProcName2);
658 process->set_pid(1);
Lalit Magantib4274aa2019-07-09 14:29:48 +0100659 process->set_ppid(3);
Isabelle Taylord80932a2018-06-19 17:00:47 +0100660
Lalit Maganti08884242019-02-19 12:28:32 +0000661 EXPECT_CALL(*process_,
Lalit Maganti4662a202020-07-08 13:09:52 +0100662 SetProcessMetadata(1, Eq(3u), base::StringView(kProcName1),
663 base::StringView("proc1 proc2")));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000664 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100665 context_.sorter->ExtractEventsForced();
Isabelle Taylord80932a2018-06-19 17:00:47 +0100666}
667
Primiano Tuccid933d912018-09-04 09:15:07 +0100668TEST_F(ProtoTraceParserTest, LoadThreadPacket) {
Primiano Tuccibb371732020-08-07 17:25:11 +0200669 auto* tree = trace_->add_packet()->set_process_tree();
Isabelle Taylor3dd366c2018-06-22 16:21:41 +0100670 auto* thread = tree->add_threads();
671 thread->set_tid(1);
672 thread->set_tgid(2);
673
Primiano Tuccid933d912018-09-04 09:15:07 +0100674 EXPECT_CALL(*process_, UpdateThread(1, 2));
Primiano Tuccie5f11682019-03-22 07:21:49 +0000675 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +0100676 context_.sorter->ExtractEventsForced();
Isabelle Taylor3dd366c2018-06-22 16:21:41 +0100677}
678
Eric Seckler7d128472020-01-13 10:03:51 +0000679TEST_F(ProtoTraceParserTest, ProcessNameFromProcessDescriptor) {
Eric Seckler7d128472020-01-13 10:03:51 +0000680 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200681 auto* packet = trace_->add_packet();
Eric Seckler7d128472020-01-13 10:03:51 +0000682 packet->set_trusted_packet_sequence_id(1);
683 packet->set_incremental_state_cleared(true);
684 auto* process_desc = packet->set_process_descriptor();
685 process_desc->set_pid(15);
686 process_desc->set_process_name("OldProcessName");
687 }
688 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200689 auto* packet = trace_->add_packet();
Eric Seckler7d128472020-01-13 10:03:51 +0000690 packet->set_trusted_packet_sequence_id(1);
691 packet->set_incremental_state_cleared(true);
692 auto* process_desc = packet->set_process_descriptor();
693 process_desc->set_pid(15);
694 process_desc->set_process_name("NewProcessName");
695 }
696 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200697 auto* packet = trace_->add_packet();
Eric Seckler7d128472020-01-13 10:03:51 +0000698 packet->set_trusted_packet_sequence_id(2);
699 packet->set_incremental_state_cleared(true);
700 auto* process_desc = packet->set_process_descriptor();
701 process_desc->set_pid(16);
702 process_desc->set_process_name("DifferentProcessName");
703 }
704
705 EXPECT_CALL(*process_, GetOrCreateProcess(15))
706 .WillRepeatedly(testing::Return(1u));
707 EXPECT_CALL(*process_, GetOrCreateProcess(16)).WillOnce(testing::Return(2u));
708
Lalit Maganti47bc3d62020-01-15 16:21:22 +0000709 EXPECT_CALL(*process_, SetProcessNameIfUnset(
710 1u, storage_->InternString("OldProcessName")));
Eric Seckler7d128472020-01-13 10:03:51 +0000711 // Packet with same thread, but different name should update the name.
Lalit Maganti47bc3d62020-01-15 16:21:22 +0000712 EXPECT_CALL(*process_, SetProcessNameIfUnset(
713 1u, storage_->InternString("NewProcessName")));
714 EXPECT_CALL(*process_,
715 SetProcessNameIfUnset(
716 2u, storage_->InternString("DifferentProcessName")));
Eric Seckler7d128472020-01-13 10:03:51 +0000717
718 Tokenize();
719 context_.sorter->ExtractEventsForced();
720}
721
Siddhartha Sd37e5662019-06-13 18:27:42 -0700722TEST_F(ProtoTraceParserTest, ThreadNameFromThreadDescriptor) {
Siddhartha Sd37e5662019-06-13 18:27:42 -0700723 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200724 auto* packet = trace_->add_packet();
Siddhartha Sd37e5662019-06-13 18:27:42 -0700725 packet->set_trusted_packet_sequence_id(1);
726 packet->set_incremental_state_cleared(true);
727 auto* thread_desc = packet->set_thread_descriptor();
728 thread_desc->set_pid(15);
729 thread_desc->set_tid(16);
730 thread_desc->set_reference_timestamp_us(1000);
731 thread_desc->set_reference_thread_time_us(2000);
732 thread_desc->set_thread_name("OldThreadName");
733 }
734 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200735 auto* packet = trace_->add_packet();
Siddhartha Sd37e5662019-06-13 18:27:42 -0700736 packet->set_trusted_packet_sequence_id(1);
737 packet->set_incremental_state_cleared(true);
738 auto* thread_desc = packet->set_thread_descriptor();
739 thread_desc->set_pid(15);
740 thread_desc->set_tid(16);
741 thread_desc->set_reference_timestamp_us(1000);
742 thread_desc->set_reference_thread_time_us(2000);
743 thread_desc->set_thread_name("NewThreadName");
744 }
745 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200746 auto* packet = trace_->add_packet();
Siddhartha Sd37e5662019-06-13 18:27:42 -0700747 packet->set_trusted_packet_sequence_id(2);
748 packet->set_incremental_state_cleared(true);
749 auto* thread_desc = packet->set_thread_descriptor();
750 thread_desc->set_pid(15);
751 thread_desc->set_tid(11);
752 thread_desc->set_reference_timestamp_us(1000);
753 thread_desc->set_reference_thread_time_us(2000);
754 thread_desc->set_thread_name("DifferentThreadName");
755 }
756
Eric Seckler9d48adc2019-10-24 16:57:15 +0100757 EXPECT_CALL(*process_, UpdateThread(16, 15))
758 .WillRepeatedly(testing::Return(1u));
759 EXPECT_CALL(*process_, UpdateThread(11, 15)).WillOnce(testing::Return(2u));
Siddhartha Sd37e5662019-06-13 18:27:42 -0700760
Mikhail Khokhlov642b8352020-07-24 10:04:39 +0100761 EXPECT_CALL(*process_, UpdateThreadNameByUtid(
762 1u, storage_->InternString("OldThreadName"),
763 ThreadNamePriority::kTrackDescriptor));
Siddhartha Sd37e5662019-06-13 18:27:42 -0700764 // Packet with same thread, but different name should update the name.
Mikhail Khokhlov642b8352020-07-24 10:04:39 +0100765 EXPECT_CALL(*process_, UpdateThreadNameByUtid(
766 1u, storage_->InternString("NewThreadName"),
767 ThreadNamePriority::kTrackDescriptor));
768 EXPECT_CALL(*process_, UpdateThreadNameByUtid(
769 2u, storage_->InternString("DifferentThreadName"),
Mikhail Khokhlov567c0042020-07-17 17:42:44 +0100770 ThreadNamePriority::kTrackDescriptor));
Siddhartha Sd37e5662019-06-13 18:27:42 -0700771
772 Tokenize();
773 context_.sorter->ExtractEventsForced();
774}
775
Eric Seckler56a007d2019-05-02 16:25:14 +0100776TEST_F(ProtoTraceParserTest, TrackEventWithoutInternedData) {
Eric Seckler56a007d2019-05-02 16:25:14 +0100777 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200778 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +0100779 packet->set_trusted_packet_sequence_id(1);
780 packet->set_incremental_state_cleared(true);
781 auto* thread_desc = packet->set_thread_descriptor();
782 thread_desc->set_pid(15);
783 thread_desc->set_tid(16);
784 thread_desc->set_reference_timestamp_us(1000);
785 thread_desc->set_reference_thread_time_us(2000);
786 }
787 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200788 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +0100789 packet->set_trusted_packet_sequence_id(1);
790 auto* event = packet->set_track_event();
791 event->set_timestamp_delta_us(10); // absolute: 1010.
792 event->set_thread_time_delta_us(5); // absolute: 2005.
793 event->add_category_iids(1);
794 auto* legacy_event = event->set_legacy_event();
795 legacy_event->set_name_iid(1);
796 legacy_event->set_phase('B');
797 }
798 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200799 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +0100800 packet->set_trusted_packet_sequence_id(1);
801 auto* event = packet->set_track_event();
802 event->set_timestamp_delta_us(10); // absolute: 1020.
803 event->set_thread_time_delta_us(5); // absolute: 2010.
804 event->add_category_iids(1);
805 auto* legacy_event = event->set_legacy_event();
806 legacy_event->set_name_iid(1);
807 legacy_event->set_phase('E');
808 }
809 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200810 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +0100811 packet->set_trusted_packet_sequence_id(1);
812 auto* event = packet->set_track_event();
813 event->set_timestamp_absolute_us(1005);
814 event->set_thread_time_absolute_us(2003);
815 event->add_category_iids(2);
816 event->add_category_iids(3);
817 auto* legacy_event = event->set_legacy_event();
818 legacy_event->set_name_iid(2);
819 legacy_event->set_phase('X');
820 legacy_event->set_duration_us(23); // absolute end: 1028.
821 legacy_event->set_thread_duration_us(12); // absolute end: 2015.
822 }
823
824 Tokenize();
825
Lalit Maganti09e840c2021-09-22 15:23:17 +0100826 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Seckler56a007d2019-05-02 16:25:14 +0100827
Lalit Magantieac7fff2020-01-10 16:42:54 +0000828 tables::ThreadTable::Row row(16);
829 row.upid = 1u;
830 storage_->mutable_thread_table()->Insert(row);
Eric Secklerb32cacf2019-09-27 16:51:19 +0100831
Lalit Maganti7449dc82019-12-30 15:52:35 +0000832 MockBoundInserter inserter;
Eric Secklerd3b89d52019-07-10 15:36:29 +0100833
Raymond Chiub2463992020-02-25 16:23:20 -0800834 StringId unknown_cat = storage_->InternString("unknown(1)");
835
Lalit Magantib0e11f62020-01-02 14:17:58 +0000836 constexpr TrackId track{0u};
Eric Seckler063ed392020-04-03 18:26:30 +0100837 constexpr TrackId thread_time_track{1u};
838
Eric Seckler56a007d2019-05-02 16:25:14 +0100839 InSequence in_sequence; // Below slices should be sorted by timestamp.
Eric Seckler411e9c82020-05-04 13:36:25 +0100840 // Only the begin thread time can be imported into the counter table.
Eric Seckler063ed392020-04-03 18:26:30 +0100841 EXPECT_CALL(*event_, PushCounter(1005000, testing::DoubleEq(2003000),
842 thread_time_track));
Stephen Nuskof848d462021-04-06 13:28:04 +0100843 EXPECT_CALL(*slice_, StartSlice(1005000, track, _, _))
844 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
845 InvokeArgument<2>(&inserter), Return(SliceId(0u))));
Eric Seckler063ed392020-04-03 18:26:30 +0100846 EXPECT_CALL(*event_, PushCounter(1010000, testing::DoubleEq(2005000),
847 thread_time_track));
Stephen Nuskof848d462021-04-06 13:28:04 +0100848 EXPECT_CALL(*slice_, StartSlice(1010000, track, _, _))
849 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
850 InvokeArgument<2>(&inserter), Return(SliceId(1u))));
Eric Seckler063ed392020-04-03 18:26:30 +0100851 EXPECT_CALL(*event_, PushCounter(1020000, testing::DoubleEq(2010000),
852 thread_time_track));
Raymond Chiub2463992020-02-25 16:23:20 -0800853 EXPECT_CALL(*slice_, End(1020000, track, unknown_cat, kNullStringId, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +0000854 .WillOnce(DoAll(InvokeArgument<4>(&inserter), Return(SliceId(1u))));
Eric Seckler56a007d2019-05-02 16:25:14 +0100855
856 context_.sorter->ExtractEventsForced();
Eric Secklerd3b89d52019-07-10 15:36:29 +0100857
Stephen Nuskof848d462021-04-06 13:28:04 +0100858 EXPECT_EQ(storage_->thread_slice_table().id().row_map().size(), 2u);
859 auto id_0 = storage_->thread_slice_table().id().IndexOf(SliceId(0u));
860 EXPECT_TRUE(id_0);
861 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_0], 2003000);
862 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_0], 12000);
863 auto id_1 = storage_->thread_slice_table().id().IndexOf(SliceId(1u));
864 EXPECT_TRUE(id_1);
865 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_1], 2005000);
866 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_1], 5000);
Eric Seckler56a007d2019-05-02 16:25:14 +0100867}
868
Eric Seckler58fcbf12019-08-07 15:05:43 +0100869TEST_F(ProtoTraceParserTest, TrackEventWithoutInternedDataWithTypes) {
Eric Seckler58fcbf12019-08-07 15:05:43 +0100870 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200871 auto* packet = trace_->add_packet();
Eric Seckler58fcbf12019-08-07 15:05:43 +0100872 packet->set_trusted_packet_sequence_id(1);
873 packet->set_incremental_state_cleared(true);
874 auto* thread_desc = packet->set_thread_descriptor();
875 thread_desc->set_pid(15);
876 thread_desc->set_tid(16);
877 thread_desc->set_reference_timestamp_us(1000);
878 thread_desc->set_reference_thread_time_us(2000);
879 }
880 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200881 auto* packet = trace_->add_packet();
Eric Seckler58fcbf12019-08-07 15:05:43 +0100882 packet->set_trusted_packet_sequence_id(1);
883 auto* event = packet->set_track_event();
884 event->set_timestamp_delta_us(10); // absolute: 1010.
885 event->set_thread_time_delta_us(5); // absolute: 2005.
886 event->add_category_iids(1);
887 event->set_type(protos::pbzero::TrackEvent::TYPE_SLICE_BEGIN);
888 auto* legacy_event = event->set_legacy_event();
889 legacy_event->set_name_iid(1);
890 }
891 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200892 auto* packet = trace_->add_packet();
Eric Seckler58fcbf12019-08-07 15:05:43 +0100893 packet->set_trusted_packet_sequence_id(1);
894 auto* event = packet->set_track_event();
895 event->set_timestamp_delta_us(10); // absolute: 1020.
896 event->set_thread_time_delta_us(5); // absolute: 2010.
897 event->add_category_iids(1);
898 event->set_type(protos::pbzero::TrackEvent::TYPE_SLICE_END);
899 auto* legacy_event = event->set_legacy_event();
900 legacy_event->set_name_iid(1);
901 }
Eric Seckler361c10e2019-08-13 11:40:13 +0100902 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200903 auto* packet = trace_->add_packet();
Eric Seckler361c10e2019-08-13 11:40:13 +0100904 packet->set_trusted_packet_sequence_id(1);
905 auto* event = packet->set_track_event();
906 event->set_timestamp_absolute_us(1015);
907 event->set_thread_time_absolute_us(2007);
908 event->add_category_iids(2);
909 event->set_type(protos::pbzero::TrackEvent::TYPE_INSTANT);
910 auto* legacy_event = event->set_legacy_event();
911 legacy_event->set_name_iid(2);
912 }
Eric Seckler58fcbf12019-08-07 15:05:43 +0100913
914 Tokenize();
915
Lalit Maganti09e840c2021-09-22 15:23:17 +0100916 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Seckler58fcbf12019-08-07 15:05:43 +0100917
Lalit Magantieac7fff2020-01-10 16:42:54 +0000918 tables::ThreadTable::Row row(16);
919 row.upid = 1u;
920 storage_->mutable_thread_table()->Insert(row);
Eric Secklerb32cacf2019-09-27 16:51:19 +0100921
Lalit Maganti7449dc82019-12-30 15:52:35 +0000922 MockBoundInserter inserter;
Eric Seckler58fcbf12019-08-07 15:05:43 +0100923
Raymond Chiub2463992020-02-25 16:23:20 -0800924 StringId unknown_cat1 = storage_->InternString("unknown(1)");
Raymond Chiub2463992020-02-25 16:23:20 -0800925
Lalit Magantib0e11f62020-01-02 14:17:58 +0000926 constexpr TrackId track{0u};
Eric Seckler063ed392020-04-03 18:26:30 +0100927 constexpr TrackId thread_time_track{1u};
928
Eric Seckler58fcbf12019-08-07 15:05:43 +0100929 InSequence in_sequence; // Below slices should be sorted by timestamp.
Eric Seckler063ed392020-04-03 18:26:30 +0100930 EXPECT_CALL(*event_, PushCounter(1010000, testing::DoubleEq(2005000),
931 thread_time_track));
Stephen Nuskof848d462021-04-06 13:28:04 +0100932 EXPECT_CALL(*slice_, StartSlice(1010000, track, _, _))
933 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
934 InvokeArgument<2>(&inserter), Return(SliceId(0u))));
Eric Seckler063ed392020-04-03 18:26:30 +0100935 EXPECT_CALL(*event_, PushCounter(1015000, testing::DoubleEq(2007000),
936 thread_time_track));
Stephen Nuskof848d462021-04-06 13:28:04 +0100937 EXPECT_CALL(*slice_, StartSlice(1015000, track, _, _))
938 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
939 InvokeArgument<2>(&inserter), Return(SliceId(1u))));
Eric Seckler063ed392020-04-03 18:26:30 +0100940 EXPECT_CALL(*event_, PushCounter(1020000, testing::DoubleEq(2010000),
941 thread_time_track));
Raymond Chiub2463992020-02-25 16:23:20 -0800942 EXPECT_CALL(*slice_, End(1020000, track, unknown_cat1, kNullStringId, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +0000943 .WillOnce(DoAll(InvokeArgument<4>(&inserter), Return(SliceId(0u))));
Eric Seckler58fcbf12019-08-07 15:05:43 +0100944
945 context_.sorter->ExtractEventsForced();
946
Stephen Nuskof848d462021-04-06 13:28:04 +0100947 EXPECT_EQ(storage_->thread_slice_table().id().row_map().size(), 2u);
948 auto id_0 = storage_->thread_slice_table().id().IndexOf(SliceId(0u));
949 EXPECT_TRUE(id_0);
950 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_0], 2005000);
951 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_0], 5000);
952 auto id_1 = storage_->thread_slice_table().id().IndexOf(SliceId(1u));
953 EXPECT_TRUE(id_1);
954 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_1], 2007000);
955 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_1], 0);
Eric Seckler58fcbf12019-08-07 15:05:43 +0100956}
957
Eric Seckler56a007d2019-05-02 16:25:14 +0100958TEST_F(ProtoTraceParserTest, TrackEventWithInternedData) {
Eric Seckler56a007d2019-05-02 16:25:14 +0100959 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200960 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +0100961 packet->set_trusted_packet_sequence_id(1);
962 packet->set_incremental_state_cleared(true);
963 auto* thread_desc = packet->set_thread_descriptor();
964 thread_desc->set_pid(15);
965 thread_desc->set_tid(16);
966 thread_desc->set_reference_timestamp_us(1000);
967 thread_desc->set_reference_thread_time_us(2000);
Eric Seckler54f30a32019-07-19 15:10:29 +0100968 thread_desc->set_reference_thread_instruction_count(3000);
Eric Seckler56a007d2019-05-02 16:25:14 +0100969 }
970 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200971 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +0100972 packet->set_trusted_packet_sequence_id(1);
973 auto* event = packet->set_track_event();
Eric Seckler54f30a32019-07-19 15:10:29 +0100974 event->set_timestamp_delta_us(10); // absolute: 1010.
975 event->set_thread_time_delta_us(5); // absolute: 2005.
976 event->set_thread_instruction_count_delta(20); // absolute: 3020.
Eric Seckler56a007d2019-05-02 16:25:14 +0100977 event->add_category_iids(1);
978 auto* legacy_event = event->set_legacy_event();
979 legacy_event->set_name_iid(1);
980 legacy_event->set_phase('B');
981
982 auto* interned_data = packet->set_interned_data();
983 auto cat1 = interned_data->add_event_categories();
984 cat1->set_iid(1);
985 cat1->set_name("cat1");
Eric Seckler0c460ef2019-08-14 15:42:36 +0100986 auto ev1 = interned_data->add_event_names();
Eric Seckler56a007d2019-05-02 16:25:14 +0100987 ev1->set_iid(1);
988 ev1->set_name("ev1");
989 }
990 {
Primiano Tuccibb371732020-08-07 17:25:11 +0200991 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +0100992 packet->set_trusted_packet_sequence_id(1);
993 auto* event = packet->set_track_event();
Eric Seckler651ca312019-06-05 16:41:51 +0100994 event->set_timestamp_absolute_us(1040);
995 event->set_thread_time_absolute_us(2030);
Eric Seckler54f30a32019-07-19 15:10:29 +0100996 event->set_thread_instruction_count_absolute(3100);
Eric Seckler651ca312019-06-05 16:41:51 +0100997 event->add_category_iids(1);
998 auto* legacy_event = event->set_legacy_event();
999 legacy_event->set_name_iid(1);
1000 legacy_event->set_phase('I');
1001 }
1002 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001003 auto* packet = trace_->add_packet();
Eric Seckler651ca312019-06-05 16:41:51 +01001004 packet->set_trusted_packet_sequence_id(1);
1005 auto* event = packet->set_track_event();
Eric Secklera0366df2019-06-07 14:42:56 +01001006 event->set_timestamp_absolute_us(1050);
1007 event->add_category_iids(1);
1008 auto* legacy_event = event->set_legacy_event();
1009 legacy_event->set_name_iid(1);
1010 legacy_event->set_phase('i');
1011 legacy_event->set_instant_event_scope(
1012 protos::pbzero::TrackEvent::LegacyEvent::SCOPE_PROCESS);
1013 }
1014 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001015 auto* packet = trace_->add_packet();
Eric Secklera0366df2019-06-07 14:42:56 +01001016 packet->set_trusted_packet_sequence_id(1);
1017 auto* event = packet->set_track_event();
Eric Seckler54f30a32019-07-19 15:10:29 +01001018 event->set_timestamp_delta_us(10); // absolute: 1020.
1019 event->set_thread_time_delta_us(5); // absolute: 2010.
1020 event->set_thread_instruction_count_delta(20); // absolute: 3040.
Eric Seckler56a007d2019-05-02 16:25:14 +01001021 event->add_category_iids(1);
1022 auto* legacy_event = event->set_legacy_event();
1023 legacy_event->set_name_iid(1);
1024 legacy_event->set_phase('E');
1025 }
1026 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001027 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001028 packet->set_trusted_packet_sequence_id(1);
1029 auto* event = packet->set_track_event();
1030 event->set_timestamp_absolute_us(1005);
1031 event->set_thread_time_absolute_us(2003);
Eric Seckler54f30a32019-07-19 15:10:29 +01001032 event->set_thread_instruction_count_absolute(3010);
Eric Seckler56a007d2019-05-02 16:25:14 +01001033 event->add_category_iids(2);
1034 event->add_category_iids(3);
1035 auto* legacy_event = event->set_legacy_event();
Eric Seckler624e60f2019-10-14 20:57:50 +01001036 legacy_event->set_name_iid(4);
Eric Seckler56a007d2019-05-02 16:25:14 +01001037 legacy_event->set_phase('X');
Eric Seckler54f30a32019-07-19 15:10:29 +01001038 legacy_event->set_duration_us(23); // absolute end: 1028.
1039 legacy_event->set_thread_duration_us(12); // absolute end: 2015.
1040 legacy_event->set_thread_instruction_delta(50); // absolute end: 3060.
Eric Seckler6f13e332019-10-15 12:14:04 +01001041 legacy_event->set_bind_id(9999);
Eric Seckler6f13e332019-10-15 12:14:04 +01001042 legacy_event->set_flow_direction(
Andriidd07cb12020-09-10 16:09:01 +03001043 protos::pbzero::TrackEvent::LegacyEvent::FLOW_OUT);
Eric Seckler56a007d2019-05-02 16:25:14 +01001044
1045 auto* interned_data = packet->set_interned_data();
1046 auto cat2 = interned_data->add_event_categories();
1047 cat2->set_iid(2);
1048 cat2->set_name("cat2");
1049 auto cat3 = interned_data->add_event_categories();
1050 cat3->set_iid(3);
1051 cat3->set_name("cat3");
Eric Seckler0c460ef2019-08-14 15:42:36 +01001052 auto ev2 = interned_data->add_event_names();
Eric Seckler624e60f2019-10-14 20:57:50 +01001053 ev2->set_iid(4);
Eric Seckler56a007d2019-05-02 16:25:14 +01001054 ev2->set_name("ev2");
1055 }
1056
Andriidd07cb12020-09-10 16:09:01 +03001057 {
1058 auto* packet = trace_->add_packet();
1059 packet->set_trusted_packet_sequence_id(1);
1060 auto* thread_desc = packet->set_thread_descriptor();
1061 thread_desc->set_pid(15);
1062 thread_desc->set_tid(16);
1063 auto* event = packet->set_track_event();
1064 event->set_timestamp_absolute_us(1005);
1065 event->add_category_iids(2);
1066 auto* legacy_event = event->set_legacy_event();
1067 legacy_event->set_name_iid(4);
1068 legacy_event->set_phase('t');
1069 legacy_event->set_unscoped_id(220);
1070 }
1071
1072 {
1073 auto* packet = trace_->add_packet();
1074 packet->set_trusted_packet_sequence_id(1);
1075 auto* thread_desc = packet->set_thread_descriptor();
1076 thread_desc->set_pid(15);
1077 thread_desc->set_tid(16);
1078 auto* event = packet->set_track_event();
1079 event->set_timestamp_absolute_us(1005);
1080 event->add_category_iids(2);
1081 auto* legacy_event = event->set_legacy_event();
1082 legacy_event->set_name_iid(4);
1083 legacy_event->set_phase('f');
1084 legacy_event->set_unscoped_id(330);
1085 legacy_event->set_bind_to_enclosing(false);
1086 }
1087
Eric Seckler56a007d2019-05-02 16:25:14 +01001088 Tokenize();
1089
Lalit Maganti09e840c2021-09-22 15:23:17 +01001090 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Seckler56a007d2019-05-02 16:25:14 +01001091
Lalit Magantieac7fff2020-01-10 16:42:54 +00001092 tables::ThreadTable::Row row(16);
1093 row.upid = 2u;
1094 storage_->mutable_thread_table()->Insert(row);
Eric Secklera0366df2019-06-07 14:42:56 +01001095
Lalit Magantib0e11f62020-01-02 14:17:58 +00001096 constexpr TrackId thread_1_track{0u};
Eric Seckler063ed392020-04-03 18:26:30 +01001097 constexpr TrackId thread_time_track{1u};
1098 constexpr TrackId thread_instruction_count_track{2u};
1099 constexpr TrackId process_2_track{3u};
Lalit Maganti21b21632019-09-28 16:50:23 +01001100
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001101 StringId cat_1 = storage_->InternString("cat1");
1102 StringId ev_1 = storage_->InternString("ev1");
Eric Seckler02cdcef2019-10-14 08:56:28 +01001103
1104 InSequence in_sequence; // Below slices should be sorted by timestamp.
1105
Lalit Maganti7449dc82019-12-30 15:52:35 +00001106 MockBoundInserter inserter;
Eric Seckler411e9c82020-05-04 13:36:25 +01001107 // Only the begin timestamp counters can be imported into the counter table.
Eric Seckler063ed392020-04-03 18:26:30 +01001108 EXPECT_CALL(*event_, PushCounter(1005000, testing::DoubleEq(2003000),
1109 thread_time_track));
Eric Seckler063ed392020-04-03 18:26:30 +01001110 EXPECT_CALL(*event_, PushCounter(1005000, testing::DoubleEq(3010),
1111 thread_instruction_count_track));
Stephen Nuskof848d462021-04-06 13:28:04 +01001112 EXPECT_CALL(*slice_, StartSlice(1005000, thread_1_track, _, _))
1113 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
1114 InvokeArgument<2>(&inserter), Return(SliceId(0u))));
Andriidd07cb12020-09-10 16:09:01 +03001115
1116 EXPECT_CALL(*flow_, Begin(_, _));
1117
1118 EXPECT_CALL(*flow_, Step(_, _));
1119
Andrii1b50d2e2020-10-05 16:05:30 +03001120 EXPECT_CALL(*flow_, End(_, _, false, false));
Eric Seckler56a007d2019-05-02 16:25:14 +01001121
Eric Seckler063ed392020-04-03 18:26:30 +01001122 EXPECT_CALL(*event_, PushCounter(1010000, testing::DoubleEq(2005000),
1123 thread_time_track));
1124 EXPECT_CALL(*event_, PushCounter(1010000, testing::DoubleEq(3020),
1125 thread_instruction_count_track));
Stephen Nuskof848d462021-04-06 13:28:04 +01001126 EXPECT_CALL(*slice_, StartSlice(1010000, thread_1_track, _, _))
1127 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
1128 InvokeArgument<2>(&inserter), Return(SliceId(1u))));
Lalit Maganti21b21632019-09-28 16:50:23 +01001129
Eric Seckler063ed392020-04-03 18:26:30 +01001130 EXPECT_CALL(*event_, PushCounter(1020000, testing::DoubleEq(2010000),
1131 thread_time_track));
1132 EXPECT_CALL(*event_, PushCounter(1020000, testing::DoubleEq(3040),
1133 thread_instruction_count_track));
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001134 EXPECT_CALL(*slice_, End(1020000, thread_1_track, cat_1, ev_1, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +00001135 .WillOnce(DoAll(InvokeArgument<4>(&inserter), Return(SliceId(1u))));
Lalit Maganti21b21632019-09-28 16:50:23 +01001136
Eric Seckler063ed392020-04-03 18:26:30 +01001137 EXPECT_CALL(*event_, PushCounter(1040000, testing::DoubleEq(2030000),
1138 thread_time_track));
1139 EXPECT_CALL(*event_, PushCounter(1040000, testing::DoubleEq(3100),
1140 thread_instruction_count_track));
Stephen Nuskof848d462021-04-06 13:28:04 +01001141 EXPECT_CALL(*slice_, StartSlice(1040000, thread_1_track, _, _))
1142 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
1143 InvokeArgument<2>(&inserter), Return(SliceId(2u))));
Eric Secklera0366df2019-06-07 14:42:56 +01001144
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001145 EXPECT_CALL(*slice_, Scoped(1050000, process_2_track, cat_1, ev_1, 0, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +00001146 .WillOnce(DoAll(InvokeArgument<5>(&inserter), Return(SliceId(3u))));
Eric Secklerbb0e1542020-01-16 13:44:13 +00001147 // Second slice should have a legacy_event.passthrough_utid arg.
Eric Secklerc7b0c612020-02-12 18:30:35 +00001148 EXPECT_CALL(inserter, AddArg(_, _, Variadic::UnsignedInteger(1u), _));
Eric Seckler87fd11a2019-06-07 15:52:28 +01001149
1150 context_.sorter->ExtractEventsForced();
Eric Secklerd3b89d52019-07-10 15:36:29 +01001151
Stephen Nuskof848d462021-04-06 13:28:04 +01001152 EXPECT_EQ(storage_->thread_slice_table().id().row_map().size(), 3u);
1153 auto id_0 = storage_->thread_slice_table().id().IndexOf(SliceId(0u));
1154 EXPECT_TRUE(id_0);
1155 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_0], 2003000);
1156 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_0], 12000);
1157 EXPECT_EQ(storage_->thread_slice_table().thread_instruction_count()[*id_0],
1158 3010);
1159 EXPECT_EQ(storage_->thread_slice_table().thread_instruction_delta()[*id_0],
1160 50);
1161 auto id_1 = storage_->thread_slice_table().id().IndexOf(SliceId(1u));
1162 EXPECT_TRUE(id_1);
1163 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_1], 2005000);
1164 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_1], 5000);
1165 EXPECT_EQ(storage_->thread_slice_table().thread_instruction_count()[*id_1],
1166 3020);
1167 EXPECT_EQ(storage_->thread_slice_table().thread_instruction_delta()[*id_1],
1168 20);
1169 auto id_2 = storage_->thread_slice_table().id().IndexOf(SliceId(2u));
1170 EXPECT_TRUE(id_2);
1171 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_2], 2030000);
1172 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_2], 0);
1173 EXPECT_EQ(storage_->thread_slice_table().thread_instruction_count()[*id_2],
1174 3100);
1175 EXPECT_EQ(storage_->thread_slice_table().thread_instruction_delta()[*id_2],
1176 0);
Eric Seckler87fd11a2019-06-07 15:52:28 +01001177}
1178
1179TEST_F(ProtoTraceParserTest, TrackEventAsyncEvents) {
Eric Seckler87fd11a2019-06-07 15:52:28 +01001180 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001181 auto* packet = trace_->add_packet();
Eric Seckler87fd11a2019-06-07 15:52:28 +01001182 packet->set_trusted_packet_sequence_id(1);
1183 packet->set_incremental_state_cleared(true);
1184 auto* thread_desc = packet->set_thread_descriptor();
1185 thread_desc->set_pid(15);
1186 thread_desc->set_tid(16);
1187 thread_desc->set_reference_timestamp_us(1000);
1188 thread_desc->set_reference_thread_time_us(2000);
Eric Seckler54f30a32019-07-19 15:10:29 +01001189 thread_desc->set_reference_thread_instruction_count(3000);
Eric Seckler87fd11a2019-06-07 15:52:28 +01001190 }
1191 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001192 auto* packet = trace_->add_packet();
Eric Seckler87fd11a2019-06-07 15:52:28 +01001193 packet->set_trusted_packet_sequence_id(1);
1194 auto* event = packet->set_track_event();
Eric Seckler54f30a32019-07-19 15:10:29 +01001195 event->set_timestamp_delta_us(10); // absolute: 1010.
1196 event->set_thread_time_delta_us(5); // absolute: 2005.
1197 event->set_thread_instruction_count_delta(20); // absolute: 3020.
Eric Seckler87fd11a2019-06-07 15:52:28 +01001198 event->add_category_iids(1);
1199 auto* legacy_event = event->set_legacy_event();
1200 legacy_event->set_name_iid(1);
1201 legacy_event->set_phase('b');
1202 legacy_event->set_global_id(10);
Eric Secklerc3430c62019-07-22 10:49:58 +01001203 legacy_event->set_use_async_tts(true);
Eric Seckler87fd11a2019-06-07 15:52:28 +01001204
1205 auto* interned_data = packet->set_interned_data();
1206 auto cat1 = interned_data->add_event_categories();
1207 cat1->set_iid(1);
1208 cat1->set_name("cat1");
Eric Seckler0c460ef2019-08-14 15:42:36 +01001209 auto ev1 = interned_data->add_event_names();
Eric Seckler87fd11a2019-06-07 15:52:28 +01001210 ev1->set_iid(1);
1211 ev1->set_name("ev1");
1212 }
1213 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001214 auto* packet = trace_->add_packet();
Eric Seckler87fd11a2019-06-07 15:52:28 +01001215 packet->set_trusted_packet_sequence_id(1);
1216 auto* event = packet->set_track_event();
Eric Seckler54f30a32019-07-19 15:10:29 +01001217 event->set_timestamp_delta_us(10); // absolute: 1020.
1218 event->set_thread_time_delta_us(5); // absolute: 2010.
1219 event->set_thread_instruction_count_delta(20); // absolute: 3040.
Eric Seckler87fd11a2019-06-07 15:52:28 +01001220 event->add_category_iids(1);
1221 auto* legacy_event = event->set_legacy_event();
1222 legacy_event->set_name_iid(1);
1223 legacy_event->set_phase('e');
1224 legacy_event->set_global_id(10);
Eric Secklerc3430c62019-07-22 10:49:58 +01001225 legacy_event->set_use_async_tts(true);
Eric Seckler87fd11a2019-06-07 15:52:28 +01001226 }
1227 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001228 auto* packet = trace_->add_packet();
Eric Seckler87fd11a2019-06-07 15:52:28 +01001229 packet->set_trusted_packet_sequence_id(1);
1230 auto* event = packet->set_track_event();
1231 event->set_timestamp_absolute_us(1015);
Eric Secklerebe76eb2019-10-16 14:49:12 +01001232 event->add_category_iids(1);
Eric Seckler87fd11a2019-06-07 15:52:28 +01001233 auto* legacy_event = event->set_legacy_event();
1234 legacy_event->set_name_iid(2);
1235 legacy_event->set_phase('n');
1236 legacy_event->set_global_id(10);
1237
1238 auto* interned_data = packet->set_interned_data();
Eric Seckler0c460ef2019-08-14 15:42:36 +01001239 auto ev2 = interned_data->add_event_names();
Eric Seckler87fd11a2019-06-07 15:52:28 +01001240 ev2->set_iid(2);
1241 ev2->set_name("ev2");
1242 }
1243 {
Eric Secklerebe76eb2019-10-16 14:49:12 +01001244 // Different category but same global_id -> separate track.
Primiano Tuccibb371732020-08-07 17:25:11 +02001245 auto* packet = trace_->add_packet();
Eric Secklerebe76eb2019-10-16 14:49:12 +01001246 packet->set_trusted_packet_sequence_id(1);
1247 auto* event = packet->set_track_event();
1248 event->set_timestamp_absolute_us(1018);
1249 event->add_category_iids(2);
1250 auto* legacy_event = event->set_legacy_event();
1251 legacy_event->set_name_iid(2);
1252 legacy_event->set_phase('n');
1253 legacy_event->set_global_id(15);
1254
1255 auto* interned_data = packet->set_interned_data();
1256 auto cat2 = interned_data->add_event_categories();
1257 cat2->set_iid(2);
1258 cat2->set_name("cat2");
1259 }
1260 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001261 auto* packet = trace_->add_packet();
Eric Seckler87fd11a2019-06-07 15:52:28 +01001262 packet->set_trusted_packet_sequence_id(1);
1263 auto* event = packet->set_track_event();
1264 event->set_timestamp_absolute_us(1030);
1265 event->add_category_iids(2);
1266 auto* legacy_event = event->set_legacy_event();
1267 legacy_event->set_name_iid(2);
1268 legacy_event->set_phase('n');
1269 legacy_event->set_local_id(15);
1270 legacy_event->set_id_scope("scope1");
1271 }
1272
1273 Tokenize();
1274
Eric Seckler137a4672019-10-24 08:51:14 +01001275 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Secklerb32cacf2019-09-27 16:51:19 +01001276
Lalit Magantieac7fff2020-01-10 16:42:54 +00001277 tables::ThreadTable::Row row(16);
1278 row.upid = 1u;
1279 storage_->mutable_thread_table()->Insert(row);
Eric Seckler87fd11a2019-06-07 15:52:28 +01001280
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001281 StringId cat_1 = storage_->InternString("cat1");
1282 StringId ev_1 = storage_->InternString("ev1");
1283 StringId cat_2 = storage_->InternString("cat2");
1284 StringId ev_2 = storage_->InternString("ev2");
Eric Seckler02cdcef2019-10-14 08:56:28 +01001285
Eric Seckler063ed392020-04-03 18:26:30 +01001286 TrackId thread_time_track{2u};
1287 TrackId thread_instruction_count_track{3u};
1288
Eric Seckler87fd11a2019-06-07 15:52:28 +01001289 InSequence in_sequence; // Below slices should be sorted by timestamp.
1290
Eric Seckler063ed392020-04-03 18:26:30 +01001291 EXPECT_CALL(*event_, PushCounter(1010000, testing::DoubleEq(2005000),
1292 thread_time_track));
1293 EXPECT_CALL(*event_, PushCounter(1010000, testing::DoubleEq(3020),
1294 thread_instruction_count_track));
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001295 EXPECT_CALL(*slice_, Begin(1010000, TrackId{1}, cat_1, ev_1, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +00001296 .WillOnce(Return(SliceId(0u)));
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001297 EXPECT_CALL(*slice_, Scoped(1015000, TrackId{1}, cat_1, ev_2, 0, _));
Eric Seckler063ed392020-04-03 18:26:30 +01001298 EXPECT_CALL(*slice_, Scoped(1018000, TrackId{4}, cat_2, ev_2, 0, _));
1299 EXPECT_CALL(*event_, PushCounter(1020000, testing::DoubleEq(2010000),
1300 thread_time_track));
1301 EXPECT_CALL(*event_, PushCounter(1020000, testing::DoubleEq(3040),
1302 thread_instruction_count_track));
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001303 EXPECT_CALL(*slice_, End(1020000, TrackId{1}, cat_1, ev_1, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +00001304 .WillOnce(Return(SliceId(SliceId(0u))));
Eric Seckler063ed392020-04-03 18:26:30 +01001305 EXPECT_CALL(*slice_, Scoped(1030000, TrackId{5}, cat_2, ev_2, 0, _));
Eric Seckler651ca312019-06-05 16:41:51 +01001306
Eric Seckler56a007d2019-05-02 16:25:14 +01001307 context_.sorter->ExtractEventsForced();
Eric Seckler5703ede2019-07-10 10:13:02 +01001308
Eric Seckler063ed392020-04-03 18:26:30 +01001309 // First track is for the thread; second first async, third and fourth for
1310 // thread time and instruction count, others are the async event tracks.
1311 EXPECT_EQ(storage_->track_table().row_count(), 6u);
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001312 EXPECT_EQ(storage_->track_table().name()[1], ev_1);
Eric Seckler063ed392020-04-03 18:26:30 +01001313 EXPECT_EQ(storage_->track_table().name()[4], ev_2);
1314 EXPECT_EQ(storage_->track_table().name()[5], ev_2);
Lalit Maganti53bdbb22019-09-25 11:11:18 +01001315
Lalit Maganti7e24f062019-12-17 18:10:35 +00001316 EXPECT_EQ(storage_->process_track_table().row_count(), 3u);
Lalit Maganti53bdbb22019-09-25 11:11:18 +01001317 EXPECT_EQ(storage_->process_track_table().upid()[0], 1u);
Eric Secklerebe76eb2019-10-16 14:49:12 +01001318 EXPECT_EQ(storage_->process_track_table().upid()[1], 1u);
1319 EXPECT_EQ(storage_->process_track_table().upid()[2], 1u);
Eric Secklerc3430c62019-07-22 10:49:58 +01001320
1321 EXPECT_EQ(storage_->virtual_track_slices().slice_count(), 1u);
Lalit Magantif523f2a2021-03-01 13:58:27 +00001322 EXPECT_EQ(storage_->virtual_track_slices().slice_ids()[0], SliceId(0u));
Eric Secklerc3430c62019-07-22 10:49:58 +01001323 EXPECT_EQ(storage_->virtual_track_slices().thread_timestamp_ns()[0], 2005000);
1324 EXPECT_EQ(storage_->virtual_track_slices().thread_duration_ns()[0], 5000);
Eric Seckler54f30a32019-07-19 15:10:29 +01001325 EXPECT_EQ(storage_->virtual_track_slices().thread_instruction_counts()[0],
1326 3020);
1327 EXPECT_EQ(storage_->virtual_track_slices().thread_instruction_deltas()[0],
1328 20);
Eric Seckler56a007d2019-05-02 16:25:14 +01001329}
1330
Eric Secklerb32cacf2019-09-27 16:51:19 +01001331// TODO(eseckler): Also test instant events on separate tracks.
1332TEST_F(ProtoTraceParserTest, TrackEventWithTrackDescriptors) {
Eric Secklerb32cacf2019-09-27 16:51:19 +01001333 // Sequence 1.
1334 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001335 auto* packet = trace_->add_packet();
Eric Secklerb32cacf2019-09-27 16:51:19 +01001336 packet->set_trusted_packet_sequence_id(1);
1337 packet->set_incremental_state_cleared(true);
Eric Seckler3183c6d2020-01-14 15:45:20 +00001338 packet->set_timestamp(1000000);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001339 auto* track_desc = packet->set_track_descriptor();
1340 track_desc->set_uuid(1234);
1341 track_desc->set_name("Thread track 1");
1342 auto* thread_desc = track_desc->set_thread();
1343 thread_desc->set_pid(15);
1344 thread_desc->set_tid(16);
ssid812a4222021-01-07 00:52:39 -08001345 auto* chrome_thread = track_desc->set_chrome_thread();
1346 chrome_thread->set_thread_type(
1347 protos::pbzero::ChromeThreadDescriptor::THREAD_SAMPLING_PROFILER);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001348 }
1349 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001350 auto* packet = trace_->add_packet();
Eric Secklerb32cacf2019-09-27 16:51:19 +01001351 packet->set_trusted_packet_sequence_id(1);
Eric Seckler3183c6d2020-01-14 15:45:20 +00001352 packet->set_timestamp(1000000);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001353 auto* track_desc = packet->set_track_descriptor();
1354 track_desc->set_uuid(5678);
1355 track_desc->set_name("Async track 1");
1356 }
1357 {
1358 // Async event started on "Async track 1".
Primiano Tuccibb371732020-08-07 17:25:11 +02001359 auto* packet = trace_->add_packet();
Eric Secklerb32cacf2019-09-27 16:51:19 +01001360 packet->set_trusted_packet_sequence_id(1);
1361 packet->set_timestamp(1010000);
1362 auto* event = packet->set_track_event();
1363 event->set_track_uuid(5678);
1364 event->set_thread_time_absolute_us(2005);
1365 event->set_thread_instruction_count_absolute(3020);
1366 event->add_category_iids(1);
1367 event->set_name_iid(1);
1368 event->set_type(protos::pbzero::TrackEvent::TYPE_SLICE_BEGIN);
1369 auto* legacy_event = event->set_legacy_event();
1370 legacy_event->set_use_async_tts(true);
1371
1372 auto* interned_data = packet->set_interned_data();
1373 auto cat1 = interned_data->add_event_categories();
1374 cat1->set_iid(1);
1375 cat1->set_name("cat1");
1376 auto ev1 = interned_data->add_event_names();
1377 ev1->set_iid(1);
1378 ev1->set_name("ev1");
1379 }
1380 {
1381 // Instant event on "Thread track 1".
Primiano Tuccibb371732020-08-07 17:25:11 +02001382 auto* packet = trace_->add_packet();
Eric Secklerb32cacf2019-09-27 16:51:19 +01001383 packet->set_trusted_packet_sequence_id(1);
1384 packet->set_timestamp(1015000);
1385 auto* event = packet->set_track_event();
1386 event->set_track_uuid(1234);
1387 event->set_thread_time_absolute_us(2007);
1388 event->add_category_iids(2);
1389 event->set_name_iid(2);
1390 event->set_type(protos::pbzero::TrackEvent::TYPE_INSTANT);
1391
1392 auto* interned_data = packet->set_interned_data();
1393 auto cat1 = interned_data->add_event_categories();
1394 cat1->set_iid(2);
1395 cat1->set_name("cat2");
1396 auto ev1 = interned_data->add_event_names();
1397 ev1->set_iid(2);
1398 ev1->set_name("ev2");
1399 }
1400
1401 // Sequence 2.
1402 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001403 auto* packet = trace_->add_packet();
Eric Secklerb32cacf2019-09-27 16:51:19 +01001404 packet->set_trusted_packet_sequence_id(2);
1405 packet->set_incremental_state_cleared(true);
Eric Seckler3183c6d2020-01-14 15:45:20 +00001406 packet->set_timestamp(1000000);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001407 auto* track_desc = packet->set_track_descriptor();
1408 track_desc->set_uuid(4321);
1409 track_desc->set_name("Thread track 2");
1410 auto* thread_desc = track_desc->set_thread();
1411 thread_desc->set_pid(15);
1412 thread_desc->set_tid(17);
1413 }
1414 {
Eric Secklerb32cacf2019-09-27 16:51:19 +01001415 // Async event completed on "Async track 1".
Primiano Tuccibb371732020-08-07 17:25:11 +02001416 auto* packet = trace_->add_packet();
Eric Secklerb32cacf2019-09-27 16:51:19 +01001417 packet->set_trusted_packet_sequence_id(2);
1418 packet->set_timestamp(1020000);
1419 auto* event = packet->set_track_event();
1420 event->set_track_uuid(5678);
1421 event->set_thread_time_absolute_us(2010);
1422 event->set_thread_instruction_count_absolute(3040);
1423 event->set_type(protos::pbzero::TrackEvent::TYPE_SLICE_END);
1424 auto* legacy_event = event->set_legacy_event();
1425 legacy_event->set_use_async_tts(true);
1426 }
1427 {
1428 // Instant event on "Thread track 2".
Primiano Tuccibb371732020-08-07 17:25:11 +02001429 auto* packet = trace_->add_packet();
Eric Secklerb32cacf2019-09-27 16:51:19 +01001430 packet->set_trusted_packet_sequence_id(2);
1431 packet->set_timestamp(1016000);
1432 auto* event = packet->set_track_event();
1433 event->set_track_uuid(4321);
1434 event->set_thread_time_absolute_us(2008);
1435 event->add_category_iids(1);
1436 event->set_name_iid(1);
1437 event->set_type(protos::pbzero::TrackEvent::TYPE_INSTANT);
1438
1439 auto* interned_data = packet->set_interned_data();
1440 auto cat1 = interned_data->add_event_categories();
1441 cat1->set_iid(1);
1442 cat1->set_name("cat3");
1443 auto ev1 = interned_data->add_event_names();
1444 ev1->set_iid(1);
1445 ev1->set_name("ev3");
1446 }
1447
ssid812a4222021-01-07 00:52:39 -08001448 EXPECT_CALL(*process_,
1449 UpdateThreadNameByUtid(
1450 1u, storage_->InternString("StackSamplingProfiler"),
1451 ThreadNamePriority::kTrackDescriptorThreadType));
1452 EXPECT_CALL(*process_,
1453 UpdateThreadNameByUtid(2u, kNullStringId,
1454 ThreadNamePriority::kTrackDescriptor));
1455 EXPECT_CALL(*process_,
1456 UpdateThreadNameByUtid(1u, kNullStringId,
1457 ThreadNamePriority::kTrackDescriptor));
Eric Secklerb32cacf2019-09-27 16:51:19 +01001458 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
1459 EXPECT_CALL(*process_, UpdateThread(17, 15)).WillRepeatedly(Return(2));
1460
Lalit Magantieac7fff2020-01-10 16:42:54 +00001461 tables::ThreadTable::Row t1(16);
1462 t1.upid = 1u;
1463 storage_->mutable_thread_table()->Insert(t1);
1464
1465 tables::ThreadTable::Row t2(16);
1466 t2.upid = 2u;
1467 storage_->mutable_thread_table()->Insert(t2);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001468
Eric Secklerb32cacf2019-09-27 16:51:19 +01001469 Tokenize();
1470
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001471 StringId cat_1 = storage_->InternString("cat1");
1472 StringId ev_1 = storage_->InternString("ev1");
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001473
Eric Secklerb32cacf2019-09-27 16:51:19 +01001474 InSequence in_sequence; // Below slices should be sorted by timestamp.
1475
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001476 EXPECT_CALL(*slice_, Begin(1010000, TrackId{1}, cat_1, ev_1, _))
Stephen Nuskof848d462021-04-06 13:28:04 +01001477 .WillOnce(Return(SliceId(2u)));
Eric Secklerb32cacf2019-09-27 16:51:19 +01001478
Eric Seckler063ed392020-04-03 18:26:30 +01001479 EXPECT_CALL(*event_,
Lalit Maganti530a2f52020-12-11 18:20:21 +00001480 PushCounter(1015000, testing::DoubleEq(2007000), TrackId{3}));
Stephen Nuskof848d462021-04-06 13:28:04 +01001481 EXPECT_CALL(*slice_, StartSlice(1015000, TrackId{0}, _, _))
1482 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()), Return(SliceId(0u))));
Eric Secklerb32cacf2019-09-27 16:51:19 +01001483
Eric Seckler063ed392020-04-03 18:26:30 +01001484 EXPECT_CALL(*event_,
Lalit Maganti530a2f52020-12-11 18:20:21 +00001485 PushCounter(1016000, testing::DoubleEq(2008000), TrackId{4}));
Stephen Nuskof848d462021-04-06 13:28:04 +01001486 EXPECT_CALL(*slice_, StartSlice(1016000, TrackId{2}, _, _))
1487 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()), Return(SliceId(1u))));
Eric Secklerb32cacf2019-09-27 16:51:19 +01001488
Lalit Magantif0599a02020-01-15 15:45:20 +00001489 EXPECT_CALL(*slice_,
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001490 End(1020000, TrackId{1}, kNullStringId, kNullStringId, _))
Stephen Nuskof848d462021-04-06 13:28:04 +01001491 .WillOnce(Return(SliceId(2u)));
Eric Secklerb32cacf2019-09-27 16:51:19 +01001492
1493 context_.sorter->ExtractEventsForced();
1494
Eric Secklerc64e19c2020-01-28 15:47:56 +00001495 // First track is "Thread track 1"; second is "Async track 1", third is global
Eric Seckler063ed392020-04-03 18:26:30 +01001496 // default track (parent of async track), fourth is "Thread track 2", fifth &
1497 // sixth are thread time tracks for thread 1 and 2.
Lalit Maganti530a2f52020-12-11 18:20:21 +00001498 EXPECT_EQ(storage_->track_table().row_count(), 5u);
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001499 EXPECT_EQ(storage_->track_table().name().GetString(0), "Thread track 1");
1500 EXPECT_EQ(storage_->track_table().name().GetString(1), "Async track 1");
Lalit Maganti530a2f52020-12-11 18:20:21 +00001501 EXPECT_EQ(storage_->track_table().name().GetString(2), "Thread track 2");
Lalit Maganti7e24f062019-12-17 18:10:35 +00001502 EXPECT_EQ(storage_->thread_track_table().row_count(), 2u);
Eric Seckler3183c6d2020-01-14 15:45:20 +00001503 EXPECT_EQ(storage_->thread_track_table().utid()[0], 1u);
1504 EXPECT_EQ(storage_->thread_track_table().utid()[1], 2u);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001505
1506 EXPECT_EQ(storage_->virtual_track_slices().slice_count(), 1u);
Stephen Nuskof848d462021-04-06 13:28:04 +01001507 EXPECT_EQ(storage_->virtual_track_slices().slice_ids()[0], SliceId(2u));
Eric Secklerb32cacf2019-09-27 16:51:19 +01001508 EXPECT_EQ(storage_->virtual_track_slices().thread_timestamp_ns()[0], 2005000);
1509 EXPECT_EQ(storage_->virtual_track_slices().thread_duration_ns()[0], 5000);
1510 EXPECT_EQ(storage_->virtual_track_slices().thread_instruction_counts()[0],
1511 3020);
1512 EXPECT_EQ(storage_->virtual_track_slices().thread_instruction_deltas()[0],
1513 20);
1514
Stephen Nuskof848d462021-04-06 13:28:04 +01001515 EXPECT_EQ(storage_->thread_slice_table().id().row_map().size(), 2u);
1516 auto id_0 = storage_->thread_slice_table().id().IndexOf(SliceId(0u));
1517 EXPECT_TRUE(id_0);
1518 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_0], 2007000);
1519 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_0], 0);
1520 // There was no thread instructions in the packets above.
1521 EXPECT_FALSE(
1522 storage_->thread_slice_table().thread_instruction_count()[*id_0]);
1523 EXPECT_FALSE(
1524 storage_->thread_slice_table().thread_instruction_delta()[*id_0]);
1525 auto id_1 = storage_->thread_slice_table().id().IndexOf(SliceId(1u));
1526 EXPECT_TRUE(id_1);
1527 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_1], 2008000);
1528 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_1], 0);
1529 EXPECT_FALSE(
1530 storage_->thread_slice_table().thread_instruction_count()[*id_1]);
1531 EXPECT_FALSE(
1532 storage_->thread_slice_table().thread_instruction_delta()[*id_1]);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001533}
1534
Eric Secklerf1497812020-04-30 10:43:23 +01001535TEST_F(ProtoTraceParserTest, TrackEventWithResortedCounterDescriptor) {
Eric Secklerf1497812020-04-30 10:43:23 +01001536 // Descriptors with timestamps after the event below. They will be tokenized
1537 // in the order they appear here, but then resorted before parsing to appear
1538 // after the events below.
1539 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001540 auto* packet = trace_->add_packet();
Eric Secklerf1497812020-04-30 10:43:23 +01001541 packet->set_trusted_packet_sequence_id(1);
1542 packet->set_incremental_state_cleared(true);
1543 packet->set_timestamp(3000);
1544 auto* track_desc = packet->set_track_descriptor();
1545 track_desc->set_uuid(1);
1546 auto* thread_desc = track_desc->set_thread();
1547 thread_desc->set_pid(5);
1548 thread_desc->set_tid(1);
1549 thread_desc->set_thread_name("t1");
1550 // Default to track for "t1" and an extra counter for thread time.
1551 auto* track_event_defaults =
1552 packet->set_trace_packet_defaults()->set_track_event_defaults();
1553 track_event_defaults->set_track_uuid(1);
1554 // Thread-time counter track defined below.
1555 track_event_defaults->add_extra_counter_track_uuids(10);
1556 }
1557 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001558 auto* packet = trace_->add_packet();
Eric Secklerf1497812020-04-30 10:43:23 +01001559 packet->set_trusted_packet_sequence_id(1);
1560 packet->set_timestamp(3000);
1561 auto* track_desc = packet->set_track_descriptor();
1562 track_desc->set_uuid(10);
1563 track_desc->set_parent_uuid(1);
1564 auto* counter = track_desc->set_counter();
1565 counter->set_type(
1566 protos::pbzero::CounterDescriptor::COUNTER_THREAD_TIME_NS);
1567 counter->set_unit_multiplier(1000); // provided in us.
1568 counter->set_is_incremental(true);
1569 }
1570 {
1571 // Event with timestamps before the descriptors above. The thread time
1572 // counter values should still be imported as counter values and as args for
1573 // JSON export. Should appear on default track "t1" with
1574 // extra_counter_values for "c1".
Primiano Tuccibb371732020-08-07 17:25:11 +02001575 auto* packet = trace_->add_packet();
Eric Secklerf1497812020-04-30 10:43:23 +01001576 packet->set_trusted_packet_sequence_id(1);
1577 packet->set_sequence_flags(
1578 protos::pbzero::TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
1579 packet->set_timestamp(1000);
1580 auto* event = packet->set_track_event();
1581 event->add_categories("cat1");
1582 event->set_name("ev1");
1583 event->set_type(protos::pbzero::TrackEvent::TYPE_SLICE_BEGIN);
1584 event->add_extra_counter_values(1000); // absolute: 1000000.
1585 }
1586 {
1587 // End for "ev1".
Primiano Tuccibb371732020-08-07 17:25:11 +02001588 auto* packet = trace_->add_packet();
Eric Secklerf1497812020-04-30 10:43:23 +01001589 packet->set_trusted_packet_sequence_id(1);
1590 packet->set_timestamp(1100);
1591 auto* event = packet->set_track_event();
1592 event->set_type(protos::pbzero::TrackEvent::TYPE_SLICE_END);
1593 event->add_extra_counter_values(10); // absolute: 1010000.
1594 }
1595
1596 EXPECT_CALL(*process_, UpdateThread(1, 5)).WillRepeatedly(Return(1));
1597
1598 tables::ThreadTable::Row t1(16);
1599 t1.upid = 1u;
1600 storage_->mutable_thread_table()->Insert(t1);
1601
1602 Tokenize();
1603
Eric Secklerf1497812020-04-30 10:43:23 +01001604 InSequence in_sequence; // Below slices should be sorted by timestamp.
1605
1606 EXPECT_CALL(*event_,
1607 PushCounter(1000, testing::DoubleEq(1000000), TrackId{1}));
Stephen Nuskof848d462021-04-06 13:28:04 +01001608 EXPECT_CALL(*slice_, StartSlice(1000, TrackId{0}, _, _))
1609 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()), Return(SliceId(0u))));
Eric Secklerf1497812020-04-30 10:43:23 +01001610
1611 EXPECT_CALL(*event_,
1612 PushCounter(1100, testing::DoubleEq(1010000), TrackId{1}));
1613 EXPECT_CALL(*slice_, End(1100, TrackId{0}, kNullStringId, kNullStringId, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +00001614 .WillOnce(Return(SliceId(0u)));
Eric Secklerf1497812020-04-30 10:43:23 +01001615
1616 EXPECT_CALL(*process_,
Mikhail Khokhlov642b8352020-07-24 10:04:39 +01001617 UpdateThreadNameByUtid(1u, storage_->InternString("t1"),
1618 ThreadNamePriority::kTrackDescriptor));
Eric Secklerf1497812020-04-30 10:43:23 +01001619
1620 context_.sorter->ExtractEventsForced();
1621
1622 // First track is thread time track, second is "t1".
1623 EXPECT_EQ(storage_->track_table().row_count(), 2u);
1624 EXPECT_EQ(storage_->thread_track_table().row_count(), 1u);
1625 EXPECT_EQ(storage_->thread_track_table().utid()[0], 1u);
1626
1627 // Counter values should also be imported into thread slices.
Stephen Nuskof848d462021-04-06 13:28:04 +01001628 EXPECT_EQ(storage_->thread_slice_table().id().row_map().size(), 1u);
1629 auto id_0 = storage_->thread_slice_table().id().IndexOf(SliceId(0u));
1630 EXPECT_TRUE(id_0);
1631 EXPECT_EQ(storage_->thread_slice_table().thread_ts()[*id_0], 1000000);
1632 EXPECT_EQ(storage_->thread_slice_table().thread_dur()[*id_0], 10000);
Eric Secklerf1497812020-04-30 10:43:23 +01001633}
1634
Eric Seckler56a007d2019-05-02 16:25:14 +01001635TEST_F(ProtoTraceParserTest, TrackEventWithoutIncrementalStateReset) {
Eric Seckler56a007d2019-05-02 16:25:14 +01001636 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001637 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001638 packet->set_trusted_packet_sequence_id(1);
1639 auto* thread_desc = packet->set_thread_descriptor();
1640 thread_desc->set_pid(15);
1641 thread_desc->set_tid(16);
1642 thread_desc->set_reference_timestamp_us(1000);
1643 thread_desc->set_reference_thread_time_us(2000);
1644 }
1645 {
Eric Seckler772a9812020-02-14 11:58:33 +00001646 // Event should be discarded because delta timestamps require valid
1647 // incremental state + thread descriptor.
Primiano Tuccibb371732020-08-07 17:25:11 +02001648 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001649 packet->set_trusted_packet_sequence_id(1);
1650 auto* event = packet->set_track_event();
1651 event->set_timestamp_delta_us(10); // absolute: 1010.
1652 event->set_thread_time_delta_us(5); // absolute: 2005.
1653 event->add_category_iids(1);
1654 auto* legacy_event = event->set_legacy_event();
1655 legacy_event->set_name_iid(1);
1656 legacy_event->set_phase('B');
1657 }
Eric Seckler772a9812020-02-14 11:58:33 +00001658 {
1659 // Event should be discarded because it specifies
1660 // SEQ_NEEDS_INCREMENTAL_STATE.
Primiano Tuccibb371732020-08-07 17:25:11 +02001661 auto* packet = trace_->add_packet();
Eric Seckler772a9812020-02-14 11:58:33 +00001662 packet->set_timestamp(2000000);
1663 packet->set_trusted_packet_sequence_id(1);
1664 packet->set_sequence_flags(
1665 protos::pbzero::TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
1666 auto* event = packet->set_track_event();
1667 event->add_categories("cat");
1668 event->set_name("ev1");
1669 event->set_type(protos::pbzero::TrackEvent::TYPE_INSTANT);
1670 }
1671 {
1672 // Event should be accepted because it does not specify
1673 // SEQ_NEEDS_INCREMENTAL_STATE and uses absolute timestamps.
Primiano Tuccibb371732020-08-07 17:25:11 +02001674 auto* packet = trace_->add_packet();
Eric Seckler772a9812020-02-14 11:58:33 +00001675 packet->set_timestamp(2100000);
1676 packet->set_trusted_packet_sequence_id(1);
1677 auto* event = packet->set_track_event();
1678 event->add_categories("cat1");
1679 event->set_name("ev2");
1680 event->set_type(protos::pbzero::TrackEvent::TYPE_INSTANT);
1681 }
Eric Seckler56a007d2019-05-02 16:25:14 +01001682
1683 Tokenize();
1684
Eric Seckler772a9812020-02-14 11:58:33 +00001685 StringId cat1 = storage_->InternString("cat1");
1686 StringId ev2 = storage_->InternString("ev2");
1687
1688 EXPECT_CALL(*slice_, Scoped(2100000, TrackId{0}, cat1, ev2, 0, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +00001689 .WillOnce(Return(SliceId(0u)));
Eric Seckler56a007d2019-05-02 16:25:14 +01001690 context_.sorter->ExtractEventsForced();
1691}
1692
1693TEST_F(ProtoTraceParserTest, TrackEventWithoutThreadDescriptor) {
Eric Seckler56a007d2019-05-02 16:25:14 +01001694 {
Eric Seckler772a9812020-02-14 11:58:33 +00001695 // Event should be discarded because it specifies delta timestamps and no
1696 // thread descriptor was seen yet.
Primiano Tuccibb371732020-08-07 17:25:11 +02001697 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001698 packet->set_trusted_packet_sequence_id(1);
1699 packet->set_incremental_state_cleared(true);
1700 auto* event = packet->set_track_event();
1701 event->set_timestamp_delta_us(10);
1702 event->set_thread_time_delta_us(5);
1703 event->add_category_iids(1);
1704 auto* legacy_event = event->set_legacy_event();
1705 legacy_event->set_name_iid(1);
1706 legacy_event->set_phase('B');
1707 }
Eric Seckler772a9812020-02-14 11:58:33 +00001708 {
1709 // Events that specify SEQ_NEEDS_INCREMENTAL_STATE should be accepted even
1710 // if there's no valid thread descriptor.
Primiano Tuccibb371732020-08-07 17:25:11 +02001711 auto* packet = trace_->add_packet();
Eric Seckler772a9812020-02-14 11:58:33 +00001712 packet->set_timestamp(2000000);
1713 packet->set_trusted_packet_sequence_id(1);
1714 packet->set_sequence_flags(
1715 protos::pbzero::TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
1716 auto* event = packet->set_track_event();
1717 event->add_categories("cat1");
1718 event->set_name("ev1");
1719 event->set_type(protos::pbzero::TrackEvent::TYPE_INSTANT);
1720 }
Eric Seckler56a007d2019-05-02 16:25:14 +01001721
1722 Tokenize();
1723
Eric Seckler772a9812020-02-14 11:58:33 +00001724 StringId cat1 = storage_->InternString("cat1");
1725 StringId ev1 = storage_->InternString("ev1");
1726
1727 EXPECT_CALL(*slice_, Scoped(2000000, TrackId{0}, cat1, ev1, 0, _))
Lalit Magantif523f2a2021-03-01 13:58:27 +00001728 .WillOnce(Return(SliceId(0u)));
Eric Seckler56a007d2019-05-02 16:25:14 +01001729 context_.sorter->ExtractEventsForced();
1730}
1731
1732TEST_F(ProtoTraceParserTest, TrackEventWithDataLoss) {
Eric Seckler56a007d2019-05-02 16:25:14 +01001733 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001734 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001735 packet->set_trusted_packet_sequence_id(1);
1736 packet->set_incremental_state_cleared(true);
1737 auto* thread_desc = packet->set_thread_descriptor();
1738 thread_desc->set_pid(15);
1739 thread_desc->set_tid(16);
1740 thread_desc->set_reference_timestamp_us(1000);
Eric Seckler56a007d2019-05-02 16:25:14 +01001741 }
1742 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001743 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001744 packet->set_trusted_packet_sequence_id(1);
1745 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01001746 event->set_timestamp_delta_us(10); // absolute: 1010.
Eric Seckler56a007d2019-05-02 16:25:14 +01001747 event->add_category_iids(1);
1748 auto* legacy_event = event->set_legacy_event();
1749 legacy_event->set_name_iid(1);
1750 legacy_event->set_phase('B');
1751 }
1752 {
1753 // Event should be dropped because data loss occurred before.
Primiano Tuccibb371732020-08-07 17:25:11 +02001754 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001755 packet->set_trusted_packet_sequence_id(1);
1756 packet->set_previous_packet_dropped(true); // Data loss occurred.
1757 auto* event = packet->set_track_event();
1758 event->set_timestamp_delta_us(10);
Eric Seckler56a007d2019-05-02 16:25:14 +01001759 event->add_category_iids(1);
1760 auto* legacy_event = event->set_legacy_event();
1761 legacy_event->set_name_iid(1);
1762 legacy_event->set_phase('E');
1763 }
1764 {
1765 // Event should be dropped because incremental state is invalid.
Primiano Tuccibb371732020-08-07 17:25:11 +02001766 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001767 packet->set_trusted_packet_sequence_id(1);
1768 auto* event = packet->set_track_event();
1769 event->set_timestamp_delta_us(10);
Eric Seckler56a007d2019-05-02 16:25:14 +01001770 event->add_category_iids(1);
1771 auto* legacy_event = event->set_legacy_event();
1772 legacy_event->set_name_iid(1);
1773 legacy_event->set_phase('E');
1774 }
1775 {
1776 // Event should be dropped because no new thread descriptor was seen yet.
Primiano Tuccibb371732020-08-07 17:25:11 +02001777 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001778 packet->set_trusted_packet_sequence_id(1);
1779 packet->set_incremental_state_cleared(true);
1780 auto* event = packet->set_track_event();
1781 event->set_timestamp_delta_us(10);
Eric Seckler56a007d2019-05-02 16:25:14 +01001782 event->add_category_iids(1);
1783 auto* legacy_event = event->set_legacy_event();
1784 legacy_event->set_name_iid(1);
1785 legacy_event->set_phase('E');
1786 }
1787 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001788 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001789 packet->set_trusted_packet_sequence_id(1);
1790 auto* thread_desc = packet->set_thread_descriptor();
1791 thread_desc->set_pid(15);
1792 thread_desc->set_tid(16);
1793 thread_desc->set_reference_timestamp_us(2000);
Eric Seckler56a007d2019-05-02 16:25:14 +01001794 }
1795 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001796 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001797 packet->set_trusted_packet_sequence_id(1);
1798 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01001799 event->set_timestamp_delta_us(10); // absolute: 2010.
Eric Seckler56a007d2019-05-02 16:25:14 +01001800 event->add_category_iids(1);
1801 auto* legacy_event = event->set_legacy_event();
1802 legacy_event->set_name_iid(1);
1803 legacy_event->set_phase('E');
1804 }
1805
1806 Tokenize();
1807
Eric Seckler063ed392020-04-03 18:26:30 +01001808 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Seckler56a007d2019-05-02 16:25:14 +01001809
Lalit Magantieac7fff2020-01-10 16:42:54 +00001810 tables::ThreadTable::Row row(16);
1811 row.upid = 1u;
1812 storage_->mutable_thread_table()->Insert(row);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001813
Raymond Chiub2463992020-02-25 16:23:20 -08001814 StringId unknown_cat = storage_->InternString("unknown(1)");
Lalit Magantib0e11f62020-01-02 14:17:58 +00001815 constexpr TrackId track{0u};
Eric Seckler56a007d2019-05-02 16:25:14 +01001816 InSequence in_sequence; // Below slices should be sorted by timestamp.
Stephen Nuskof848d462021-04-06 13:28:04 +01001817 EXPECT_CALL(*slice_, StartSlice(1010000, track, _, _));
Raymond Chiub2463992020-02-25 16:23:20 -08001818 EXPECT_CALL(*slice_, End(2010000, track, unknown_cat, kNullStringId, _));
Eric Seckler56a007d2019-05-02 16:25:14 +01001819
1820 context_.sorter->ExtractEventsForced();
1821}
1822
1823TEST_F(ProtoTraceParserTest, TrackEventMultipleSequences) {
Eric Seckler56a007d2019-05-02 16:25:14 +01001824 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001825 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001826 packet->set_trusted_packet_sequence_id(1);
1827 packet->set_incremental_state_cleared(true);
1828 auto* thread_desc = packet->set_thread_descriptor();
1829 thread_desc->set_pid(15);
1830 thread_desc->set_tid(16);
1831 thread_desc->set_reference_timestamp_us(1000);
Eric Seckler56a007d2019-05-02 16:25:14 +01001832 }
1833 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001834 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001835 packet->set_trusted_packet_sequence_id(1);
1836 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01001837 event->set_timestamp_delta_us(10); // absolute: 1010.
Eric Seckler56a007d2019-05-02 16:25:14 +01001838 event->add_category_iids(1);
1839 auto* legacy_event = event->set_legacy_event();
1840 legacy_event->set_name_iid(1);
1841 legacy_event->set_phase('B');
1842
1843 auto* interned_data = packet->set_interned_data();
1844 auto cat1 = interned_data->add_event_categories();
1845 cat1->set_iid(1);
1846 cat1->set_name("cat1");
Eric Seckler0c460ef2019-08-14 15:42:36 +01001847 auto ev1 = interned_data->add_event_names();
Eric Seckler56a007d2019-05-02 16:25:14 +01001848 ev1->set_iid(1);
1849 ev1->set_name("ev1");
1850 }
1851 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001852 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001853 packet->set_trusted_packet_sequence_id(2);
1854 packet->set_incremental_state_cleared(true);
1855 auto* thread_desc = packet->set_thread_descriptor();
1856 thread_desc->set_pid(15);
1857 thread_desc->set_tid(17);
1858 thread_desc->set_reference_timestamp_us(995);
Eric Seckler56a007d2019-05-02 16:25:14 +01001859 }
1860 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001861 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001862 packet->set_trusted_packet_sequence_id(2);
1863 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01001864 event->set_timestamp_delta_us(10); // absolute: 1005.
Eric Seckler56a007d2019-05-02 16:25:14 +01001865 event->add_category_iids(1);
1866 auto* legacy_event = event->set_legacy_event();
1867 legacy_event->set_name_iid(1);
1868 legacy_event->set_phase('B');
1869
1870 auto* interned_data = packet->set_interned_data();
1871 auto cat1 = interned_data->add_event_categories();
1872 cat1->set_iid(1);
1873 cat1->set_name("cat1");
Eric Seckler0c460ef2019-08-14 15:42:36 +01001874 auto ev2 = interned_data->add_event_names();
Eric Seckler56a007d2019-05-02 16:25:14 +01001875 ev2->set_iid(1);
1876 ev2->set_name("ev2");
1877 }
1878 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001879 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001880 packet->set_trusted_packet_sequence_id(1);
1881 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01001882 event->set_timestamp_delta_us(10); // absolute: 1020.
Eric Seckler56a007d2019-05-02 16:25:14 +01001883 event->add_category_iids(1);
1884 auto* legacy_event = event->set_legacy_event();
1885 legacy_event->set_name_iid(1);
1886 legacy_event->set_phase('E');
1887 }
1888 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001889 auto* packet = trace_->add_packet();
Eric Seckler56a007d2019-05-02 16:25:14 +01001890 packet->set_trusted_packet_sequence_id(2);
1891 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01001892 event->set_timestamp_delta_us(10); // absolute: 1015.
Eric Seckler56a007d2019-05-02 16:25:14 +01001893 event->add_category_iids(1);
1894 auto* legacy_event = event->set_legacy_event();
1895 legacy_event->set_name_iid(1);
1896 legacy_event->set_phase('E');
1897 }
1898
1899 Tokenize();
1900
Lalit Maganti09e840c2021-09-22 15:23:17 +01001901 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
1902 EXPECT_CALL(*process_, UpdateThread(17, 15)).WillRepeatedly(Return(2));
Eric Seckler56a007d2019-05-02 16:25:14 +01001903
Lalit Magantieac7fff2020-01-10 16:42:54 +00001904 tables::ThreadTable::Row t1(16);
1905 t1.upid = 1u;
1906 storage_->mutable_thread_table()->Insert(t1);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001907
Lalit Magantieac7fff2020-01-10 16:42:54 +00001908 tables::ThreadTable::Row t2(17);
1909 t2.upid = 1u;
1910 storage_->mutable_thread_table()->Insert(t2);
Eric Secklerb32cacf2019-09-27 16:51:19 +01001911
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001912 StringId cat_1 = storage_->InternString("cat1");
1913 StringId ev_2 = storage_->InternString("ev2");
1914 StringId ev_1 = storage_->InternString("ev1");
Eric Seckler02cdcef2019-10-14 08:56:28 +01001915
Lalit Magantib0e11f62020-01-02 14:17:58 +00001916 constexpr TrackId thread_2_track{0u};
1917 constexpr TrackId thread_1_track{1u};
Eric Seckler56a007d2019-05-02 16:25:14 +01001918 InSequence in_sequence; // Below slices should be sorted by timestamp.
1919
Stephen Nuskof848d462021-04-06 13:28:04 +01001920 EXPECT_CALL(*slice_, StartSlice(1005000, thread_2_track, _, _));
1921 EXPECT_CALL(*slice_, StartSlice(1010000, thread_1_track, _, _));
Lalit Maganti47bc3d62020-01-15 16:21:22 +00001922 EXPECT_CALL(*slice_, End(1015000, thread_2_track, cat_1, ev_2, _));
1923 EXPECT_CALL(*slice_, End(1020000, thread_1_track, cat_1, ev_1, _));
Eric Seckler56a007d2019-05-02 16:25:14 +01001924
1925 context_.sorter->ExtractEventsForced();
1926}
1927
Eric Secklerc93823e2019-06-03 16:49:19 +01001928TEST_F(ProtoTraceParserTest, TrackEventWithDebugAnnotations) {
Lalit Maganti7449dc82019-12-30 15:52:35 +00001929 MockBoundInserter inserter;
Eric Secklerc93823e2019-06-03 16:49:19 +01001930
1931 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001932 auto* packet = trace_->add_packet();
Eric Secklerc93823e2019-06-03 16:49:19 +01001933 packet->set_trusted_packet_sequence_id(1);
1934 packet->set_incremental_state_cleared(true);
1935 auto* thread_desc = packet->set_thread_descriptor();
1936 thread_desc->set_pid(15);
1937 thread_desc->set_tid(16);
1938 thread_desc->set_reference_timestamp_us(1000);
Eric Secklerc93823e2019-06-03 16:49:19 +01001939 }
1940 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001941 auto* packet = trace_->add_packet();
Eric Secklerc93823e2019-06-03 16:49:19 +01001942 packet->set_trusted_packet_sequence_id(1);
1943 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01001944 event->set_timestamp_delta_us(10); // absolute: 1010.
Eric Secklerc93823e2019-06-03 16:49:19 +01001945 event->add_category_iids(1);
1946 auto* annotation1 = event->add_debug_annotations();
1947 annotation1->set_name_iid(1);
1948 annotation1->set_uint_value(10u);
1949 auto* annotation2 = event->add_debug_annotations();
1950 annotation2->set_name_iid(2);
1951 auto* nested = annotation2->set_nested_value();
1952 nested->set_nested_type(protos::pbzero::DebugAnnotation::NestedValue::DICT);
1953 nested->add_dict_keys("child1");
1954 nested->add_dict_keys("child2");
1955 auto* child1 = nested->add_dict_values();
1956 child1->set_nested_type(
1957 protos::pbzero::DebugAnnotation::NestedValue::UNSPECIFIED);
1958 child1->set_bool_value(true);
1959 auto* child2 = nested->add_dict_values();
1960 child2->set_nested_type(
1961 protos::pbzero::DebugAnnotation::NestedValue::ARRAY);
1962 auto* child21 = child2->add_array_values();
1963 child21->set_nested_type(
1964 protos::pbzero::DebugAnnotation::NestedValue::UNSPECIFIED);
1965 child21->set_string_value("child21");
1966 auto* child22 = child2->add_array_values();
1967 child22->set_nested_type(
1968 protos::pbzero::DebugAnnotation::NestedValue::UNSPECIFIED);
1969 child22->set_double_value(2.2);
1970 auto* child23 = child2->add_array_values();
1971 child23->set_nested_type(
1972 protos::pbzero::DebugAnnotation::NestedValue::UNSPECIFIED);
1973 child23->set_int_value(23);
1974 auto* legacy_event = event->set_legacy_event();
1975 legacy_event->set_name_iid(1);
1976 legacy_event->set_phase('B');
1977
1978 auto* interned_data = packet->set_interned_data();
1979 auto cat1 = interned_data->add_event_categories();
1980 cat1->set_iid(1);
1981 cat1->set_name("cat1");
Eric Seckler0c460ef2019-08-14 15:42:36 +01001982 auto ev1 = interned_data->add_event_names();
Eric Secklerc93823e2019-06-03 16:49:19 +01001983 ev1->set_iid(1);
1984 ev1->set_name("ev1");
1985 auto an1 = interned_data->add_debug_annotation_names();
1986 an1->set_iid(1);
1987 an1->set_name("an1");
1988 auto an2 = interned_data->add_debug_annotation_names();
1989 an2->set_iid(2);
1990 an2->set_name("an2");
1991 }
1992 {
Primiano Tuccibb371732020-08-07 17:25:11 +02001993 auto* packet = trace_->add_packet();
Eric Secklerc93823e2019-06-03 16:49:19 +01001994 packet->set_trusted_packet_sequence_id(1);
1995 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01001996 event->set_timestamp_delta_us(10); // absolute: 1020.
Eric Secklerc93823e2019-06-03 16:49:19 +01001997 event->add_category_iids(1);
1998 auto* annotation3 = event->add_debug_annotations();
1999 annotation3->set_name_iid(3);
2000 annotation3->set_int_value(-3);
2001 auto* annotation4 = event->add_debug_annotations();
2002 annotation4->set_name_iid(4);
2003 annotation4->set_bool_value(true);
2004 auto* annotation5 = event->add_debug_annotations();
2005 annotation5->set_name_iid(5);
2006 annotation5->set_double_value(-5.5);
2007 auto* annotation6 = event->add_debug_annotations();
2008 annotation6->set_name_iid(6);
2009 annotation6->set_pointer_value(20u);
2010 auto* annotation7 = event->add_debug_annotations();
2011 annotation7->set_name_iid(7);
2012 annotation7->set_string_value("val7");
2013 auto* annotation8 = event->add_debug_annotations();
2014 annotation8->set_name_iid(8);
Eric Seckler03832282020-02-10 19:23:38 +00002015 annotation8->set_legacy_json_value(
2016 "{\"val8\": {\"a\": 42, \"b\": \"val8b\"}, \"arr8\": [1, 2, 3]}");
Mikhail Khokhlovac134ed2020-01-07 14:35:49 +00002017 auto* annotation9 = event->add_debug_annotations();
2018 annotation9->set_name_iid(9);
2019 annotation9->set_int_value(15);
Eric Secklerc93823e2019-06-03 16:49:19 +01002020 auto* legacy_event = event->set_legacy_event();
2021 legacy_event->set_name_iid(1);
2022 legacy_event->set_phase('E');
2023
2024 auto* interned_data = packet->set_interned_data();
2025 auto an3 = interned_data->add_debug_annotation_names();
2026 an3->set_iid(3);
2027 an3->set_name("an3");
2028 auto an4 = interned_data->add_debug_annotation_names();
2029 an4->set_iid(4);
2030 an4->set_name("an4");
2031 auto an5 = interned_data->add_debug_annotation_names();
2032 an5->set_iid(5);
2033 an5->set_name("an5");
2034 auto an6 = interned_data->add_debug_annotation_names();
2035 an6->set_iid(6);
2036 an6->set_name("an6");
2037 auto an7 = interned_data->add_debug_annotation_names();
2038 an7->set_iid(7);
2039 an7->set_name("an7");
2040 auto an8 = interned_data->add_debug_annotation_names();
2041 an8->set_iid(8);
2042 an8->set_name("an8");
Mikhail Khokhlovac134ed2020-01-07 14:35:49 +00002043 auto an9 = interned_data->add_debug_annotation_names();
2044 an9->set_iid(9);
2045 an9->set_name("an8.foo");
Eric Secklerc93823e2019-06-03 16:49:19 +01002046 }
2047
2048 Tokenize();
2049
Eric Seckler063ed392020-04-03 18:26:30 +01002050 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Secklerc93823e2019-06-03 16:49:19 +01002051
Lalit Magantieac7fff2020-01-10 16:42:54 +00002052 tables::ThreadTable::Row row(16);
2053 row.upid = 1u;
2054 storage_->mutable_thread_table()->Insert(row);
Eric Secklerb32cacf2019-09-27 16:51:19 +01002055
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002056 StringId cat_1 = storage_->InternString("cat1");
2057 StringId ev_1 = storage_->InternString("ev1");
2058 StringId debug_an_1 = storage_->InternString("debug.an1");
2059 StringId debug_an_2_child_1 = storage_->InternString("debug.an2.child1");
2060 StringId debug_an_2_child_2 = storage_->InternString("debug.an2.child2");
2061 StringId debug_an_2_child_2_0 = storage_->InternString("debug.an2.child2[0]");
2062 StringId child21 = storage_->InternString("child21");
2063 StringId debug_an_2_child_2_1 = storage_->InternString("debug.an2.child2[1]");
2064 StringId debug_an_2_child_2_2 = storage_->InternString("debug.an2.child2[2]");
2065 StringId debug_an_3 = storage_->InternString("debug.an3");
2066 StringId debug_an_4 = storage_->InternString("debug.an4");
2067 StringId debug_an_5 = storage_->InternString("debug.an5");
2068 StringId debug_an_6 = storage_->InternString("debug.an6");
2069 StringId debug_an_7 = storage_->InternString("debug.an7");
2070 StringId val_7 = storage_->InternString("val7");
Eric Seckler03832282020-02-10 19:23:38 +00002071 StringId debug_an_8_val8_a = storage_->InternString("debug.an8.val8.a");
2072 StringId debug_an_8_val8_b = storage_->InternString("debug.an8.val8.b");
2073 StringId val_8b = storage_->InternString("val8b");
2074 StringId debug_an_8_arr8 = storage_->InternString("debug.an8.arr8");
2075 StringId debug_an_8_arr8_0 = storage_->InternString("debug.an8.arr8[0]");
2076 StringId debug_an_8_arr8_1 = storage_->InternString("debug.an8.arr8[1]");
2077 StringId debug_an_8_arr8_2 = storage_->InternString("debug.an8.arr8[2]");
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002078 StringId debug_an_8_foo = storage_->InternString("debug.an8_foo");
Eric Seckler02cdcef2019-10-14 08:56:28 +01002079
Lalit Magantib0e11f62020-01-02 14:17:58 +00002080 constexpr TrackId track{0u};
Eric Seckler02cdcef2019-10-14 08:56:28 +01002081
Stephen Nuskof848d462021-04-06 13:28:04 +01002082 EXPECT_CALL(*slice_, StartSlice(1010000, track, _, _))
2083 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
2084 InvokeArgument<2>(&inserter), Return(SliceId(0u))));
Eric Secklerc7b0c612020-02-12 18:30:35 +00002085 EXPECT_CALL(inserter, AddArg(debug_an_1, debug_an_1,
2086 Variadic::UnsignedInteger(10u), _));
Lalit Magantif0599a02020-01-15 15:45:20 +00002087
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002088 EXPECT_CALL(inserter, AddArg(debug_an_2_child_1, debug_an_2_child_1,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002089 Variadic::Boolean(true), _));
Lalit Magantif0599a02020-01-15 15:45:20 +00002090
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002091 EXPECT_CALL(inserter, AddArg(debug_an_2_child_2, debug_an_2_child_2_0,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002092 Variadic::String(child21), _));
Eric Seckler02cdcef2019-10-14 08:56:28 +01002093
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002094 EXPECT_CALL(inserter, AddArg(debug_an_2_child_2, debug_an_2_child_2_1,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002095 Variadic::Real(2.2), _));
Eric Seckler02cdcef2019-10-14 08:56:28 +01002096
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002097 EXPECT_CALL(inserter, AddArg(debug_an_2_child_2, debug_an_2_child_2_2,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002098 Variadic::Integer(23), _));
Eric Secklerc93823e2019-06-03 16:49:19 +01002099
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002100 EXPECT_CALL(*slice_, End(1020000, track, cat_1, ev_1, _))
Stephen Nuskof848d462021-04-06 13:28:04 +01002101 .WillOnce(DoAll(InvokeArgument<4>(&inserter), Return(SliceId(0u))));
Eric Secklerc93823e2019-06-03 16:49:19 +01002102
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002103 EXPECT_CALL(inserter,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002104 AddArg(debug_an_3, debug_an_3, Variadic::Integer(-3), _));
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002105 EXPECT_CALL(inserter,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002106 AddArg(debug_an_4, debug_an_4, Variadic::Boolean(true), _));
2107 EXPECT_CALL(inserter,
2108 AddArg(debug_an_5, debug_an_5, Variadic::Real(-5.5), _));
2109 EXPECT_CALL(inserter,
2110 AddArg(debug_an_6, debug_an_6, Variadic::Pointer(20u), _));
2111 EXPECT_CALL(inserter,
2112 AddArg(debug_an_7, debug_an_7, Variadic::String(val_7), _));
Eric Seckler03832282020-02-10 19:23:38 +00002113 EXPECT_CALL(inserter, AddArg(debug_an_8_val8_a, debug_an_8_val8_a,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002114 Variadic::Integer(42), _));
Eric Seckler03832282020-02-10 19:23:38 +00002115 EXPECT_CALL(inserter, AddArg(debug_an_8_val8_b, debug_an_8_val8_b,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002116 Variadic::String(val_8b), _));
2117 EXPECT_CALL(inserter, AddArg(debug_an_8_arr8, debug_an_8_arr8_0,
2118 Variadic::Integer(1), _));
2119 EXPECT_CALL(inserter, AddArg(debug_an_8_arr8, debug_an_8_arr8_1,
2120 Variadic::Integer(2), _));
2121 EXPECT_CALL(inserter, AddArg(debug_an_8_arr8, debug_an_8_arr8_2,
2122 Variadic::Integer(3), _));
Eric Seckler03832282020-02-10 19:23:38 +00002123 EXPECT_CALL(inserter,
Eric Secklerc7b0c612020-02-12 18:30:35 +00002124 AddArg(debug_an_8_foo, debug_an_8_foo, Variadic::Integer(15), _));
Eric Secklerc93823e2019-06-03 16:49:19 +01002125
2126 context_.sorter->ExtractEventsForced();
2127}
2128
2129TEST_F(ProtoTraceParserTest, TrackEventWithTaskExecution) {
Eric Secklerc93823e2019-06-03 16:49:19 +01002130 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002131 auto* packet = trace_->add_packet();
Eric Secklerc93823e2019-06-03 16:49:19 +01002132 packet->set_trusted_packet_sequence_id(1);
2133 packet->set_incremental_state_cleared(true);
2134 auto* thread_desc = packet->set_thread_descriptor();
2135 thread_desc->set_pid(15);
2136 thread_desc->set_tid(16);
2137 thread_desc->set_reference_timestamp_us(1000);
Eric Secklerc93823e2019-06-03 16:49:19 +01002138 }
2139 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002140 auto* packet = trace_->add_packet();
Eric Secklerc93823e2019-06-03 16:49:19 +01002141 packet->set_trusted_packet_sequence_id(1);
2142 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01002143 event->set_timestamp_delta_us(10); // absolute: 1010.
Eric Secklerc93823e2019-06-03 16:49:19 +01002144 event->add_category_iids(1);
2145 auto* task_execution = event->set_task_execution();
2146 task_execution->set_posted_from_iid(1);
2147 auto* legacy_event = event->set_legacy_event();
2148 legacy_event->set_name_iid(1);
2149 legacy_event->set_phase('B');
2150
2151 auto* interned_data = packet->set_interned_data();
2152 auto cat1 = interned_data->add_event_categories();
2153 cat1->set_iid(1);
2154 cat1->set_name("cat1");
Eric Seckler0c460ef2019-08-14 15:42:36 +01002155 auto ev1 = interned_data->add_event_names();
Eric Secklerc93823e2019-06-03 16:49:19 +01002156 ev1->set_iid(1);
2157 ev1->set_name("ev1");
2158 auto loc1 = interned_data->add_source_locations();
2159 loc1->set_iid(1);
2160 loc1->set_file_name("file1");
2161 loc1->set_function_name("func1");
Nicolò Mazzucato6261d732019-08-30 13:15:17 +01002162 loc1->set_line_number(42);
Eric Secklerc93823e2019-06-03 16:49:19 +01002163 }
2164
2165 Tokenize();
2166
Eric Seckler3183c6d2020-01-14 15:45:20 +00002167 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Secklerc93823e2019-06-03 16:49:19 +01002168
Lalit Magantieac7fff2020-01-10 16:42:54 +00002169 tables::ThreadTable::Row row(16);
2170 row.upid = 1u;
2171 storage_->mutable_thread_table()->Insert(row);
Eric Secklerb32cacf2019-09-27 16:51:19 +01002172
Lalit Magantib0e11f62020-01-02 14:17:58 +00002173 constexpr TrackId track{0u};
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002174
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002175 StringId file_1 = storage_->InternString("file1");
2176 StringId func_1 = storage_->InternString("func1");
2177
Eric Secklerc93823e2019-06-03 16:49:19 +01002178 InSequence in_sequence; // Below slices should be sorted by timestamp.
2179
Lalit Maganti7449dc82019-12-30 15:52:35 +00002180 MockBoundInserter inserter;
Stephen Nuskof848d462021-04-06 13:28:04 +01002181 EXPECT_CALL(*slice_, StartSlice(1010000, track, _, _))
2182 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
2183 InvokeArgument<2>(&inserter), Return(SliceId(0u))));
Eric Secklerc7b0c612020-02-12 18:30:35 +00002184 EXPECT_CALL(inserter, AddArg(_, _, Variadic::String(file_1), _));
2185 EXPECT_CALL(inserter, AddArg(_, _, Variadic::String(func_1), _));
2186 EXPECT_CALL(inserter, AddArg(_, _, Variadic::UnsignedInteger(42), _));
Eric Secklerc93823e2019-06-03 16:49:19 +01002187
2188 context_.sorter->ExtractEventsForced();
2189}
2190
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002191TEST_F(ProtoTraceParserTest, TrackEventWithLogMessage) {
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002192 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002193 auto* packet = trace_->add_packet();
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002194 packet->set_trusted_packet_sequence_id(1);
2195 packet->set_incremental_state_cleared(true);
2196 auto* thread_desc = packet->set_thread_descriptor();
2197 thread_desc->set_pid(15);
2198 thread_desc->set_tid(16);
2199 thread_desc->set_reference_timestamp_us(1000);
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002200 }
2201 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002202 auto* packet = trace_->add_packet();
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002203 packet->set_trusted_packet_sequence_id(1);
2204 auto* event = packet->set_track_event();
Lalit Maganti09e840c2021-09-22 15:23:17 +01002205 event->set_timestamp_delta_us(10); // absolute: 1010.
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002206 event->add_category_iids(1);
2207
2208 auto* log_message = event->set_log_message();
2209 log_message->set_body_iid(1);
2210 log_message->set_source_location_iid(1);
2211
2212 auto* legacy_event = event->set_legacy_event();
2213 legacy_event->set_name_iid(1);
2214 legacy_event->set_phase('I');
2215
2216 auto* interned_data = packet->set_interned_data();
2217 auto cat1 = interned_data->add_event_categories();
2218 cat1->set_iid(1);
2219 cat1->set_name("cat1");
2220
Eric Seckler0c460ef2019-08-14 15:42:36 +01002221 auto ev1 = interned_data->add_event_names();
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002222 ev1->set_iid(1);
2223 ev1->set_name("ev1");
2224
2225 auto body = interned_data->add_log_message_body();
2226 body->set_iid(1);
2227 body->set_body("body1");
2228
2229 auto loc1 = interned_data->add_source_locations();
2230 loc1->set_iid(1);
2231 loc1->set_file_name("file1");
2232 loc1->set_function_name("func1");
2233 loc1->set_line_number(1);
2234 }
2235
2236 Tokenize();
2237
Eric Seckler3183c6d2020-01-14 15:45:20 +00002238 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002239
Lalit Magantieac7fff2020-01-10 16:42:54 +00002240 tables::ThreadTable::Row row(16);
2241 row.upid = 1u;
2242 storage_->mutable_thread_table()->Insert(row);
Eric Secklerb32cacf2019-09-27 16:51:19 +01002243
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002244 StringId body_1 = storage_->InternString("body1");
2245
Lalit Magantib0e11f62020-01-02 14:17:58 +00002246 constexpr TrackId track{0};
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002247 InSequence in_sequence; // Below slices should be sorted by timestamp.
2248
Lalit Maganti7449dc82019-12-30 15:52:35 +00002249 MockBoundInserter inserter;
Stephen Nuskof848d462021-04-06 13:28:04 +01002250 EXPECT_CALL(*slice_, StartSlice(1010000, track, _, _))
2251 .WillOnce(DoAll(IgnoreResult(InvokeArgument<3>()),
2252 InvokeArgument<2>(&inserter), Return(SliceId(0u))));
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002253
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002254 // Call with logMessageBody (body1 in this case).
Eric Secklerc7b0c612020-02-12 18:30:35 +00002255 EXPECT_CALL(inserter, AddArg(_, _, Variadic::String(body_1), _));
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002256
2257 context_.sorter->ExtractEventsForced();
2258
Lalit Magantif1ab24f2020-01-07 17:42:26 +00002259 EXPECT_GT(context_.storage->android_log_table().row_count(), 0u);
2260 EXPECT_EQ(context_.storage->android_log_table().ts()[0], 1010000);
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002261 EXPECT_EQ(context_.storage->android_log_table().msg()[0], body_1);
Nicolò Mazzucato8f75ede2019-08-12 17:36:36 +01002262}
2263
Eric Secklerb7e26332019-07-19 12:46:17 +01002264TEST_F(ProtoTraceParserTest, TrackEventParseLegacyEventIntoRawTable) {
Eric Secklerb7e26332019-07-19 12:46:17 +01002265 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002266 auto* packet = trace_->add_packet();
Eric Secklerb7e26332019-07-19 12:46:17 +01002267 packet->set_trusted_packet_sequence_id(1);
2268 packet->set_incremental_state_cleared(true);
2269 auto* thread_desc = packet->set_thread_descriptor();
2270 thread_desc->set_pid(15);
2271 thread_desc->set_tid(16);
2272 thread_desc->set_reference_timestamp_us(1000);
2273 thread_desc->set_reference_thread_time_us(2000);
2274 }
2275 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002276 auto* packet = trace_->add_packet();
Eric Secklerb7e26332019-07-19 12:46:17 +01002277 packet->set_trusted_packet_sequence_id(1);
2278 auto* event = packet->set_track_event();
2279 event->set_timestamp_delta_us(10); // absolute: 1010.
2280 event->set_thread_time_delta_us(5); // absolute: 2005.
2281 event->add_category_iids(1);
2282
2283 auto* legacy_event = event->set_legacy_event();
2284 legacy_event->set_name_iid(1);
2285 // Represents a phase that isn't parsed into regular trace processor tables.
2286 legacy_event->set_phase('?');
2287 legacy_event->set_duration_us(23);
2288 legacy_event->set_thread_duration_us(15);
2289 legacy_event->set_global_id(99u);
2290 legacy_event->set_id_scope("scope1");
Primiano Tucci63201702020-12-04 17:38:12 +01002291 legacy_event->set_use_async_tts(true);
Eric Secklerb7e26332019-07-19 12:46:17 +01002292
2293 auto* annotation1 = event->add_debug_annotations();
2294 annotation1->set_name_iid(1);
2295 annotation1->set_uint_value(10u);
2296
2297 auto* interned_data = packet->set_interned_data();
2298 auto cat1 = interned_data->add_event_categories();
2299 cat1->set_iid(1);
2300 cat1->set_name("cat1");
Eric Seckler0c460ef2019-08-14 15:42:36 +01002301 auto ev1 = interned_data->add_event_names();
Eric Secklerb7e26332019-07-19 12:46:17 +01002302 ev1->set_iid(1);
2303 ev1->set_name("ev1");
2304 auto an1 = interned_data->add_debug_annotation_names();
2305 an1->set_iid(1);
2306 an1->set_name("an1");
2307 }
2308
2309 Tokenize();
2310
Eric Seckler3183c6d2020-01-14 15:45:20 +00002311 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Seckler411e9c82020-05-04 13:36:25 +01002312 // Only the begin thread time can be imported into the counter table.
Eric Seckler063ed392020-04-03 18:26:30 +01002313 EXPECT_CALL(*event_,
2314 PushCounter(1010000, testing::DoubleEq(2005000), TrackId{1}));
Eric Secklerb7e26332019-07-19 12:46:17 +01002315
Lalit Magantieac7fff2020-01-10 16:42:54 +00002316 tables::ThreadTable::Row row(16);
2317 row.upid = 1u;
2318 storage_->mutable_thread_table()->Insert(row);
Eric Secklerb32cacf2019-09-27 16:51:19 +01002319
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002320 StringId cat_1 = storage_->InternString("cat1");
2321 StringId ev_1 = storage_->InternString("ev1");
2322 StringId scope_1 = storage_->InternString("scope1");
2323 StringId question = storage_->InternString("?");
2324 StringId debug_an_1 = storage_->InternString("debug.an1");
Eric Secklerb7e26332019-07-19 12:46:17 +01002325
2326 context_.sorter->ExtractEventsForced();
2327
2328 ::testing::Mock::VerifyAndClearExpectations(storage_);
2329
Lalit Maganti679b29d2020-01-13 13:26:28 +00002330 // Verify raw_table and args contents.
2331 const auto& raw_table = storage_->raw_table();
2332 EXPECT_EQ(raw_table.row_count(), 1u);
2333 EXPECT_EQ(raw_table.ts()[0], 1010000);
2334 EXPECT_EQ(raw_table.name()[0],
Eric Secklerb7e26332019-07-19 12:46:17 +01002335 storage_->InternString("track_event.legacy_event"));
Lalit Maganti679b29d2020-01-13 13:26:28 +00002336 EXPECT_EQ(raw_table.cpu()[0], 0u);
2337 EXPECT_EQ(raw_table.utid()[0], 1u);
2338 EXPECT_EQ(raw_table.arg_set_id()[0], 1u);
Eric Secklerb7e26332019-07-19 12:46:17 +01002339
Andriidd07cb12020-09-10 16:09:01 +03002340 EXPECT_GE(storage_->arg_table().row_count(), 10u);
Eric Secklerb7e26332019-07-19 12:46:17 +01002341
2342 EXPECT_TRUE(HasArg(1u, storage_->InternString("legacy_event.category"),
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002343 Variadic::String(cat_1)));
Eric Secklerb7e26332019-07-19 12:46:17 +01002344 EXPECT_TRUE(HasArg(1u, storage_->InternString("legacy_event.name"),
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002345 Variadic::String(ev_1)));
Eric Secklerb7e26332019-07-19 12:46:17 +01002346 EXPECT_TRUE(HasArg(1u, storage_->InternString("legacy_event.phase"),
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002347 Variadic::String(question)));
Eric Secklerb7e26332019-07-19 12:46:17 +01002348 EXPECT_TRUE(HasArg(1u, storage_->InternString("legacy_event.duration_ns"),
2349 Variadic::Integer(23000)));
2350 EXPECT_TRUE(HasArg(1u,
2351 storage_->InternString("legacy_event.thread_timestamp_ns"),
2352 Variadic::Integer(2005000)));
2353 EXPECT_TRUE(HasArg(1u,
2354 storage_->InternString("legacy_event.thread_duration_ns"),
2355 Variadic::Integer(15000)));
2356 EXPECT_TRUE(HasArg(1u, storage_->InternString("legacy_event.use_async_tts"),
2357 Variadic::Boolean(true)));
2358 EXPECT_TRUE(HasArg(1u, storage_->InternString("legacy_event.global_id"),
2359 Variadic::UnsignedInteger(99u)));
2360 EXPECT_TRUE(HasArg(1u, storage_->InternString("legacy_event.id_scope"),
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002361 Variadic::String(scope_1)));
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002362 EXPECT_TRUE(HasArg(1u, debug_an_1, Variadic::UnsignedInteger(10u)));
Eric Secklerb7e26332019-07-19 12:46:17 +01002363}
2364
Eric Seckler15ea5df2019-10-14 13:54:07 +01002365TEST_F(ProtoTraceParserTest, TrackEventLegacyTimestampsWithClockSnapshot) {
Eric Secklerdc454522020-05-20 19:40:23 +01002366 clock_->AddSnapshot({{protos::pbzero::BUILTIN_CLOCK_BOOTTIME, 0},
2367 {protos::pbzero::BUILTIN_CLOCK_MONOTONIC, 1000000}});
Eric Seckler15ea5df2019-10-14 13:54:07 +01002368
2369 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002370 auto* packet = trace_->add_packet();
Eric Seckler15ea5df2019-10-14 13:54:07 +01002371 packet->set_trusted_packet_sequence_id(1);
2372 packet->set_incremental_state_cleared(true);
2373 auto* thread_desc = packet->set_thread_descriptor();
2374 thread_desc->set_pid(15);
2375 thread_desc->set_tid(16);
2376 thread_desc->set_reference_timestamp_us(1000); // MONOTONIC.
2377 }
2378 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002379 auto* packet = trace_->add_packet();
Eric Seckler15ea5df2019-10-14 13:54:07 +01002380 packet->set_trusted_packet_sequence_id(1);
2381 auto* event = packet->set_track_event();
2382 event->set_timestamp_delta_us(10); // absolute: 1010 (mon), 10 (boot).
2383 event->add_category_iids(1);
2384 event->set_type(protos::pbzero::TrackEvent::TYPE_SLICE_BEGIN);
2385 auto* legacy_event = event->set_legacy_event();
2386 legacy_event->set_name_iid(1);
2387 }
2388
2389 Tokenize();
2390
Eric Seckler3183c6d2020-01-14 15:45:20 +00002391 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Eric Seckler15ea5df2019-10-14 13:54:07 +01002392
Lalit Magantieac7fff2020-01-10 16:42:54 +00002393 tables::ThreadTable::Row row(16);
2394 row.upid = 1u;
2395 storage_->mutable_thread_table()->Insert(row);
Eric Seckler15ea5df2019-10-14 13:54:07 +01002396
Lalit Magantib0e11f62020-01-02 14:17:58 +00002397 constexpr TrackId track{0u};
Eric Seckler15ea5df2019-10-14 13:54:07 +01002398 InSequence in_sequence; // Below slices should be sorted by timestamp.
2399
2400 // Timestamp should be adjusted to trace time (BOOTTIME).
Stephen Nuskof848d462021-04-06 13:28:04 +01002401 EXPECT_CALL(*slice_, StartSlice(10000, track, _, _));
Eric Seckler15ea5df2019-10-14 13:54:07 +01002402
2403 context_.sorter->ExtractEventsForced();
2404}
2405
Eric Seckler6f263fd2019-10-24 16:48:24 +01002406TEST_F(ProtoTraceParserTest, ParseEventWithClockIdButWithoutClockSnapshot) {
Eric Seckler6f263fd2019-10-24 16:48:24 +01002407 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002408 auto* packet = trace_->add_packet();
Eric Seckler6f263fd2019-10-24 16:48:24 +01002409 packet->set_timestamp(1000);
2410 packet->set_timestamp_clock_id(3);
2411 packet->set_trusted_packet_sequence_id(1);
2412 auto* bundle = packet->set_chrome_events();
2413 auto* metadata = bundle->add_metadata();
2414 metadata->set_name("test");
2415 metadata->set_int_value(23);
2416 }
2417
2418 util::Status status = Tokenize();
2419 EXPECT_TRUE(status.ok());
2420 context_.sorter->ExtractEventsForced();
2421
2422 // Metadata should have created a raw event.
Lalit Maganti679b29d2020-01-13 13:26:28 +00002423 const auto& raw_table = storage_->raw_table();
2424 EXPECT_EQ(raw_table.row_count(), 1u);
Eric Seckler6f263fd2019-10-24 16:48:24 +01002425}
2426
Mikhail Khokhlovca34df22019-08-07 16:50:01 +01002427TEST_F(ProtoTraceParserTest, ParseChromeMetadataEventIntoRawTable) {
2428 static const char kStringName[] = "string_name";
2429 static const char kStringValue[] = "string_value";
2430 static const char kIntName[] = "int_name";
2431 static const int kIntValue = 123;
2432
Mikhail Khokhlovca34df22019-08-07 16:50:01 +01002433 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002434 auto* packet = trace_->add_packet();
Eric Seckler6f263fd2019-10-24 16:48:24 +01002435 packet->set_timestamp(1000);
2436 packet->set_timestamp_clock_id(3);
Mikhail Khokhlovca34df22019-08-07 16:50:01 +01002437 packet->set_trusted_packet_sequence_id(1);
2438 auto* bundle = packet->set_chrome_events();
2439 auto* metadata = bundle->add_metadata();
2440 metadata->set_name(kStringName);
2441 metadata->set_string_value(kStringValue);
2442 metadata = bundle->add_metadata();
2443 metadata->set_name(kIntName);
2444 metadata->set_int_value(kIntValue);
2445 }
2446
2447 Tokenize();
2448 context_.sorter->ExtractEventsForced();
2449
Lalit Maganti679b29d2020-01-13 13:26:28 +00002450 // Verify raw_table and args contents.
2451 const auto& raw_table = storage_->raw_table();
2452 EXPECT_EQ(raw_table.row_count(), 1u);
2453 EXPECT_EQ(raw_table.name()[0],
Mikhail Khokhlovca34df22019-08-07 16:50:01 +01002454 storage_->InternString("chrome_event.metadata"));
Lalit Maganti679b29d2020-01-13 13:26:28 +00002455 EXPECT_EQ(raw_table.arg_set_id()[0], 1u);
Mikhail Khokhlovca34df22019-08-07 16:50:01 +01002456
Lalit Maganti1908e262020-01-09 14:33:19 +00002457 EXPECT_EQ(storage_->arg_table().row_count(), 2u);
Mikhail Khokhlovca34df22019-08-07 16:50:01 +01002458 EXPECT_TRUE(HasArg(1u, storage_->InternString(kStringName),
2459 Variadic::String(storage_->InternString(kStringValue))));
2460 EXPECT_TRUE(HasArg(1u, storage_->InternString(kIntName),
2461 Variadic::Integer(kIntValue)));
2462}
2463
Eric Secklered369bb2021-04-01 10:32:55 +01002464// TODO(crbug.com/1194914): Remove this test once the Chrome-side fix has
2465// propagated into all release channels.
2466TEST_F(ProtoTraceParserTest, ParseChromeCombinedMetadataPacket) {
2467 static const char kStringName[] = "string_name";
2468 static const char kStringValue[] = "string_value";
2469
Eric Secklered369bb2021-04-01 10:32:55 +01002470 {
2471 auto* packet = trace_->add_packet();
2472 packet->set_timestamp(1000);
2473 packet->set_timestamp_clock_id(3);
2474 packet->set_trusted_packet_sequence_id(1);
2475 auto* chrome_metadata = packet->set_chrome_metadata();
2476 chrome_metadata->set_chrome_version_code(123);
2477 auto* bundle = packet->set_chrome_events();
2478 auto* metadata = bundle->add_metadata();
2479 metadata->set_name(kStringName);
2480 metadata->set_string_value(kStringValue);
2481 }
2482
2483 Tokenize();
2484 context_.sorter->ExtractEventsForced();
2485
2486 // Typed metadata should be in metadata table.
2487 bool found = false;
2488 for (uint32_t row = 0; row < storage_->metadata_table().row_count(); row++) {
2489 if (storage_->metadata_table().name()[row] ==
2490 storage_->InternString("cr-playstore_version_code")) {
2491 found = true;
2492 EXPECT_EQ(storage_->metadata_table().int_value()[0], 123);
2493 }
2494 }
2495 EXPECT_TRUE(found);
2496
2497 // Untyped metadata should be in raw table.
2498 const auto& raw_table = storage_->raw_table();
2499 EXPECT_EQ(raw_table.row_count(), 1u);
2500 EXPECT_EQ(raw_table.name()[0],
2501 storage_->InternString("chrome_event.metadata"));
2502 EXPECT_EQ(raw_table.arg_set_id()[0], 1u);
2503
2504 EXPECT_EQ(storage_->arg_table().row_count(), 1u);
2505 EXPECT_TRUE(HasArg(1u, storage_->InternString(kStringName),
2506 Variadic::String(storage_->InternString(kStringValue))));
2507}
2508
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002509TEST_F(ProtoTraceParserTest, ParseChromeLegacyFtraceIntoRawTable) {
2510 static const char kDataPart0[] = "aaa";
2511 static const char kDataPart1[] = "bbb";
2512 static const char kFullData[] = "aaabbb";
2513
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002514 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002515 auto* packet = trace_->add_packet();
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002516 packet->set_trusted_packet_sequence_id(1);
2517 auto* bundle = packet->set_chrome_events();
2518 bundle->add_legacy_ftrace_output(kDataPart0);
2519 bundle->add_legacy_ftrace_output(kDataPart1);
2520 }
2521
2522 Tokenize();
2523
2524 context_.sorter->ExtractEventsForced();
2525
Lalit Maganti679b29d2020-01-13 13:26:28 +00002526 // Verify raw_table and args contents.
2527 const auto& raw_table = storage_->raw_table();
2528 EXPECT_EQ(raw_table.row_count(), 1u);
2529 EXPECT_EQ(raw_table.name()[0],
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002530 storage_->InternString("chrome_event.legacy_system_trace"));
Lalit Maganti679b29d2020-01-13 13:26:28 +00002531 EXPECT_EQ(raw_table.arg_set_id()[0], 1u);
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002532
Lalit Maganti1908e262020-01-09 14:33:19 +00002533 EXPECT_EQ(storage_->arg_table().row_count(), 1u);
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002534 EXPECT_TRUE(HasArg(1u, storage_->InternString("data"),
2535 Variadic::String(storage_->InternString(kFullData))));
2536}
2537
2538TEST_F(ProtoTraceParserTest, ParseChromeLegacyJsonIntoRawTable) {
2539 static const char kUserTraceEvent[] = "{\"user\":1}";
2540
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002541 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002542 auto* packet = trace_->add_packet();
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002543 packet->set_trusted_packet_sequence_id(1);
2544 auto* bundle = packet->set_chrome_events();
2545 auto* user_trace = bundle->add_legacy_json_trace();
2546 user_trace->set_type(protos::pbzero::ChromeLegacyJsonTrace::USER_TRACE);
2547 user_trace->set_data(kUserTraceEvent);
2548 }
2549
2550 Tokenize();
2551
2552 context_.sorter->ExtractEventsForced();
2553
Lalit Maganti679b29d2020-01-13 13:26:28 +00002554 // Verify raw_table and args contents.
2555 const auto& raw_table = storage_->raw_table();
2556 EXPECT_EQ(raw_table.row_count(), 1u);
2557 EXPECT_EQ(raw_table.name()[0],
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002558 storage_->InternString("chrome_event.legacy_user_trace"));
Lalit Maganti679b29d2020-01-13 13:26:28 +00002559 EXPECT_EQ(raw_table.arg_set_id()[0], 1u);
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002560
Lalit Maganti1908e262020-01-09 14:33:19 +00002561 EXPECT_EQ(storage_->arg_table().row_count(), 1u);
Eric Seckler13b84b32019-10-04 12:00:38 +01002562 EXPECT_TRUE(
2563 HasArg(1u, storage_->InternString("data"),
2564 Variadic::String(storage_->InternString(kUserTraceEvent))));
Mikhail Khokhlovfd746552019-08-15 14:54:29 +01002565}
2566
Mikhail Khokhlovb1fe42a2019-05-23 13:58:05 +01002567TEST_F(ProtoTraceParserTest, LoadChromeBenchmarkMetadata) {
2568 static const char kName[] = "name";
Ryan Savitski0476ee92019-07-09 14:29:33 +01002569 static const char kTag1[] = "tag1";
2570 static const char kTag2[] = "tag2";
Mikhail Khokhlovb1fe42a2019-05-23 13:58:05 +01002571
Primiano Tuccibb371732020-08-07 17:25:11 +02002572 auto* metadata = trace_->add_packet()->set_chrome_benchmark_metadata();
Mikhail Khokhlovb1fe42a2019-05-23 13:58:05 +01002573 metadata->set_benchmark_name(kName);
2574 metadata->add_story_tags(kTag1);
2575 metadata->add_story_tags(kTag2);
2576
2577 Tokenize();
2578
Lalit Maganti8c8e9972020-04-07 17:47:54 +01002579 base::StringView benchmark = metadata::kNames[metadata::benchmark_name];
2580 base::StringView tags = metadata::kNames[metadata::benchmark_story_tags];
Lalit Magantiededb0e2020-01-08 12:50:34 +00002581
Mikhail Khokhlovb1fe42a2019-05-23 13:58:05 +01002582 context_.sorter->ExtractEventsForced();
Ryan Savitski0476ee92019-07-09 14:29:33 +01002583
Lalit Magantiededb0e2020-01-08 12:50:34 +00002584 const auto& meta_keys = storage_->metadata_table().name();
2585 const auto& meta_values = storage_->metadata_table().str_value();
2586 EXPECT_EQ(storage_->metadata_table().row_count(), 3u);
2587
Lalit Maganti8c8e9972020-04-07 17:47:54 +01002588 std::vector<std::pair<base::StringView, base::StringView>> meta_entries;
Lalit Magantiededb0e2020-01-08 12:50:34 +00002589 for (uint32_t i = 0; i < storage_->metadata_table().row_count(); i++) {
Lalit Maganti8c8e9972020-04-07 17:47:54 +01002590 meta_entries.emplace_back(
2591 std::make_pair(meta_keys.GetString(i), meta_values.GetString(i)));
Ryan Savitski0476ee92019-07-09 14:29:33 +01002592 }
Lalit Maganti47bc3d62020-01-15 16:21:22 +00002593 EXPECT_THAT(meta_entries,
Lalit Maganti8c8e9972020-04-07 17:47:54 +01002594 UnorderedElementsAreArray({std::make_pair(benchmark, kName),
2595 std::make_pair(tags, kTag1),
2596 std::make_pair(tags, kTag2)}));
Ryan Savitski0476ee92019-07-09 14:29:33 +01002597}
2598
Oystein Eftevaag6ad5d162021-03-15 12:02:03 -07002599TEST_F(ProtoTraceParserTest, LoadChromeMetadata) {
Oystein Eftevaag6ad5d162021-03-15 12:02:03 -07002600 auto* track_event = trace_->add_packet()->set_chrome_events();
2601 {
2602 auto* metadata = track_event->add_metadata();
2603 metadata->set_name("str_name");
2604 metadata->set_string_value("foostr");
2605 }
2606
2607 {
2608 auto* metadata = track_event->add_metadata();
2609 metadata->set_name("int_name");
2610 metadata->set_int_value(42);
2611 }
2612
2613 {
2614 auto* metadata = track_event->add_metadata();
2615 metadata->set_name("bool_name");
2616 metadata->set_bool_value(true);
2617 }
2618
2619 {
2620 auto* metadata = track_event->add_metadata();
2621 metadata->set_name("json_name");
2622 metadata->set_json_value("{key: value}");
2623 }
2624
2625 Tokenize();
2626 context_.sorter->ExtractEventsForced();
2627
2628 const auto& metadata = storage_->metadata_table();
2629
2630 EXPECT_STREQ(metadata.name().GetString(0).c_str(), "cr-str_name");
2631 EXPECT_STREQ(metadata.str_value().GetString(0).c_str(), "foostr");
2632
2633 EXPECT_STREQ(metadata.name().GetString(1).c_str(), "cr-int_name");
2634 EXPECT_EQ(metadata.int_value()[1], 42);
2635
2636 EXPECT_STREQ(metadata.name().GetString(2).c_str(), "cr-bool_name");
2637 EXPECT_EQ(metadata.int_value()[2], 1);
2638
2639 EXPECT_STREQ(metadata.name().GetString(3).c_str(), "cr-json_name");
2640 EXPECT_STREQ(metadata.str_value().GetString(3).c_str(), "{key: value}");
2641}
2642
Ryan Savitski0476ee92019-07-09 14:29:33 +01002643TEST_F(ProtoTraceParserTest, AndroidPackagesList) {
Primiano Tuccibb371732020-08-07 17:25:11 +02002644 auto* packet = trace_->add_packet();
Ryan Savitski0476ee92019-07-09 14:29:33 +01002645 auto* pkg_list = packet->set_packages_list();
2646
2647 pkg_list->set_read_error(false);
2648 pkg_list->set_parse_error(true);
2649 {
2650 auto* pkg = pkg_list->add_packages();
2651 pkg->set_name("com.test.app");
2652 pkg->set_uid(1000);
2653 pkg->set_debuggable(false);
2654 pkg->set_profileable_from_shell(true);
2655 pkg->set_version_code(42);
2656 }
2657 {
2658 auto* pkg = pkg_list->add_packages();
2659 pkg->set_name("com.test.app2");
2660 pkg->set_uid(1001);
2661 pkg->set_debuggable(false);
2662 pkg->set_profileable_from_shell(false);
2663 pkg->set_version_code(43);
2664 }
2665
2666 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +01002667 context_.sorter->ExtractEventsForced();
Ryan Savitski0476ee92019-07-09 14:29:33 +01002668
2669 // Packet-level errors reflected in stats storage.
2670 const auto& stats = context_.storage->stats();
2671 EXPECT_FALSE(stats[stats::packages_list_has_read_errors].value);
2672 EXPECT_TRUE(stats[stats::packages_list_has_parse_errors].value);
2673
2674 // Expect two metadata rows, each with an int_value of a separate arg set id.
2675 // The relevant arg sets have the info about the packages. To simplify test
2676 // structure, make an assumption that metadata storage is filled in in the
2677 // FIFO order of seen packages.
Florian Mayer19ce3952020-04-08 15:27:32 +02002678 const auto& package_list = context_.storage->package_list_table();
Lalit Magantiededb0e2020-01-08 12:50:34 +00002679 ASSERT_EQ(package_list.row_count(), 2u);
Ryan Savitski0476ee92019-07-09 14:29:33 +01002680
Florian Mayer19ce3952020-04-08 15:27:32 +02002681 EXPECT_STREQ(storage_->GetString(package_list.package_name()[0]).c_str(),
2682 "com.test.app");
2683 EXPECT_EQ(package_list.uid()[0], 1000u);
2684 EXPECT_EQ(package_list.debuggable()[0], false);
2685 EXPECT_EQ(package_list.profileable_from_shell()[0], true);
2686 EXPECT_EQ(package_list.version_code()[0], 42);
Ryan Savitski0476ee92019-07-09 14:29:33 +01002687
Florian Mayer19ce3952020-04-08 15:27:32 +02002688 EXPECT_STREQ(storage_->GetString(package_list.package_name()[1]).c_str(),
2689 "com.test.app2");
2690 EXPECT_EQ(package_list.uid()[1], 1001u);
2691 EXPECT_EQ(package_list.debuggable()[1], false);
2692 EXPECT_EQ(package_list.profileable_from_shell()[1], false);
2693 EXPECT_EQ(package_list.version_code()[1], 43);
2694}
Ryan Savitski0476ee92019-07-09 14:29:33 +01002695
Florian Mayer19ce3952020-04-08 15:27:32 +02002696TEST_F(ProtoTraceParserTest, AndroidPackagesListDuplicate) {
Primiano Tuccibb371732020-08-07 17:25:11 +02002697 auto* packet = trace_->add_packet();
Florian Mayer19ce3952020-04-08 15:27:32 +02002698 auto* pkg_list = packet->set_packages_list();
Ryan Savitski0476ee92019-07-09 14:29:33 +01002699
Florian Mayer19ce3952020-04-08 15:27:32 +02002700 pkg_list->set_read_error(false);
2701 pkg_list->set_parse_error(true);
2702 {
2703 auto* pkg = pkg_list->add_packages();
2704 pkg->set_name("com.test.app");
2705 pkg->set_uid(1000);
2706 pkg->set_debuggable(false);
2707 pkg->set_profileable_from_shell(true);
2708 pkg->set_version_code(42);
2709 }
2710 {
2711 auto* pkg = pkg_list->add_packages();
2712 pkg->set_name("com.test.app");
2713 pkg->set_uid(1000);
2714 pkg->set_debuggable(false);
2715 pkg->set_profileable_from_shell(true);
2716 pkg->set_version_code(42);
2717 }
2718
2719 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +01002720 context_.sorter->ExtractEventsForced();
Florian Mayer19ce3952020-04-08 15:27:32 +02002721
2722 // Packet-level errors reflected in stats storage.
2723 const auto& stats = context_.storage->stats();
2724 EXPECT_FALSE(stats[stats::packages_list_has_read_errors].value);
2725 EXPECT_TRUE(stats[stats::packages_list_has_parse_errors].value);
2726
2727 // Expect two metadata rows, each with an int_value of a separate arg set id.
2728 // The relevant arg sets have the info about the packages. To simplify test
2729 // structure, make an assumption that metadata storage is filled in in the
2730 // FIFO order of seen packages.
2731 const auto& package_list = context_.storage->package_list_table();
2732 ASSERT_EQ(package_list.row_count(), 1u);
2733
2734 EXPECT_STREQ(storage_->GetString(package_list.package_name()[0]).c_str(),
2735 "com.test.app");
2736 EXPECT_EQ(package_list.uid()[0], 1000u);
2737 EXPECT_EQ(package_list.debuggable()[0], false);
2738 EXPECT_EQ(package_list.profileable_from_shell()[0], true);
2739 EXPECT_EQ(package_list.version_code()[0], 42);
Mikhail Khokhlovb1fe42a2019-05-23 13:58:05 +01002740}
2741
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002742TEST_F(ProtoTraceParserTest, ParseCPUProfileSamplesIntoTable) {
2743 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002744 auto* packet = trace_->add_packet();
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002745 packet->set_trusted_packet_sequence_id(1);
2746 packet->set_incremental_state_cleared(true);
2747
2748 auto* thread_desc = packet->set_thread_descriptor();
2749 thread_desc->set_pid(15);
2750 thread_desc->set_tid(16);
2751 thread_desc->set_reference_timestamp_us(1);
2752 thread_desc->set_reference_thread_time_us(2);
2753
2754 auto* interned_data = packet->set_interned_data();
2755
2756 auto mapping = interned_data->add_mappings();
2757 mapping->set_iid(1);
Oystein Eftevaagaa944212020-01-22 14:32:47 -08002758 mapping->set_build_id(1);
2759
2760 auto build_id = interned_data->add_build_ids();
2761 build_id->set_iid(1);
2762 build_id->set_str("3BBCFBD372448A727265C3E7C4D954F91");
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002763
2764 auto frame = interned_data->add_frames();
2765 frame->set_iid(1);
2766 frame->set_rel_pc(0x42);
2767 frame->set_mapping_id(1);
2768
2769 auto frame2 = interned_data->add_frames();
2770 frame2->set_iid(2);
2771 frame2->set_rel_pc(0x4242);
2772 frame2->set_mapping_id(1);
2773
2774 auto callstack = interned_data->add_callstacks();
2775 callstack->set_iid(1);
2776 callstack->add_frame_ids(1);
2777
2778 auto callstack2 = interned_data->add_callstacks();
2779 callstack2->set_iid(42);
2780 callstack2->add_frame_ids(2);
2781 }
2782
2783 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002784 auto* packet = trace_->add_packet();
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002785 packet->set_trusted_packet_sequence_id(1);
2786
2787 auto* samples = packet->set_streaming_profile_packet();
2788 samples->add_callstack_iid(42);
2789 samples->add_timestamp_delta_us(10);
2790
2791 samples->add_callstack_iid(1);
2792 samples->add_timestamp_delta_us(15);
Oystein Eftevaag95fe09e2020-04-17 12:55:17 -07002793 samples->set_process_priority(20);
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002794 }
2795
2796 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002797 auto* packet = trace_->add_packet();
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002798 packet->set_trusted_packet_sequence_id(1);
2799 auto* samples = packet->set_streaming_profile_packet();
2800
2801 samples->add_callstack_iid(42);
2802 samples->add_timestamp_delta_us(42);
Oystein Eftevaag95fe09e2020-04-17 12:55:17 -07002803 samples->set_process_priority(30);
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002804 }
2805
Lalit Maganti09e840c2021-09-22 15:23:17 +01002806 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002807
2808 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +01002809 context_.sorter->ExtractEventsForced();
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002810
2811 // Verify cpu_profile_samples.
Lalit Maganti0fd14ef2019-12-18 18:18:44 +00002812 const auto& samples = storage_->cpu_profile_stack_sample_table();
2813 EXPECT_EQ(samples.row_count(), 3u);
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002814
Oystein Eftevaag65ab9662020-01-14 15:09:39 -08002815 EXPECT_EQ(samples.ts()[0], 11000);
Lalit Maganti3f37ad52020-01-30 11:56:47 +00002816 EXPECT_EQ(samples.callsite_id()[0], CallsiteId{0});
Lalit Maganti0fd14ef2019-12-18 18:18:44 +00002817 EXPECT_EQ(samples.utid()[0], 1u);
Oystein Eftevaag95fe09e2020-04-17 12:55:17 -07002818 EXPECT_EQ(samples.process_priority()[0], 20);
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002819
Oystein Eftevaag65ab9662020-01-14 15:09:39 -08002820 EXPECT_EQ(samples.ts()[1], 26000);
Lalit Maganti3f37ad52020-01-30 11:56:47 +00002821 EXPECT_EQ(samples.callsite_id()[1], CallsiteId{1});
Lalit Maganti0fd14ef2019-12-18 18:18:44 +00002822 EXPECT_EQ(samples.utid()[1], 1u);
Oystein Eftevaag95fe09e2020-04-17 12:55:17 -07002823 EXPECT_EQ(samples.process_priority()[1], 20);
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002824
Oystein Eftevaag65ab9662020-01-14 15:09:39 -08002825 EXPECT_EQ(samples.ts()[2], 68000);
Lalit Maganti3f37ad52020-01-30 11:56:47 +00002826 EXPECT_EQ(samples.callsite_id()[2], CallsiteId{0});
Lalit Maganti0fd14ef2019-12-18 18:18:44 +00002827 EXPECT_EQ(samples.utid()[2], 1u);
Oystein Eftevaag95fe09e2020-04-17 12:55:17 -07002828 EXPECT_EQ(samples.process_priority()[2], 30);
Oystein Eftevaagaa944212020-01-22 14:32:47 -08002829
2830 // Breakpad build_ids should not be modified/mangled.
2831 ASSERT_STREQ(
2832 context_.storage
2833 ->GetString(storage_->stack_profile_mapping_table().build_id()[0])
2834 .c_str(),
2835 "3BBCFBD372448A727265C3E7C4D954F91");
Oystein Eftevaag7f64c102019-08-29 10:27:31 -07002836}
2837
Eric Seckler44eeb882020-02-03 11:31:12 +00002838TEST_F(ProtoTraceParserTest, CPUProfileSamplesTimestampsAreClockMonotonic) {
2839 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002840 auto* packet = trace_->add_packet();
Eric Seckler44eeb882020-02-03 11:31:12 +00002841 packet->set_trusted_packet_sequence_id(0);
2842
2843 // 1000 us monotonic == 10000 us boottime.
2844 auto* clock_snapshot = packet->set_clock_snapshot();
2845 auto* clock_boot = clock_snapshot->add_clocks();
Eric Secklerdc454522020-05-20 19:40:23 +01002846 clock_boot->set_clock_id(protos::pbzero::BUILTIN_CLOCK_BOOTTIME);
Eric Seckler44eeb882020-02-03 11:31:12 +00002847 clock_boot->set_timestamp(10000000);
2848 auto* clock_monotonic = clock_snapshot->add_clocks();
Eric Secklerdc454522020-05-20 19:40:23 +01002849 clock_monotonic->set_clock_id(protos::pbzero::BUILTIN_CLOCK_MONOTONIC);
Eric Seckler44eeb882020-02-03 11:31:12 +00002850 clock_monotonic->set_timestamp(1000000);
2851 }
2852
2853 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002854 auto* packet = trace_->add_packet();
Eric Seckler44eeb882020-02-03 11:31:12 +00002855 packet->set_trusted_packet_sequence_id(1);
2856 packet->set_incremental_state_cleared(true);
2857
2858 auto* thread_desc = packet->set_thread_descriptor();
2859 thread_desc->set_pid(15);
2860 thread_desc->set_tid(16);
2861 thread_desc->set_reference_timestamp_us(1000);
2862 thread_desc->set_reference_thread_time_us(2000);
2863
2864 auto* interned_data = packet->set_interned_data();
2865
2866 auto mapping = interned_data->add_mappings();
2867 mapping->set_iid(1);
2868 mapping->set_build_id(1);
2869
2870 auto build_id = interned_data->add_build_ids();
2871 build_id->set_iid(1);
2872 build_id->set_str("3BBCFBD372448A727265C3E7C4D954F91");
2873
2874 auto frame = interned_data->add_frames();
2875 frame->set_iid(1);
2876 frame->set_rel_pc(0x42);
2877 frame->set_mapping_id(1);
2878
2879 auto callstack = interned_data->add_callstacks();
2880 callstack->set_iid(1);
2881 callstack->add_frame_ids(1);
2882 }
2883
2884 {
Primiano Tuccibb371732020-08-07 17:25:11 +02002885 auto* packet = trace_->add_packet();
Eric Seckler44eeb882020-02-03 11:31:12 +00002886 packet->set_trusted_packet_sequence_id(1);
2887
2888 auto* samples = packet->set_streaming_profile_packet();
2889 samples->add_callstack_iid(1);
2890 samples->add_timestamp_delta_us(15);
2891 }
2892
2893 EXPECT_CALL(*process_, UpdateThread(16, 15)).WillRepeatedly(Return(1));
2894
2895 Tokenize();
Lalit Maganti09e840c2021-09-22 15:23:17 +01002896 context_.sorter->ExtractEventsForced();
Eric Seckler44eeb882020-02-03 11:31:12 +00002897
2898 const auto& samples = storage_->cpu_profile_stack_sample_table();
2899 EXPECT_EQ(samples.row_count(), 1u);
2900
2901 // Should have been translated to boottime, i.e. 10015 us absolute.
2902 EXPECT_EQ(samples.ts()[0], 10015000);
2903 EXPECT_EQ(samples.callsite_id()[0], CallsiteId{0});
2904 EXPECT_EQ(samples.utid()[0], 1u);
2905}
2906
Hector Dearmana1d75242020-10-02 09:47:24 +01002907TEST_F(ProtoTraceParserTest, ConfigUuid) {
2908 auto* config = trace_->add_packet()->set_trace_config();
2909 config->set_trace_uuid_lsb(1);
2910 config->set_trace_uuid_msb(2);
2911
2912 ASSERT_TRUE(Tokenize().ok());
Lalit Maganti09e840c2021-09-22 15:23:17 +01002913 context_.sorter->ExtractEventsForced();
Hector Dearmana1d75242020-10-02 09:47:24 +01002914
2915 SqlValue value =
2916 context_.metadata_tracker->GetMetadataForTesting(metadata::trace_uuid);
2917 EXPECT_STREQ(value.string_value, "00000000-0000-0002-0000-000000000001");
Tuchila Octavianfaaaa6d2021-06-04 14:13:18 +01002918 ASSERT_TRUE(context_.uuid_found_in_trace);
Hector Dearmana1d75242020-10-02 09:47:24 +01002919}
2920
2921TEST_F(ProtoTraceParserTest, ConfigPbtxt) {
2922 auto* config = trace_->add_packet()->set_trace_config();
2923 config->add_buffers()->set_size_kb(42);
2924
2925 ASSERT_TRUE(Tokenize().ok());
Lalit Maganti09e840c2021-09-22 15:23:17 +01002926 context_.sorter->ExtractEventsForced();
Hector Dearmana1d75242020-10-02 09:47:24 +01002927
2928 SqlValue value = context_.metadata_tracker->GetMetadataForTesting(
2929 metadata::trace_config_pbtxt);
2930 EXPECT_THAT(value.string_value, HasSubstr("size_kb: 42"));
2931}
2932
Lalit Maganti93b76362018-06-01 03:03:58 +01002933} // namespace
2934} // namespace trace_processor
2935} // namespace perfetto