Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
test_alert_triggers.cpp File Reference
#include <gtest/gtest.h>
#include <kcenon/monitoring/alert/alert_triggers.h>
#include <chrono>
#include <cmath>
#include <memory>
#include <thread>
#include <vector>
Include dependency graph for test_alert_triggers.cpp:

Go to the source code of this file.

Classes

class  ThresholdTriggerTest
 
class  RangeTriggerTest
 
class  RateOfChangeTriggerTest
 
class  AnomalyTriggerTest
 
class  CompositeTriggerTest
 
class  AbsentTriggerTest
 
class  DeltaTriggerTest
 

Functions

 TEST_F (ThresholdTriggerTest, GreaterThan)
 
 TEST_F (ThresholdTriggerTest, GreaterOrEqual)
 
 TEST_F (ThresholdTriggerTest, LessThan)
 
 TEST_F (ThresholdTriggerTest, LessOrEqual)
 
 TEST_F (ThresholdTriggerTest, Equal)
 
 TEST_F (ThresholdTriggerTest, NotEqual)
 
 TEST_F (ThresholdTriggerTest, FactoryAbove)
 
 TEST_F (ThresholdTriggerTest, FactoryBelow)
 
 TEST_F (ThresholdTriggerTest, FactoryAboveOrEqual)
 
 TEST_F (ThresholdTriggerTest, FactoryBelowOrEqual)
 
 TEST_F (ThresholdTriggerTest, TypeName)
 
 TEST_F (ThresholdTriggerTest, Description)
 
 TEST_F (ThresholdTriggerTest, NegativeThreshold)
 
 TEST_F (ThresholdTriggerTest, ZeroThreshold)
 
 TEST_F (RangeTriggerTest, InsideRange)
 
 TEST_F (RangeTriggerTest, OutsideRange)
 
 TEST_F (RangeTriggerTest, FactoryInRange)
 
 TEST_F (RangeTriggerTest, FactoryOutOfRange)
 
 TEST_F (RangeTriggerTest, TypeNameAndDescription)
 
 TEST_F (RangeTriggerTest, OutsideRangeDescription)
 
 TEST_F (RateOfChangeTriggerTest, InsufficientSamplesDoesNotFire)
 
 TEST_F (RateOfChangeTriggerTest, IncreasingRateDetected)
 
 TEST_F (RateOfChangeTriggerTest, DecreasingDirection)
 
 TEST_F (RateOfChangeTriggerTest, EitherDirection)
 
 TEST_F (RateOfChangeTriggerTest, Reset)
 
 TEST_F (RateOfChangeTriggerTest, TypeNameAndDescription)
 
 TEST_F (AnomalyTriggerTest, InsufficientSamplesDoesNotFire)
 
 TEST_F (AnomalyTriggerTest, NormalValuesDoNotFire)
 
 TEST_F (AnomalyTriggerTest, AnomalousValueFires)
 
 TEST_F (AnomalyTriggerTest, Statistics)
 
 TEST_F (AnomalyTriggerTest, Reset)
 
 TEST_F (AnomalyTriggerTest, ZeroStddevDoesNotFire)
 
 TEST_F (AnomalyTriggerTest, TypeNameAndDescription)
 
 TEST_F (CompositeTriggerTest, AndBothTrue)
 
 TEST_F (CompositeTriggerTest, AndEvaluateMulti)
 
 TEST_F (CompositeTriggerTest, OrAnyTrue)
 
 TEST_F (CompositeTriggerTest, XorExactlyOne)
 
 TEST_F (CompositeTriggerTest, XorBothTrueIsFalse)
 
 TEST_F (CompositeTriggerTest, Not)
 
 TEST_F (CompositeTriggerTest, EmptyTriggersIsFalse)
 
 TEST_F (CompositeTriggerTest, EvaluateMultiFewerValuesThanTriggers)
 
 TEST_F (CompositeTriggerTest, TriggersAccessor)
 
 TEST_F (CompositeTriggerTest, TypeNameAndDescription)
 
 TEST_F (CompositeTriggerTest, NotDescription)
 
 TEST_F (AbsentTriggerTest, FirstEvaluationDoesNotFire)
 
 TEST_F (AbsentTriggerTest, QuickSecondEvaluationDoesNotFire)
 
 TEST_F (AbsentTriggerTest, GapExceedingDurationFires)
 
 TEST_F (AbsentTriggerTest, ResetClearsState)
 
 TEST_F (AbsentTriggerTest, TypeNameAndDescription)
 
 TEST_F (DeltaTriggerTest, FirstEvaluationDoesNotFire)
 
 TEST_F (DeltaTriggerTest, AbsoluteSmallChangeDoesNotFire)
 
 TEST_F (DeltaTriggerTest, AbsoluteLargeChangeFires)
 
 TEST_F (DeltaTriggerTest, AbsoluteNegativeChangeFires)
 
 TEST_F (DeltaTriggerTest, SignedPositiveChangeOnly)
 
 TEST_F (DeltaTriggerTest, ContinuousTracking)
 
 TEST_F (DeltaTriggerTest, Reset)
 
 TEST_F (DeltaTriggerTest, TypeNameAndDescription)
 
 TEST_F (DeltaTriggerTest, SignedDescription)
 
 TEST (ComparisonOperatorTest, AllOperatorsHaveStrings)
 

Function Documentation

◆ TEST()

TEST ( ComparisonOperatorTest ,
AllOperatorsHaveStrings  )

Definition at line 525 of file test_alert_triggers.cpp.

525 {
526 EXPECT_STREQ(comparison_operator_to_string(comparison_operator::greater_than), ">");
527 EXPECT_STREQ(comparison_operator_to_string(comparison_operator::greater_or_equal), ">=");
528 EXPECT_STREQ(comparison_operator_to_string(comparison_operator::less_than), "<");
529 EXPECT_STREQ(comparison_operator_to_string(comparison_operator::less_or_equal), "<=");
530 EXPECT_STREQ(comparison_operator_to_string(comparison_operator::equal), "==");
531 EXPECT_STREQ(comparison_operator_to_string(comparison_operator::not_equal), "!=");
532}
constexpr const char * comparison_operator_to_string(comparison_operator op) noexcept
Convert comparison operator to string.

References kcenon::monitoring::comparison_operator_to_string().

Here is the call graph for this function:

◆ TEST_F() [1/58]

TEST_F ( AbsentTriggerTest ,
FirstEvaluationDoesNotFire  )

Definition at line 417 of file test_alert_triggers.cpp.

417 {
418 auto trigger = std::make_shared<absent_trigger>(100ms);
419 EXPECT_FALSE(trigger->evaluate(1.0));
420}

◆ TEST_F() [2/58]

TEST_F ( AbsentTriggerTest ,
GapExceedingDurationFires  )

Definition at line 429 of file test_alert_triggers.cpp.

429 {
430 auto trigger = std::make_shared<absent_trigger>(50ms);
431 trigger->evaluate(1.0);
432 std::this_thread::sleep_for(60ms);
433 EXPECT_TRUE(trigger->evaluate(2.0));
434}

◆ TEST_F() [3/58]

TEST_F ( AbsentTriggerTest ,
QuickSecondEvaluationDoesNotFire  )

Definition at line 422 of file test_alert_triggers.cpp.

422 {
423 auto trigger = std::make_shared<absent_trigger>(100ms);
424 trigger->evaluate(1.0);
425 // Immediately evaluate again - gap is tiny
426 EXPECT_FALSE(trigger->evaluate(2.0));
427}

◆ TEST_F() [4/58]

TEST_F ( AbsentTriggerTest ,
ResetClearsState  )

Definition at line 436 of file test_alert_triggers.cpp.

436 {
437 auto trigger = std::make_shared<absent_trigger>(50ms);
438 trigger->evaluate(1.0);
439 trigger->reset();
440 // After reset, first evaluation again
441 EXPECT_FALSE(trigger->evaluate(2.0));
442}

◆ TEST_F() [5/58]

TEST_F ( AbsentTriggerTest ,
TypeNameAndDescription  )

Definition at line 444 of file test_alert_triggers.cpp.

444 {
445 auto trigger = std::make_shared<absent_trigger>(5000ms);
446 EXPECT_EQ(trigger->type_name(), "absent");
447 auto desc = trigger->description();
448 EXPECT_NE(desc.find("no data"), std::string::npos);
449}

◆ TEST_F() [6/58]

TEST_F ( AnomalyTriggerTest ,
AnomalousValueFires  )

Definition at line 271 of file test_alert_triggers.cpp.

271 {
272 auto trigger = std::make_shared<anomaly_trigger>(2.0, 100, 10);
273 // Build up history with values around 50
274 for (int i = 0; i < 20; ++i) {
275 trigger->evaluate(50.0 + (i % 2 == 0 ? 0.5 : -0.5));
276 }
277 // Now inject a value far from the mean
278 bool fired = trigger->evaluate(200.0);
279 EXPECT_TRUE(fired);
280}

◆ TEST_F() [7/58]

TEST_F ( AnomalyTriggerTest ,
InsufficientSamplesDoesNotFire  )

Definition at line 255 of file test_alert_triggers.cpp.

255 {
256 auto trigger = std::make_shared<anomaly_trigger>(3.0, 100, 10);
257 // Feed fewer than min_samples
258 for (int i = 0; i < 9; ++i) {
259 EXPECT_FALSE(trigger->evaluate(50.0));
260 }
261}

◆ TEST_F() [8/58]

TEST_F ( AnomalyTriggerTest ,
NormalValuesDoNotFire  )

Definition at line 263 of file test_alert_triggers.cpp.

263 {
264 auto trigger = std::make_shared<anomaly_trigger>(3.0, 100, 10);
265 // Feed stable values
266 for (int i = 0; i < 50; ++i) {
267 EXPECT_FALSE(trigger->evaluate(50.0 + (i % 3) * 0.1));
268 }
269}

◆ TEST_F() [9/58]

TEST_F ( AnomalyTriggerTest ,
Reset  )

Definition at line 291 of file test_alert_triggers.cpp.

291 {
292 auto trigger = std::make_shared<anomaly_trigger>(3.0, 100, 10);
293 for (int i = 0; i < 20; ++i) {
294 trigger->evaluate(50.0);
295 }
296 trigger->reset();
297 // After reset, should need min_samples again
298 EXPECT_FALSE(trigger->evaluate(200.0));
299}

◆ TEST_F() [10/58]

TEST_F ( AnomalyTriggerTest ,
Statistics  )

Definition at line 282 of file test_alert_triggers.cpp.

282 {
283 auto trigger = std::make_shared<anomaly_trigger>(3.0, 100, 5);
284 for (int i = 0; i < 10; ++i) {
285 trigger->evaluate(10.0);
286 }
287 EXPECT_NEAR(trigger->current_mean(), 10.0, 0.01);
288 EXPECT_NEAR(trigger->current_stddev(), 0.0, 0.01);
289}

◆ TEST_F() [11/58]

TEST_F ( AnomalyTriggerTest ,
TypeNameAndDescription  )

Definition at line 311 of file test_alert_triggers.cpp.

311 {
312 auto trigger = std::make_shared<anomaly_trigger>(3.0);
313 EXPECT_EQ(trigger->type_name(), "anomaly");
314 EXPECT_NE(trigger->description().find("std devs"), std::string::npos);
315}

◆ TEST_F() [12/58]

TEST_F ( AnomalyTriggerTest ,
ZeroStddevDoesNotFire  )

Definition at line 301 of file test_alert_triggers.cpp.

301 {
302 // When all values are the same, stddev = 0, should not fire (avoid division by zero)
303 auto trigger = std::make_shared<anomaly_trigger>(3.0, 100, 5);
304 for (int i = 0; i < 10; ++i) {
305 trigger->evaluate(50.0);
306 }
307 // Evaluating the same value keeps stddev at 0, guard should return false
308 EXPECT_FALSE(trigger->evaluate(50.0));
309}

◆ TEST_F() [13/58]

TEST_F ( CompositeTriggerTest ,
AndBothTrue  )

Definition at line 327 of file test_alert_triggers.cpp.

327 {
328 auto composite = composite_trigger::all_of({high_, low_});
329 // Single value evaluated against both: 90 > 80 (true) but 90 < 20 (false)
330 EXPECT_FALSE(composite->evaluate(90.0));
331}
static std::shared_ptr< composite_trigger > all_of(std::vector< std::shared_ptr< alert_trigger > > triggers)
Create AND composite.

References kcenon::monitoring::composite_trigger::all_of().

Here is the call graph for this function:

◆ TEST_F() [14/58]

TEST_F ( CompositeTriggerTest ,
AndEvaluateMulti  )

Definition at line 333 of file test_alert_triggers.cpp.

333 {
334 auto composite = composite_trigger::all_of({high_, low_});
335 // 90 > 80 (true), 10 < 20 (true) => AND = true
336 EXPECT_TRUE(composite->evaluate_multi({90.0, 10.0}));
337 // 90 > 80 (true), 30 < 20 (false) => AND = false
338 EXPECT_FALSE(composite->evaluate_multi({90.0, 30.0}));
339}

References kcenon::monitoring::composite_trigger::all_of().

Here is the call graph for this function:

◆ TEST_F() [15/58]

TEST_F ( CompositeTriggerTest ,
EmptyTriggersIsFalse  )

Definition at line 379 of file test_alert_triggers.cpp.

379 {
380 auto composite = std::make_shared<composite_trigger>(
381 composite_operation::AND,
382 std::vector<std::shared_ptr<alert_trigger>>{});
383 EXPECT_FALSE(composite->evaluate(50.0));
384}

◆ TEST_F() [16/58]

TEST_F ( CompositeTriggerTest ,
EvaluateMultiFewerValuesThanTriggers  )

Definition at line 386 of file test_alert_triggers.cpp.

386 {
387 auto composite = composite_trigger::all_of({high_, low_});
388 // Only one value provided: last value repeated for missing triggers
389 // 90 > 80 (true), 90 < 20 (false) => AND = false
390 EXPECT_FALSE(composite->evaluate_multi({90.0}));
391}

References kcenon::monitoring::composite_trigger::all_of().

Here is the call graph for this function:

◆ TEST_F() [17/58]

TEST_F ( CompositeTriggerTest ,
Not  )

Definition at line 371 of file test_alert_triggers.cpp.

371 {
372 auto composite = composite_trigger::invert(high_);
373 // 90 > 80 = true, NOT = false
374 EXPECT_FALSE(composite->evaluate(90.0));
375 // 50 > 80 = false, NOT = true
376 EXPECT_TRUE(composite->evaluate(50.0));
377}
static std::shared_ptr< composite_trigger > invert(std::shared_ptr< alert_trigger > trigger)
Create NOT composite.

References kcenon::monitoring::composite_trigger::invert().

Here is the call graph for this function:

◆ TEST_F() [18/58]

TEST_F ( CompositeTriggerTest ,
NotDescription  )

Definition at line 405 of file test_alert_triggers.cpp.

405 {
406 auto composite = composite_trigger::invert(high_);
407 auto desc = composite->description();
408 EXPECT_NE(desc.find("NOT"), std::string::npos);
409}

References kcenon::monitoring::composite_trigger::invert().

Here is the call graph for this function:

◆ TEST_F() [19/58]

TEST_F ( CompositeTriggerTest ,
OrAnyTrue  )

Definition at line 341 of file test_alert_triggers.cpp.

341 {
342 auto composite = composite_trigger::any_of({high_, low_});
343 // 90 > 80 = true, so OR = true
344 EXPECT_TRUE(composite->evaluate(90.0));
345 // 10 < 20 = true, 10 > 80 = false, but OR = true
346 EXPECT_TRUE(composite->evaluate(10.0));
347 // 50: not > 80 and not < 20
348 EXPECT_FALSE(composite->evaluate(50.0));
349}
static std::shared_ptr< composite_trigger > any_of(std::vector< std::shared_ptr< alert_trigger > > triggers)
Create OR composite.

References kcenon::monitoring::composite_trigger::any_of().

Here is the call graph for this function:

◆ TEST_F() [20/58]

TEST_F ( CompositeTriggerTest ,
TriggersAccessor  )

Definition at line 393 of file test_alert_triggers.cpp.

393 {
394 auto composite = composite_trigger::all_of({high_, low_});
395 EXPECT_EQ(composite->triggers().size(), 2u);
396}

References kcenon::monitoring::composite_trigger::all_of().

Here is the call graph for this function:

◆ TEST_F() [21/58]

TEST_F ( CompositeTriggerTest ,
TypeNameAndDescription  )

Definition at line 398 of file test_alert_triggers.cpp.

398 {
399 auto composite = composite_trigger::all_of({high_, low_});
400 EXPECT_EQ(composite->type_name(), "composite");
401 auto desc = composite->description();
402 EXPECT_NE(desc.find("AND"), std::string::npos);
403}

References kcenon::monitoring::composite_trigger::all_of().

Here is the call graph for this function:

◆ TEST_F() [22/58]

TEST_F ( CompositeTriggerTest ,
XorBothTrueIsFalse  )

Definition at line 362 of file test_alert_triggers.cpp.

362 {
363 auto composite = std::make_shared<composite_trigger>(
364 composite_operation::XOR,
365 std::vector<std::shared_ptr<alert_trigger>>{high_, low_});
366
367 // Both true via evaluate_multi => XOR = false
368 EXPECT_FALSE(composite->evaluate_multi({90.0, 10.0}));
369}

◆ TEST_F() [23/58]

TEST_F ( CompositeTriggerTest ,
XorExactlyOne  )

Definition at line 351 of file test_alert_triggers.cpp.

351 {
352 auto composite = std::make_shared<composite_trigger>(
353 composite_operation::XOR,
354 std::vector<std::shared_ptr<alert_trigger>>{high_, low_});
355
356 // 90: high fires (true), low doesn't (false) => XOR = true (exactly 1)
357 EXPECT_TRUE(composite->evaluate(90.0));
358 // 50: neither fires => XOR = false
359 EXPECT_FALSE(composite->evaluate(50.0));
360}

◆ TEST_F() [24/58]

TEST_F ( DeltaTriggerTest ,
AbsoluteLargeChangeFires  )

Definition at line 468 of file test_alert_triggers.cpp.

468 {
469 auto trigger = std::make_shared<delta_trigger>(10.0, true);
470 trigger->evaluate(50.0);
471 EXPECT_TRUE(trigger->evaluate(70.0)); // |20| > 10
472}

◆ TEST_F() [25/58]

TEST_F ( DeltaTriggerTest ,
AbsoluteNegativeChangeFires  )

Definition at line 474 of file test_alert_triggers.cpp.

474 {
475 auto trigger = std::make_shared<delta_trigger>(10.0, true);
476 trigger->evaluate(50.0);
477 EXPECT_TRUE(trigger->evaluate(30.0)); // |-20| > 10
478}

◆ TEST_F() [26/58]

TEST_F ( DeltaTriggerTest ,
AbsoluteSmallChangeDoesNotFire  )

Definition at line 462 of file test_alert_triggers.cpp.

462 {
463 auto trigger = std::make_shared<delta_trigger>(10.0, true);
464 trigger->evaluate(50.0);
465 EXPECT_FALSE(trigger->evaluate(55.0)); // |5| <= 10
466}

◆ TEST_F() [27/58]

TEST_F ( DeltaTriggerTest ,
ContinuousTracking  )

Definition at line 489 of file test_alert_triggers.cpp.

489 {
490 auto trigger = std::make_shared<delta_trigger>(5.0, true);
491 trigger->evaluate(10.0); // first - no fire
492 trigger->evaluate(12.0); // |2| <= 5 - no fire
493 EXPECT_FALSE(trigger->evaluate(14.0)); // |2| <= 5
494 EXPECT_TRUE(trigger->evaluate(25.0)); // |11| > 5
495 EXPECT_FALSE(trigger->evaluate(27.0)); // |2| <= 5 (relative to 25)
496}

◆ TEST_F() [28/58]

TEST_F ( DeltaTriggerTest ,
FirstEvaluationDoesNotFire  )

Definition at line 457 of file test_alert_triggers.cpp.

457 {
458 auto trigger = std::make_shared<delta_trigger>(10.0);
459 EXPECT_FALSE(trigger->evaluate(50.0));
460}

◆ TEST_F() [29/58]

TEST_F ( DeltaTriggerTest ,
Reset  )

Definition at line 498 of file test_alert_triggers.cpp.

498 {
499 auto trigger = std::make_shared<delta_trigger>(5.0, true);
500 trigger->evaluate(10.0);
501 trigger->evaluate(20.0);
502 trigger->reset();
503 // After reset, first evaluation again
504 EXPECT_FALSE(trigger->evaluate(100.0));
505}

◆ TEST_F() [30/58]

TEST_F ( DeltaTriggerTest ,
SignedDescription  )

Definition at line 514 of file test_alert_triggers.cpp.

514 {
515 auto trigger = std::make_shared<delta_trigger>(10.0, false);
516 auto desc = trigger->description();
517 // Should NOT contain "|delta|" for signed mode
518 EXPECT_EQ(desc.find("|delta|"), std::string::npos);
519}

◆ TEST_F() [31/58]

TEST_F ( DeltaTriggerTest ,
SignedPositiveChangeOnly  )

Definition at line 480 of file test_alert_triggers.cpp.

480 {
481 auto trigger = std::make_shared<delta_trigger>(10.0, false);
482 trigger->evaluate(50.0);
483 // Decrease: delta = -20, not > 10
484 EXPECT_FALSE(trigger->evaluate(30.0));
485 // Increase: delta = 40, > 10
486 EXPECT_TRUE(trigger->evaluate(70.0));
487}

◆ TEST_F() [32/58]

TEST_F ( DeltaTriggerTest ,
TypeNameAndDescription  )

Definition at line 507 of file test_alert_triggers.cpp.

507 {
508 auto trigger = std::make_shared<delta_trigger>(10.0, true);
509 EXPECT_EQ(trigger->type_name(), "delta");
510 auto desc = trigger->description();
511 EXPECT_NE(desc.find("delta"), std::string::npos);
512}

◆ TEST_F() [33/58]

TEST_F ( RangeTriggerTest ,
FactoryInRange  )

Definition at line 156 of file test_alert_triggers.cpp.

156 {
157 auto trigger = threshold_trigger::in_range(20.0, 80.0);
158 EXPECT_TRUE(trigger->evaluate(50.0));
159 EXPECT_FALSE(trigger->evaluate(10.0));
160}
static std::shared_ptr< class range_trigger > in_range(double min_val, double max_val)
Create trigger for value within range (inclusive)

References kcenon::monitoring::threshold_trigger::in_range().

Here is the call graph for this function:

◆ TEST_F() [34/58]

TEST_F ( RangeTriggerTest ,
FactoryOutOfRange  )

Definition at line 162 of file test_alert_triggers.cpp.

162 {
163 auto trigger = threshold_trigger::out_of_range(20.0, 80.0);
164 EXPECT_TRUE(trigger->evaluate(10.0));
165 EXPECT_TRUE(trigger->evaluate(90.0));
166 EXPECT_FALSE(trigger->evaluate(50.0));
167}
static std::shared_ptr< class range_trigger > out_of_range(double min_val, double max_val)
Create trigger for value outside range (exclusive)

References kcenon::monitoring::threshold_trigger::out_of_range().

Here is the call graph for this function:

◆ TEST_F() [35/58]

TEST_F ( RangeTriggerTest ,
InsideRange  )

Definition at line 138 of file test_alert_triggers.cpp.

138 {
139 auto trigger = std::make_shared<range_trigger>(10.0, 90.0, true);
140 EXPECT_TRUE(trigger->evaluate(50.0));
141 EXPECT_TRUE(trigger->evaluate(10.0)); // inclusive
142 EXPECT_TRUE(trigger->evaluate(90.0)); // inclusive
143 EXPECT_FALSE(trigger->evaluate(9.9));
144 EXPECT_FALSE(trigger->evaluate(90.1));
145}

◆ TEST_F() [36/58]

TEST_F ( RangeTriggerTest ,
OutsideRange  )

Definition at line 147 of file test_alert_triggers.cpp.

147 {
148 auto trigger = std::make_shared<range_trigger>(10.0, 90.0, false);
149 EXPECT_TRUE(trigger->evaluate(5.0));
150 EXPECT_TRUE(trigger->evaluate(95.0));
151 EXPECT_FALSE(trigger->evaluate(50.0));
152 EXPECT_FALSE(trigger->evaluate(10.0));
153 EXPECT_FALSE(trigger->evaluate(90.0));
154}

◆ TEST_F() [37/58]

TEST_F ( RangeTriggerTest ,
OutsideRangeDescription  )

Definition at line 176 of file test_alert_triggers.cpp.

176 {
177 auto trigger = std::make_shared<range_trigger>(10.0, 90.0, false);
178 auto desc = trigger->description();
179 EXPECT_NE(desc.find("outside"), std::string::npos);
180}

◆ TEST_F() [38/58]

TEST_F ( RangeTriggerTest ,
TypeNameAndDescription  )

Definition at line 169 of file test_alert_triggers.cpp.

169 {
170 auto trigger = std::make_shared<range_trigger>(10.0, 90.0, true);
171 EXPECT_EQ(trigger->type_name(), "range");
172 auto desc = trigger->description();
173 EXPECT_NE(desc.find("in"), std::string::npos);
174}

◆ TEST_F() [39/58]

TEST_F ( RateOfChangeTriggerTest ,
DecreasingDirection  )

Definition at line 210 of file test_alert_triggers.cpp.

210 {
211 auto trigger = std::make_shared<rate_of_change_trigger>(
212 5.0, 1000ms, rate_of_change_trigger::rate_direction::decreasing, 2);
213
214 trigger->evaluate(100.0);
215 std::this_thread::sleep_for(10ms);
216 bool fired = trigger->evaluate(0.0);
217 EXPECT_TRUE(fired);
218}

◆ TEST_F() [40/58]

TEST_F ( RateOfChangeTriggerTest ,
EitherDirection  )

Definition at line 220 of file test_alert_triggers.cpp.

220 {
221 auto trigger = std::make_shared<rate_of_change_trigger>(
222 5.0, 1000ms, rate_of_change_trigger::rate_direction::either, 2);
223
224 trigger->evaluate(50.0);
225 std::this_thread::sleep_for(10ms);
226 // Large change in either direction
227 EXPECT_TRUE(trigger->evaluate(200.0));
228}

◆ TEST_F() [41/58]

TEST_F ( RateOfChangeTriggerTest ,
IncreasingRateDetected  )

Definition at line 197 of file test_alert_triggers.cpp.

197 {
198 auto trigger = std::make_shared<rate_of_change_trigger>(
199 5.0, 1000ms, rate_of_change_trigger::rate_direction::increasing, 2);
200
201 trigger->evaluate(0.0);
202 std::this_thread::sleep_for(10ms);
203 // Large jump should produce high positive rate
204 bool fired = trigger->evaluate(100.0);
205 // Rate depends on timing, but a jump of 100 in ~10ms over a 1s window
206 // should yield a very high rate
207 EXPECT_TRUE(fired);
208}

◆ TEST_F() [42/58]

TEST_F ( RateOfChangeTriggerTest ,
InsufficientSamplesDoesNotFire  )

Definition at line 188 of file test_alert_triggers.cpp.

188 {
189 auto trigger = std::make_shared<rate_of_change_trigger>(
190 10.0, 1000ms, rate_of_change_trigger::rate_direction::either, 3);
191 // Only 1 sample
192 EXPECT_FALSE(trigger->evaluate(50.0));
193 // Only 2 samples
194 EXPECT_FALSE(trigger->evaluate(60.0));
195}

◆ TEST_F() [43/58]

TEST_F ( RateOfChangeTriggerTest ,
Reset  )

Definition at line 230 of file test_alert_triggers.cpp.

230 {
231 auto trigger = std::make_shared<rate_of_change_trigger>(
232 5.0, 1000ms, rate_of_change_trigger::rate_direction::either, 2);
233
234 trigger->evaluate(0.0);
235 trigger->evaluate(100.0);
236 trigger->reset();
237
238 // After reset, insufficient samples again
239 EXPECT_FALSE(trigger->evaluate(50.0));
240}

◆ TEST_F() [44/58]

TEST_F ( RateOfChangeTriggerTest ,
TypeNameAndDescription  )

Definition at line 242 of file test_alert_triggers.cpp.

242 {
243 auto trigger = std::make_shared<rate_of_change_trigger>(
244 10.0, 1000ms, rate_of_change_trigger::rate_direction::increasing);
245 EXPECT_EQ(trigger->type_name(), "rate_of_change");
246 EXPECT_FALSE(trigger->description().empty());
247}

◆ TEST_F() [45/58]

TEST_F ( ThresholdTriggerTest ,
Description  )

Definition at line 112 of file test_alert_triggers.cpp.

112 {
113 trigger_ = threshold_trigger::above(80.0);
114 auto desc = trigger_->description();
115 EXPECT_FALSE(desc.empty());
116 EXPECT_NE(desc.find(">"), std::string::npos);
117}
static std::shared_ptr< threshold_trigger > above(double threshold)
Create trigger for value > threshold.

References kcenon::monitoring::threshold_trigger::above().

Here is the call graph for this function:

◆ TEST_F() [46/58]

TEST_F ( ThresholdTriggerTest ,
Equal  )

Definition at line 67 of file test_alert_triggers.cpp.

67 {
68 trigger_ = std::make_shared<threshold_trigger>(50.0, comparison_operator::equal);
69 EXPECT_TRUE(trigger_->evaluate(50.0));
70 EXPECT_TRUE(trigger_->evaluate(50.0 + 1e-10)); // Within epsilon
71 EXPECT_FALSE(trigger_->evaluate(50.1));
72}

◆ TEST_F() [47/58]

TEST_F ( ThresholdTriggerTest ,
FactoryAbove  )

Definition at line 81 of file test_alert_triggers.cpp.

81 {
82 auto t = threshold_trigger::above(80.0);
83 EXPECT_TRUE(t->evaluate(81.0));
84 EXPECT_FALSE(t->evaluate(80.0));
85 EXPECT_EQ(t->threshold(), 80.0);
86 EXPECT_EQ(t->op(), comparison_operator::greater_than);
87}

References kcenon::monitoring::threshold_trigger::above().

Here is the call graph for this function:

◆ TEST_F() [48/58]

TEST_F ( ThresholdTriggerTest ,
FactoryAboveOrEqual  )

Definition at line 95 of file test_alert_triggers.cpp.

95 {
97 EXPECT_TRUE(t->evaluate(80.0));
98 EXPECT_FALSE(t->evaluate(79.9));
99}
static std::shared_ptr< threshold_trigger > above_or_equal(double threshold)
Create trigger for value >= threshold.

References kcenon::monitoring::threshold_trigger::above_or_equal().

Here is the call graph for this function:

◆ TEST_F() [49/58]

TEST_F ( ThresholdTriggerTest ,
FactoryBelow  )

Definition at line 89 of file test_alert_triggers.cpp.

89 {
90 auto t = threshold_trigger::below(20.0);
91 EXPECT_TRUE(t->evaluate(19.0));
92 EXPECT_FALSE(t->evaluate(20.0));
93}
static std::shared_ptr< threshold_trigger > below(double threshold)
Create trigger for value < threshold.

References kcenon::monitoring::threshold_trigger::below().

Here is the call graph for this function:

◆ TEST_F() [50/58]

TEST_F ( ThresholdTriggerTest ,
FactoryBelowOrEqual  )

Definition at line 101 of file test_alert_triggers.cpp.

101 {
103 EXPECT_TRUE(t->evaluate(20.0));
104 EXPECT_FALSE(t->evaluate(20.1));
105}
static std::shared_ptr< threshold_trigger > below_or_equal(double threshold)
Create trigger for value <= threshold.

References kcenon::monitoring::threshold_trigger::below_or_equal().

Here is the call graph for this function:

◆ TEST_F() [51/58]

TEST_F ( ThresholdTriggerTest ,
GreaterOrEqual  )

Definition at line 46 of file test_alert_triggers.cpp.

46 {
47 trigger_ = std::make_shared<threshold_trigger>(80.0, comparison_operator::greater_or_equal);
48 EXPECT_TRUE(trigger_->evaluate(81.0));
49 EXPECT_TRUE(trigger_->evaluate(80.0));
50 EXPECT_FALSE(trigger_->evaluate(79.0));
51}

◆ TEST_F() [52/58]

TEST_F ( ThresholdTriggerTest ,
GreaterThan  )

Definition at line 39 of file test_alert_triggers.cpp.

39 {
40 trigger_ = std::make_shared<threshold_trigger>(80.0, comparison_operator::greater_than);
41 EXPECT_TRUE(trigger_->evaluate(81.0));
42 EXPECT_FALSE(trigger_->evaluate(80.0));
43 EXPECT_FALSE(trigger_->evaluate(79.0));
44}

◆ TEST_F() [53/58]

TEST_F ( ThresholdTriggerTest ,
LessOrEqual  )

Definition at line 60 of file test_alert_triggers.cpp.

60 {
61 trigger_ = std::make_shared<threshold_trigger>(20.0, comparison_operator::less_or_equal);
62 EXPECT_TRUE(trigger_->evaluate(19.0));
63 EXPECT_TRUE(trigger_->evaluate(20.0));
64 EXPECT_FALSE(trigger_->evaluate(21.0));
65}

◆ TEST_F() [54/58]

TEST_F ( ThresholdTriggerTest ,
LessThan  )

Definition at line 53 of file test_alert_triggers.cpp.

53 {
54 trigger_ = std::make_shared<threshold_trigger>(20.0, comparison_operator::less_than);
55 EXPECT_TRUE(trigger_->evaluate(19.0));
56 EXPECT_FALSE(trigger_->evaluate(20.0));
57 EXPECT_FALSE(trigger_->evaluate(21.0));
58}

◆ TEST_F() [55/58]

TEST_F ( ThresholdTriggerTest ,
NegativeThreshold  )

Definition at line 119 of file test_alert_triggers.cpp.

119 {
120 trigger_ = threshold_trigger::below(-10.0);
121 EXPECT_TRUE(trigger_->evaluate(-11.0));
122 EXPECT_FALSE(trigger_->evaluate(-9.0));
123}

References kcenon::monitoring::threshold_trigger::below().

Here is the call graph for this function:

◆ TEST_F() [56/58]

TEST_F ( ThresholdTriggerTest ,
NotEqual  )

Definition at line 74 of file test_alert_triggers.cpp.

74 {
75 trigger_ = std::make_shared<threshold_trigger>(50.0, comparison_operator::not_equal);
76 EXPECT_FALSE(trigger_->evaluate(50.0));
77 EXPECT_TRUE(trigger_->evaluate(50.1));
78 EXPECT_TRUE(trigger_->evaluate(49.9));
79}

◆ TEST_F() [57/58]

TEST_F ( ThresholdTriggerTest ,
TypeName  )

Definition at line 107 of file test_alert_triggers.cpp.

107 {
108 trigger_ = threshold_trigger::above(80.0);
109 EXPECT_EQ(trigger_->type_name(), "threshold");
110}

References kcenon::monitoring::threshold_trigger::above().

Here is the call graph for this function:

◆ TEST_F() [58/58]

TEST_F ( ThresholdTriggerTest ,
ZeroThreshold  )

Definition at line 125 of file test_alert_triggers.cpp.

125 {
126 trigger_ = threshold_trigger::above(0.0);
127 EXPECT_TRUE(trigger_->evaluate(0.001));
128 EXPECT_FALSE(trigger_->evaluate(0.0));
129 EXPECT_FALSE(trigger_->evaluate(-1.0));
130}

References kcenon::monitoring::threshold_trigger::above().

Here is the call graph for this function: