5#include <gtest/gtest.h>
15class InterruptCollectorTest :
public ::testing::Test {
17 void SetUp()
override {
18 collector_ = std::make_unique<interrupt_collector>();
19 std::unordered_map<std::string, std::string> config;
27TEST_F(InterruptCollectorTest, InitializesSuccessfully) {
29 EXPECT_EQ(
collector_->name(),
"interrupt_collector");
33TEST_F(InterruptCollectorTest, ReturnsCorrectMetricTypes) {
35 EXPECT_FALSE(types.empty());
38 std::vector<std::string> expected = {
41 "soft_interrupts_total",
42 "soft_interrupts_per_sec"
45 for (
const auto& expected_type : expected) {
46 EXPECT_NE(std::find(types.begin(), types.end(), expected_type), types.end())
47 <<
"Missing metric type: " << expected_type;
52TEST_F(InterruptCollectorTest, ConfigurationOptions) {
53 auto collector = std::make_unique<interrupt_collector>();
54 std::unordered_map<std::string, std::string> config;
55 config[
"collect_per_cpu"] =
"true";
56 config[
"collect_soft_interrupts"] =
"false";
57 EXPECT_TRUE(collector->initialize(config));
59 auto stats = collector->get_statistics();
60 EXPECT_DOUBLE_EQ(stats[
"collect_per_cpu"], 1.0);
61 EXPECT_DOUBLE_EQ(stats[
"collect_soft_interrupts"], 0.0);
65TEST_F(InterruptCollectorTest, CanBeDisabled) {
66 auto collector = std::make_unique<interrupt_collector>();
67 std::unordered_map<std::string, std::string> config;
68 config[
"enabled"] =
"false";
69 collector->initialize(config);
71 auto metrics = collector->collect();
72 EXPECT_TRUE(metrics.empty());
74 auto stats = collector->get_statistics();
75 EXPECT_DOUBLE_EQ(stats[
"enabled"], 0.0);
79TEST_F(InterruptCollectorTest, TracksStatistics) {
85 if (
collector_->is_interrupt_monitoring_available()) {
87 EXPECT_GE(stats[
"collection_count"], 2.0);
91 EXPECT_GE(stats[
"collection_errors"], 2.0);
96TEST_F(InterruptCollectorTest, CollectReturnsMetrics) {
102TEST_F(InterruptCollectorTest, GetLastMetrics) {
106 if (
collector_->is_interrupt_monitoring_available()) {
108 auto now = std::chrono::system_clock::now();
109 auto diff = std::chrono::duration_cast<std::chrono::seconds>(now - last.timestamp);
110 EXPECT_LT(diff.count(), 10);
114 EXPECT_FALSE(last.metrics_available);
119TEST_F(InterruptCollectorTest, InterruptMonitoringAvailabilityCheck) {
122 EXPECT_NO_THROW(
collector_->is_interrupt_monitoring_available());
126TEST(InterruptMetricsTest, DefaultInitialization) {
127 interrupt_metrics metrics;
128 EXPECT_EQ(metrics.interrupts_total, 0);
129 EXPECT_DOUBLE_EQ(metrics.interrupts_per_sec, 0.0);
130 EXPECT_EQ(metrics.soft_interrupts_total, 0);
131 EXPECT_DOUBLE_EQ(metrics.soft_interrupts_per_sec, 0.0);
132 EXPECT_TRUE(metrics.per_cpu.empty());
133 EXPECT_FALSE(metrics.metrics_available);
134 EXPECT_FALSE(metrics.soft_interrupts_available);
138TEST(CpuInterruptInfoTest, DefaultInitialization) {
139 cpu_interrupt_info
info;
140 EXPECT_EQ(
info.cpu_id, 0);
141 EXPECT_EQ(
info.interrupt_count, 0);
142 EXPECT_DOUBLE_EQ(
info.interrupts_per_sec, 0.0);
146TEST(InterruptInfoCollectorTest, BasicFunctionality) {
147 interrupt_info_collector collector;
150 EXPECT_NO_THROW(collector.is_interrupt_monitoring_available());
153 auto metrics = collector.collect_metrics();
156 auto now = std::chrono::system_clock::now();
157 auto diff = std::chrono::duration_cast<std::chrono::seconds>(now - metrics.timestamp);
158 EXPECT_LT(diff.count(), 10);
162TEST_F(InterruptCollectorTest, MultipleCollectionsAreStable) {
163 for (
int i = 0; i < 10; ++i) {
166 EXPECT_NO_THROW(
collector_->get_statistics());
170 if (
collector_->is_interrupt_monitoring_available()) {
171 EXPECT_GE(stats[
"collection_count"], 10.0);
175 EXPECT_GE(stats[
"collection_errors"], 10.0);
180TEST_F(InterruptCollectorTest, MetricsHaveCorrectTags) {
183 for (
const auto& m : metrics) {
185 auto it = m.tags.find(
"collector");
186 if (it != m.tags.end()) {
187 EXPECT_EQ(it->second,
"interrupt_collector");
193TEST_F(InterruptCollectorTest, IsAvailableReflectsState) {
195 bool available =
false;
196 EXPECT_NO_THROW(available =
collector_->is_available());
200 auto disabled_collector = std::make_unique<interrupt_collector>();
201 std::unordered_map<std::string, std::string> config;
202 config[
"enabled"] =
"false";
203 disabled_collector->initialize(config);
204 EXPECT_NO_THROW(disabled_collector->is_available());
207#if defined(__linux__) || defined(__APPLE__)
209TEST_F(InterruptCollectorTest, UnixInterruptMonitoringAvailable) {
210 EXPECT_TRUE(
collector_->is_interrupt_monitoring_available());
214TEST(InterruptInfoCollectorTest, HasInterruptsOnUnix) {
215 interrupt_info_collector collector;
217 if (collector.is_interrupt_monitoring_available()) {
218 auto metrics = collector.collect_metrics();
219 EXPECT_TRUE(metrics.metrics_available);
221 EXPECT_GT(metrics.interrupts_total, 0);
226TEST(InterruptInfoCollectorTest, RateCalculationWorks) {
227 interrupt_info_collector collector;
229 if (collector.is_interrupt_monitoring_available()) {
231 auto first = collector.collect_metrics();
232 EXPECT_DOUBLE_EQ(first.interrupts_per_sec, 0.0);
235 std::this_thread::sleep_for(std::chrono::milliseconds(100));
238 auto second = collector.collect_metrics();
240 EXPECT_GE(second.interrupts_per_sec, 0.0);
247TEST_F(InterruptCollectorTest, WindowsInterruptMonitoringUnavailable) {
248 EXPECT_FALSE(
collector_->is_interrupt_monitoring_available());
252TEST(InterruptInfoCollectorTest, WindowsReturnsUnavailableMetrics) {
253 interrupt_info_collector collector;
254 auto metrics = collector.collect_metrics();
255 EXPECT_FALSE(metrics.metrics_available);
Hardware and software interrupt statistics monitoring collector.
@ info
Informational, no action required.
TEST(AdapterFunctionalityTest, WorksWithoutLogger)
Test Scenario 1: Adapter with NULL logger.
TEST_F(AdaptiveMonitoringTest, AdaptiveConfigDefaults)
std::unique_ptr< battery_collector > collector_