brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 8d69b9a Raw
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