aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/monlib/metrics/timer_ut.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/monlib/metrics/timer_ut.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/monlib/metrics/timer_ut.cpp')
-rw-r--r--library/cpp/monlib/metrics/timer_ut.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/library/cpp/monlib/metrics/timer_ut.cpp b/library/cpp/monlib/metrics/timer_ut.cpp
new file mode 100644
index 0000000000..c244a8c9e1
--- /dev/null
+++ b/library/cpp/monlib/metrics/timer_ut.cpp
@@ -0,0 +1,157 @@
+#include "timer.h"
+
+#include <library/cpp/testing/unittest/registar.h>
+#include <library/cpp/threading/future/async.h>
+#include <library/cpp/threading/future/future.h>
+
+using namespace NMonitoring;
+using namespace NThreading;
+
+Y_UNIT_TEST_SUITE(TTimerTest) {
+
+ using namespace std::chrono;
+
+ struct TTestClock {
+ using time_point = time_point<high_resolution_clock>;
+
+ static time_point TimePoint;
+
+ static time_point now() {
+ return TimePoint;
+ }
+ };
+
+ TTestClock::time_point TTestClock::TimePoint;
+
+
+ Y_UNIT_TEST(Gauge) {
+ TTestClock::TimePoint = TTestClock::time_point::min();
+
+ TGauge gauge(0);
+ {
+ TMetricTimerScope<TGauge, milliseconds, TTestClock> t{&gauge};
+ TTestClock::TimePoint += milliseconds(10);
+ }
+ UNIT_ASSERT_EQUAL(10, gauge.Get());
+
+ {
+ TMetricTimerScope<TGauge, milliseconds, TTestClock> t{&gauge};
+ TTestClock::TimePoint += milliseconds(20);
+ }
+ UNIT_ASSERT_EQUAL(20, gauge.Get());
+ }
+
+ Y_UNIT_TEST(IntGauge) {
+ TTestClock::TimePoint = TTestClock::time_point::min();
+
+ TIntGauge gauge(0);
+ {
+ TMetricTimerScope<TIntGauge, milliseconds, TTestClock> t{&gauge};
+ TTestClock::TimePoint += milliseconds(10);
+ }
+ UNIT_ASSERT_EQUAL(10, gauge.Get());
+
+ {
+ TMetricTimerScope<TIntGauge, milliseconds, TTestClock> t{&gauge};
+ TTestClock::TimePoint += milliseconds(20);
+ }
+ UNIT_ASSERT_EQUAL(20, gauge.Get());
+ }
+
+ Y_UNIT_TEST(CounterNew) {
+ TTestClock::TimePoint = TTestClock::time_point::min();
+
+ TCounter counter(0);
+ {
+ TMetricTimerScope<TCounter, milliseconds, TTestClock> t{&counter};
+ TTestClock::TimePoint += milliseconds(10);
+ }
+ UNIT_ASSERT_EQUAL(10, counter.Get());
+
+ {
+ TMetricTimerScope<TCounter, milliseconds, TTestClock> t{&counter};
+ TTestClock::TimePoint += milliseconds(20);
+ }
+ UNIT_ASSERT_EQUAL(30, counter.Get());
+ }
+
+ Y_UNIT_TEST(Rate) {
+ TTestClock::TimePoint = TTestClock::time_point::min();
+
+ TRate rate(0);
+ {
+ TMetricTimerScope<TRate, milliseconds, TTestClock> t{&rate};
+ TTestClock::TimePoint += milliseconds(10);
+ }
+ UNIT_ASSERT_EQUAL(10, rate.Get());
+
+ {
+ TMetricTimerScope<TRate, milliseconds, TTestClock> t{&rate};
+ TTestClock::TimePoint += milliseconds(20);
+ }
+ UNIT_ASSERT_EQUAL(30, rate.Get());
+ }
+
+ Y_UNIT_TEST(Histogram) {
+ TTestClock::TimePoint = TTestClock::time_point::min();
+
+ auto assertHistogram = [](const TVector<ui64>& expected, IHistogramSnapshotPtr snapshot) {
+ UNIT_ASSERT_EQUAL(expected.size(), snapshot->Count());
+ for (size_t i = 0; i < expected.size(); ++i) {
+ UNIT_ASSERT_EQUAL(expected[i], snapshot->Value(i));
+ }
+ };
+
+ THistogram histogram(ExplicitHistogram({10, 20, 30}), true);
+ {
+ TMetricTimerScope<THistogram, milliseconds, TTestClock> t{&histogram};
+ TTestClock::TimePoint += milliseconds(5);
+ }
+ assertHistogram({1, 0, 0, 0}, histogram.TakeSnapshot());
+
+ {
+ TMetricTimerScope<THistogram, milliseconds, TTestClock> t{&histogram};
+ TTestClock::TimePoint += milliseconds(15);
+ }
+ assertHistogram({1, 1, 0, 0}, histogram.TakeSnapshot());
+ }
+
+ Y_UNIT_TEST(Moving) {
+ TTestClock::TimePoint = TTestClock::time_point::min();
+
+ TCounter counter(0);
+ {
+ TMetricTimerScope<TCounter, milliseconds, TTestClock> t{&counter};
+ [tt = std::move(t)] {
+ TTestClock::TimePoint += milliseconds(5);
+ Y_UNUSED(tt);
+ }();
+
+ TTestClock::TimePoint += milliseconds(10);
+ }
+
+ UNIT_ASSERT_EQUAL(counter.Get(), 5);
+ }
+
+ Y_UNIT_TEST(MovingIntoApply) {
+ TTestClock::TimePoint = TTestClock::time_point::min();
+ auto pool = CreateThreadPool(1);
+
+ TCounter counter(0);
+ {
+ TFutureFriendlyTimer<TCounter, milliseconds, TTestClock> t{&counter};
+
+ auto f = Async([=] {
+ return;
+ }, *pool).Apply([tt = t] (auto) {
+ TTestClock::TimePoint += milliseconds(5);
+ tt.Record();
+ });
+
+ f.Wait();
+ TTestClock::TimePoint += milliseconds(10);
+ }
+
+ UNIT_ASSERT_EQUAL(counter.Get(), 5);
+ }
+}