| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | #include "prometheus/counter.h"#include <gmock/gmock.h>#include <thread>#include <vector>#include <prometheus/counter.h>namespace prometheus {namespace {TEST(CounterTest, initialize_with_zero) {  Counter counter;  EXPECT_EQ(counter.Value(), 0);}TEST(CounterTest, inc) {  Counter counter;  counter.Increment();  EXPECT_EQ(counter.Value(), 1.0);}TEST(CounterTest, inc_number) {  Counter counter;  counter.Increment(4);  EXPECT_EQ(counter.Value(), 4.0);}TEST(CounterTest, inc_multiple) {  Counter counter;  counter.Increment();  counter.Increment();  counter.Increment(5);  EXPECT_EQ(counter.Value(), 7.0);}TEST(CounterTest, inc_negative_value) {  Counter counter;  counter.Increment(5.0);  counter.Increment(-5.0);  EXPECT_EQ(counter.Value(), 5.0);}TEST(CounterTest, concurrent_writes) {  Counter counter;  std::vector<std::thread> threads(std::thread::hardware_concurrency());  for (auto& thread : threads) {    thread = std::thread{[&counter]() {      for (int i{0}; i < 100000; ++i) {        counter.Increment();      }    }};  }  for (auto& thread : threads) {    thread.join();  }  EXPECT_EQ(100000 * threads.size(), counter.Value());}TEST(CounterTest, concurrent_read_write) {  Counter counter;  std::vector<double> values;  values.reserve(100000);  std::thread reader{[&counter, &values]() {    for (int i{0}; i < 100000; ++i) {      values.push_back(counter.Value());    }  }};  std::thread writer{[&counter]() {    for (int i{0}; i < 100000; ++i) {      counter.Increment();    }  }};  reader.join();  writer.join();  EXPECT_TRUE(std::is_sorted(std::begin(values), std::end(values)));}}  // namespace}  // namespace prometheus
 |