summaryrefslogtreecommitdiff
path: root/test/util/timer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/util/timer.cpp')
-rw-r--r--test/util/timer.cpp173
1 files changed, 173 insertions, 0 deletions
diff --git a/test/util/timer.cpp b/test/util/timer.cpp
new file mode 100644
index 0000000000..1ac72d8068
--- /dev/null
+++ b/test/util/timer.cpp
@@ -0,0 +1,173 @@
+#include <mbgl/util/chrono.hpp>
+#include <mbgl/util/timer.hpp>
+#include <mbgl/util/run_loop.hpp>
+#include <mbgl/util/chrono.hpp>
+
+#include <memory>
+
+#include "../fixtures/util.hpp"
+
+using namespace mbgl::util;
+
+TEST(Timer, Basic) {
+ RunLoop loop;
+
+ Timer timer;
+
+ auto callback = [&loop] { loop.stop(); };
+
+ auto interval = mbgl::Milliseconds(300);
+ auto expectedTotalTime = interval;
+
+ auto first = mbgl::Clock::now();
+ timer.start(interval, mbgl::Duration::zero(), callback);
+
+ loop.run();
+
+ auto totalTime = std::chrono::duration_cast<mbgl::Milliseconds>(mbgl::Clock::now() - first);
+
+ // These are not high precision timers. Especially libuv uses
+ // cached time from the beginning of of the main loop iteration
+ // and it is very prone to fire earlier, which is, odd.
+ EXPECT_GE(totalTime, expectedTotalTime * 0.8);
+ EXPECT_LE(totalTime, expectedTotalTime * 1.2);
+}
+
+TEST(Timer, Repeat) {
+ RunLoop loop;
+
+ Timer timer;
+
+ unsigned count = 10;
+ auto callback = [&] {
+ if (!--count) {
+ loop.stop();
+ }
+ };
+
+ auto interval = mbgl::Milliseconds(50);
+ auto expectedTotalTime = interval * count;
+
+ auto first = mbgl::Clock::now();
+ timer.start(interval, interval, callback);
+
+ loop.run();
+
+ auto totalTime = std::chrono::duration_cast<mbgl::Milliseconds>(mbgl::Clock::now() - first);
+
+ EXPECT_GE(totalTime, expectedTotalTime * 0.8);
+ EXPECT_LE(totalTime, expectedTotalTime * 1.2);
+}
+
+TEST(Timer, Stop) {
+ RunLoop loop;
+
+ Timer timer1;
+ Timer timer2;
+
+ auto interval1 = mbgl::Milliseconds(50);
+ auto interval2 = mbgl::Milliseconds(250);
+ auto expectedTotalTime = interval2;
+
+ int count = 0;
+
+ auto callback1 = [&] {
+ ++count;
+ timer1.stop();
+ };
+
+ auto callback2 = [&] {
+ ++count;
+ loop.stop();
+ };
+
+ auto first = mbgl::Clock::now();
+ timer1.start(interval1, interval1, callback1);
+ timer2.start(interval2, mbgl::Duration::zero(), callback2);
+
+ loop.run();
+
+ auto totalTime = std::chrono::duration_cast<mbgl::Milliseconds>(mbgl::Clock::now() - first);
+
+ EXPECT_EQ(count, 2);
+
+ EXPECT_GE(totalTime, expectedTotalTime * 0.8);
+ EXPECT_LE(totalTime, expectedTotalTime * 1.2);
+}
+
+TEST(Timer, DestroyShouldStop) {
+ RunLoop loop;
+
+ auto timer1 = std::make_unique<Timer>();
+ Timer timer2;
+
+ auto interval1 = mbgl::Milliseconds(50);
+ auto interval2 = mbgl::Milliseconds(250);
+ auto expectedTotalTime = interval2;
+
+ int count = 0;
+
+ auto callback1 = [&] {
+ ++count;
+ timer1.reset();
+ };
+
+ auto callback2 = [&] {
+ ++count;
+ loop.stop();
+ };
+
+ auto first = mbgl::Clock::now();
+ timer1->start(interval1, interval1, callback1);
+ timer2.start(interval2, mbgl::Duration::zero(), callback2);
+
+ loop.run();
+
+ auto totalTime = std::chrono::duration_cast<mbgl::Milliseconds>(mbgl::Clock::now() - first);
+
+ EXPECT_EQ(count, 2);
+
+ EXPECT_GE(totalTime, expectedTotalTime * 0.8);
+ EXPECT_LE(totalTime, expectedTotalTime * 1.2);
+}
+
+TEST(Timer, StartOverrides) {
+ RunLoop loop;
+
+ Timer timer;
+
+ auto interval1 = mbgl::Milliseconds(50);
+ auto interval2 = mbgl::Milliseconds(250);
+ auto expectedTotalTime = interval1 + interval2;
+
+ int count = 0;
+
+ auto callback2 = [&] {
+ ++count;
+ loop.stop();
+ };
+
+ auto callback1 = [&] {
+ ++count;
+ timer.start(interval2, mbgl::Duration::zero(), callback2);
+ };
+
+ auto first = mbgl::Clock::now();
+ timer.start(interval1, mbgl::Duration::zero(), callback1);
+
+ loop.run();
+
+ auto totalTime = std::chrono::duration_cast<mbgl::Milliseconds>(mbgl::Clock::now() - first);
+
+ EXPECT_EQ(count, 2);
+
+ EXPECT_GE(totalTime, expectedTotalTime * 0.8);
+ EXPECT_LE(totalTime, expectedTotalTime * 1.2);
+}
+
+TEST(Timer, CanStopNonStartedTimer) {
+ RunLoop loop;
+
+ Timer timer;
+ timer.stop();
+}