Fix realtime_clock to not be monotonic

The realtime_clock::time_point was actually monotonic_clock::time_point.

While we are here, add an operator << for it now that it is different...

Change-Id: If4860406bb9b3b7fa3a2c4a7d3af514d9d900442
diff --git a/aos/time/time.cc b/aos/time/time.cc
index 2aa743e..a0423ea 100644
--- a/aos/time/time.cc
+++ b/aos/time/time.cc
@@ -9,7 +9,6 @@
 
 #ifdef __linux__
 
-#include "aos/mutex/mutex.h"
 #include "glog/logging.h"
 
 #else  // __linux__
@@ -57,34 +56,52 @@
 
 std::ostream &operator<<(std::ostream &stream,
                          const aos::monotonic_clock::time_point &now) {
-      if (now < monotonic_clock::epoch()) {
-        std::chrono::seconds seconds =
-            std::chrono::duration_cast<std::chrono::seconds>(
+  if (now < monotonic_clock::epoch()) {
+    std::chrono::seconds seconds =
+        std::chrono::duration_cast<std::chrono::seconds>(
+            now.time_since_epoch());
+
+    stream << "-" << -seconds.count() << "." << std::setfill('0')
+           << std::setw(9)
+           << std::chrono::duration_cast<std::chrono::nanoseconds>(
+                  seconds - now.time_since_epoch())
+                  .count()
+           << "sec";
+  } else {
+    std::chrono::seconds seconds =
+        std::chrono::duration_cast<std::chrono::seconds>(
+            now.time_since_epoch());
+    stream << seconds.count() << "." << std::setfill('0') << std::setw(9)
+           << std::chrono::duration_cast<std::chrono::nanoseconds>(
+                  now.time_since_epoch() - seconds)
+                  .count()
+           << "sec";
+  }
+  return stream;
+}
+
+std::ostream &operator<<(std::ostream &stream,
+                         const aos::realtime_clock::time_point &now) {
+  std::tm tm;
+  std::chrono::seconds seconds =
+      now < realtime_clock::epoch()
+          ? std::chrono::duration_cast<std::chrono::seconds>(
+                now.time_since_epoch() - std::chrono::nanoseconds(999999999))
+          : std::chrono::duration_cast<std::chrono::seconds>(
                 now.time_since_epoch());
 
-        stream << "-" << -seconds.count() << "." << std::setfill('0')
-               << std::setw(9)
-               << std::chrono::duration_cast<std::chrono::nanoseconds>(
-                      seconds - now.time_since_epoch())
-                      .count()
-               << "sec";
-      } else {
-        std::chrono::seconds seconds =
-            std::chrono::duration_cast<std::chrono::seconds>(
-                now.time_since_epoch());
-        stream << seconds.count() << "." << std::setfill('0') << std::setw(9)
-               << std::chrono::duration_cast<std::chrono::nanoseconds>(
-                      now.time_since_epoch() - seconds)
-                      .count()
-               << "sec";
-      }
-      return stream;
+  std::time_t seconds_t = seconds.count();
+  stream << std::put_time(localtime_r(&seconds_t, &tm), "%Y-%m-%d_%H-%M-%S.")
+         << std::setfill('0') << std::setw(9)
+         << std::chrono::duration_cast<std::chrono::nanoseconds>(
+                now.time_since_epoch() - seconds)
+                .count();
+  return stream;
 }
 
 namespace time {
 
-struct timespec to_timespec(
-    const ::aos::monotonic_clock::duration duration) {
+struct timespec to_timespec(const ::aos::monotonic_clock::duration duration) {
   struct timespec time_timespec;
   ::std::chrono::seconds sec =
       ::std::chrono::duration_cast<::std::chrono::seconds>(duration);
@@ -95,8 +112,7 @@
   return time_timespec;
 }
 
-struct timespec to_timespec(
-    const ::aos::monotonic_clock::time_point time) {
+struct timespec to_timespec(const ::aos::monotonic_clock::time_point time) {
   return to_timespec(time.time_since_epoch());
 }
 }  // namespace time
diff --git a/aos/time/time.h b/aos/time/time.h
index aecddf0..27e4c70 100644
--- a/aos/time/time.h
+++ b/aos/time/time.h
@@ -45,19 +45,19 @@
   typedef ::std::chrono::nanoseconds::rep rep;
   typedef ::std::chrono::nanoseconds::period period;
   typedef ::std::chrono::nanoseconds duration;
-  typedef ::std::chrono::time_point<monotonic_clock> time_point;
+  typedef ::std::chrono::time_point<realtime_clock> time_point;
 
 #ifdef __linux__
-  static monotonic_clock::time_point now() noexcept;
+  static realtime_clock::time_point now() noexcept;
 #endif  // __linux__
   static constexpr bool is_steady = false;
 
   // Returns the epoch (0).
-  static constexpr monotonic_clock::time_point epoch() {
+  static constexpr realtime_clock::time_point epoch() {
     return time_point(zero());
   }
 
-  static constexpr monotonic_clock::duration zero() { return duration(0); }
+  static constexpr realtime_clock::duration zero() { return duration(0); }
 
   static constexpr time_point min_time{
       time_point(duration(::std::numeric_limits<duration::rep>::min()))};
@@ -67,6 +67,8 @@
 
 std::ostream &operator<<(std::ostream &stream,
                          const aos::monotonic_clock::time_point &now);
+std::ostream &operator<<(std::ostream &stream,
+                         const aos::realtime_clock::time_point &now);
 
 namespace time {
 #ifdef __linux__
diff --git a/aos/time/time_test.cc b/aos/time/time_test.cc
index 80d273e..8edaf9b 100644
--- a/aos/time/time_test.cc
+++ b/aos/time/time_test.cc
@@ -114,6 +114,70 @@
   EXPECT_EQ(s.str(), "-9223372036.854775808sec");
 }
 
+// Test that << works with the epoch on the realtime clock.
+TEST(TimeTest, OperatorStreamRealtimeEpoch) {
+  const realtime_clock::time_point t = realtime_clock::epoch();
+
+  std::stringstream s;
+  s << t;
+
+  EXPECT_EQ(s.str(), "1970-01-01_00-00-00.000000000");
+}
+
+// Test that << works with positive time on the realtime clock.
+TEST(TimeTest, OperatorStreamRealtimePositive) {
+  const realtime_clock::time_point t =
+      realtime_clock::epoch() + std::chrono::hours(5 * 24) +
+      std::chrono::seconds(11) + std::chrono::milliseconds(5);
+
+  std::stringstream s;
+  s << t;
+
+  EXPECT_EQ(s.str(), "1970-01-06_00-00-11.005000000");
+}
+
+// Test that << works with negative time on the realtime clock.
+TEST(TimeTest, OperatorStreamRealtimeNegative) {
+  {
+    const realtime_clock::time_point t =
+        realtime_clock::epoch() - std::chrono::nanoseconds(1);
+
+    std::stringstream s;
+    s << t;
+
+    EXPECT_EQ(s.str(), "1969-12-31_23-59-59.999999999");
+  }
+  {
+    const realtime_clock::time_point t =
+        realtime_clock::epoch() - std::chrono::nanoseconds(999999999);
+
+    std::stringstream s;
+    s << t;
+
+    EXPECT_EQ(s.str(), "1969-12-31_23-59-59.000000001");
+  }
+  {
+    const realtime_clock::time_point t = realtime_clock::epoch() -
+                                         std::chrono::seconds(1) -
+                                         std::chrono::nanoseconds(999999999);
+
+    std::stringstream s;
+    s << t;
+
+    EXPECT_EQ(s.str(), "1969-12-31_23-59-58.000000001");
+  }
+  {
+    const realtime_clock::time_point t =
+        realtime_clock::epoch() - std::chrono::hours(5 * 24) +
+        std::chrono::seconds(11) - std::chrono::milliseconds(5);
+
+    std::stringstream s;
+    s << t;
+
+    EXPECT_EQ(s.str(), "1969-12-27_00-00-10.995000000");
+  }
+}
+
 }  // namespace testing
 }  // namespace time
 }  // namespace aos