Only start data sources on registration if the tracing session is enabled
R=primiano@google.com
Change-Id: I222b4a2982e0cc1f6b9c208a3d52f8311ad1283e
diff --git a/src/tracing/core/service_impl_unittest.cc b/src/tracing/core/service_impl_unittest.cc
index ec78bdc..14960fa 100644
--- a/src/tracing/core/service_impl_unittest.cc
+++ b/src/tracing/core/service_impl_unittest.cc
@@ -574,6 +574,34 @@
TracingServiceImpl::kDataSourceStopTimeoutMs / 2);
}
+// Creates a tracing session where a second data source
+// is added while the service is waiting for DisableTracing
+// acks; the service should not enable the new datasource
+// and should not hit any asserts when the consumer is
+// subsequently destroyed.
+TEST_F(TracingServiceImplTest, OnDataSourceAddedWhilePendingDisableAcks) {
+ std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
+ consumer->Connect(svc.get());
+
+ std::unique_ptr<MockProducer> producer = CreateMockProducer();
+ producer->Connect(svc.get(), "mock_producer");
+ producer->RegisterDataSource("ds_will_ack", /*ack_stop=*/true);
+
+ TraceConfig trace_config;
+ trace_config.add_buffers()->set_size_kb(128);
+ trace_config.add_data_sources()->mutable_config()->set_name("ds_will_ack");
+ trace_config.add_data_sources()->mutable_config()->set_name("ds_wont_ack");
+
+ consumer->EnableTracing(trace_config);
+ producer->WaitForTracingSetup();
+
+ consumer->DisableTracing();
+
+ producer->RegisterDataSource("ds_wont_ack");
+
+ consumer.reset();
+}
+
// Similar to OnTracingDisabledWaitsForDataSourceStopAcks, but deliberately
// skips the ack and checks that the service invokes the OnTracingDisabled()
// after the timeout.