59 lines · cpp
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 11using namespace lldb_private;12using Duration = std::chrono::duration<double>;13 14class DummySummaryImpl : public lldb_private::TypeSummaryImpl {15public: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 32TEST(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