perfetto-cmd: Save/Load state using protozero

Change-Id: I4d686fdb8b0a3290c6126afb751bc639ea537283
diff --git a/Android.bp b/Android.bp
index a41c143..5a1b59e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -628,7 +628,6 @@
   ],
   shared_libs: [
     "liblog",
-    "libprotobuf-cpp-lite",
     "libz",
   ],
   generated_headers: [
@@ -4220,10 +4219,11 @@
   ],
   tools: [
     "aprotoc",
+    "perfetto_src_protozero_protoc_plugin_cppgen_plugin",
   ],
-  cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=$(genDir)/external/perfetto/ $(in)",
+  cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(in)",
   out: [
-    "external/perfetto/src/perfetto_cmd/perfetto_cmd_state.pb.cc",
+    "external/perfetto/src/perfetto_cmd/perfetto_cmd_state.gen.cc",
   ],
 }
 
@@ -4235,10 +4235,11 @@
   ],
   tools: [
     "aprotoc",
+    "perfetto_src_protozero_protoc_plugin_cppgen_plugin",
   ],
-  cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=$(genDir)/external/perfetto/ $(in)",
+  cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(in)",
   out: [
-    "external/perfetto/src/perfetto_cmd/perfetto_cmd_state.pb.h",
+    "external/perfetto/src/perfetto_cmd/perfetto_cmd_state.gen.h",
   ],
   export_include_dirs: [
     ".",
@@ -6140,7 +6141,6 @@
   ],
   shared_libs: [
     "liblog",
-    "libprotobuf-cpp-lite",
   ],
   generated_headers: [
     "perfetto_protos_perfetto_common_cpp_gen_headers",
diff --git a/BUILD b/BUILD
index 30d9281..db7385c 100644
--- a/BUILD
+++ b/BUILD
@@ -2315,7 +2315,7 @@
 )
 
 # GN target: //src/perfetto_cmd:protos
-perfetto_cc_proto_library(
+perfetto_cc_protocpp_library(
     name = "src_perfetto_cmd_protos",
     deps = [
         ":src_perfetto_cmd_protos_protos",
diff --git a/src/perfetto_cmd/BUILD.gn b/src/perfetto_cmd/BUILD.gn
index f012c47..b695f09 100644
--- a/src/perfetto_cmd/BUILD.gn
+++ b/src/perfetto_cmd/BUILD.gn
@@ -110,7 +110,7 @@
 }
 
 perfetto_proto_library("protos") {
-  proto_generators = [ "lite" ]
+  proto_generators = [ "cpp" ]
   sources = [
     "perfetto_cmd_state.proto",
   ]
diff --git a/src/perfetto_cmd/perfetto_cmd.h b/src/perfetto_cmd/perfetto_cmd.h
index ea93a8c..8f1a721 100644
--- a/src/perfetto_cmd/perfetto_cmd.h
+++ b/src/perfetto_cmd/perfetto_cmd.h
@@ -33,8 +33,6 @@
 #include "perfetto/ext/tracing/ipc/consumer_ipc_client.h"
 #include "src/perfetto_cmd/rate_limiter.h"
 
-#include "src/perfetto_cmd/perfetto_cmd_state.pb.h"
-
 namespace perfetto {
 
 class PacketWriter;
diff --git a/src/perfetto_cmd/rate_limiter.cc b/src/perfetto_cmd/rate_limiter.cc
index 4b2a685..c7df19e 100644
--- a/src/perfetto_cmd/rate_limiter.cc
+++ b/src/perfetto_cmd/rate_limiter.cc
@@ -158,7 +158,7 @@
 }
 
 bool RateLimiter::ClearState() {
-  PerfettoCmdState zero{};
+  gen::PerfettoCmdState zero{};
   zero.set_total_bytes_uploaded(0);
   zero.set_last_trace_timestamp(0);
   zero.set_first_trace_timestamp(0);
@@ -168,7 +168,7 @@
   return success;
 }
 
-bool RateLimiter::LoadState(PerfettoCmdState* state) {
+bool RateLimiter::LoadState(gen::PerfettoCmdState* state) {
   base::ScopedFile in_fd(base::OpenFile(GetStateFilePath(), O_RDONLY));
 
   if (!in_fd)
@@ -177,27 +177,23 @@
   ssize_t bytes = PERFETTO_EINTR(read(in_fd.get(), &buf, sizeof(buf)));
   if (bytes <= 0)
     return false;
-  return state->ParseFromArray(&buf, static_cast<int>(bytes));
+  return state->ParseFromArray(&buf, static_cast<size_t>(bytes));
 }
 
-bool RateLimiter::SaveState(const PerfettoCmdState& state) {
+bool RateLimiter::SaveState(const gen::PerfettoCmdState& state) {
   // Rationale for 0666: the cmdline client can be executed under two
   // different Unix UIDs: shell and statsd. If we run one after the
   // other and the file has 0600 permissions, then the 2nd run won't
   // be able to read the file and will clear it, aborting the trace.
   // SELinux still prevents that anything other than the perfetto
   // executable can change the guardrail file.
+  std::vector<uint8_t> buf = state.SerializeAsArray();
   base::ScopedFile out_fd(
       base::OpenFile(GetStateFilePath(), O_WRONLY | O_CREAT | O_TRUNC, 0666));
   if (!out_fd)
     return false;
-  char buf[1024];
-  size_t size = static_cast<size_t>(state.ByteSize());
-  PERFETTO_CHECK(size < sizeof(buf));
-  if (!state.SerializeToArray(&buf, static_cast<int>(size)))
-    return false;
-  ssize_t written = base::WriteAll(out_fd.get(), &buf, size);
-  return written >= 0 && static_cast<size_t>(written) == size;
+  ssize_t written = base::WriteAll(out_fd.get(), buf.data(), buf.size());
+  return written >= 0 && static_cast<size_t>(written) == buf.size();
 }
 
 }  // namespace perfetto
diff --git a/src/perfetto_cmd/rate_limiter.h b/src/perfetto_cmd/rate_limiter.h
index be76677..1f4866c 100644
--- a/src/perfetto_cmd/rate_limiter.h
+++ b/src/perfetto_cmd/rate_limiter.h
@@ -18,7 +18,7 @@
 #define SRC_PERFETTO_CMD_RATE_LIMITER_H_
 
 #include "perfetto/base/time.h"
-#include "src/perfetto_cmd/perfetto_cmd_state.pb.h"
+#include "src/perfetto_cmd/perfetto_cmd_state.gen.h"
 
 namespace perfetto {
 
@@ -42,16 +42,16 @@
   bool ClearState();
 
   // virtual for testing.
-  virtual bool LoadState(PerfettoCmdState* state);
+  virtual bool LoadState(gen::PerfettoCmdState* state);
 
   // virtual for testing.
-  virtual bool SaveState(const PerfettoCmdState& state);
+  virtual bool SaveState(const gen::PerfettoCmdState& state);
 
   bool StateFileExists();
   virtual std::string GetStateFilePath() const;
 
  private:
-  PerfettoCmdState state_{};
+  gen::PerfettoCmdState state_{};
 };
 
 }  // namespace perfetto
diff --git a/src/perfetto_cmd/rate_limiter_unittest.cc b/src/perfetto_cmd/rate_limiter_unittest.cc
index 2837731..6e0c462 100644
--- a/src/perfetto_cmd/rate_limiter_unittest.cc
+++ b/src/perfetto_cmd/rate_limiter_unittest.cc
@@ -53,16 +53,16 @@
       remove(GetStateFilePath().c_str());
   }
 
-  bool LoadStateConcrete(PerfettoCmdState* state) {
+  bool LoadStateConcrete(gen::PerfettoCmdState* state) {
     return RateLimiter::LoadState(state);
   }
 
-  bool SaveStateConcrete(const PerfettoCmdState& state) {
+  bool SaveStateConcrete(const gen::PerfettoCmdState& state) {
     return RateLimiter::SaveState(state);
   }
 
-  MOCK_METHOD1(LoadState, bool(PerfettoCmdState*));
-  MOCK_METHOD1(SaveState, bool(const PerfettoCmdState&));
+  MOCK_METHOD1(LoadState, bool(gen::PerfettoCmdState*));
+  MOCK_METHOD1(SaveState, bool(const gen::PerfettoCmdState&));
 
  private:
   base::TempDir dir_;
@@ -78,8 +78,8 @@
 TEST(RateLimiterTest, RoundTripState) {
   NiceMock<MockRateLimiter> limiter;
 
-  PerfettoCmdState input{};
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState input{};
+  gen::PerfettoCmdState output{};
 
   input.set_total_bytes_uploaded(42);
   ASSERT_TRUE(limiter.SaveState(input));
@@ -90,11 +90,11 @@
 TEST(RateLimiterTest, LoadFromEmpty) {
   NiceMock<MockRateLimiter> limiter;
 
-  PerfettoCmdState input{};
+  gen::PerfettoCmdState input{};
   input.set_total_bytes_uploaded(0);
   input.set_last_trace_timestamp(0);
   input.set_first_trace_timestamp(0);
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
 
   ASSERT_TRUE(limiter.SaveState(input));
   ASSERT_TRUE(limiter.LoadState(&output));
@@ -103,7 +103,7 @@
 
 TEST(RateLimiterTest, LoadFromNoFileFails) {
   NiceMock<MockRateLimiter> limiter;
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
   ASSERT_FALSE(limiter.LoadState(&output));
   ASSERT_EQ(output.total_bytes_uploaded(), 0u);
 }
@@ -113,7 +113,7 @@
 
   WriteGarbageToFile(limiter.GetStateFilePath().c_str());
 
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
   ASSERT_FALSE(limiter.LoadState(&output));
   ASSERT_EQ(output.total_bytes_uploaded(), 0u);
 }
@@ -149,7 +149,7 @@
   EXPECT_CALL(limiter, SaveState(_));
   ASSERT_TRUE(limiter.OnTraceDone(args, true, 42u));
 
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
   ASSERT_TRUE(limiter.LoadStateConcrete(&output));
   ASSERT_EQ(output.first_trace_timestamp(), 41u);
   ASSERT_EQ(output.last_trace_timestamp(), 41u);
@@ -171,7 +171,7 @@
   EXPECT_CALL(limiter, SaveState(_));
   ASSERT_TRUE(limiter.OnTraceDone(args, true, 1024 * 1024));
 
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
   ASSERT_TRUE(limiter.LoadStateConcrete(&output));
   EXPECT_EQ(output.total_bytes_uploaded(), 1024u * 1024u);
   EXPECT_EQ(output.first_trace_timestamp(), 10000u);
@@ -182,7 +182,7 @@
   StrictMock<MockRateLimiter> limiter;
   RateLimiter::Args args;
 
-  PerfettoCmdState input{};
+  gen::PerfettoCmdState input{};
   input.set_first_trace_timestamp(10000);
   input.set_last_trace_timestamp(10000 + 60 * 10);
   input.set_total_bytes_uploaded(1024 * 1024 * 2);
@@ -198,7 +198,7 @@
   EXPECT_CALL(limiter, SaveState(_));
   ASSERT_TRUE(limiter.OnTraceDone(args, true, 1024 * 1024));
 
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
   ASSERT_TRUE(limiter.LoadStateConcrete(&output));
   EXPECT_EQ(output.total_bytes_uploaded(), 1024u * 1024u * 3);
   EXPECT_EQ(output.first_trace_timestamp(), input.first_trace_timestamp());
@@ -219,7 +219,7 @@
   EXPECT_CALL(limiter, SaveState(_));
   ASSERT_FALSE(limiter.ShouldTrace(args));
 
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
   ASSERT_TRUE(limiter.LoadStateConcrete(&output));
   EXPECT_EQ(output.total_bytes_uploaded(), 0u);
   EXPECT_EQ(output.first_trace_timestamp(), 0u);
@@ -230,7 +230,7 @@
   StrictMock<MockRateLimiter> limiter;
   RateLimiter::Args args;
 
-  PerfettoCmdState input{};
+  gen::PerfettoCmdState input{};
   input.set_first_trace_timestamp(100);
   input.set_last_trace_timestamp(100);
   ASSERT_TRUE(limiter.SaveStateConcrete(input));
@@ -243,7 +243,7 @@
   EXPECT_CALL(limiter, SaveState(_));
   ASSERT_FALSE(limiter.ShouldTrace(args));
 
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
   ASSERT_TRUE(limiter.LoadStateConcrete(&output));
   EXPECT_EQ(output.total_bytes_uploaded(), 0u);
   EXPECT_EQ(output.first_trace_timestamp(), 0u);
@@ -254,7 +254,7 @@
   StrictMock<MockRateLimiter> limiter;
   RateLimiter::Args args;
 
-  PerfettoCmdState input{};
+  gen::PerfettoCmdState input{};
   input.set_first_trace_timestamp(10000);
   input.set_last_trace_timestamp(10000);
   ASSERT_TRUE(limiter.SaveStateConcrete(input));
@@ -271,7 +271,7 @@
   StrictMock<MockRateLimiter> limiter;
   RateLimiter::Args args;
 
-  PerfettoCmdState input{};
+  gen::PerfettoCmdState input{};
   input.set_total_bytes_uploaded(10 * 1024 * 1024 + 1);
   ASSERT_TRUE(limiter.SaveStateConcrete(input));
 
@@ -288,7 +288,7 @@
   StrictMock<MockRateLimiter> limiter;
   RateLimiter::Args args;
 
-  PerfettoCmdState input{};
+  gen::PerfettoCmdState input{};
   input.set_total_bytes_uploaded(10 * 1024 * 1024 + 1);
   ASSERT_TRUE(limiter.SaveStateConcrete(input));
 
@@ -305,7 +305,7 @@
   StrictMock<MockRateLimiter> limiter;
   RateLimiter::Args args;
 
-  PerfettoCmdState input{};
+  gen::PerfettoCmdState input{};
   input.set_first_trace_timestamp(1);
   input.set_last_trace_timestamp(1);
   input.set_total_bytes_uploaded(10 * 1024 * 1024 + 1);
@@ -320,7 +320,7 @@
   EXPECT_CALL(limiter, SaveState(_));
   ASSERT_TRUE(limiter.OnTraceDone(args, true, 1024 * 1024));
 
-  PerfettoCmdState output{};
+  gen::PerfettoCmdState output{};
   ASSERT_TRUE(limiter.LoadStateConcrete(&output));
   EXPECT_EQ(output.total_bytes_uploaded(), 1024u * 1024u);
   EXPECT_EQ(output.first_trace_timestamp(),
diff --git a/src/protozero/test/example_proto/test_messages.descriptor.h b/src/protozero/test/example_proto/test_messages.descriptor.h
index 9d0affc..6e0ff15 100644
--- a/src/protozero/test/example_proto/test_messages.descriptor.h
+++ b/src/protozero/test/example_proto/test_messages.descriptor.h
@@ -209,19 +209,19 @@
      0x72, 0x42, 0x61, 0x7a, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x72, 0x42,
      0x61, 0x7a, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x61,
      0x72, 0x42, 0x61, 0x7a, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x6f, 0x6f, 0x4d,
-     0x6f, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6d, 0x6f,
+     0x6f, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4d, 0x6f,
      0x6f, 0x4d, 0x6f, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x45,
      0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
-     0x52, 0x0a, 0x75, 0x52, 0x4c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72,
+     0x52, 0x0a, 0x55, 0x52, 0x4c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72,
      0x12, 0x12, 0x0a, 0x04, 0x58, 0x4d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01,
-     0x28, 0x08, 0x52, 0x04, 0x78, 0x4d, 0x61, 0x70, 0x12, 0x21, 0x0a, 0x0d,
+     0x28, 0x08, 0x52, 0x04, 0x58, 0x4d, 0x61, 0x70, 0x12, 0x21, 0x0a, 0x0d,
      0x55, 0x72, 0x4c, 0x45, 0x5f, 0x6e, 0x63, 0x6f, 0x5f, 0x5f, 0x64, 0x65,
-     0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x72, 0x4c,
+     0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x55, 0x72, 0x4c,
      0x45, 0x4e, 0x63, 0x6f, 0x44, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x09, 0x5f,
      0x5f, 0x62, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01,
-     0x28, 0x08, 0x52, 0x07, 0x62, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x67, 0x12,
+     0x28, 0x08, 0x52, 0x07, 0x42, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x67, 0x12,
      0x0e, 0x0a, 0x02, 0x55, 0x32, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52,
-     0x02, 0x75, 0x32, 0x12, 0x1a, 0x0a, 0x09, 0x62, 0x61, 0x6e, 0x67, 0x42,
+     0x02, 0x55, 0x32, 0x12, 0x1a, 0x0a, 0x09, 0x62, 0x61, 0x6e, 0x67, 0x42,
      0x69, 0x67, 0x5f, 0x5f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
      0x62, 0x61, 0x6e, 0x67, 0x42, 0x69, 0x67, 0x22, 0x8f, 0x01, 0x0a, 0x14,
      0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74,