Add consumer API and --query cmdline to list data sources
This CL adds a --query (and --query-raw) cmdline option to
the perfetto cmdline client to list the data sources connected
(whether they are tracing or not) and to retrieve the
DataSourceDescriptor passed at registration time.
--query returns a human readable format (for debugging).
It does NOT print the full DataSourceDescriptor (because
it might now know the schema)
Example: https://pastebin.com/cC9mAWw1
--query-raw is for machine-to-machine and passes through
the whole tracing_service_state.proto, including the
DataSourceDescriptor(s).
Bug: 132678367
Test: unittests + integrationtests
Change-Id: Id776cc6efe4109ad879380fd6adab8e9d685351a
diff --git a/src/tracing/core/tracing_service_impl_unittest.cc b/src/tracing/core/tracing_service_impl_unittest.cc
index c96d097..0067384 100644
--- a/src/tracing/core/tracing_service_impl_unittest.cc
+++ b/src/tracing/core/tracing_service_impl_unittest.cc
@@ -2758,4 +2758,55 @@
consumer->WaitForTracingDisabled();
}
+TEST_F(TracingServiceImplTest, QueryServiceState) {
+ std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
+ consumer->Connect(svc.get());
+
+ std::unique_ptr<MockProducer> producer1 = CreateMockProducer();
+ producer1->Connect(svc.get(), "producer1");
+
+ std::unique_ptr<MockProducer> producer2 = CreateMockProducer();
+ producer2->Connect(svc.get(), "producer2");
+
+ producer1->RegisterDataSource("common_ds");
+ producer2->RegisterDataSource("common_ds");
+
+ producer1->RegisterDataSource("p1_ds");
+ producer2->RegisterDataSource("p2_ds");
+
+ TracingServiceState svc_state = consumer->QueryServiceState();
+
+ EXPECT_EQ(svc_state.producers_size(), 2u);
+ EXPECT_EQ(svc_state.producers().at(0).id(), 1);
+ EXPECT_EQ(svc_state.producers().at(0).name(), "producer1");
+ EXPECT_EQ(svc_state.producers().at(1).id(), 2);
+ EXPECT_EQ(svc_state.producers().at(1).name(), "producer2");
+
+ EXPECT_EQ(svc_state.data_sources_size(), 4u);
+
+ EXPECT_EQ(svc_state.data_sources().at(0).producer_id(), 1);
+ EXPECT_EQ(svc_state.data_sources().at(0).descriptor().name(), "common_ds");
+
+ EXPECT_EQ(svc_state.data_sources().at(1).producer_id(), 2);
+ EXPECT_EQ(svc_state.data_sources().at(1).descriptor().name(), "common_ds");
+
+ EXPECT_EQ(svc_state.data_sources().at(2).producer_id(), 1);
+ EXPECT_EQ(svc_state.data_sources().at(2).descriptor().name(), "p1_ds");
+
+ EXPECT_EQ(svc_state.data_sources().at(3).producer_id(), 2);
+ EXPECT_EQ(svc_state.data_sources().at(3).descriptor().name(), "p2_ds");
+
+ // Test that descriptors are cleared when a producer disconnects.
+ producer1.reset();
+ svc_state = consumer->QueryServiceState();
+
+ EXPECT_EQ(svc_state.producers_size(), 1u);
+ EXPECT_EQ(svc_state.data_sources_size(), 2u);
+
+ EXPECT_EQ(svc_state.data_sources().at(0).producer_id(), 2);
+ EXPECT_EQ(svc_state.data_sources().at(0).descriptor().name(), "common_ds");
+ EXPECT_EQ(svc_state.data_sources().at(1).producer_id(), 2);
+ EXPECT_EQ(svc_state.data_sources().at(1).descriptor().name(), "p2_ds");
+}
+
} // namespace perfetto