Minor test cleanup, use protozero::HeapBuffered<Msg>

Uneventful CL. Simply cleans up some tests taking
advantage of the HeapBuffered<> helper that has been
introduced at some point later.
This is to help some upcoming refactoring work on
protozero::Message.

Bug: 163125063
Change-Id: I98166f5b2145a6f79c4b7b7470d4f433bb7869ac
diff --git a/src/protozero/proto_decoder_unittest.cc b/src/protozero/proto_decoder_unittest.cc
index 580e959..5f40a89 100644
--- a/src/protozero/proto_decoder_unittest.cc
+++ b/src/protozero/proto_decoder_unittest.cc
@@ -61,29 +61,25 @@
   const uint64_t data_size = 4096 + kPayloadSize;
   std::unique_ptr<uint8_t, perfetto::base::FreeDeleter> data(
       static_cast<uint8_t*>(malloc(data_size)));
-
-  StaticBufferDelegate delegate(data.get(), data_size);
-  ScatteredStreamWriter writer(&delegate);
-  Message message;
-  message.Reset(&writer);
+  StaticBuffered<Message> message(data.get(), data_size);
 
   // Append a valid field.
-  message.AppendVarInt(/*field_id=*/1, 11);
+  message->AppendVarInt(/*field_id=*/1, 11);
 
   // Append a very large field that will be skipped.
   uint8_t raw[10];
   uint8_t* wptr = raw;
   wptr = WriteVarInt(MakeTagLengthDelimited(2), wptr);
   wptr = WriteVarInt(kPayloadSize, wptr);
-  message.AppendRawProtoBytes(raw, static_cast<size_t>(wptr - raw));
+  message->AppendRawProtoBytes(raw, static_cast<size_t>(wptr - raw));
   const uint8_t padding[1024 * 128]{};
   for (size_t i = 0; i < kPayloadSize / sizeof(padding); i++)
-    message.AppendRawProtoBytes(padding, sizeof(padding));
+    message->AppendRawProtoBytes(padding, sizeof(padding));
 
   // Append another valid field.
-  message.AppendVarInt(/*field_id=*/3, 13);
+  message->AppendVarInt(/*field_id=*/3, 13);
 
-  ProtoDecoder decoder(data.get(), static_cast<size_t>(writer.written()));
+  ProtoDecoder decoder(data.get(), message.Finalize());
   Field field = decoder.ReadField();
   ASSERT_EQ(1u, field.id());
   ASSERT_EQ(11, field.as_int32());
@@ -97,16 +93,10 @@
 }
 
 TEST(ProtoDecoderTest, SingleRepeatedField) {
-  Message message;
-  ScatteredHeapBuffer delegate(512, 512);
-  ScatteredStreamWriter writer(&delegate);
-  delegate.set_writer(&writer);
-  message.Reset(&writer);
-  message.AppendVarInt(/*field_id=*/2, 10);
-  delegate.AdjustUsedSizeOfCurrentSlice();
-  auto used_range = delegate.slices()[0].GetUsedRange();
-
-  TypedProtoDecoder<2, true> tpd(used_range.begin, used_range.size());
+  HeapBuffered<Message> message;
+  message->AppendVarInt(/*field_id=*/2, 10);
+  auto data = message.SerializeAsArray();
+  TypedProtoDecoder<2, true> tpd(data.data(), data.size());
   auto it = tpd.GetRepeated<int32_t>(/*field_id=*/2);
   EXPECT_TRUE(it);
   EXPECT_EQ(it.field().as_int32(), 10);
@@ -137,16 +127,11 @@
 }
 
 TEST(ProtoDecoderTest, SingleRepeatedFieldWithExpansion) {
-  Message message;
-  ScatteredHeapBuffer delegate(512, 512);
-  ScatteredStreamWriter writer(&delegate);
-  delegate.set_writer(&writer);
-  message.Reset(&writer);
+  HeapBuffered<Message> message;
   for (int i = 0; i < 2000; i++) {
-    message.AppendVarInt(/*field_id=*/2, i);
+    message->AppendVarInt(/*field_id=*/2, i);
   }
-  std::vector<uint8_t> data = delegate.StitchSlices();
-
+  auto data = message.SerializeAsArray();
   TypedProtoDecoder<2, true> tpd(data.data(), data.size());
   auto it = tpd.GetRepeated<int32_t>(/*field_id=*/2);
   for (int i = 0; i < 2000; i++) {
@@ -166,26 +151,20 @@
 }
 
 TEST(ProtoDecoderTest, RepeatedFields) {
-  Message message;
-  ScatteredHeapBuffer delegate(512, 512);
-  ScatteredStreamWriter writer(&delegate);
-  delegate.set_writer(&writer);
-  message.Reset(&writer);
+  HeapBuffered<Message> message;
 
-  message.AppendVarInt(1, 10);
-  message.AppendVarInt(2, 20);
-  message.AppendVarInt(3, 30);
+  message->AppendVarInt(1, 10);
+  message->AppendVarInt(2, 20);
+  message->AppendVarInt(3, 30);
 
-  message.AppendVarInt(1, 11);
-  message.AppendVarInt(2, 21);
-  message.AppendVarInt(2, 22);
-
-  delegate.AdjustUsedSizeOfCurrentSlice();
-  auto used_range = delegate.slices()[0].GetUsedRange();
+  message->AppendVarInt(1, 11);
+  message->AppendVarInt(2, 21);
+  message->AppendVarInt(2, 22);
 
   // When iterating with the simple decoder we should just see fields in parsing
   // order.
-  ProtoDecoder decoder(used_range.begin, used_range.size());
+  auto data = message.SerializeAsArray();
+  ProtoDecoder decoder(data.data(), data.size());
   std::string fields_seen;
   for (auto fld = decoder.ReadField(); fld.valid(); fld = decoder.ReadField()) {
     fields_seen +=
@@ -193,7 +172,7 @@
   }
   EXPECT_EQ(fields_seen, "1:10;2:20;3:30;1:11;2:21;2:22;");
 
-  TypedProtoDecoder<4, true> tpd(used_range.begin, used_range.size());
+  TypedProtoDecoder<4, true> tpd(data.data(), data.size());
 
   // When parsing with the one-shot decoder and querying the single field id, we
   // should see the last value for each of them, not the first one. This is the
@@ -557,18 +536,14 @@
 // This is a regression test for b/145339282 (DataSourceConfig.for_testing
 // having a very large ID == 268435455 until Android R).
 TEST(ProtoDecoderTest, SkipBigFieldIds) {
-  Message message;
-  ScatteredHeapBuffer delegate(512, 512);
-  ScatteredStreamWriter writer(&delegate);
-  delegate.set_writer(&writer);
-  message.Reset(&writer);
-  message.AppendVarInt(/*field_id=*/1, 11);
-  message.AppendVarInt(/*field_id=*/1000000, 0);  // Will be skipped
-  message.AppendVarInt(/*field_id=*/65535, 99);
-  message.AppendVarInt(/*field_id=*/268435455, 0);  // Will be skipped
-  message.AppendVarInt(/*field_id=*/2, 12);
-  message.AppendVarInt(/*field_id=*/2000000, 0);  // Will be skipped
-  std::vector<uint8_t> data = delegate.StitchSlices();
+  HeapBuffered<Message> message;
+  message->AppendVarInt(/*field_id=*/1, 11);
+  message->AppendVarInt(/*field_id=*/1000000, 0);  // Will be skipped
+  message->AppendVarInt(/*field_id=*/65535, 99);
+  message->AppendVarInt(/*field_id=*/268435455, 0);  // Will be skipped
+  message->AppendVarInt(/*field_id=*/2, 12);
+  message->AppendVarInt(/*field_id=*/2000000, 0);  // Will be skipped
+  auto data = message.SerializeAsArray();
 
   // Check the iterator-based ProtoDecoder.
   {
@@ -606,13 +581,9 @@
 // very big id. Test that we skip it and return an invalid field, instead of
 // geetting stuck in some loop.
 TEST(ProtoDecoderTest, OneBigFieldIdOnly) {
-  Message message;
-  ScatteredHeapBuffer delegate(512, 512);
-  ScatteredStreamWriter writer(&delegate);
-  delegate.set_writer(&writer);
-  message.Reset(&writer);
-  message.AppendVarInt(/*field_id=*/268435455, 0);
-  std::vector<uint8_t> data = delegate.StitchSlices();
+  HeapBuffered<Message> message;
+  message->AppendVarInt(/*field_id=*/268435455, 0);
+  auto data = message.SerializeAsArray();
 
   // Check the iterator-based ProtoDecoder.
   ProtoDecoder decoder(data.data(), data.size());
diff --git a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
index a6be8b6..a4e7913 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
@@ -230,18 +230,13 @@
     RegisterAdditionalModules(&context_);
   }
 
-  void ResetTraceBuffers() {
-    heap_buf_.reset(new protozero::ScatteredHeapBuffer());
-    stream_writer_.reset(new protozero::ScatteredStreamWriter(heap_buf_.get()));
-    heap_buf_->set_writer(stream_writer_.get());
-    trace_.Reset(stream_writer_.get());
-  }
+  void ResetTraceBuffers() { trace_.Reset(); }
 
   void SetUp() override { ResetTraceBuffers(); }
 
   util::Status Tokenize() {
-    trace_.Finalize();
-    std::vector<uint8_t> trace_bytes = heap_buf_->StitchSlices();
+    trace_->Finalize();
+    std::vector<uint8_t> trace_bytes = trace_.SerializeAsArray();
     std::unique_ptr<uint8_t[]> raw_trace(new uint8_t[trace_bytes.size()]);
     memcpy(raw_trace.get(), trace_bytes.data(), trace_bytes.size());
     context_.chunk_reader.reset(new ProtoTraceTokenizer(&context_));
@@ -273,9 +268,7 @@
     return std::unique_ptr<TraceParser>(new ProtoTraceParser(&context_));
   }
 
-  std::unique_ptr<protozero::ScatteredHeapBuffer> heap_buf_;
-  std::unique_ptr<protozero::ScatteredStreamWriter> stream_writer_;
-  protos::pbzero::Trace trace_;
+  protozero::HeapBuffered<protos::pbzero::Trace> trace_;
   TraceProcessorContext context_;
   MockEventTracker* event_;
   MockSchedEventTracker* sched_;
@@ -288,7 +281,7 @@
 // TODO(eseckler): Refactor these into a new file for ftrace tests.
 
 TEST_F(ProtoTraceParserTest, LoadSingleEvent) {
-  auto* bundle = trace_.add_packet()->set_ftrace_events();
+  auto* bundle = trace_->add_packet()->set_ftrace_events();
   bundle->set_cpu(10);
 
   auto* event = bundle->add_event();
@@ -313,7 +306,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadEventsIntoRaw) {
-  auto* bundle = trace_.add_packet()->set_ftrace_events();
+  auto* bundle = trace_->add_packet()->set_ftrace_events();
   bundle->set_cpu(10);
 
   // This event is unknown and will only appear in
@@ -365,7 +358,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadGenericFtrace) {
-  auto* packet = trace_.add_packet();
+  auto* packet = trace_->add_packet();
   packet->set_timestamp(100);
 
   auto* bundle = packet->set_ftrace_events();
@@ -418,7 +411,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadMultipleEvents) {
-  auto* bundle = trace_.add_packet()->set_ftrace_events();
+  auto* bundle = trace_->add_packet()->set_ftrace_events();
   bundle->set_cpu(10);
 
   auto* event = bundle->add_event();
@@ -461,7 +454,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadMultiplePackets) {
-  auto* bundle = trace_.add_packet()->set_ftrace_events();
+  auto* bundle = trace_->add_packet()->set_ftrace_events();
   bundle->set_cpu(10);
 
   auto* event = bundle->add_event();
@@ -479,7 +472,7 @@
   sched_switch->set_next_pid(100);
   sched_switch->set_next_prio(1024);
 
-  bundle = trace_.add_packet()->set_ftrace_events();
+  bundle = trace_->add_packet()->set_ftrace_events();
   bundle->set_cpu(10);
 
   event = bundle->add_event();
@@ -506,7 +499,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, RepeatedLoadSinglePacket) {
-  auto* bundle = trace_.add_packet()->set_ftrace_events();
+  auto* bundle = trace_->add_packet()->set_ftrace_events();
   bundle->set_cpu(10);
   auto* event = bundle->add_event();
   event->set_timestamp(1000);
@@ -526,7 +519,7 @@
                               32, 100, base::StringView(kProcName1), 1024));
   Tokenize();
 
-  bundle = trace_.add_packet()->set_ftrace_events();
+  bundle = trace_->add_packet()->set_ftrace_events();
   bundle->set_cpu(10);
   event = bundle->add_event();
   event->set_timestamp(1001);
@@ -547,7 +540,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadCpuFreq) {
-  auto* bundle = trace_.add_packet()->set_ftrace_events();
+  auto* bundle = trace_->add_packet()->set_ftrace_events();
   bundle->set_cpu(12);
   auto* event = bundle->add_event();
   event->set_timestamp(1000);
@@ -563,7 +556,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadMemInfo) {
-  auto* packet = trace_.add_packet();
+  auto* packet = trace_->add_packet();
   uint64_t ts = 1000;
   packet->set_timestamp(ts);
   auto* bundle = packet->set_sys_stats();
@@ -580,7 +573,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadVmStats) {
-  auto* packet = trace_.add_packet();
+  auto* packet = trace_->add_packet();
   uint64_t ts = 1000;
   packet->set_timestamp(ts);
   auto* bundle = packet->set_sys_stats();
@@ -597,7 +590,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadProcessPacket) {
-  auto* tree = trace_.add_packet()->set_process_tree();
+  auto* tree = trace_->add_packet()->set_process_tree();
   auto* process = tree->add_processes();
   static const char kProcName1[] = "proc1";
 
@@ -612,7 +605,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadProcessPacket_FirstCmdline) {
-  auto* tree = trace_.add_packet()->set_process_tree();
+  auto* tree = trace_->add_packet()->set_process_tree();
   auto* process = tree->add_processes();
   static const char kProcName1[] = "proc1";
   static const char kProcName2[] = "proc2";
@@ -629,7 +622,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, LoadThreadPacket) {
-  auto* tree = trace_.add_packet()->set_process_tree();
+  auto* tree = trace_->add_packet()->set_process_tree();
   auto* thread = tree->add_threads();
   thread->set_tid(1);
   thread->set_tgid(2);
@@ -642,7 +635,7 @@
   context_.sorter.reset(new TraceSorter(
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* process_desc = packet->set_process_descriptor();
@@ -650,7 +643,7 @@
     process_desc->set_process_name("OldProcessName");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* process_desc = packet->set_process_descriptor();
@@ -658,7 +651,7 @@
     process_desc->set_process_name("NewProcessName");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(2);
     packet->set_incremental_state_cleared(true);
     auto* process_desc = packet->set_process_descriptor();
@@ -687,7 +680,7 @@
   context_.sorter.reset(new TraceSorter(
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -698,7 +691,7 @@
     thread_desc->set_thread_name("OldThreadName");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -709,7 +702,7 @@
     thread_desc->set_thread_name("NewThreadName");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(2);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -744,7 +737,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -754,7 +747,7 @@
     thread_desc->set_reference_thread_time_us(2000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -765,7 +758,7 @@
     legacy_event->set_phase('B');
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1020.
@@ -776,7 +769,7 @@
     legacy_event->set_phase('E');
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_absolute_us(1005);
@@ -838,7 +831,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -848,7 +841,7 @@
     thread_desc->set_reference_thread_time_us(2000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -859,7 +852,7 @@
     legacy_event->set_name_iid(1);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1020.
@@ -870,7 +863,7 @@
     legacy_event->set_name_iid(1);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_absolute_us(1015);
@@ -929,7 +922,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -940,7 +933,7 @@
     thread_desc->set_reference_thread_instruction_count(3000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);              // absolute: 1010.
@@ -960,7 +953,7 @@
     ev1->set_name("ev1");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_absolute_us(1040);
@@ -972,7 +965,7 @@
     legacy_event->set_phase('I');
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_absolute_us(1050);
@@ -984,7 +977,7 @@
         protos::pbzero::TrackEvent::LegacyEvent::SCOPE_PROCESS);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);              // absolute: 1020.
@@ -996,7 +989,7 @@
     legacy_event->set_phase('E');
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_absolute_us(1005);
@@ -1111,7 +1104,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -1122,7 +1115,7 @@
     thread_desc->set_reference_thread_instruction_count(3000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);              // absolute: 1010.
@@ -1144,7 +1137,7 @@
     ev1->set_name("ev1");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);              // absolute: 1020.
@@ -1158,7 +1151,7 @@
     legacy_event->set_use_async_tts(true);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_absolute_us(1015);
@@ -1175,7 +1168,7 @@
   }
   {
     // Different category but same global_id -> separate track.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_absolute_us(1018);
@@ -1191,7 +1184,7 @@
     cat2->set_name("cat2");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_absolute_us(1030);
@@ -1268,7 +1261,7 @@
 
   // Sequence 1.
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     packet->set_timestamp(1000000);
@@ -1280,7 +1273,7 @@
     thread_desc->set_tid(16);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_timestamp(1000000);
     auto* track_desc = packet->set_track_descriptor();
@@ -1289,7 +1282,7 @@
   }
   {
     // Async event started on "Async track 1".
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_timestamp(1010000);
     auto* event = packet->set_track_event();
@@ -1312,7 +1305,7 @@
   }
   {
     // Instant event on "Thread track 1".
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_timestamp(1015000);
     auto* event = packet->set_track_event();
@@ -1333,7 +1326,7 @@
 
   // Sequence 2.
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(2);
     packet->set_incremental_state_cleared(true);
     packet->set_timestamp(1000000);
@@ -1346,7 +1339,7 @@
   }
   {
     // Async event completed on "Async track 1".
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(2);
     packet->set_timestamp(1020000);
     auto* event = packet->set_track_event();
@@ -1359,7 +1352,7 @@
   }
   {
     // Instant event on "Thread track 2".
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(2);
     packet->set_timestamp(1016000);
     auto* event = packet->set_track_event();
@@ -1461,7 +1454,7 @@
   // in the order they appear here, but then resorted before parsing to appear
   // after the events below.
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     packet->set_timestamp(3000);
@@ -1479,7 +1472,7 @@
     track_event_defaults->add_extra_counter_track_uuids(10);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_timestamp(3000);
     auto* track_desc = packet->set_track_descriptor();
@@ -1496,7 +1489,7 @@
     // counter values should still be imported as counter values and as args for
     // JSON export. Should appear on default track "t1" with
     // extra_counter_values for "c1".
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_sequence_flags(
         protos::pbzero::TracePacket::SEQ_NEEDS_INCREMENTAL_STATE);
@@ -1509,7 +1502,7 @@
   }
   {
     // End for "ev1".
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_timestamp(1100);
     auto* event = packet->set_track_event();
@@ -1563,7 +1556,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* thread_desc = packet->set_thread_descriptor();
     thread_desc->set_pid(15);
@@ -1574,7 +1567,7 @@
   {
     // Event should be discarded because delta timestamps require valid
     // incremental state + thread descriptor.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -1587,7 +1580,7 @@
   {
     // Event should be discarded because it specifies
     // SEQ_NEEDS_INCREMENTAL_STATE.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_timestamp(2000000);
     packet->set_trusted_packet_sequence_id(1);
     packet->set_sequence_flags(
@@ -1600,7 +1593,7 @@
   {
     // Event should be accepted because it does not specify
     // SEQ_NEEDS_INCREMENTAL_STATE and uses absolute timestamps.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_timestamp(2100000);
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
@@ -1626,7 +1619,7 @@
   {
     // Event should be discarded because it specifies delta timestamps and no
     // thread descriptor was seen yet.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* event = packet->set_track_event();
@@ -1640,7 +1633,7 @@
   {
     // Events that specify SEQ_NEEDS_INCREMENTAL_STATE should be accepted even
     // if there's no valid thread descriptor.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_timestamp(2000000);
     packet->set_trusted_packet_sequence_id(1);
     packet->set_sequence_flags(
@@ -1666,7 +1659,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -1675,7 +1668,7 @@
     thread_desc->set_reference_timestamp_us(1000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -1686,7 +1679,7 @@
   }
   {
     // Event should be dropped because data loss occurred before.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_previous_packet_dropped(true);  // Data loss occurred.
     auto* event = packet->set_track_event();
@@ -1698,7 +1691,7 @@
   }
   {
     // Event should be dropped because incremental state is invalid.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);
@@ -1709,7 +1702,7 @@
   }
   {
     // Event should be dropped because no new thread descriptor was seen yet.
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* event = packet->set_track_event();
@@ -1720,7 +1713,7 @@
     legacy_event->set_phase('E');
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* thread_desc = packet->set_thread_descriptor();
     thread_desc->set_pid(15);
@@ -1728,7 +1721,7 @@
     thread_desc->set_reference_timestamp_us(2000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 2010.
@@ -1760,7 +1753,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -1769,7 +1762,7 @@
     thread_desc->set_reference_timestamp_us(1000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -1787,7 +1780,7 @@
     ev1->set_name("ev1");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(2);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -1796,7 +1789,7 @@
     thread_desc->set_reference_timestamp_us(995);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(2);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1005.
@@ -1814,7 +1807,7 @@
     ev2->set_name("ev2");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1020.
@@ -1824,7 +1817,7 @@
     legacy_event->set_phase('E');
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(2);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1015.
@@ -1871,7 +1864,7 @@
   MockBoundInserter inserter;
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -1880,7 +1873,7 @@
     thread_desc->set_reference_timestamp_us(1000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -1932,7 +1925,7 @@
     an2->set_name("an2");
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1020.
@@ -2072,7 +2065,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -2081,7 +2074,7 @@
     thread_desc->set_reference_timestamp_us(1000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -2138,7 +2131,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -2147,7 +2140,7 @@
     thread_desc->set_reference_timestamp_us(1000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -2215,7 +2208,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -2225,7 +2218,7 @@
     thread_desc->set_reference_thread_time_us(2000);
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);   // absolute: 1010.
@@ -2333,7 +2326,7 @@
                        {protos::pbzero::BUILTIN_CLOCK_MONOTONIC, 1000000}});
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
     auto* thread_desc = packet->set_thread_descriptor();
@@ -2342,7 +2335,7 @@
     thread_desc->set_reference_timestamp_us(1000);  // MONOTONIC.
   }
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* event = packet->set_track_event();
     event->set_timestamp_delta_us(10);  // absolute: 1010 (mon), 10 (boot).
@@ -2375,7 +2368,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_timestamp(1000);
     packet->set_timestamp_clock_id(3);
     packet->set_trusted_packet_sequence_id(1);
@@ -2404,7 +2397,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_timestamp(1000);
     packet->set_timestamp_clock_id(3);
     packet->set_trusted_packet_sequence_id(1);
@@ -2443,7 +2436,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* bundle = packet->set_chrome_events();
     bundle->add_legacy_ftrace_output(kDataPart0);
@@ -2473,7 +2466,7 @@
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* bundle = packet->set_chrome_events();
     auto* user_trace = bundle->add_legacy_json_trace();
@@ -2506,7 +2499,7 @@
   context_.sorter.reset(new TraceSorter(
       CreateParser(), std::numeric_limits<int64_t>::max() /*window size*/));
 
-  auto* metadata = trace_.add_packet()->set_chrome_benchmark_metadata();
+  auto* metadata = trace_->add_packet()->set_chrome_benchmark_metadata();
   metadata->set_benchmark_name(kName);
   metadata->add_story_tags(kTag1);
   metadata->add_story_tags(kTag2);
@@ -2534,7 +2527,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, AndroidPackagesList) {
-  auto* packet = trace_.add_packet();
+  auto* packet = trace_->add_packet();
   auto* pkg_list = packet->set_packages_list();
 
   pkg_list->set_read_error(false);
@@ -2586,7 +2579,7 @@
 }
 
 TEST_F(ProtoTraceParserTest, AndroidPackagesListDuplicate) {
-  auto* packet = trace_.add_packet();
+  auto* packet = trace_->add_packet();
   auto* pkg_list = packet->set_packages_list();
 
   pkg_list->set_read_error(false);
@@ -2632,7 +2625,7 @@
 
 TEST_F(ProtoTraceParserTest, ParseCPUProfileSamplesIntoTable) {
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
 
@@ -2672,7 +2665,7 @@
   }
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
 
     auto* samples = packet->set_streaming_profile_packet();
@@ -2685,7 +2678,7 @@
   }
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     auto* samples = packet->set_streaming_profile_packet();
 
@@ -2728,7 +2721,7 @@
 
 TEST_F(ProtoTraceParserTest, CPUProfileSamplesTimestampsAreClockMonotonic) {
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(0);
 
     // 1000 us monotonic == 10000 us boottime.
@@ -2742,7 +2735,7 @@
   }
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
     packet->set_incremental_state_cleared(true);
 
@@ -2773,7 +2766,7 @@
   }
 
   {
-    auto* packet = trace_.add_packet();
+    auto* packet = trace_->add_packet();
     packet->set_trusted_packet_sequence_id(1);
 
     auto* samples = packet->set_streaming_profile_packet();
diff --git a/src/traced/probes/ftrace/cpu_reader_unittest.cc b/src/traced/probes/ftrace/cpu_reader_unittest.cc
index c59b027..43c574a 100644
--- a/src/traced/probes/ftrace/cpu_reader_unittest.cc
+++ b/src/traced/probes/ftrace/cpu_reader_unittest.cc
@@ -112,24 +112,20 @@
 template <class ZeroT, class ProtoT>
 class ProtoProvider {
  public:
-  explicit ProtoProvider(size_t chunk_size)
-      : chunk_size_(chunk_size), delegate_(chunk_size_), stream_(&delegate_) {
-    delegate_.set_writer(&stream_);
-    writer_.Reset(&stream_);
-  }
+  explicit ProtoProvider(size_t chunk_size) : chunk_size_(chunk_size) {}
   ~ProtoProvider() = default;
 
-  ZeroT* writer() { return &writer_; }
+  ZeroT* writer() { return writer_.get(); }
+  void ResetWriter() { writer_.Reset(); }
 
   // Stitch together the scattered chunks into a single buffer then attempt
   // to parse the buffer as a FtraceEventBundle. Returns the FtraceEventBundle
   // on success and nullptr on failure.
   std::unique_ptr<ProtoT> ParseProto() {
     auto bundle = std::unique_ptr<ProtoT>(new ProtoT());
-    std::vector<uint8_t> buffer = delegate_.StitchSlices();
-    if (!bundle->ParseFromArray(buffer.data(), buffer.size())) {
+    std::vector<uint8_t> buffer = writer_.SerializeAsArray();
+    if (!bundle->ParseFromArray(buffer.data(), buffer.size()))
       return nullptr;
-    }
     return bundle;
   }
 
@@ -138,9 +134,7 @@
   ProtoProvider& operator=(const ProtoProvider&) = delete;
 
   size_t chunk_size_;
-  protozero::ScatteredHeapBuffer delegate_;
-  protozero::ScatteredStreamWriter stream_;
-  ZeroT writer_;
+  protozero::HeapBuffered<ZeroT> writer_;
 };
 
 using BundleProvider = ProtoProvider<protos::pbzero::FtraceEventBundle,
@@ -846,6 +840,7 @@
   ASSERT_TRUE(bundle);
   EXPECT_EQ(0u, bundle->event().size());
   EXPECT_FALSE(bundle->has_compact_sched());
+  bundle_provider.ResetWriter();
 
   // Instead, sched switch fields were buffered:
   EXPECT_LT(0u, compact_buffer.sched_switch().size());