| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 | #include "prometheus/summary.h"#include <cmath>#include <thread>#include <gmock/gmock.h>namespace prometheus {namespace {TEST(SummaryTest, initialize_with_zero) {  Summary summary{Summary::Quantiles{}};  auto metric = summary.Collect();  auto s = metric.summary;  EXPECT_EQ(s.sample_count, 0);  EXPECT_EQ(s.sample_sum, 0);}TEST(SummaryTest, sample_count) {  Summary summary{Summary::Quantiles{{0.5, 0.05}}};  summary.Observe(0);  summary.Observe(200);  auto metric = summary.Collect();  auto s = metric.summary;  EXPECT_EQ(s.sample_count, 2);}TEST(SummaryTest, sample_sum) {  Summary summary{Summary::Quantiles{{0.5, 0.05}}};  summary.Observe(0);  summary.Observe(1);  summary.Observe(101);  auto metric = summary.Collect();  auto s = metric.summary;  EXPECT_EQ(s.sample_sum, 102);}TEST(SummaryTest, quantile_size) {  Summary summary{Summary::Quantiles{{0.5, 0.05}, {0.90, 0.01}}};  auto metric = summary.Collect();  auto s = metric.summary;  EXPECT_EQ(s.quantile.size(), 2);}TEST(SummaryTest, quantile_bounds) {  Summary summary{Summary::Quantiles{{0.5, 0.05}, {0.90, 0.01}, {0.99, 0.001}}};  auto metric = summary.Collect();  auto s = metric.summary;  ASSERT_EQ(s.quantile.size(), 3);  EXPECT_DOUBLE_EQ(s.quantile.at(0).quantile, 0.5);  EXPECT_DOUBLE_EQ(s.quantile.at(1).quantile, 0.9);  EXPECT_DOUBLE_EQ(s.quantile.at(2).quantile, 0.99);}TEST(SummaryTest, quantile_values) {  static const int SAMPLES = 1000000;  Summary summary{Summary::Quantiles{{0.5, 0.05}, {0.9, 0.01}, {0.99, 0.001}}};  for (int i = 1; i <= SAMPLES; ++i) summary.Observe(i);  auto metric = summary.Collect();  auto s = metric.summary;  ASSERT_EQ(s.quantile.size(), 3);  EXPECT_NEAR(s.quantile.at(0).value, 0.5 * SAMPLES, 0.05 * SAMPLES);  EXPECT_NEAR(s.quantile.at(1).value, 0.9 * SAMPLES, 0.01 * SAMPLES);  EXPECT_NEAR(s.quantile.at(2).value, 0.99 * SAMPLES, 0.001 * SAMPLES);}TEST(SummaryTest, max_age) {  Summary summary{Summary::Quantiles{{0.99, 0.001}}, std::chrono::seconds(1),                  2};  summary.Observe(8.0);  static const auto test_value = [&summary](double ref) {    auto metric = summary.Collect();    auto s = metric.summary;    ASSERT_EQ(s.quantile.size(), 1);    if (std::isnan(ref))      EXPECT_TRUE(std::isnan(s.quantile.at(0).value));    else      EXPECT_DOUBLE_EQ(s.quantile.at(0).value, ref);  };  test_value(8.0);  std::this_thread::sleep_for(std::chrono::milliseconds(600));  test_value(8.0);  std::this_thread::sleep_for(std::chrono::milliseconds(600));  test_value(std::numeric_limits<double>::quiet_NaN());}}  // namespace}  // namespace prometheus
 |