@@ -425,3 +425,104 @@ TEST_F(ProgressReportTest, TestProgressManagerDisjointReports) {
425425
426426 ASSERT_FALSE (listener_sp->GetEvent (event_sp, TIMEOUT));
427427}
428+
429+ TEST_F (ProgressReportTest, TestExternalReportCreation) {
430+ ListenerSP listener_sp =
431+ CreateListenerFor (lldb::eBroadcastBitExternalProgress);
432+ EventSP event_sp;
433+ const ProgressEventData *data;
434+
435+ // Scope this for RAII on the progress objects.
436+ // Create progress reports and check that their respective events for having
437+ // started and ended are broadcasted.
438+ {
439+ Progress progress1 (" Progress report 1" , " Starting report 1" ,
440+ /* total=*/ std::nullopt , /* debugger=*/ nullptr ,
441+ /* minimum_report_time=*/ std::chrono::seconds (0 ),
442+ Progress::Origin::eExternal);
443+ Progress progress2 (" Progress report 2" , " Starting report 2" ,
444+ /* total=*/ std::nullopt , /* debugger=*/ nullptr ,
445+ /* minimum_report_time=*/ std::chrono::seconds (0 ),
446+ Progress::Origin::eExternal);
447+ Progress progress3 (" Progress report 3" , " Starting report 3" ,
448+ /* total=*/ std::nullopt , /* debugger=*/ nullptr ,
449+ /* minimum_report_time=*/ std::chrono::seconds (0 ),
450+ Progress::Origin::eExternal);
451+ }
452+
453+ // Start popping events from the queue, they should have been recevied
454+ // in this order:
455+ // Starting progress: 1, 2, 3
456+ // Ending progress: 3, 2, 1
457+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
458+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
459+
460+ EXPECT_EQ (data->GetDetails (), " Starting report 1" );
461+ EXPECT_FALSE (data->IsFinite ());
462+ EXPECT_FALSE (data->GetCompleted ());
463+ EXPECT_EQ (data->GetTotal (), Progress::kNonDeterministicTotal );
464+ EXPECT_EQ (data->GetMessage (), " Progress report 1: Starting report 1" );
465+
466+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
467+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
468+
469+ EXPECT_EQ (data->GetDetails (), " Starting report 2" );
470+ EXPECT_FALSE (data->IsFinite ());
471+ EXPECT_FALSE (data->GetCompleted ());
472+ EXPECT_EQ (data->GetTotal (), Progress::kNonDeterministicTotal );
473+ EXPECT_EQ (data->GetMessage (), " Progress report 2: Starting report 2" );
474+
475+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
476+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
477+
478+ EXPECT_EQ (data->GetDetails (), " Starting report 3" );
479+ EXPECT_FALSE (data->IsFinite ());
480+ EXPECT_FALSE (data->GetCompleted ());
481+ EXPECT_EQ (data->GetTotal (), Progress::kNonDeterministicTotal );
482+ EXPECT_EQ (data->GetMessage (), " Progress report 3: Starting report 3" );
483+
484+ // Progress report objects should be destroyed at this point so
485+ // get each report from the queue and check that they've been
486+ // destroyed in reverse order.
487+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
488+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
489+
490+ EXPECT_EQ (data->GetTitle (), " Progress report 3" );
491+ EXPECT_TRUE (data->GetCompleted ());
492+ EXPECT_FALSE (data->IsFinite ());
493+ EXPECT_EQ (data->GetMessage (), " Progress report 3: Starting report 3" );
494+
495+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
496+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
497+
498+ EXPECT_EQ (data->GetTitle (), " Progress report 2" );
499+ EXPECT_TRUE (data->GetCompleted ());
500+ EXPECT_FALSE (data->IsFinite ());
501+ EXPECT_EQ (data->GetMessage (), " Progress report 2: Starting report 2" );
502+
503+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
504+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
505+
506+ EXPECT_EQ (data->GetTitle (), " Progress report 1" );
507+ EXPECT_TRUE (data->GetCompleted ());
508+ EXPECT_FALSE (data->IsFinite ());
509+ EXPECT_EQ (data->GetMessage (), " Progress report 1: Starting report 1" );
510+ }
511+
512+ TEST_F (ProgressReportTest, TestExternalReportNotReceived) {
513+ ListenerSP listener_sp = CreateListenerFor (lldb::eBroadcastBitProgress);
514+ EventSP event_sp;
515+
516+ // Scope this for RAII on the progress objects.
517+ // Create progress reports and check that their respective events for having
518+ // started and ended are broadcasted.
519+ {
520+ Progress progress1 (" External Progress report 1" ,
521+ " Starting external report 1" ,
522+ /* total=*/ std::nullopt , /* debugger=*/ nullptr ,
523+ /* minimum_report_time=*/ std::chrono::seconds (0 ),
524+ Progress::Origin::eExternal);
525+ }
526+
527+ ASSERT_FALSE (listener_sp->GetEvent (event_sp, TIMEOUT));
528+ }
0 commit comments