142 lines · cpp
1//===-- TelemetryTest.cpp ------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8#include "lldb/Core/Telemetry.h"9#include "TestingSupport/SubsystemRAII.h"10#include "lldb/Core/PluginInterface.h"11#include "lldb/Core/PluginManager.h"12#include "llvm/ADT/StringRef.h"13#include "llvm/Support/Error.h"14#include "llvm/Telemetry/Telemetry.h"15#include "llvm/Testing/Support/Error.h"16#include "gtest/gtest.h"17#include <memory>18#include <vector>19 20namespace lldb_private {21 22struct FakeTelemetryInfo : public telemetry::LLDBBaseTelemetryInfo {23 std::string msg;24 int num;25 26 ::llvm::telemetry::KindType getKind() const override { return 0b11111111; }27};28 29class TestDestination : public llvm::telemetry::Destination {30public:31 TestDestination(32 std::vector<std::unique_ptr<llvm::telemetry::TelemetryInfo>> *entries)33 : received_entries(entries) {}34 35 llvm::Error36 receiveEntry(const llvm::telemetry::TelemetryInfo *entry) override {37 // Save a copy of the entry for later verification (because the original38 // entry might have gone out of scope by the time verification is done.39 if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(entry))40 received_entries->push_back(41 std::make_unique<FakeTelemetryInfo>(*fake_entry));42 return llvm::Error::success();43 }44 45 llvm::StringLiteral name() const override { return "TestDestination"; }46 47private:48 std::vector<std::unique_ptr<llvm::telemetry::TelemetryInfo>>49 *received_entries;50};51 52class FakePlugin : public telemetry::TelemetryManager {53public:54 FakePlugin()55 : telemetry::TelemetryManager(std::make_unique<telemetry::LLDBConfig>(56 /*enable_telemetry=*/true, /*detailed_command_telemetry=*/true,57 /*enable_client_telemetry=*/true)) {}58 59 // TelemetryManager interface60 llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override {61 if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(entry))62 fake_entry->msg = "In FakePlugin";63 64 return llvm::Error::success();65 }66 67 llvm::StringRef GetInstanceName() const override {68 return "FakeTelemetryPlugin";69 }70 71 static void Initialize() {72 telemetry::TelemetryManager::SetInstance(std::make_unique<FakePlugin>());73 }74 75 static void Terminate() { telemetry::TelemetryManager::SetInstance(nullptr); }76};77 78} // namespace lldb_private79 80using namespace lldb_private::telemetry;81 82class TelemetryTest : public testing::Test {83public:84 lldb_private::SubsystemRAII<lldb_private::FakePlugin> subsystems;85 std::vector<std::unique_ptr<::llvm::telemetry::TelemetryInfo>>86 received_entries;87 88 void SetUp() override {89 auto *ins = lldb_private::telemetry::TelemetryManager::GetInstance();90 ASSERT_NE(ins, nullptr);91 92 ins->addDestination(93 std::make_unique<lldb_private::TestDestination>(&received_entries));94 }95};96 97#if LLVM_ENABLE_TELEMETRY98#define TELEMETRY_TEST(suite, test) TEST_F(suite, test)99#else100#define TELEMETRY_TEST(suite, test) TEST_F(suite, DISABLED_##test)101#endif102 103TELEMETRY_TEST(TelemetryTest, PluginTest) {104 lldb_private::telemetry::TelemetryManager *ins =105 lldb_private::telemetry::TelemetryManager::GetInstance();106 107 lldb_private::FakeTelemetryInfo entry;108 entry.msg = "";109 110 ASSERT_THAT_ERROR(ins->dispatch(&entry), ::llvm::Succeeded());111 ASSERT_EQ(1U, received_entries.size());112 EXPECT_EQ("In FakePlugin",113 llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(received_entries[0])114 ->msg);115 116 ASSERT_EQ("FakeTelemetryPlugin", ins->GetInstanceName());117}118 119TELEMETRY_TEST(TelemetryTest, ScopedDispatcherTest) {120 {121 ScopedDispatcher<lldb_private::FakeTelemetryInfo> helper(122 [](lldb_private::FakeTelemetryInfo *info) { info->num = 0; });123 }124 125 {126 ScopedDispatcher<lldb_private::FakeTelemetryInfo> helper(127 [](lldb_private::FakeTelemetryInfo *info) { info->num = 1; });128 }129 130 {131 ScopedDispatcher<lldb_private::FakeTelemetryInfo> helper(132 [](lldb_private::FakeTelemetryInfo *info) { info->num = 2; });133 }134 135 EXPECT_EQ(3U, received_entries.size());136 for (int i = 0; i < 3; ++i) {137 EXPECT_EQ(138 i, llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(received_entries[i])139 ->num);140 }141}142