diff options
Diffstat (limited to 'staging_vespalib/src/tests')
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> |