aboutsummaryrefslogtreecommitdiffstats
path: root/source/serial/tests/unit/unix_timer_tests.cc
diff options
context:
space:
mode:
Diffstat (limited to 'source/serial/tests/unit/unix_timer_tests.cc')
-rw-r--r--source/serial/tests/unit/unix_timer_tests.cc63
1 files changed, 63 insertions, 0 deletions
diff --git a/source/serial/tests/unit/unix_timer_tests.cc b/source/serial/tests/unit/unix_timer_tests.cc
new file mode 100644
index 0000000..5bbd1ed
--- /dev/null
+++ b/source/serial/tests/unit/unix_timer_tests.cc
@@ -0,0 +1,63 @@
+#include "gtest/gtest.h"
+#include "serial/impl/unix.h"
+
+#include <unistd.h>
+#include <stdlib.h>
+
+using serial::MillisecondTimer;
+
+namespace {
+
+/**
+ * Do 100 trials of timing gaps between 0 and 19 milliseconds.
+ * Expect accuracy within one millisecond.
+ */
+TEST(timer_tests, short_intervals) {
+ for (int trial = 0; trial < 100; trial++)
+ {
+ uint32_t ms = rand() % 20;
+ MillisecondTimer mt(ms);
+ usleep(1000 * ms);
+ int32_t r = mt.remaining();
+
+ // 1ms slush, for the cost of calling usleep.
+ EXPECT_NEAR(r+1, 0, 1);
+ }
+}
+
+TEST(timer_tests, overlapping_long_intervals) {
+ MillisecondTimer* timers[10];
+
+ // Experimentally determined. Corresponds to the extra time taken by the loops,
+ // the big usleep, and the test infrastructure itself.
+ const int slush_factor = 14;
+
+ // Set up the timers to each time one second, 1ms apart.
+ for (int t = 0; t < 10; t++)
+ {
+ timers[t] = new MillisecondTimer(1000);
+ usleep(1000);
+ }
+
+ // Check in on them after 500ms.
+ usleep(500000);
+ for (int t = 0; t < 10; t++)
+ {
+ EXPECT_NEAR(timers[t]->remaining(), 500 - slush_factor + t, 5);
+ }
+
+ // Check in on them again after another 500ms and free them.
+ usleep(500000);
+ for (int t = 0; t < 10; t++)
+ {
+ EXPECT_NEAR(timers[t]->remaining(), -slush_factor + t, 5);
+ delete timers[t];
+ }
+}
+
+} // namespace
+
+int main(int argc, char **argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}