blob: acf893e82d1b0b98f31b42edc8067c71366d43c3 [file] [log] [blame]
Stephen Nuskobc76a6c2019-12-03 11:55:27 +00001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "src/trace_processor/importers/proto/args_table_utils.h"
18
19#include "perfetto/ext/base/string_view.h"
20#include "perfetto/protozero/scattered_heap_buffer.h"
21#include "protos/perfetto/common/descriptor.pbzero.h"
22#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
23#include "protos/perfetto/trace/track_event/source_location.pbzero.h"
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000024#include "src/protozero/test/example_proto/test_messages.pbzero.h"
Lalit Maganti617deae2020-04-14 21:00:49 +010025#include "src/trace_processor/importers/common/args_tracker.h"
Lalit Maganti7010b332020-02-07 10:51:15 +000026#include "src/trace_processor/storage/trace_storage.h"
Lalit Maganti2939c082021-03-11 17:25:44 +000027#include "src/trace_processor/test_messages.descriptor.h"
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000028#include "test/gtest_and_gmock.h"
29
30namespace perfetto {
31namespace trace_processor {
32namespace {
33
34constexpr size_t kChunkSize = 42;
35
36using ::testing::_;
37using ::testing::Eq;
38using ::testing::Invoke;
39using ::testing::NiceMock;
40
41class ArgsTableUtilsTest : public ::testing::Test {
42 protected:
43 ArgsTableUtilsTest() {
44 context_.storage.reset(new TraceStorage);
45 storage_ = context_.storage.get();
Lalit Maganti1908e262020-01-09 14:33:19 +000046 context_.global_args_tracker.reset(new GlobalArgsTracker(&context_));
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000047 context_.args_tracker.reset(new ArgsTracker(&context_));
48 sequence_state_.reset(new PacketSequenceState(&context_));
49 }
50
Andrew Shulaevc10e8af2020-02-25 10:38:55 +000051 /**
52 * Check whether the argument set contains the value with given flat_key and
53 * key and is equal to the given value.
54 */
55 bool HasArg(ArgSetId set_id,
56 const base::StringView& flat_key,
57 const base::StringView& key,
58 Variadic value) {
Lalit Maganti1908e262020-01-09 14:33:19 +000059 const auto& args = storage_->arg_table();
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000060 auto key_id = storage_->string_pool().GetId(key);
61 EXPECT_TRUE(key_id);
Andrew Shulaevc10e8af2020-02-25 10:38:55 +000062 auto flat_key_id = storage_->string_pool().GetId(flat_key);
63 EXPECT_TRUE(flat_key_id);
Lalit Maganti1908e262020-01-09 14:33:19 +000064
65 RowMap rm = args.FilterToRowMap({args.arg_set_id().eq(set_id)});
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000066 bool found = false;
Lalit Maganti1908e262020-01-09 14:33:19 +000067 for (auto it = rm.IterateRows(); it; it.Next()) {
68 if (args.key()[it.row()] == key_id) {
Andrew Shulaevc10e8af2020-02-25 10:38:55 +000069 EXPECT_EQ(args.flat_key()[it.row()], flat_key_id);
Lalit Maganti1908e262020-01-09 14:33:19 +000070 if (storage_->GetArgValue(it.row()) == value) {
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000071 found = true;
72 break;
73 }
74 }
75 }
76 return found;
77 }
78
Andrew Shulaevc10e8af2020-02-25 10:38:55 +000079 /**
80 * Implementation of HasArg for a simple case when flat_key is equals to key,
81 * so that two won't have to be repeated for each assertion.
82 */
83 bool HasArg(ArgSetId set_id, const base::StringView& key, Variadic value) {
84 return HasArg(set_id, key, key, value);
85 }
86
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000087 uint32_t arg_set_id_ = 1;
88 std::unique_ptr<PacketSequenceState> sequence_state_;
89 TraceProcessorContext context_;
90 TraceStorage* storage_;
91};
92
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000093TEST_F(ArgsTableUtilsTest, EnsureTestMessageProtoParses) {
Andrew Shulaeve80864c2020-03-05 15:41:09 +000094 ProtoToArgsTable helper(&context_);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +000095 auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
96 kTestMessagesDescriptor.size());
97 EXPECT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
98 << status.message();
99}
100
101TEST_F(ArgsTableUtilsTest, BasicSingleLayerProto) {
102 using namespace protozero::test::protos::pbzero;
103 protozero::HeapBuffered<EveryField> msg{kChunkSize, kChunkSize};
104 msg->set_field_int32(-1);
105 msg->set_field_int64(-333123456789ll);
106 msg->set_field_uint32(600);
107 msg->set_field_uint64(333123456789ll);
108 msg->set_field_sint32(-5);
109 msg->set_field_sint64(-9000);
110 msg->set_field_fixed32(12345);
111 msg->set_field_fixed64(444123450000ll);
112 msg->set_field_sfixed32(-69999);
113 msg->set_field_sfixed64(-200);
114 msg->set_field_double(0.5555);
115 msg->set_field_bool(true);
116 msg->set_small_enum(SmallEnum::TO_BE);
117 msg->set_signed_enum(SignedEnum::NEGATIVE);
118 msg->set_big_enum(BigEnum::BEGIN);
119 msg->set_nested_enum(EveryField::PONG);
120 msg->set_field_float(3.14f);
121 msg->set_field_string("FizzBuzz");
122 msg->add_repeated_int32(1);
123 msg->add_repeated_int32(-1);
124 msg->add_repeated_int32(100);
125 msg->add_repeated_int32(2000000);
126
127 auto binary_proto = msg.SerializeAsArray();
128
129 storage_->mutable_track_table()->Insert({});
Andrew Shulaeve80864c2020-03-05 15:41:09 +0000130 ProtoToArgsTable helper(&context_);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000131 auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
132 kTestMessagesDescriptor.size());
133 ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
134 << status.message();
135
Lalit Maganti5228f362020-01-15 13:45:56 +0000136 auto inserter = context_.args_tracker->AddArgsTo(TrackId(0));
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100137 status = helper.InternProtoFieldsIntoArgsTable(
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000138 protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100139 ".protozero.test.protos.EveryField", nullptr, &inserter,
Lalit Maganti9a843112020-11-10 13:39:05 +0000140 sequence_state_->current_generation().get());
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000141
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100142 EXPECT_TRUE(status.ok())
143 << "InternProtoFieldsIntoArgsTable failed with error: "
144 << status.message();
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000145
146 context_.args_tracker->Flush();
147 EXPECT_TRUE(
148 HasArg(ArgSetId(arg_set_id_), "field_int32", Variadic::Integer(-1)));
149 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_int64",
150 Variadic::Integer(-333123456789ll)));
151 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_uint32",
152 Variadic::UnsignedInteger(600)));
153 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_uint64",
154 Variadic::UnsignedInteger(333123456789ll)));
155 EXPECT_TRUE(
156 HasArg(ArgSetId(arg_set_id_), "field_sint32", Variadic::Integer(-5)));
157 EXPECT_TRUE(
158 HasArg(ArgSetId(arg_set_id_), "field_sint64", Variadic::Integer(-9000)));
159 EXPECT_TRUE(
160 HasArg(ArgSetId(arg_set_id_), "field_fixed32", Variadic::Integer(12345)));
161 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_fixed64",
162 Variadic::Integer(444123450000ll)));
163 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_sfixed32",
164 Variadic::Integer(-69999)));
165 EXPECT_TRUE(
166 HasArg(ArgSetId(arg_set_id_), "field_sfixed64", Variadic::Integer(-200)));
167 EXPECT_TRUE(
168 HasArg(ArgSetId(arg_set_id_), "field_double", Variadic::Real(0.5555)));
169 EXPECT_TRUE(
170 HasArg(ArgSetId(arg_set_id_), "field_bool", Variadic::Boolean(true)));
171 EXPECT_TRUE(HasArg(
172 ArgSetId(arg_set_id_), "small_enum",
173 Variadic::String(*context_.storage->string_pool().GetId("TO_BE"))));
174 EXPECT_TRUE(HasArg(
175 ArgSetId(arg_set_id_), "signed_enum",
176 Variadic::String(*context_.storage->string_pool().GetId("NEGATIVE"))));
177 EXPECT_TRUE(HasArg(
178 ArgSetId(arg_set_id_), "big_enum",
179 Variadic::String(*context_.storage->string_pool().GetId("BEGIN"))));
180 EXPECT_TRUE(
181 HasArg(ArgSetId(arg_set_id_), "nested_enum",
182 Variadic::String(*context_.storage->string_pool().GetId("PONG"))));
183 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "field_float",
184 Variadic::Real(static_cast<double>(3.14f))));
185 ASSERT_TRUE(context_.storage->string_pool().GetId("FizzBuzz"));
186 EXPECT_TRUE(HasArg(
187 ArgSetId(arg_set_id_), "field_string",
188 Variadic::String(*context_.storage->string_pool().GetId("FizzBuzz"))));
Eric Secklerc7b0c612020-02-12 18:30:35 +0000189 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "repeated_int32",
Andrew Shulaevc10e8af2020-02-25 10:38:55 +0000190 "repeated_int32[0]", Variadic::Integer(1)));
191 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "repeated_int32",
192 "repeated_int32[1]", Variadic::Integer(-1)));
193 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "repeated_int32",
194 "repeated_int32[2]", Variadic::Integer(100)));
195 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "repeated_int32",
196 "repeated_int32[3]", Variadic::Integer(2000000)));
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000197}
198
199TEST_F(ArgsTableUtilsTest, NestedProto) {
200 using namespace protozero::test::protos::pbzero;
201 protozero::HeapBuffered<NestedA> msg{kChunkSize, kChunkSize};
202 msg->set_super_nested()->set_value_c(3);
203
204 auto binary_proto = msg.SerializeAsArray();
205
206 storage_->mutable_track_table()->Insert({});
Andrew Shulaeve80864c2020-03-05 15:41:09 +0000207 ProtoToArgsTable helper(&context_);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000208 auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
209 kTestMessagesDescriptor.size());
210 ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
211 << status.message();
212
Lalit Maganti5228f362020-01-15 13:45:56 +0000213 auto inserter = context_.args_tracker->AddArgsTo(TrackId(0));
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100214 status = helper.InternProtoFieldsIntoArgsTable(
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000215 protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100216 ".protozero.test.protos.NestedA", nullptr, &inserter,
Lalit Maganti9a843112020-11-10 13:39:05 +0000217 sequence_state_->current_generation().get());
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100218 EXPECT_TRUE(status.ok())
219 << "InternProtoFieldsIntoArgsTable failed with error: "
220 << status.message();
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000221 context_.args_tracker->Flush();
222 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_c",
223 Variadic::Integer(3)));
224}
225
226TEST_F(ArgsTableUtilsTest, CamelCaseFieldsProto) {
227 using namespace protozero::test::protos::pbzero;
228 protozero::HeapBuffered<CamelCaseFields> msg{kChunkSize, kChunkSize};
229 msg->set_barbaz(true);
230 msg->set_moomoo(true);
231 msg->set___bigbang(true);
232
233 auto binary_proto = msg.SerializeAsArray();
234
235 storage_->mutable_track_table()->Insert({});
Andrew Shulaeve80864c2020-03-05 15:41:09 +0000236 ProtoToArgsTable helper(&context_);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000237 auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
238 kTestMessagesDescriptor.size());
239 ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
240 << status.message();
241
Lalit Maganti5228f362020-01-15 13:45:56 +0000242 auto inserter = context_.args_tracker->AddArgsTo(TrackId(0));
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100243 status = helper.InternProtoFieldsIntoArgsTable(
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000244 protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100245 ".protozero.test.protos.CamelCaseFields", nullptr, &inserter,
Lalit Maganti9a843112020-11-10 13:39:05 +0000246 sequence_state_->current_generation().get());
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100247 EXPECT_TRUE(status.ok())
248 << "InternProtoFieldsIntoArgsTable failed with error: "
249 << status.message();
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000250 context_.args_tracker->Flush();
251 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "barBaz", Variadic::Boolean(true)));
252 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "MooMoo", Variadic::Boolean(true)));
253 EXPECT_TRUE(
254 HasArg(ArgSetId(arg_set_id_), "__bigBang", Variadic::Boolean(true)));
255}
256
257TEST_F(ArgsTableUtilsTest, NestedProtoParsingOverrideHandled) {
258 using namespace protozero::test::protos::pbzero;
259 protozero::HeapBuffered<NestedA> msg{kChunkSize, kChunkSize};
260 msg->set_super_nested()->set_value_c(3);
261
262 auto binary_proto = msg.SerializeAsArray();
263
264 storage_->mutable_track_table()->Insert({});
Andrew Shulaeve80864c2020-03-05 15:41:09 +0000265 ProtoToArgsTable helper(&context_);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000266 auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
267 kTestMessagesDescriptor.size());
268 ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
269 << status.message();
270
271 helper.AddParsingOverride(
272 "super_nested.value_c",
273 [](const ProtoToArgsTable::ParsingOverrideState& state,
Lalit Maganti7449dc82019-12-30 15:52:35 +0000274 const protozero::Field& field, ArgsTracker::BoundInserter* inserter) {
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000275 EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000276 EXPECT_TRUE(state.context);
277 EXPECT_TRUE(state.sequence_state);
278 auto id = state.context->storage->InternString(
279 "super_nested.value_b.replaced");
280 int32_t val = field.as_int32();
Lalit Maganti7449dc82019-12-30 15:52:35 +0000281 inserter->AddArg(id, id, Variadic::Integer(val + 1));
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000282 // We've handled this field by adding the desired args.
283 return true;
284 });
Lalit Maganti7449dc82019-12-30 15:52:35 +0000285
Lalit Maganti5228f362020-01-15 13:45:56 +0000286 auto inserter = context_.args_tracker->AddArgsTo(TrackId(0));
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100287 status = helper.InternProtoFieldsIntoArgsTable(
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000288 protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100289 ".protozero.test.protos.NestedA", nullptr, &inserter,
Lalit Maganti9a843112020-11-10 13:39:05 +0000290 sequence_state_->current_generation().get());
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100291 EXPECT_TRUE(status.ok())
292 << "InternProtoFieldsIntoArgsTable failed with error: "
293 << status.message();
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000294 context_.args_tracker->Flush();
295 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_b.replaced",
296 Variadic::Integer(4)));
297}
298
299TEST_F(ArgsTableUtilsTest, NestedProtoParsingOverrideSkipped) {
300 using namespace protozero::test::protos::pbzero;
301 protozero::HeapBuffered<NestedA> msg{kChunkSize, kChunkSize};
302 msg->set_super_nested()->set_value_c(3);
303
304 auto binary_proto = msg.SerializeAsArray();
305
306 storage_->mutable_track_table()->Insert({});
Andrew Shulaeve80864c2020-03-05 15:41:09 +0000307 ProtoToArgsTable helper(&context_);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000308 auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
309 kTestMessagesDescriptor.size());
310 ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
311 << status.message();
312
313 helper.AddParsingOverride(
314 "super_nested.value_c",
315 [](const ProtoToArgsTable::ParsingOverrideState& state,
Lalit Maganti7449dc82019-12-30 15:52:35 +0000316 const protozero::Field& field, ArgsTracker::BoundInserter*) {
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000317 static int val = 0;
318 ++val;
319 EXPECT_EQ(1, val);
320 EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000321 EXPECT_TRUE(state.sequence_state);
322 EXPECT_TRUE(state.context);
323 // By returning false we expect this field to be handled like regular.
324 return false;
325 });
Lalit Maganti7449dc82019-12-30 15:52:35 +0000326
Lalit Maganti5228f362020-01-15 13:45:56 +0000327 auto inserter = context_.args_tracker->AddArgsTo(TrackId(0));
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100328 status = helper.InternProtoFieldsIntoArgsTable(
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000329 protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100330 ".protozero.test.protos.NestedA", nullptr, &inserter,
Lalit Maganti9a843112020-11-10 13:39:05 +0000331 sequence_state_->current_generation().get());
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100332 EXPECT_TRUE(status.ok())
333 << "InternProtoFieldsIntoArgsTable failed with error: "
334 << status.message();
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000335 context_.args_tracker->Flush();
336 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_c",
337 Variadic::Integer(3)));
338}
339
340TEST_F(ArgsTableUtilsTest, LookingUpInternedStateParsingOverride) {
341 using namespace protozero::test::protos::pbzero;
342 // The test proto, we will use |value_c| as the source_location iid.
343 protozero::HeapBuffered<NestedA> msg{kChunkSize, kChunkSize};
344 msg->set_super_nested()->set_value_c(3);
345 auto binary_proto = msg.SerializeAsArray();
346
347 // The interned source location.
348 protozero::HeapBuffered<protos::pbzero::SourceLocation> src_loc{kChunkSize,
349 kChunkSize};
350 src_loc->set_iid(3);
351 src_loc->set_file_name("test_file_name");
352 // We need to update sequence_state to point to it.
353 auto binary_data = src_loc.SerializeAsArray();
354 std::unique_ptr<uint8_t[]> buffer(new uint8_t[binary_data.size()]);
355 for (size_t i = 0; i < binary_data.size(); ++i) {
356 buffer.get()[i] = binary_data[i];
357 }
358 TraceBlobView blob(std::move(buffer), 0, binary_data.size());
359 sequence_state_->InternMessage(
360 protos::pbzero::InternedData::kSourceLocationsFieldNumber,
361 std::move(blob));
362
Andrew Shulaeve80864c2020-03-05 15:41:09 +0000363 ProtoToArgsTable helper(&context_);
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000364 // Now we override the behaviour of |value_c| so we can expand the iid into
365 // multiple args rows.
366 helper.AddParsingOverride(
367 "super_nested.value_c",
368 [](const ProtoToArgsTable::ParsingOverrideState& state,
Lalit Maganti7449dc82019-12-30 15:52:35 +0000369 const protozero::Field& field, ArgsTracker::BoundInserter* inserter) {
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000370 EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt);
371 auto* decoder = state.sequence_state->LookupInternedMessage<
372 protos::pbzero::InternedData::kSourceLocationsFieldNumber,
Eric Seckler7e9dc312020-01-02 15:17:28 +0000373 protos::pbzero::SourceLocation>(field.as_uint64());
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000374 if (!decoder) {
375 // Lookup failed fall back on default behaviour.
376 return false;
377 }
378 TraceStorage* storage = state.context->storage.get();
379 auto file_name_id = storage->InternString("file_name");
380 auto line_number_id = storage->InternString("line_number");
381 auto file_id = storage->InternString(decoder->file_name());
Lalit Maganti7449dc82019-12-30 15:52:35 +0000382 inserter->AddArg(file_name_id, file_name_id, Variadic::String(file_id));
383 inserter->AddArg(line_number_id, line_number_id, Variadic::Integer(2));
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000384 return true;
385 });
386
387 storage_->mutable_track_table()->Insert({});
388 auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(),
389 kTestMessagesDescriptor.size());
390 ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: "
391 << status.message();
392
Lalit Maganti5228f362020-01-15 13:45:56 +0000393 auto inserter = context_.args_tracker->AddArgsTo(TrackId(0));
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100394 status = helper.InternProtoFieldsIntoArgsTable(
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000395 protozero::ConstBytes{binary_proto.data(), binary_proto.size()},
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100396 ".protozero.test.protos.NestedA", nullptr, &inserter,
Lalit Maganti9a843112020-11-10 13:39:05 +0000397 sequence_state_->current_generation().get());
Andrew Shulaev1fe53322020-07-14 14:57:22 +0100398 EXPECT_TRUE(status.ok())
399 << "InternProtoFieldsIntoArgsTable failed with error: "
400 << status.message();
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000401 auto file_name_id = storage_->string_pool().GetId("test_file_name");
402 ASSERT_TRUE(file_name_id);
403 context_.args_tracker->Flush();
404 EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "file_name",
405 Variadic::String(*file_name_id)));
406 EXPECT_TRUE(
407 HasArg(ArgSetId(arg_set_id_), "line_number", Variadic::Integer(2)));
408}
409
Stephen Nuskobc76a6c2019-12-03 11:55:27 +0000410} // namespace
411} // namespace trace_processor
412} // namespace perfetto