@@ -4171,11 +4171,14 @@ TEST_F(TracingServiceImplTest, LifecycleMultipleFlushEventsQueued) {
41714171 ASSERT_TRUE (flush_request.WaitForReply ());
41724172
41734173 auto packets = consumer->ReadBuffers ();
4174- uint32_t count = 0 ;
4174+ uint32_t flush_started_count = 0 ;
4175+ uint32_t flush_done_count = 0 ;
41754176 for (const auto & packet : packets) {
4176- count += packet.service_event ().all_data_sources_flushed ();
4177+ flush_started_count += packet.service_event ().flush_started ();
4178+ flush_done_count += packet.service_event ().all_data_sources_flushed ();
41774179 }
4178- ASSERT_EQ (count, 2u );
4180+ EXPECT_EQ (flush_started_count, 2u );
4181+ EXPECT_EQ (flush_done_count, 2u );
41794182
41804183 consumer->DisableTracing ();
41814184 producer->WaitForDataSourceStop (" data_source" );
@@ -5809,4 +5812,145 @@ TEST_F(TracingServiceImplTest, DetachDurationTimeoutFreeBuffers) {
58095812 task_runner.RunUntilCheckpoint (on_attach_name);
58105813}
58115814
5815+ TEST_F (TracingServiceImplTest, SlowStartingDataSources) {
5816+ std::unique_ptr<MockConsumer> consumer = CreateMockConsumer ();
5817+ consumer->Connect (svc.get ());
5818+
5819+ std::unique_ptr<MockProducer> producer = CreateMockProducer ();
5820+ producer->Connect (svc.get (), " mock_producer" );
5821+ producer->RegisterDataSource (" data_source1" , /* ack_stop=*/ false ,
5822+ /* ack_start=*/ true );
5823+ producer->RegisterDataSource (" data_source2" , /* ack_stop=*/ false ,
5824+ /* ack_start=*/ true );
5825+ producer->RegisterDataSource (" data_source3" , /* ack_stop=*/ false ,
5826+ /* ack_start=*/ true );
5827+
5828+ TraceConfig trace_config;
5829+ trace_config.add_buffers ()->set_size_kb (128 );
5830+ trace_config.add_data_sources ()->mutable_config ()->set_name (" data_source1" );
5831+ trace_config.add_data_sources ()->mutable_config ()->set_name (" data_source2" );
5832+ trace_config.add_data_sources ()->mutable_config ()->set_name (" data_source3" );
5833+ consumer->EnableTracing (trace_config);
5834+
5835+ producer->WaitForTracingSetup ();
5836+ producer->WaitForDataSourceSetup (" data_source1" );
5837+ producer->WaitForDataSourceSetup (" data_source2" );
5838+ producer->WaitForDataSourceSetup (" data_source3" );
5839+
5840+ producer->WaitForDataSourceStart (" data_source1" );
5841+ producer->WaitForDataSourceStart (" data_source2" );
5842+ producer->WaitForDataSourceStart (" data_source3" );
5843+
5844+ DataSourceInstanceID id1 = producer->GetDataSourceInstanceId (" data_source1" );
5845+ DataSourceInstanceID id3 = producer->GetDataSourceInstanceId (" data_source3" );
5846+
5847+ producer->endpoint ()->NotifyDataSourceStarted (id1);
5848+ producer->endpoint ()->NotifyDataSourceStarted (id3);
5849+
5850+ // This matches kAllDataSourceStartedTimeout.
5851+ AdvanceTimeAndRunUntilIdle (20000 );
5852+
5853+ consumer->DisableTracing ();
5854+ producer->WaitForDataSourceStop (" data_source1" );
5855+ producer->WaitForDataSourceStop (" data_source2" );
5856+ producer->WaitForDataSourceStop (" data_source3" );
5857+ consumer->WaitForTracingDisabled ();
5858+
5859+ std::vector<protos::gen::TracePacket> packets = consumer->ReadBuffers ();
5860+ EXPECT_THAT (
5861+ packets,
5862+ Contains (Property (
5863+ &protos::gen::TracePacket::service_event,
5864+ Property (
5865+ &protos::gen::TracingServiceEvent::slow_starting_data_sources,
5866+ Property (
5867+ &protos::gen::TracingServiceEvent::DataSources::data_source,
5868+ ElementsAre (
5869+ Property (&protos::gen::TracingServiceEvent::DataSources::
5870+ DataSource::data_source_name,
5871+ " data_source2" )))))));
5872+ }
5873+
5874+ TEST_F (TracingServiceImplTest, FlushTimeoutEventsEmitted) {
5875+ std::unique_ptr<MockConsumer> consumer = CreateMockConsumer ();
5876+ consumer->Connect (svc.get ());
5877+
5878+ std::unique_ptr<MockProducer> producer = CreateMockProducer ();
5879+ producer->Connect (svc.get (), " mock_producer1" );
5880+ producer->RegisterDataSource (" ds_1" );
5881+
5882+ TraceConfig trace_config;
5883+ trace_config.add_buffers ()->set_size_kb (1024 ); // Buf 0.
5884+ auto * ds_cfg = trace_config.add_data_sources ()->mutable_config ();
5885+ ds_cfg->set_name (" ds_1" );
5886+ ds_cfg->set_target_buffer (0 );
5887+
5888+ consumer->EnableTracing (trace_config);
5889+ producer->WaitForTracingSetup ();
5890+ producer->WaitForDataSourceSetup (" ds_1" );
5891+ producer->WaitForDataSourceStart (" ds_1" );
5892+
5893+ std::unique_ptr<TraceWriter> writer1 = producer->CreateTraceWriter (" ds_1" );
5894+
5895+ // Do not reply to Flush.
5896+ std::string producer_flush1_checkpoint_name = " producer_flush1_requested" ;
5897+ auto flush1_requested =
5898+ task_runner.CreateCheckpoint (producer_flush1_checkpoint_name);
5899+ EXPECT_CALL (*producer, Flush).WillOnce (Invoke (flush1_requested));
5900+ consumer->Flush (5000 , FlushFlags (FlushFlags::Initiator::kTraced ,
5901+ FlushFlags::Reason::kTraceStop ));
5902+
5903+ task_runner.RunUntilCheckpoint (producer_flush1_checkpoint_name);
5904+
5905+ AdvanceTimeAndRunUntilIdle (5000 );
5906+
5907+ // ReadBuffers returns a last_flush_slow_data_source event.
5908+ std::vector<protos::gen::TracePacket> packets = consumer->ReadBuffers ();
5909+ EXPECT_THAT (
5910+ packets,
5911+ Contains (Property (
5912+ &protos::gen::TracePacket::service_event,
5913+ Property (
5914+ &protos::gen::TracingServiceEvent::last_flush_slow_data_sources,
5915+ Property (
5916+ &protos::gen::TracingServiceEvent::DataSources::data_source,
5917+ ElementsAre (
5918+ Property (&protos::gen::TracingServiceEvent::DataSources::
5919+ DataSource::data_source_name,
5920+ " ds_1" )))))));
5921+
5922+ // Reply to Flush.
5923+ std::string producer_flush2_checkpoint_name = " producer_flush2_requested" ;
5924+ auto flush2_requested =
5925+ task_runner.CreateCheckpoint (producer_flush2_checkpoint_name);
5926+ FlushRequestID flush2_req_id;
5927+ EXPECT_CALL (*producer, Flush (_, _, _, _))
5928+ .WillOnce ([&](FlushRequestID req_id, const DataSourceInstanceID*, size_t ,
5929+ FlushFlags) {
5930+ flush2_req_id = req_id;
5931+ flush2_requested ();
5932+ });
5933+ consumer->Flush (5000 , FlushFlags (FlushFlags::Initiator::kTraced ,
5934+ FlushFlags::Reason::kTraceStop ));
5935+
5936+ task_runner.RunUntilCheckpoint (producer_flush2_checkpoint_name);
5937+
5938+ producer->endpoint ()->NotifyFlushComplete (flush2_req_id);
5939+
5940+ AdvanceTimeAndRunUntilIdle (5000 );
5941+
5942+ // ReadBuffers returns a last_flush_slow_data_source event.
5943+ packets = consumer->ReadBuffers ();
5944+ EXPECT_THAT (
5945+ packets,
5946+ Not (Contains (Property (&protos::gen::TracePacket::service_event,
5947+ Property (&protos::gen::TracingServiceEvent::
5948+ has_last_flush_slow_data_sources,
5949+ Eq (true ))))));
5950+
5951+ consumer->DisableTracing ();
5952+ producer->WaitForDataSourceStop (" ds_1" );
5953+ consumer->WaitForTracingDisabled ();
5954+ }
5955+
58125956} // namespace perfetto
0 commit comments