tracing service: add support for issuing periodic ClearIncrementalState ipcs.
Bug: 132394650
Change-Id: I964e6e9d82c4b9b6d254fbc7869a49f3885a357b
diff --git a/src/tracing/core/tracing_service_impl_unittest.cc b/src/tracing/core/tracing_service_impl_unittest.cc
index a4c05bd..74653c6 100644
--- a/src/tracing/core/tracing_service_impl_unittest.cc
+++ b/src/tracing/core/tracing_service_impl_unittest.cc
@@ -1615,6 +1615,83 @@
}
}
+TEST_F(TracingServiceImplTest, PeriodicClearIncrementalState) {
+ std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
+ consumer->Connect(svc.get());
+ std::unique_ptr<MockProducer> producer = CreateMockProducer();
+ producer->Connect(svc.get(), "mock_producer");
+
+ // Incremental data source that expects to receive the clear.
+ producer->RegisterDataSource("ds_incremental1", false, false,
+ /*handles_incremental_state_clear=*/true);
+
+ // Incremental data source that expects to receive the clear.
+ producer->RegisterDataSource("ds_incremental2", false, false,
+ /*handles_incremental_state_clear=*/true);
+
+ // Data source that does *not* advertise itself as support incremental state
+ // clears.
+ producer->RegisterDataSource("ds_selfcontained", false, false,
+ /*handles_incremental_state_clear=*/false);
+
+ // Incremental data source that is registered, but won't be active within the
+ // test's tracing session.
+ producer->RegisterDataSource("ds_inactive", false, false,
+ /*handles_incremental_state_clear=*/true);
+
+ TraceConfig trace_config;
+ trace_config.add_buffers()->set_size_kb(128);
+ trace_config.mutable_incremental_state_config()->set_clear_period_ms(1);
+ trace_config.add_data_sources()->mutable_config()->set_name(
+ "ds_selfcontained");
+ trace_config.add_data_sources()->mutable_config()->set_name(
+ "ds_incremental1");
+ trace_config.add_data_sources()->mutable_config()->set_name(
+ "ds_incremental2");
+
+ // note: the mocking is very brittle, and has to assume a specific order of
+ // the data sources' setup/start.
+ consumer->EnableTracing(trace_config);
+ producer->WaitForTracingSetup();
+ producer->WaitForDataSourceSetup("ds_selfcontained");
+ producer->WaitForDataSourceSetup("ds_incremental1");
+ producer->WaitForDataSourceSetup("ds_incremental2");
+ producer->WaitForDataSourceStart("ds_selfcontained");
+ producer->WaitForDataSourceStart("ds_incremental1");
+ producer->WaitForDataSourceStart("ds_incremental2");
+
+ DataSourceInstanceID ds_incremental1 =
+ producer->GetDataSourceInstanceId("ds_incremental1");
+ DataSourceInstanceID ds_incremental2 =
+ producer->GetDataSourceInstanceId("ds_incremental2");
+
+ const int kNumClears = 3;
+ std::function<void()> checkpoint =
+ task_runner.CreateCheckpoint("clears_received");
+ std::vector<std::vector<DataSourceInstanceID>> clears_seen;
+ EXPECT_CALL(*producer, ClearIncrementalState(_, _))
+ .WillRepeatedly(Invoke([&clears_seen, &checkpoint](
+ const DataSourceInstanceID* data_source_ids,
+ size_t num_data_sources) {
+ std::vector<DataSourceInstanceID> ds_ids;
+ for (size_t i = 0; i < num_data_sources; i++) {
+ ds_ids.push_back(*data_source_ids++);
+ }
+ clears_seen.push_back(ds_ids);
+ if (clears_seen.size() >= kNumClears)
+ checkpoint();
+ }));
+ task_runner.RunUntilCheckpoint("clears_received");
+
+ consumer->DisableTracing();
+
+ // Assert that the clears were only for the active incremental data sources.
+ ASSERT_EQ(clears_seen.size(), kNumClears);
+ for (const std::vector<DataSourceInstanceID>& ds_ids : clears_seen) {
+ ASSERT_THAT(ds_ids, ElementsAreArray({ds_incremental1, ds_incremental2}));
+ }
+}
+
// Creates a tracing session where some of the data sources set the
// |will_notify_on_stop| flag and checks that the OnTracingDisabled notification
// to the consumer is delayed until the acks are received.