https://github.com/royitaqi updated https://github.com/llvm/llvm-project/pull/102097
>From 8222646222673a07d52eeb2b3a02c380e253249c Mon Sep 17 00:00:00 2001 From: Roy Shi <roy...@meta.com> Date: Mon, 5 Aug 2024 20:30:14 -0700 Subject: [PATCH 1/2] Make sure that a progress completed update is always reported at Progress destruction --- lldb/source/Core/Progress.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lldb/source/Core/Progress.cpp b/lldb/source/Core/Progress.cpp index 1a779e2ddf924..e0ba1a63c508e 100644 --- a/lldb/source/Core/Progress.cpp +++ b/lldb/source/Core/Progress.cpp @@ -45,8 +45,7 @@ Progress::~Progress() { // Make sure to always report progress completed when this object is // destructed so it indicates the progress dialog/activity should go away. std::lock_guard<std::mutex> guard(m_mutex); - if (!m_completed) - m_completed = m_total; + m_completed = m_total; ReportProgress(); // Report to the ProgressManager if that subsystem is enabled. >From a2c9310e66250a9d046b42e8446cf5b8c2ff8172 Mon Sep 17 00:00:00 2001 From: Roy Shi <roy...@meta.com> Date: Tue, 6 Aug 2024 15:11:44 -0700 Subject: [PATCH 2/2] Add unit test --- lldb/unittests/Core/ProgressReportTest.cpp | 74 ++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/lldb/unittests/Core/ProgressReportTest.cpp b/lldb/unittests/Core/ProgressReportTest.cpp index 141244feb1f08..d21a181affdc1 100644 --- a/lldb/unittests/Core/ProgressReportTest.cpp +++ b/lldb/unittests/Core/ProgressReportTest.cpp @@ -133,6 +133,80 @@ TEST_F(ProgressReportTest, TestReportCreation) { EXPECT_EQ(data->GetMessage(), "Progress report 1: Starting report 1"); } +TEST_F(ProgressReportTest, TestReportDestructionWithPartialProgress) { + ListenerSP listener_sp = CreateListenerFor(lldb::eBroadcastBitProgress); + EventSP event_sp; + const ProgressEventData *data; + + // Create a finite progress report and only increment to a non-completed + // state before destruction. + { + Progress progress("Finite progress", "Report 1", 100); + progress.Increment(3); + } + + // Verify that the progress in the events are: + // 1. At construction: 0 out of 100 + // 2. At increment: 3 out of 100 + // 3. At destruction: 100 out of 100 + ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT)); + data = ProgressEventData::GetEventDataFromEvent(event_sp.get()); + EXPECT_EQ(data->GetDetails(), "Report 1"); + EXPECT_TRUE(data->IsFinite()); + EXPECT_EQ(data->GetCompleted(), (uint64_t)0); + EXPECT_EQ(data->GetTotal(), (uint64_t)100); + EXPECT_EQ(data->GetMessage(), "Finite progress: Report 1"); + + ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT)); + data = ProgressEventData::GetEventDataFromEvent(event_sp.get()); + EXPECT_EQ(data->GetDetails(), "Report 1"); + EXPECT_TRUE(data->IsFinite()); + EXPECT_EQ(data->GetCompleted(), (uint64_t)3); + EXPECT_EQ(data->GetTotal(), (uint64_t)100); + EXPECT_EQ(data->GetMessage(), "Finite progress: Report 1"); + + ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT)); + data = ProgressEventData::GetEventDataFromEvent(event_sp.get()); + EXPECT_EQ(data->GetDetails(), "Report 1"); + EXPECT_TRUE(data->IsFinite()); + EXPECT_EQ(data->GetCompleted(), (uint64_t)100); + EXPECT_EQ(data->GetTotal(), (uint64_t)100); + EXPECT_EQ(data->GetMessage(), "Finite progress: Report 1"); + + // Create an infinite progress report and increment by some amount. + { + Progress progress("Infinite progress", "Report 2"); + progress.Increment(3); + } + + // Verify that the progress in the events are: + // 1. At construction: 0 + // 2. At increment: 3 + // 3. At destruction: 100 out of 100 + ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT)); + data = ProgressEventData::GetEventDataFromEvent(event_sp.get()); + EXPECT_EQ(data->GetDetails(), "Report 2"); + EXPECT_FALSE(data->IsFinite()); + EXPECT_EQ(data->GetCompleted(), (uint64_t)0); + EXPECT_EQ(data->GetTotal(), Progress::kNonDeterministicTotal); + EXPECT_EQ(data->GetMessage(), "Infinite progress: Report 2"); + + ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT)); + data = ProgressEventData::GetEventDataFromEvent(event_sp.get()); + EXPECT_EQ(data->GetDetails(), "Report 2"); + EXPECT_FALSE(data->IsFinite()); + EXPECT_EQ(data->GetCompleted(), (uint64_t)3); + EXPECT_EQ(data->GetTotal(), Progress::kNonDeterministicTotal); + EXPECT_EQ(data->GetMessage(), "Infinite progress: Report 2"); + + ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT)); + data = ProgressEventData::GetEventDataFromEvent(event_sp.get()); + EXPECT_EQ(data->GetDetails(), "Report 2"); + EXPECT_FALSE(data->IsFinite()); + EXPECT_EQ(data->GetCompleted(), Progress::kNonDeterministicTotal); + EXPECT_EQ(data->GetTotal(), Progress::kNonDeterministicTotal); + EXPECT_EQ(data->GetMessage(), "Infinite progress: Report 2");} + TEST_F(ProgressReportTest, TestProgressManager) { ListenerSP listener_sp = CreateListenerFor(lldb::eBroadcastBitProgressCategory); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits