service: Write a trusted PacketSequenceID with each packet.

A PacketSequenceID identifies each <Producer, Writer> pair uniquely
within the scope of a tracing session, i.e. each
<producer_id, writer_id> pair is mapped to a PacketSequenceID.

It thus identifies all packets that were emitted by the same writer.
This is a prerequisite for our new trace event data interning feature,
where interning indexes will be scoped to each packet sequence.

Bug: 123864183
Change-Id: I686ff01ab21a34905375e95503c0d89c04fddb0e
diff --git a/src/tracing/core/service_impl_unittest.cc b/src/tracing/core/service_impl_unittest.cc
index 1cf8ff6..6e74a4a 100644
--- a/src/tracing/core/service_impl_unittest.cc
+++ b/src/tracing/core/service_impl_unittest.cc
@@ -935,6 +935,97 @@
   consumer->WaitForTracingDisabled();
 }
 
+TEST_F(TracingServiceImplTest, ProducerUIDsAndPacketSequenceIDs) {
+  std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
+  consumer->Connect(svc.get());
+
+  std::unique_ptr<MockProducer> producer1 = CreateMockProducer();
+  producer1->Connect(svc.get(), "mock_producer1", 123u /* uid */);
+  producer1->RegisterDataSource("data_source");
+
+  std::unique_ptr<MockProducer> producer2 = CreateMockProducer();
+  producer2->Connect(svc.get(), "mock_producer2", 456u /* uid */);
+  producer2->RegisterDataSource("data_source");
+
+  TraceConfig trace_config;
+  trace_config.add_buffers()->set_size_kb(128);
+  auto* ds_config = trace_config.add_data_sources()->mutable_config();
+  ds_config->set_name("data_source");
+
+  consumer->EnableTracing(trace_config);
+  producer1->WaitForTracingSetup();
+  producer1->WaitForDataSourceSetup("data_source");
+  producer2->WaitForTracingSetup();
+  producer2->WaitForDataSourceSetup("data_source");
+  producer1->WaitForDataSourceStart("data_source");
+  producer2->WaitForDataSourceStart("data_source");
+
+  std::unique_ptr<TraceWriter> writer1a =
+      producer1->CreateTraceWriter("data_source");
+  std::unique_ptr<TraceWriter> writer1b =
+      producer1->CreateTraceWriter("data_source");
+  std::unique_ptr<TraceWriter> writer2a =
+      producer2->CreateTraceWriter("data_source");
+  {
+    auto tp = writer1a->NewTracePacket();
+    tp->set_for_testing()->set_str("payload1a1");
+    tp = writer1b->NewTracePacket();
+    tp->set_for_testing()->set_str("payload1b1");
+    tp = writer1a->NewTracePacket();
+    tp->set_for_testing()->set_str("payload1a2");
+    tp = writer2a->NewTracePacket();
+    tp->set_for_testing()->set_str("payload2a1");
+    tp = writer1b->NewTracePacket();
+    tp->set_for_testing()->set_str("payload1b2");
+  }
+
+  auto flush_request = consumer->Flush();
+  producer1->WaitForFlush({writer1a.get(), writer1b.get()});
+  producer2->WaitForFlush(writer2a.get());
+  ASSERT_TRUE(flush_request.WaitForReply());
+
+  consumer->DisableTracing();
+  producer1->WaitForDataSourceStop("data_source");
+  producer2->WaitForDataSourceStop("data_source");
+  consumer->WaitForTracingDisabled();
+  auto packets = consumer->ReadBuffers();
+  EXPECT_THAT(
+      packets,
+      Contains(AllOf(
+          Property(&protos::TracePacket::for_testing,
+                   Property(&protos::TestEvent::str, Eq("payload1a1"))),
+          Property(&protos::TracePacket::trusted_uid, Eq(123)),
+          Property(&protos::TracePacket::trusted_packet_sequence_id, Eq(2u)))));
+  EXPECT_THAT(
+      packets,
+      Contains(AllOf(
+          Property(&protos::TracePacket::for_testing,
+                   Property(&protos::TestEvent::str, Eq("payload1a2"))),
+          Property(&protos::TracePacket::trusted_uid, Eq(123)),
+          Property(&protos::TracePacket::trusted_packet_sequence_id, Eq(2u)))));
+  EXPECT_THAT(
+      packets,
+      Contains(AllOf(
+          Property(&protos::TracePacket::for_testing,
+                   Property(&protos::TestEvent::str, Eq("payload1b1"))),
+          Property(&protos::TracePacket::trusted_uid, Eq(123)),
+          Property(&protos::TracePacket::trusted_packet_sequence_id, Eq(3u)))));
+  EXPECT_THAT(
+      packets,
+      Contains(AllOf(
+          Property(&protos::TracePacket::for_testing,
+                   Property(&protos::TestEvent::str, Eq("payload1b2"))),
+          Property(&protos::TracePacket::trusted_uid, Eq(123)),
+          Property(&protos::TracePacket::trusted_packet_sequence_id, Eq(3u)))));
+  EXPECT_THAT(
+      packets,
+      Contains(AllOf(
+          Property(&protos::TracePacket::for_testing,
+                   Property(&protos::TestEvent::str, Eq("payload2a1"))),
+          Property(&protos::TracePacket::trusted_uid, Eq(456)),
+          Property(&protos::TracePacket::trusted_packet_sequence_id, Eq(4u)))));
+}
+
 TEST_F(TracingServiceImplTest, AllowedBuffers) {
   std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
   consumer->Connect(svc.get());