//===-- TelemetryTest.cpp ------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "lldb/Core/Telemetry.h" #include "TestingSupport/SubsystemRAII.h" #include "lldb/Core/PluginInterface.h" #include "lldb/Core/PluginManager.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Error.h" #include "llvm/Telemetry/Telemetry.h" #include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" #include #include namespace lldb_private { struct FakeTelemetryInfo : public telemetry::LLDBBaseTelemetryInfo { std::string msg; int num; ::llvm::telemetry::KindType getKind() const override { return 0b11111111; } }; class TestDestination : public llvm::telemetry::Destination { public: TestDestination( std::vector> *entries) : received_entries(entries) {} llvm::Error receiveEntry(const llvm::telemetry::TelemetryInfo *entry) override { // Save a copy of the entry for later verification (because the original // entry might have gone out of scope by the time verification is done. if (auto *fake_entry = llvm::dyn_cast(entry)) received_entries->push_back( std::make_unique(*fake_entry)); return llvm::Error::success(); } llvm::StringLiteral name() const override { return "TestDestination"; } private: std::vector> *received_entries; }; class FakePlugin : public telemetry::TelemetryManager { public: FakePlugin() : telemetry::TelemetryManager(std::make_unique( /*enable_telemetry=*/true, /*detailed_command_telemetry=*/true, /*enable_client_telemetry=*/true)) {} // TelemetryManager interface llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override { if (auto *fake_entry = llvm::dyn_cast(entry)) fake_entry->msg = "In FakePlugin"; return llvm::Error::success(); } llvm::StringRef GetInstanceName() const override { return "FakeTelemetryPlugin"; } static void Initialize() { telemetry::TelemetryManager::SetInstance(std::make_unique()); } static void Terminate() { telemetry::TelemetryManager::SetInstance(nullptr); } }; } // namespace lldb_private using namespace lldb_private::telemetry; class TelemetryTest : public testing::Test { public: lldb_private::SubsystemRAII subsystems; std::vector> received_entries; void SetUp() override { auto *ins = lldb_private::telemetry::TelemetryManager::GetInstance(); ASSERT_NE(ins, nullptr); ins->addDestination( std::make_unique(&received_entries)); } }; #if LLVM_ENABLE_TELEMETRY #define TELEMETRY_TEST(suite, test) TEST_F(suite, test) #else #define TELEMETRY_TEST(suite, test) TEST_F(suite, DISABLED_##test) #endif TELEMETRY_TEST(TelemetryTest, PluginTest) { lldb_private::telemetry::TelemetryManager *ins = lldb_private::telemetry::TelemetryManager::GetInstance(); lldb_private::FakeTelemetryInfo entry; entry.msg = ""; ASSERT_THAT_ERROR(ins->dispatch(&entry), ::llvm::Succeeded()); ASSERT_EQ(1U, received_entries.size()); EXPECT_EQ("In FakePlugin", llvm::dyn_cast(received_entries[0]) ->msg); ASSERT_EQ("FakeTelemetryPlugin", ins->GetInstanceName()); } TELEMETRY_TEST(TelemetryTest, ScopedDispatcherTest) { { ScopedDispatcher helper( [](lldb_private::FakeTelemetryInfo *info) { info->num = 0; }); } { ScopedDispatcher helper( [](lldb_private::FakeTelemetryInfo *info) { info->num = 1; }); } { ScopedDispatcher helper( [](lldb_private::FakeTelemetryInfo *info) { info->num = 2; }); } EXPECT_EQ(3U, received_entries.size()); for (int i = 0; i < 3; ++i) { EXPECT_EQ( i, llvm::dyn_cast(received_entries[i]) ->num); } }