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-exception
6//
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::Error
36 receiveEntry(const llvm::telemetry::TelemetryInfo *entry) override {
37 // Save a copy of the entry for later verification (because the original
38 // entry might have gone out of scope by the time verification is done.
39 if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(Val: entry))
40 received_entries->push_back(
41 x: std::make_unique<FakeTelemetryInfo>(args: *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=*/args: true, /*detailed_command_telemetry=*/args: true,
57 /*enable_client_telemetry=*/args: true)) {}
58
59 // TelemetryManager interface
60 llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override {
61 if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(Val: 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_private
79
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 Destination: std::make_unique<lldb_private::TestDestination>(args: &received_entries));
94 }
95};
96
97#if LLVM_ENABLE_TELEMETRY
98#define TELEMETRY_TEST(suite, test) TEST_F(suite, test)
99#else
100#define TELEMETRY_TEST(suite, test) TEST_F(suite, DISABLED_##test)
101#endif
102
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

Provided by KDAB

Privacy Policy
Update your C++ knowledge – Modern C++11/14/17 Training
Find out more

source code of lldb/unittests/Core/TelemetryTest.cpp