summaryrefslogtreecommitdiffstats
path: root/staging_vespalib/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'staging_vespalib/src/tests')
-rw-r--r--staging_vespalib/src/tests/metrics/CMakeLists.txt1
-rw-r--r--staging_vespalib/src/tests/metrics/mock_tick.cpp71
-rw-r--r--staging_vespalib/src/tests/metrics/mock_tick.h38
-rw-r--r--staging_vespalib/src/tests/metrics/simple_metrics_test.cpp2
4 files changed, 111 insertions, 1 deletions
diff --git a/staging_vespalib/src/tests/metrics/CMakeLists.txt b/staging_vespalib/src/tests/metrics/CMakeLists.txt
index fc9a496c972..a441631fd15 100644
--- a/staging_vespalib/src/tests/metrics/CMakeLists.txt
+++ b/staging_vespalib/src/tests/metrics/CMakeLists.txt
@@ -2,6 +2,7 @@
vespa_add_executable(staging_vespalib_metrics_test_app TEST
SOURCES
simple_metrics_test.cpp
+ mock_tick.cpp
DEPENDS
staging_vespalib
)
diff --git a/staging_vespalib/src/tests/metrics/mock_tick.cpp b/staging_vespalib/src/tests/metrics/mock_tick.cpp
new file mode 100644
index 00000000000..e78b7c4644f
--- /dev/null
+++ b/staging_vespalib/src/tests/metrics/mock_tick.cpp
@@ -0,0 +1,71 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include "mock_tick.h"
+
+namespace vespalib::metrics {
+
+const std::chrono::seconds oneSec{1};
+
+TimeStamp
+MockTick::next(TimeStamp prev)
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ _prevValue = prev;
+ while (_runFlag) {
+ if (_provided) {
+ _blocked.store(false);
+ _provided.store(false);
+ return _nextValue;
+ }
+ _blocked.store(true);
+ _blockedCond.notify_all();
+ auto r = _providedCond.wait_for(locker, oneSec);
+ (void)r;
+ }
+ return TimeStamp(0);
+}
+
+void
+MockTick::kill()
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ _runFlag.store(false);
+ _blockedCond.notify_all();
+ _providedCond.notify_all();
+}
+
+void
+MockTick::provide(TimeStamp value)
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ _nextValue = value;
+ _blocked.store(false);
+ _provided.store(true);
+ _providedCond.notify_all();
+}
+
+TimeStamp
+MockTick::waitUntilBlocked()
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ while (_runFlag) {
+ if (_blocked) {
+ return _prevValue;
+ }
+ auto r = _blockedCond.wait_for(locker, oneSec);
+ (void)r;
+ }
+ return TimeStamp(0);
+}
+
+MockTick::MockTick()
+ : _lock(),
+ _runFlag(true),
+ _provided(false),
+ _blocked(false),
+ _providedCond(),
+ _blockedCond(),
+ _nextValue(0.0),
+ _prevValue(0.0)
+{}
+
+} // namespace vespalib::metrics
diff --git a/staging_vespalib/src/tests/metrics/mock_tick.h b/staging_vespalib/src/tests/metrics/mock_tick.h
new file mode 100644
index 00000000000..2f69f69fc91
--- /dev/null
+++ b/staging_vespalib/src/tests/metrics/mock_tick.h
@@ -0,0 +1,38 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <atomic>
+#include <condition_variable>
+#include <mutex>
+#include <vespa/vespalib/metrics/clock.h>
+
+namespace vespalib::metrics {
+
+// share the MockTick between the tested and the tester.
+class MockTick : public Tick {
+private:
+ std::mutex _lock;
+ std::atomic<bool> _runFlag;
+ std::atomic<bool> _provided;
+ std::atomic<bool> _blocked;
+ std::condition_variable _providedCond;
+ std::condition_variable _blockedCond;
+ TimeStamp _nextValue;
+ TimeStamp _prevValue;
+public:
+ MockTick();
+ TimeStamp next(TimeStamp prev) override;
+ void kill() override;
+
+ void provide(TimeStamp value);
+ TimeStamp waitUntilBlocked();
+};
+
+struct TickProxy : Tick {
+ std::shared_ptr<Tick> tick;
+ TickProxy(std::shared_ptr<Tick> tick_in) : tick(std::move(tick_in)) {}
+ TimeStamp next(TimeStamp prev) override { return tick->next(prev); }
+ void kill() override { tick->kill(); }
+};
+
+} // namespace vespalib::metrics
diff --git a/staging_vespalib/src/tests/metrics/simple_metrics_test.cpp b/staging_vespalib/src/tests/metrics/simple_metrics_test.cpp
index 6af03177ed8..80030cb89b2 100644
--- a/staging_vespalib/src/tests/metrics/simple_metrics_test.cpp
+++ b/staging_vespalib/src/tests/metrics/simple_metrics_test.cpp
@@ -6,7 +6,7 @@
#include <vespa/vespalib/metrics/simple_metrics_manager.h>
#include <vespa/vespalib/metrics/stable_store.h>
#include <vespa/vespalib/metrics/json_formatter.h>
-#include <vespa/vespalib/metrics/mock_tick.h>
+#include "mock_tick.h"
#include <stdio.h>
#include <unistd.h>