Add ability to write log to abstract log sink

It completely decouples log writing and file system.

Change-Id: Iae3b881826e04500f4862a16c237e0f7c37c9536
Signed-off-by: Austin Schuh <austin.schuh@bluerivertech.com>
Signed-off-by: Alexei Strots <alexei.strots@bluerivertech.com>
diff --git a/aos/events/logging/log_backend_test.cc b/aos/events/logging/log_backend_test.cc
index b969218..928bb24 100644
--- a/aos/events/logging/log_backend_test.cc
+++ b/aos/events/logging/log_backend_test.cc
@@ -14,13 +14,24 @@
 #include "gtest/gtest.h"
 
 namespace aos::logger::testing {
+namespace {
+// Helper to write simple string to the log sink
+WriteResult Write(LogSink *log_sink, std::string_view content) {
+  auto span = absl::Span<const uint8_t>(
+      reinterpret_cast<const unsigned char *>(content.data()), content.size());
+  auto queue = absl::Span<const absl::Span<const uint8_t>>(&span, 1);
+  return log_sink->Write(queue);
+}
+}  // namespace
+
 TEST(LogBackendTest, CreateSimpleFile) {
   const std::string logevent = aos::testing::TestTmpDir() + "/logevent/";
   FileBackend backend(logevent);
   auto file = backend.RequestFile("test.log");
   ASSERT_EQ(file->OpenForWrite(), WriteCode::kOk);
-  auto result = write(file->fd(), "test", 4);
-  EXPECT_GT(result, 0);
+  auto result = Write(file.get(), "test");
+  EXPECT_EQ(result.code, WriteCode::kOk);
+  EXPECT_EQ(result.messages_written, 1);
   EXPECT_EQ(file->Close(), WriteCode::kOk);
   EXPECT_TRUE(std::filesystem::exists(logevent + "test.log"));
 }
@@ -30,8 +41,9 @@
   RenamableFileBackend backend(logevent);
   auto file = backend.RequestFile("test.log");
   ASSERT_EQ(file->OpenForWrite(), WriteCode::kOk);
-  auto result = write(file->fd(), "testtest", 8);
-  EXPECT_GT(result, 0);
+  auto result = Write(file.get(), "test");
+  EXPECT_EQ(result.code, WriteCode::kOk);
+  EXPECT_EQ(result.messages_written, 1);
   EXPECT_EQ(file->Close(), WriteCode::kOk);
   EXPECT_TRUE(std::filesystem::exists(logevent + "test.log"));
 }
@@ -42,8 +54,9 @@
   backend.EnableTempFiles();
   auto file = backend.RequestFile("test.log");
   ASSERT_EQ(file->OpenForWrite(), WriteCode::kOk);
-  auto result = write(file->fd(), "testtest", 8);
-  EXPECT_GT(result, 0);
+  auto result = Write(file.get(), "test");
+  EXPECT_EQ(result.code, WriteCode::kOk);
+  EXPECT_EQ(result.messages_written, 1);
   EXPECT_TRUE(std::filesystem::exists(logevent + "test.log.tmp"));
 
   EXPECT_EQ(file->Close(), WriteCode::kOk);
@@ -56,8 +69,9 @@
   RenamableFileBackend backend(logevent);
   auto file = backend.RequestFile("test.log");
   ASSERT_EQ(file->OpenForWrite(), WriteCode::kOk);
-  auto result = write(file->fd(), "testtest", 8);
-  EXPECT_GT(result, 0);
+  auto result = Write(file.get(), "test");
+  EXPECT_EQ(result.code, WriteCode::kOk);
+  EXPECT_EQ(result.messages_written, 1);
   EXPECT_TRUE(std::filesystem::exists(logevent + "test.log"));
 
   std::string renamed = aos::testing::TestTmpDir() + "/renamed/";
@@ -77,8 +91,9 @@
   backend.EnableTempFiles();
   auto file = backend.RequestFile("test.log");
   ASSERT_EQ(file->OpenForWrite(), WriteCode::kOk);
-  auto result = write(file->fd(), "testtest", 8);
-  EXPECT_GT(result, 0);
+  auto result = Write(file.get(), "test");
+  EXPECT_EQ(result.code, WriteCode::kOk);
+  EXPECT_EQ(result.messages_written, 1);
   EXPECT_TRUE(std::filesystem::exists(logevent + "test.log.tmp"));
 
   std::string renamed = aos::testing::TestTmpDir() + "/renamed/";
@@ -364,7 +379,8 @@
   auto result = handler->Write(queue);
   EXPECT_EQ(result.code, WriteCode::kOk);
   EXPECT_EQ(result.messages_written, queue.size());
-  EXPECT_GT(handler->written_aligned(), 0);
+  FileHandler *file_handler = reinterpret_cast<FileHandler *>(handler.get());
+  EXPECT_GT(file_handler->written_aligned(), 0);
 
   ASSERT_EQ(handler->Close(), WriteCode::kOk);
   EXPECT_TRUE(std::filesystem::exists(file));