Partial revert of "Partial revert of aosp/2166563"

This reverts commit 241aa3e101f9434b5fcbe683f79c576da9c0cf35.

Let's reenable the test outside of Chromium. The underlying code is for trace processor only, so we don't really need it in Chromium anyway.

The Chromium roll is tested in crrev.com/c/3829089

Bug: b/241234937
Change-Id: I09819543e3c668d2b121e7b4b491804dc9b87517
diff --git a/Android.bp b/Android.bp
index 3121f00..559160d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -9534,6 +9534,14 @@
     name: "perfetto_src_trace_processor_util_interned_message_view",
 }
 
+// GN: //src/trace_processor/util:proto_profiler
+filegroup {
+    name: "perfetto_src_trace_processor_util_proto_profiler",
+    srcs: [
+        "src/trace_processor/util/proto_profiler.cc",
+    ],
+}
+
 // GN: //src/trace_processor/util:proto_to_args_parser
 filegroup {
     name: "perfetto_src_trace_processor_util_proto_to_args_parser",
@@ -9565,6 +9573,7 @@
     srcs: [
         "src/trace_processor/util/debug_annotation_parser_unittest.cc",
         "src/trace_processor/util/gzip_utils_unittest.cc",
+        "src/trace_processor/util/proto_profiler_unittest.cc",
         "src/trace_processor/util/proto_to_args_parser_unittest.cc",
         "src/trace_processor/util/protozero_to_text_unittests.cc",
         "src/trace_processor/util/streaming_line_reader_unittest.cc",
@@ -10780,6 +10789,7 @@
         ":perfetto_protos_perfetto_trace_translation_cpp_gen",
         ":perfetto_protos_perfetto_trace_translation_lite_gen",
         ":perfetto_protos_perfetto_trace_translation_zero_gen",
+        ":perfetto_protos_third_party_pprof_zero_gen",
         ":perfetto_protos_third_party_statsd_config_zero_gen",
         ":perfetto_src_android_internal_headers",
         ":perfetto_src_android_internal_lazy_library_loader",
@@ -10880,6 +10890,7 @@
         ":perfetto_src_trace_processor_util_descriptors",
         ":perfetto_src_trace_processor_util_gzip",
         ":perfetto_src_trace_processor_util_interned_message_view",
+        ":perfetto_src_trace_processor_util_proto_profiler",
         ":perfetto_src_trace_processor_util_proto_to_args_parser",
         ":perfetto_src_trace_processor_util_protozero_to_text",
         ":perfetto_src_trace_processor_util_stack_traces_util",
@@ -11065,6 +11076,7 @@
         "perfetto_protos_perfetto_trace_translation_cpp_gen_headers",
         "perfetto_protos_perfetto_trace_translation_lite_gen_headers",
         "perfetto_protos_perfetto_trace_translation_zero_gen_headers",
+        "perfetto_protos_third_party_pprof_zero_gen_headers",
         "perfetto_protos_third_party_statsd_config_zero_gen_headers",
         "perfetto_src_base_version_gen_h",
         "perfetto_src_ipc_test_messages_cpp_gen_headers",
diff --git a/src/trace_processor/util/BUILD.gn b/src/trace_processor/util/BUILD.gn
index ec24986..de147a6 100644
--- a/src/trace_processor/util/BUILD.gn
+++ b/src/trace_processor/util/BUILD.gn
@@ -146,7 +146,7 @@
   ]
   deps = [
     "../../../gn:default_deps",
-    "../../../gn:protobuf_full",
+    "../../../gn:protobuf_lite",
     "../../../protos/perfetto/common:zero",
     "../../../protos/third_party/pprof:zero",
     "../../base",
@@ -183,4 +183,17 @@
     sources += [ "gzip_utils_unittest.cc" ]
     deps += [ "../../../gn:zlib" ]
   }
+
+  # There's a dependency on protobuf_lite in perfetto_unittests in Chromium,
+  # and it breaks Windows builds when combined with the protobuf_full
+  # depenedency coming from this test. See b/241234937 for more details.
+  # This should be fixable, but it doesn't seem to be trivial. So let's disable
+  # it in Chromium for now.
+  if (!build_with_chromium) {
+    sources += [ "proto_profiler_unittest.cc" ]
+    deps += [
+      ":proto_profiler",
+      "../../../gn:protobuf_full",
+    ]
+  }
 }
diff --git a/src/trace_processor/util/proto_profiler_unittest.cc b/src/trace_processor/util/proto_profiler_unittest.cc
new file mode 100644
index 0000000..cfd48fd
--- /dev/null
+++ b/src/trace_processor/util/proto_profiler_unittest.cc
@@ -0,0 +1,88 @@
+/*
+ * 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 <google/protobuf/compiler/importer.h>
+
+#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 ::google::protobuf::Descriptor;
+using ::google::protobuf::DescriptorPool;
+using ::google::protobuf::FileDescriptor;
+using ::google::protobuf::FileDescriptorSet;
+using ::google::protobuf::compiler::DiskSourceTree;
+using ::google::protobuf::compiler::Importer;
+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(DescriptorPool::generated_pool());
+  FileDescriptorSet desc_set;
+  ASSERT_TRUE(desc_set.ParseFromArray(kTestMessagesDescriptor.data(),
+                                      kTestMessagesDescriptor.size()));
+  for (const auto& file_desc : desc_set.file()) {
+    pool.BuildFile(file_desc);
+  }
+  const Descriptor* descriptor =
+      pool.FindMessageTypeByName("protozero.test.protos.NestedA");
+  ASSERT_TRUE(descriptor);
+
+  SizeProfileComputer computer;
+  const auto got_map = computer.Compute(bytes.data(), bytes.size(), descriptor);
+
+  // 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