Store UUIDs as 16 bytes of data

This makes them much more efficient to write over shared memory to solve
the boot UUID logging problem when we add them.

Change-Id: Idf361d6b096bfa52cbc98f555c90bf1f6b90d3e0
diff --git a/aos/events/logging/uuid_test.cc b/aos/events/logging/uuid_test.cc
index 4ea351c..5ec8f83 100644
--- a/aos/events/logging/uuid_test.cc
+++ b/aos/events/logging/uuid_test.cc
@@ -9,12 +9,44 @@
 // Tests that random UUIDs are actually random, and we can convert them to a
 // string.  Not very exhaustive, but it is a good smoke test.
 TEST(UUIDTest, GetOne) {
-  LOG(INFO) << UUID::Random().string_view();
+  LOG(INFO) << UUID::Random();
+
+  UUID r = UUID::Random();
+
+  std::stringstream ss;
+  ss << r;
+
+  UUID r2 = UUID::FromString(ss.str());
+  EXPECT_EQ(r2, r);
 
   EXPECT_NE(UUID::Random(), UUID::Random());
   EXPECT_NE(UUID::Random(), UUID::Zero());
   EXPECT_EQ(UUID::Zero(), UUID::Zero());
 }
 
+// Tests that converting to and from various formats produces the same UUID.
+TEST(UUIDTest, FromString) {
+  std::string_view str = "4b88ab00-556a-455b-a395-17d1a0c6f906";
+  std::array<uint8_t, UUID::kDataSize> data = {
+      0x4b, 0x88, 0xab, 0x00, 0x55, 0x6a, 0x45, 0x5b,
+      0xa3, 0x95, 0x17, 0xd1, 0xa0, 0xc6, 0xf9, 0x06};
+
+  const UUID u = UUID::FromString(str);
+
+  EXPECT_EQ(u.span(), absl::Span<uint8_t>(data.data(), data.size()));
+  EXPECT_EQ(u.ToString(), str);
+
+  flatbuffers::FlatBufferBuilder fbb;
+  flatbuffers::Offset<flatbuffers::Vector<uint8_t>> data_offset =
+      fbb.CreateVector(data.data(), data.size());
+
+  const flatbuffers::Vector<uint8_t> *data_vector =
+      flatbuffers::GetTemporaryPointer(fbb, data_offset);
+
+  const UUID u2 = UUID::FromVector(data_vector);
+
+  EXPECT_EQ(u, u2);
+}
+
 }  // namespace testing
 }  // namespace aos