Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 1 | /* |
| 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 Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 24 | #include "src/protozero/test/example_proto/test_messages.pbzero.h" |
Lalit Maganti | 617deae | 2020-04-14 21:00:49 +0100 | [diff] [blame] | 25 | #include "src/trace_processor/importers/common/args_tracker.h" |
Lalit Maganti | 7010b33 | 2020-02-07 10:51:15 +0000 | [diff] [blame] | 26 | #include "src/trace_processor/storage/trace_storage.h" |
Lalit Maganti | 2939c08 | 2021-03-11 17:25:44 +0000 | [diff] [blame^] | 27 | #include "src/trace_processor/test_messages.descriptor.h" |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 28 | #include "test/gtest_and_gmock.h" |
| 29 | |
| 30 | namespace perfetto { |
| 31 | namespace trace_processor { |
| 32 | namespace { |
| 33 | |
| 34 | constexpr size_t kChunkSize = 42; |
| 35 | |
| 36 | using ::testing::_; |
| 37 | using ::testing::Eq; |
| 38 | using ::testing::Invoke; |
| 39 | using ::testing::NiceMock; |
| 40 | |
| 41 | class ArgsTableUtilsTest : public ::testing::Test { |
| 42 | protected: |
| 43 | ArgsTableUtilsTest() { |
| 44 | context_.storage.reset(new TraceStorage); |
| 45 | storage_ = context_.storage.get(); |
Lalit Maganti | 1908e26 | 2020-01-09 14:33:19 +0000 | [diff] [blame] | 46 | context_.global_args_tracker.reset(new GlobalArgsTracker(&context_)); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 47 | context_.args_tracker.reset(new ArgsTracker(&context_)); |
| 48 | sequence_state_.reset(new PacketSequenceState(&context_)); |
| 49 | } |
| 50 | |
Andrew Shulaev | c10e8af | 2020-02-25 10:38:55 +0000 | [diff] [blame] | 51 | /** |
| 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 Maganti | 1908e26 | 2020-01-09 14:33:19 +0000 | [diff] [blame] | 59 | const auto& args = storage_->arg_table(); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 60 | auto key_id = storage_->string_pool().GetId(key); |
| 61 | EXPECT_TRUE(key_id); |
Andrew Shulaev | c10e8af | 2020-02-25 10:38:55 +0000 | [diff] [blame] | 62 | auto flat_key_id = storage_->string_pool().GetId(flat_key); |
| 63 | EXPECT_TRUE(flat_key_id); |
Lalit Maganti | 1908e26 | 2020-01-09 14:33:19 +0000 | [diff] [blame] | 64 | |
| 65 | RowMap rm = args.FilterToRowMap({args.arg_set_id().eq(set_id)}); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 66 | bool found = false; |
Lalit Maganti | 1908e26 | 2020-01-09 14:33:19 +0000 | [diff] [blame] | 67 | for (auto it = rm.IterateRows(); it; it.Next()) { |
| 68 | if (args.key()[it.row()] == key_id) { |
Andrew Shulaev | c10e8af | 2020-02-25 10:38:55 +0000 | [diff] [blame] | 69 | EXPECT_EQ(args.flat_key()[it.row()], flat_key_id); |
Lalit Maganti | 1908e26 | 2020-01-09 14:33:19 +0000 | [diff] [blame] | 70 | if (storage_->GetArgValue(it.row()) == value) { |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 71 | found = true; |
| 72 | break; |
| 73 | } |
| 74 | } |
| 75 | } |
| 76 | return found; |
| 77 | } |
| 78 | |
Andrew Shulaev | c10e8af | 2020-02-25 10:38:55 +0000 | [diff] [blame] | 79 | /** |
| 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 Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 87 | uint32_t arg_set_id_ = 1; |
| 88 | std::unique_ptr<PacketSequenceState> sequence_state_; |
| 89 | TraceProcessorContext context_; |
| 90 | TraceStorage* storage_; |
| 91 | }; |
| 92 | |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 93 | TEST_F(ArgsTableUtilsTest, EnsureTestMessageProtoParses) { |
Andrew Shulaev | e80864c | 2020-03-05 15:41:09 +0000 | [diff] [blame] | 94 | ProtoToArgsTable helper(&context_); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 95 | auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(), |
| 96 | kTestMessagesDescriptor.size()); |
| 97 | EXPECT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: " |
| 98 | << status.message(); |
| 99 | } |
| 100 | |
| 101 | TEST_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 Shulaev | e80864c | 2020-03-05 15:41:09 +0000 | [diff] [blame] | 130 | ProtoToArgsTable helper(&context_); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 131 | auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(), |
| 132 | kTestMessagesDescriptor.size()); |
| 133 | ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: " |
| 134 | << status.message(); |
| 135 | |
Lalit Maganti | 5228f36 | 2020-01-15 13:45:56 +0000 | [diff] [blame] | 136 | auto inserter = context_.args_tracker->AddArgsTo(TrackId(0)); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 137 | status = helper.InternProtoFieldsIntoArgsTable( |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 138 | protozero::ConstBytes{binary_proto.data(), binary_proto.size()}, |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 139 | ".protozero.test.protos.EveryField", nullptr, &inserter, |
Lalit Maganti | 9a84311 | 2020-11-10 13:39:05 +0000 | [diff] [blame] | 140 | sequence_state_->current_generation().get()); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 141 | |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 142 | EXPECT_TRUE(status.ok()) |
| 143 | << "InternProtoFieldsIntoArgsTable failed with error: " |
| 144 | << status.message(); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 145 | |
| 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 Seckler | c7b0c61 | 2020-02-12 18:30:35 +0000 | [diff] [blame] | 189 | EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "repeated_int32", |
Andrew Shulaev | c10e8af | 2020-02-25 10:38:55 +0000 | [diff] [blame] | 190 | "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 Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 197 | } |
| 198 | |
| 199 | TEST_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 Shulaev | e80864c | 2020-03-05 15:41:09 +0000 | [diff] [blame] | 207 | ProtoToArgsTable helper(&context_); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 208 | auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(), |
| 209 | kTestMessagesDescriptor.size()); |
| 210 | ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: " |
| 211 | << status.message(); |
| 212 | |
Lalit Maganti | 5228f36 | 2020-01-15 13:45:56 +0000 | [diff] [blame] | 213 | auto inserter = context_.args_tracker->AddArgsTo(TrackId(0)); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 214 | status = helper.InternProtoFieldsIntoArgsTable( |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 215 | protozero::ConstBytes{binary_proto.data(), binary_proto.size()}, |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 216 | ".protozero.test.protos.NestedA", nullptr, &inserter, |
Lalit Maganti | 9a84311 | 2020-11-10 13:39:05 +0000 | [diff] [blame] | 217 | sequence_state_->current_generation().get()); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 218 | EXPECT_TRUE(status.ok()) |
| 219 | << "InternProtoFieldsIntoArgsTable failed with error: " |
| 220 | << status.message(); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 221 | context_.args_tracker->Flush(); |
| 222 | EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_c", |
| 223 | Variadic::Integer(3))); |
| 224 | } |
| 225 | |
| 226 | TEST_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 Shulaev | e80864c | 2020-03-05 15:41:09 +0000 | [diff] [blame] | 236 | ProtoToArgsTable helper(&context_); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 237 | auto status = helper.AddProtoFileDescriptor(kTestMessagesDescriptor.data(), |
| 238 | kTestMessagesDescriptor.size()); |
| 239 | ASSERT_TRUE(status.ok()) << "Failed to parse kTestMessagesDescriptor: " |
| 240 | << status.message(); |
| 241 | |
Lalit Maganti | 5228f36 | 2020-01-15 13:45:56 +0000 | [diff] [blame] | 242 | auto inserter = context_.args_tracker->AddArgsTo(TrackId(0)); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 243 | status = helper.InternProtoFieldsIntoArgsTable( |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 244 | protozero::ConstBytes{binary_proto.data(), binary_proto.size()}, |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 245 | ".protozero.test.protos.CamelCaseFields", nullptr, &inserter, |
Lalit Maganti | 9a84311 | 2020-11-10 13:39:05 +0000 | [diff] [blame] | 246 | sequence_state_->current_generation().get()); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 247 | EXPECT_TRUE(status.ok()) |
| 248 | << "InternProtoFieldsIntoArgsTable failed with error: " |
| 249 | << status.message(); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 250 | 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 | |
| 257 | TEST_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 Shulaev | e80864c | 2020-03-05 15:41:09 +0000 | [diff] [blame] | 265 | ProtoToArgsTable helper(&context_); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 266 | 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 Maganti | 7449dc8 | 2019-12-30 15:52:35 +0000 | [diff] [blame] | 274 | const protozero::Field& field, ArgsTracker::BoundInserter* inserter) { |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 275 | EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 276 | 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 Maganti | 7449dc8 | 2019-12-30 15:52:35 +0000 | [diff] [blame] | 281 | inserter->AddArg(id, id, Variadic::Integer(val + 1)); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 282 | // We've handled this field by adding the desired args. |
| 283 | return true; |
| 284 | }); |
Lalit Maganti | 7449dc8 | 2019-12-30 15:52:35 +0000 | [diff] [blame] | 285 | |
Lalit Maganti | 5228f36 | 2020-01-15 13:45:56 +0000 | [diff] [blame] | 286 | auto inserter = context_.args_tracker->AddArgsTo(TrackId(0)); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 287 | status = helper.InternProtoFieldsIntoArgsTable( |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 288 | protozero::ConstBytes{binary_proto.data(), binary_proto.size()}, |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 289 | ".protozero.test.protos.NestedA", nullptr, &inserter, |
Lalit Maganti | 9a84311 | 2020-11-10 13:39:05 +0000 | [diff] [blame] | 290 | sequence_state_->current_generation().get()); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 291 | EXPECT_TRUE(status.ok()) |
| 292 | << "InternProtoFieldsIntoArgsTable failed with error: " |
| 293 | << status.message(); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 294 | context_.args_tracker->Flush(); |
| 295 | EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_b.replaced", |
| 296 | Variadic::Integer(4))); |
| 297 | } |
| 298 | |
| 299 | TEST_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 Shulaev | e80864c | 2020-03-05 15:41:09 +0000 | [diff] [blame] | 307 | ProtoToArgsTable helper(&context_); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 308 | 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 Maganti | 7449dc8 | 2019-12-30 15:52:35 +0000 | [diff] [blame] | 316 | const protozero::Field& field, ArgsTracker::BoundInserter*) { |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 317 | static int val = 0; |
| 318 | ++val; |
| 319 | EXPECT_EQ(1, val); |
| 320 | EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 321 | 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 Maganti | 7449dc8 | 2019-12-30 15:52:35 +0000 | [diff] [blame] | 326 | |
Lalit Maganti | 5228f36 | 2020-01-15 13:45:56 +0000 | [diff] [blame] | 327 | auto inserter = context_.args_tracker->AddArgsTo(TrackId(0)); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 328 | status = helper.InternProtoFieldsIntoArgsTable( |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 329 | protozero::ConstBytes{binary_proto.data(), binary_proto.size()}, |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 330 | ".protozero.test.protos.NestedA", nullptr, &inserter, |
Lalit Maganti | 9a84311 | 2020-11-10 13:39:05 +0000 | [diff] [blame] | 331 | sequence_state_->current_generation().get()); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 332 | EXPECT_TRUE(status.ok()) |
| 333 | << "InternProtoFieldsIntoArgsTable failed with error: " |
| 334 | << status.message(); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 335 | context_.args_tracker->Flush(); |
| 336 | EXPECT_TRUE(HasArg(ArgSetId(arg_set_id_), "super_nested.value_c", |
| 337 | Variadic::Integer(3))); |
| 338 | } |
| 339 | |
| 340 | TEST_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 Shulaev | e80864c | 2020-03-05 15:41:09 +0000 | [diff] [blame] | 363 | ProtoToArgsTable helper(&context_); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 364 | // 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 Maganti | 7449dc8 | 2019-12-30 15:52:35 +0000 | [diff] [blame] | 369 | const protozero::Field& field, ArgsTracker::BoundInserter* inserter) { |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 370 | EXPECT_EQ(field.type(), protozero::proto_utils::ProtoWireType::kVarInt); |
| 371 | auto* decoder = state.sequence_state->LookupInternedMessage< |
| 372 | protos::pbzero::InternedData::kSourceLocationsFieldNumber, |
Eric Seckler | 7e9dc31 | 2020-01-02 15:17:28 +0000 | [diff] [blame] | 373 | protos::pbzero::SourceLocation>(field.as_uint64()); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 374 | 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 Maganti | 7449dc8 | 2019-12-30 15:52:35 +0000 | [diff] [blame] | 382 | 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 Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 384 | 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 Maganti | 5228f36 | 2020-01-15 13:45:56 +0000 | [diff] [blame] | 393 | auto inserter = context_.args_tracker->AddArgsTo(TrackId(0)); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 394 | status = helper.InternProtoFieldsIntoArgsTable( |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 395 | protozero::ConstBytes{binary_proto.data(), binary_proto.size()}, |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 396 | ".protozero.test.protos.NestedA", nullptr, &inserter, |
Lalit Maganti | 9a84311 | 2020-11-10 13:39:05 +0000 | [diff] [blame] | 397 | sequence_state_->current_generation().get()); |
Andrew Shulaev | 1fe5332 | 2020-07-14 14:57:22 +0100 | [diff] [blame] | 398 | EXPECT_TRUE(status.ok()) |
| 399 | << "InternProtoFieldsIntoArgsTable failed with error: " |
| 400 | << status.message(); |
Stephen Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 401 | 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 Nusko | bc76a6c | 2019-12-03 11:55:27 +0000 | [diff] [blame] | 410 | } // namespace |
| 411 | } // namespace trace_processor |
| 412 | } // namespace perfetto |