diff --git a/aos/common/time_test.cc b/aos/common/time_test.cc
new file mode 100644
index 0000000..6587759
--- /dev/null
+++ b/aos/common/time_test.cc
@@ -0,0 +1,132 @@
+#include "aos/common/time.h"
+
+#include "gtest/gtest.h"
+
+#include "aos/common/macros.h"
+
+namespace aos {
+namespace time {
+namespace testing {
+
+TEST(TimeTest, timespecConversions) {
+  timespec start{1234, 5678};  // NOLINT
+  Time time(start);
+  EXPECT_EQ(start.tv_sec, static_cast<signed time_t>(time.sec()));
+  EXPECT_EQ(start.tv_nsec, time.nsec());
+  timespec end = time.ToTimespec();
+  EXPECT_EQ(start.tv_sec, end.tv_sec);
+  EXPECT_EQ(start.tv_nsec, end.tv_nsec);
+}
+
+// It's kind of hard not to test Now and SleepFor at the same time.
+TEST(TimeTest, NowAndSleepFor) {
+  // without this, it tends to fail the first time (ends up sleeping for way
+  // longer than it should the second time, where it actually matters)
+  SleepFor(Time(0, Time::kNSecInSec / 10));
+  Time start = Time::Now();
+  SleepFor(Time(0, Time::kNSecInSec * 2 / 10));
+  EXPECT_TRUE(MACRO_DARG((Time::Now() - start)
+                         .IsWithin(Time(0, Time::kNSecInSec * 2 / 10),
+                                   Time::kNSecInSec / 1000)));
+}
+
+TEST(TimeTest, AbsoluteSleep) {
+  Time start = Time::Now();
+  SleepFor(Time(0, Time::kNSecInSec / 10));
+  SleepUntil((start + Time(0, Time::kNSecInSec * 2 / 10)));
+  EXPECT_TRUE(MACRO_DARG((Time::Now() - start)
+                         .IsWithin(Time(0, Time::kNSecInSec * 2 / 10),
+                                   Time::kNSecInSec / 1000)));
+}
+
+TEST(TimeTest, Addition) {
+  Time t(54, 500);
+  EXPECT_EQ(MACRO_DARG(Time(54, 5500)), t + MACRO_DARG(Time(0, 5000)));
+  EXPECT_EQ(MACRO_DARG(Time(56, 500)), t + MACRO_DARG(Time(2, 0)));
+  EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
+  EXPECT_EQ(MACRO_DARG(Time(50, 300)),
+            t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
+}
+TEST(TimeTest, Subtraction) {
+  Time t(54, 500);
+  EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
+  EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
+  EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
+  EXPECT_EQ(MACRO_DARG(Time(53, 600)),
+            t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
+  EXPECT_EQ(MACRO_DARG(Time(55, 800)),
+            t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
+}
+
+TEST(TimeTest, Multiplication) {
+  Time t(54, Time::kNSecInSec / 3);
+  EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
+  EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
+}
+TEST(TimeTest, Division) {
+  EXPECT_EQ(MACRO_DARG(Time(5, Time::kNSecInSec / 10 * 4 + 50)),
+            MACRO_DARG(Time(54, 500)) / 10);
+}
+
+TEST(TimeTest, Comparisons) {
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) > Time(971, 253)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(971, 255)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 255)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 254)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 254)));
+  EXPECT_TRUE(MACRO_DARG(Time(972, 254) > Time(971, 254)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(972, 254)));
+}
+
+TEST(TimeTest, Within) {
+  EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
+  EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
+  EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
+                                             250)));
+}
+
+TEST(TimeTest, Modulo) {
+  EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
+            MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
+}
+
+TEST(TimeTest, InSeconds) {
+  EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
+            Time::InSeconds(2.55));
+}
+
+#ifdef __VXWORKS__
+TEST(TimeTest, ToTicks) {
+  EXPECT_EQ(sysClkRateGet() / 100,
+            MACRO_DARG(Time(0, Time::kNSecInSec / 100).ToTicks()));
+}
+#endif
+
+TEST(TimeTest, InMS) {
+  Time t = Time::InMS(254971);
+  EXPECT_EQ(254, t.sec());
+  EXPECT_EQ(971000000, t.nsec());
+}
+
+TEST(TimeTest, InNS) {
+  Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
+  EXPECT_EQ(973, t.sec());
+  EXPECT_EQ(254111971, t.nsec());
+}
+
+TEST(TimeTest, InUS) {
+  Time t = Time::InUS(254111971);
+  EXPECT_EQ(254, t.sec());
+  EXPECT_EQ(111971000, t.nsec());
+}
+
+TEST(TimeTest, ToMSec) {
+  Time t(254, 971000000);
+  EXPECT_EQ(254971, t.ToMSec());
+}
+
+}  // namespace testing
+}  // namespace time
+}  // namespace aos
