diff --git a/test/common/BUILD b/test/common/BUILD new file mode 100644 index 000000000..ab77a73a1 --- /dev/null +++ b/test/common/BUILD @@ -0,0 +1,30 @@ +load( + "@envoy//bazel:envoy_build_system.bzl", + "envoy_cc_test", + "envoy_cc_test_library", + "envoy_package", +) + +licenses(["notice"]) # Apache 2 + +envoy_package() + +envoy_cc_test_library( + name = "fake_time_source", + srcs = ["fake_time_source.cc"], + hdrs = ["fake_time_source.h"], + repository = "@envoy", + deps = [ + "//source/client:nighthawk_client_lib", + "@com_google_absl//absl/time", + ], +) + +envoy_cc_test( + name = "fake_time_source_test", + srcs = ["fake_time_source_test.cc"], + repository = "@envoy", + deps = [ + ":fake_time_source", + ], +) diff --git a/test/common/fake_time_source.cc b/test/common/fake_time_source.cc new file mode 100644 index 000000000..82a5ae4a6 --- /dev/null +++ b/test/common/fake_time_source.cc @@ -0,0 +1,17 @@ +#include "test/common/fake_time_source.h" + +namespace Nighthawk { + +Envoy::SystemTime FakeIncrementingMonotonicTimeSource::systemTime() { + Envoy::SystemTime epoch; + return epoch; +} + +Envoy::MonotonicTime FakeIncrementingMonotonicTimeSource::monotonicTime() { + Envoy::MonotonicTime epoch; + Envoy::MonotonicTime result = epoch + std::chrono::seconds(seconds_since_epoch_); + ++seconds_since_epoch_; + return result; +} + +} // namespace Nighthawk diff --git a/test/common/fake_time_source.h b/test/common/fake_time_source.h new file mode 100644 index 000000000..fa3f6ae40 --- /dev/null +++ b/test/common/fake_time_source.h @@ -0,0 +1,29 @@ +#pragma once + +#include "envoy/common/time.h" + +namespace Nighthawk { +/** + * Fake time source that ticks 1 second on every query, starting from the Unix epoch. Supports only + * monotonicTime(). + */ +class FakeIncrementingMonotonicTimeSource : public Envoy::TimeSource { +public: + /** + * Not supported. + * + * @return Envoy::SystemTime Fixed value of the Unix epoch. + */ + Envoy::SystemTime systemTime() override; + /** + * Ticks forward 1 second on each call. + * + * @return Envoy::MonotonicTime Fake time value. + */ + Envoy::MonotonicTime monotonicTime() override; + +private: + int seconds_since_epoch_{0}; +}; + +} // namespace Nighthawk diff --git a/test/common/fake_time_source_test.cc b/test/common/fake_time_source_test.cc new file mode 100644 index 000000000..5a8b7dad9 --- /dev/null +++ b/test/common/fake_time_source_test.cc @@ -0,0 +1,32 @@ +#include "test/common/fake_time_source.h" + +#include "gtest/gtest.h" + +namespace Nighthawk { +namespace { + +TEST(FakeIncrementingMonotonicTimeSource, SystemTimeAlwaysReturnsEpoch) { + FakeIncrementingMonotonicTimeSource time_source; + Envoy::SystemTime epoch; + EXPECT_EQ(time_source.systemTime(), epoch); + EXPECT_EQ(time_source.systemTime(), epoch); +} + +TEST(FakeIncrementingMonotonicTimeSource, MonotonicTimeStartsFromEpoch) { + FakeIncrementingMonotonicTimeSource time_source; + Envoy::MonotonicTime epoch; + Envoy::MonotonicTime time = time_source.monotonicTime(); + EXPECT_EQ(std::chrono::duration_cast(time - epoch).count(), 0); +} + +TEST(FakeIncrementingMonotonicTimeSource, MonotonicTimeIncrementsOneSecondPerCall) { + FakeIncrementingMonotonicTimeSource time_source; + Envoy::MonotonicTime time1 = time_source.monotonicTime(); + Envoy::MonotonicTime time2 = time_source.monotonicTime(); + Envoy::MonotonicTime time3 = time_source.monotonicTime(); + EXPECT_EQ(std::chrono::duration_cast(time2 - time1).count(), 1); + EXPECT_EQ(std::chrono::duration_cast(time3 - time2).count(), 1); +} + +} // namespace +} // namespace Nighthawk