| /* | 
 |  * Copyright (C) 2022 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #include "test/gtest_and_gmock.h" | 
 |  | 
 | #include "perfetto/protozero/scattered_heap_buffer.h" | 
 | #include "protos/perfetto/trace/trace.pbzero.h" | 
 | #include "protos/perfetto/trace/trace_packet.pbzero.h" | 
 | #include "protos/perfetto/trace/track_event/chrome_mojo_event_info.pbzero.h" | 
 | #include "src/protozero/test/example_proto/test_messages.pbzero.h" | 
 | #include "src/trace_processor/test_messages.descriptor.h" | 
 | #include "src/trace_processor/util/proto_profiler.h" | 
 |  | 
 | namespace perfetto { | 
 | namespace trace_processor { | 
 | namespace util { | 
 | namespace { | 
 |  | 
 | using ::testing::UnorderedElementsAreArray; | 
 |  | 
 | TEST(ProtoProfiler, TestMessage) { | 
 |   protozero::HeapBuffered<protozero::test::protos::pbzero::NestedA> message; | 
 |   message->add_repeated_a()->set_value_b()->set_value_c(1); | 
 |   message->add_repeated_a()->set_value_b()->set_value_c(2); | 
 |   message->set_super_nested()->set_value_c(3); | 
 |   const std::vector<uint8_t> bytes = message.SerializeAsArray(); | 
 |  | 
 |   DescriptorPool pool; | 
 |   pool.AddFromFileDescriptorSet(kTestMessagesDescriptor.data(), | 
 |                                 kTestMessagesDescriptor.size()); | 
 |   SizeProfileComputer computer(&pool); | 
 |   const auto got_map = computer.Compute(bytes.data(), bytes.size(), | 
 |                                         ".protozero.test.protos.NestedA"); | 
 |  | 
 |   // base::FlatHashMap doesn't support STL-container style iteration, so test | 
 |   // matchers don't work for it, and we need a vector (std::map would work, | 
 |   // too). | 
 |   using Item = std::pair<SizeProfileComputer::FieldPath, | 
 |                          SizeProfileComputer::SizeSamples>; | 
 |   std::vector<Item> got; | 
 |   for (auto it = got_map.GetIterator(); it; ++it) { | 
 |     got.emplace_back(it.key(), it.value()); | 
 |   } | 
 |   std::vector<Item> expected{ | 
 |       {{"NestedA"}, {15}}, | 
 |       {{"NestedA", "#repeated_a", "NestedB"}, {5, 5}}, | 
 |       {{"NestedA", "#repeated_a", "NestedB", "#value_b", "NestedC"}, {1, 1}}, | 
 |       {{"NestedA", "#repeated_a", "NestedB", "#value_b", "NestedC", "#value_c", | 
 |         "int32"}, | 
 |        {1, 1}}, | 
 |       {{"NestedA", "#super_nested", "NestedC"}, {1}}, | 
 |       {{"NestedA", "#super_nested", "NestedC", "#value_c", "int32"}, {1}}}; | 
 |  | 
 |   EXPECT_THAT(got, UnorderedElementsAreArray(expected)); | 
 | } | 
 |  | 
 | }  // namespace | 
 | }  // namespace util | 
 | }  // namespace trace_processor | 
 | }  // namespace perfetto |