xref: /llvm-project/lldb/unittests/Target/SummaryStatisticsTest.cpp (revision 22144e20cbd237a432fdc4106abe3960555aff42)
1 #include "lldb/DataFormatters/TypeSummary.h"
2 #include "lldb/Target/Statistics.h"
3 #include "lldb/Utility/Stream.h"
4 #include "lldb/lldb-forward.h"
5 #include "lldb/lldb-private-enumerations.h"
6 #include "lldb/lldb-private.h"
7 #include "llvm/Testing/Support/Error.h"
8 #include "gtest/gtest.h"
9 #include <thread>
10 
11 using namespace lldb_private;
12 using Duration = std::chrono::duration<double>;
13 
14 class DummySummaryImpl : public lldb_private::TypeSummaryImpl {
15 public:
16   DummySummaryImpl()
17       : TypeSummaryImpl(TypeSummaryImpl::Kind::eSummaryString,
18                         TypeSummaryImpl::Flags()) {}
19 
20   std::string GetName() override { return "DummySummary"; }
21 
22   std::string GetSummaryKindName() override { return "dummy"; }
23 
24   std::string GetDescription() override { return ""; }
25 
26   bool FormatObject(ValueObject *valobj, std::string &dest,
27                     const TypeSummaryOptions &options) override {
28     return false;
29   }
30 };
31 
32 TEST(MultithreadFormatting, Multithread) {
33   SummaryStatisticsCache statistics_cache;
34   DummySummaryImpl summary;
35   std::vector<std::thread> threads;
36   for (int i = 0; i < 10; ++i) {
37     threads.emplace_back(std::thread([&statistics_cache, &summary]() {
38       auto sp = statistics_cache.GetSummaryStatisticsForProvider(summary);
39       {
40         SummaryStatistics::SummaryInvocation invocation(sp);
41         std::this_thread::sleep_for(Duration(1));
42       }
43     }));
44   }
45 
46   for (auto &thread : threads)
47     thread.join();
48 
49   auto sp = statistics_cache.GetSummaryStatisticsForProvider(summary);
50   ASSERT_TRUE(sp->GetDurationReference().get().count() > 10);
51   ASSERT_TRUE(sp->GetSummaryCount() == 10);
52 
53   std::string stats_as_json;
54   llvm::raw_string_ostream ss(stats_as_json);
55   ss << sp->ToJSON();
56   ASSERT_THAT(stats_as_json, ::testing::HasSubstr("\"name\":\"DummySummary\""));
57   ASSERT_THAT(stats_as_json, ::testing::HasSubstr("\"type\":\"dummy\""));
58 }
59