// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <fuchsia/logger/c/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/fidl/cpp/message_buffer.h>
#include <lib/fidl/txn_header.h>

#include <utility>

#include <fbl/string.h>
#include <fbl/vector.h>
#include <runtests-utils/log-exporter.h>
#include <zxtest/zxtest.h>

namespace runtests {
namespace {

// This class is the helper class which will encapsulate a LogMessage and then
// fill default values for fidl log message object. It also helps in determining
// the length of fidl message required to encode this msg object.
class LogMessage {
 public:
  LogMessage(fbl::String msg, std::initializer_list<fbl::String> tags, uint32_t dropped_logs = 0,
             uint64_t pid = 1024)
      : msg_(msg), tags_(tags), pid_(pid), dropped_logs_(dropped_logs) {}

  LogMessage(fbl::String msg, uint32_t dropped_logs = 0, uint64_t pid = 1024)
      : LogMessage(msg, {}, dropped_logs, pid) {}

  size_t TagsCount() const { return tags_.size(); }

  const fbl::String* tag(size_t index) const { return &tags_[index]; }

  const fbl::String* msg() const { return &msg_; }

  void SetFidlLogMessageValues(fuchsia_logger_LogMessage* lm) const {
    lm->pid = pid_;
    lm->tid = 1034;
    lm->time = 93892493921;
    lm->severity = fuchsia_logger_LogLevelFilter_INFO;
    lm->dropped_logs = dropped_logs_;
    lm->tags.count = tags_.size();
    lm->tags.data = reinterpret_cast<void*>(FIDL_ALLOC_PRESENT);
    lm->msg.size = msg_.length();
    lm->msg.data = reinterpret_cast<char*>(FIDL_ALLOC_PRESENT);
  }

  size_t GetFidlStringLen() const {
    size_t len = 0;
    for (size_t i = 0; i < tags_.size(); i++) {
      len += FIDL_ALIGN(tags_[i].length());
    }
    return len + FIDL_ALIGN(msg_.length());
  }

 private:
  fbl::String msg_;
  fbl::Vector<fbl::String> tags_;
  uint64_t pid_;
  uint32_t dropped_logs_;
};

// Encode |log_msg| and fills up fidl message object to be sent to
// LogListenerSafe implementation.
size_t FillLogMessagePayload(fuchsia_logger_LogMessage* lm, fidl_string_t* strings,
                             const LogMessage& log_msg) {
  log_msg.SetFidlLogMessageValues(lm);
  uint8_t* payload = reinterpret_cast<uint8_t*>(strings + log_msg.TagsCount());
  size_t offset = 0;

  // write tags
  for (size_t i = 0; i < log_msg.TagsCount(); ++i) {
    size_t size = log_msg.tag(i)->length();
    strings[i].size = size;
    strings[i].data = reinterpret_cast<char*> FIDL_ALLOC_PRESENT;
    memcpy(payload + offset, log_msg.tag(i)->data(), size);
    offset += FIDL_ALIGN(size);
  }

  // write msg
  auto msg = log_msg.msg();
  memcpy(payload + offset, msg->data(), msg->length());
  offset += FIDL_ALIGN(msg->length());
  return log_msg.TagsCount() * sizeof(fidl_string_t) + offset;
}

// Encode |log_msgs| with help from other helpers and writes the msg to
// |listener|.
zx_status_t SendLogMessagesHelper(const zx::channel& listener, uint64_t ordinal,
                                  const fbl::Vector<LogMessage>& log_msgs) {
  size_t n_msgs = log_msgs.size();
  if (n_msgs == 0) {
    return ZX_ERR_INVALID_ARGS;
  }
  size_t tags_n_msgs = 0;
  size_t len = 0;
  for (size_t i = 0; i < n_msgs; i++) {
    tags_n_msgs += log_msgs[i].TagsCount();
    len += log_msgs[i].GetFidlStringLen();
  }

  size_t msg_len = sizeof(fidl_message_header_t) + n_msgs * sizeof(fuchsia_logger_LogMessage) +
                   tags_n_msgs * sizeof(fidl_string_t) + FIDL_ALIGN(len);
  if (ordinal == fuchsia_logger_LogListenerSafeLogManyOrdinal ||
      ordinal == fuchsia_logger_LogListenerSafeLogManyOrdinal) {
    msg_len += sizeof(fidl_vector_t);
  }
  if (msg_len > UINT32_MAX) {
    return ZX_ERR_INVALID_ARGS;
  }
  uint8_t msg[msg_len];
  memset(msg, 0, msg_len);
  fidl_message_header_t* hdr = reinterpret_cast<fidl_message_header_t*>(msg);
  fidl_init_txn_header(hdr, 0, ordinal);
  fuchsia_logger_LogMessage* fidl_log_msg = reinterpret_cast<fuchsia_logger_LogMessage*>(hdr + 1);
  if (ordinal == fuchsia_logger_LogListenerSafeLogManyOrdinal ||
      ordinal == fuchsia_logger_LogListenerSafeLogManyOrdinal) {
    fidl_vector_t* vector = reinterpret_cast<fidl_vector_t*>(hdr + 1);
    vector->count = n_msgs;
    vector->data = reinterpret_cast<void*>(FIDL_ALLOC_PRESENT);
    fidl_log_msg = reinterpret_cast<fuchsia_logger_LogMessage*>(vector + 1);
  }
  fidl_string_t* strings = reinterpret_cast<fidl_string_t*>(fidl_log_msg + n_msgs);

  for (size_t i = 0; i < n_msgs; i++) {
    size_t offset = FillLogMessagePayload(fidl_log_msg, strings, log_msgs[i]);
    if (i < n_msgs - 1) {
      fidl_log_msg++;
      strings = reinterpret_cast<fidl_string_t*>((reinterpret_cast<uint8_t*>(strings)) + offset);
    }
  }
  return listener.write(0, msg, static_cast<uint32_t>(msg_len), nullptr, 0);
}

// Encodes and writes |log_msg| to |listener|. This will replicate behaviour of
// Log call in Log interface.
zx_status_t SendLogMessage(const zx::channel& listener, LogMessage log_msg) {
  fbl::Vector<LogMessage> log_msgs;
  log_msgs.push_back(std::move(log_msg));
  return SendLogMessagesHelper(listener, fuchsia_logger_LogListenerSafeLogOrdinal, log_msgs);
}

// Encodes and writes |log_msgs| to |listener|. This will replicate behaviour of
// LogMany call in Log interface.
zx_status_t SendLogMessages(const zx::channel& listener, const fbl::Vector<LogMessage>& log_msgs) {
  return SendLogMessagesHelper(listener, fuchsia_logger_LogListenerSafeLogManyOrdinal, log_msgs);
}

zx_status_t ReceiveLogMessagesHelper(const zx::channel& listener, uint64_t ordinal) {
  zx_status_t status;
  status = listener.wait_one(ZX_CHANNEL_READABLE, zx::time(0), nullptr);
  if (status != ZX_OK) {
    return status;
  }
  constexpr uint32_t header_size = sizeof(fidl_message_header_t);
  alignas(fidl_message_header_t) uint8_t bytes[header_size];
  fidl_message_header_t* header = reinterpret_cast<fidl_message_header_t*>(bytes);
  uint32_t bytes_read = 0u;
  status = listener.read(0, bytes, nullptr, header_size, 0, &bytes_read, nullptr);
  if (status != ZX_OK) {
    return status;
  }
  if (header->ordinal != ordinal) {
    return ZX_ERR_WRONG_TYPE;
  }
  return ZX_OK;
}

zx_status_t ReceiveLogMessage(const zx::channel& listener) {
  return ReceiveLogMessagesHelper(listener, fuchsia_logger_LogListenerSafeLogOrdinal);
}

zx_status_t ReceiveLogMessages(const zx::channel& listener) {
  return ReceiveLogMessagesHelper(listener, fuchsia_logger_LogListenerSafeLogManyOrdinal);
}

TEST(LogListenerTests, TestLog) {
  zx::channel listener, listener_request;
  ASSERT_EQ(ZX_OK, zx::channel::create(0, &listener, &listener_request));

  // We expect the log file to be much smaller than this.
  char buf[1024];
  memset(buf, 0, sizeof(buf));
  FILE* buf_file = fmemopen(buf, sizeof(buf), "w");

  // start listener
  auto log_listener = std::make_unique<LogExporter>(std::move(listener_request), buf_file);
  log_listener->set_error_handler([](zx_status_t status) { EXPECT_EQ(ZX_ERR_CANCELED, status); });

  LogMessage msg1("my message");
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg1)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));
  LogMessage msg2("my message", {"tag123"});
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg2)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));

  fflush(buf_file);
  ASSERT_STR_EQ(R"([00093.892493][1024][1034][] INFO: my message
[00093.892493][1024][1034][tag123] INFO: my message
)",
                buf);

  LogMessage msg3("my message", {"tag123", "tag2"});
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg3)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));

  fflush(buf_file);
  ASSERT_STR_EQ(R"([00093.892493][1024][1034][] INFO: my message
[00093.892493][1024][1034][tag123] INFO: my message
[00093.892493][1024][1034][tag123, tag2] INFO: my message
)",
                buf);
}

TEST(LogListenerTests, TestLogMany) {
  zx::channel listener, listener_request;
  ASSERT_EQ(ZX_OK, zx::channel::create(0, &listener, &listener_request));

  // We expect the log file to be much smaller than this.
  char buf[1024];
  memset(buf, 0, sizeof(buf));
  FILE* buf_file = fmemopen(buf, sizeof(buf), "w");

  // start listener
  auto log_listener = std::make_unique<LogExporter>(std::move(listener_request), buf_file);
  log_listener->set_error_handler([](zx_status_t status) { EXPECT_EQ(ZX_ERR_CANCELED, status); });

  LogMessage msg1("my message");
  LogMessage msg2("my message2", {"tag1", "tag2"});
  fbl::Vector<LogMessage> msgs;
  msgs.push_back(std::move(msg1));
  msgs.push_back(std::move(msg2));
  ASSERT_EQ(ZX_OK, SendLogMessages(listener, msgs));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessages(listener));
  fflush(buf_file);

  ASSERT_STR_EQ(R"([00093.892493][1024][1034][] INFO: my message
[00093.892493][1024][1034][tag1, tag2] INFO: my message2
)",
                buf);
  LogMessage msg3("my message", {"tag1"});
  msgs.reset();
  msgs.push_back(std::move(msg3));
  ASSERT_EQ(ZX_OK, SendLogMessages(listener, msgs));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessages(listener));

  fflush(buf_file);
  ASSERT_STR_EQ(R"([00093.892493][1024][1034][] INFO: my message
[00093.892493][1024][1034][tag1, tag2] INFO: my message2
[00093.892493][1024][1034][tag1] INFO: my message
)",
                buf);
}

TEST(LogListenerTests, TestDroppedLogs) {
  zx::channel listener, listener_request;
  ASSERT_EQ(ZX_OK, zx::channel::create(0, &listener, &listener_request));

  // We expect the log file to be much smaller than this.
  char buf[1024];
  memset(buf, 0, sizeof(buf));
  FILE* buf_file = fmemopen(buf, sizeof(buf), "w");

  // start listener
  auto log_listener = std::make_unique<LogExporter>(std::move(listener_request), buf_file);
  log_listener->set_error_handler([](zx_status_t status) { EXPECT_EQ(ZX_ERR_CANCELED, status); });

  LogMessage msg1("my message1", 1);
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg1)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));
  LogMessage msg2("my message2", 1);
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg2)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));
  LogMessage msg3("my message3", 1, 1011);
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg3)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));
  LogMessage msg4("my message4", 1, 1011);
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg4)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));
  LogMessage msg5("my message5", 2, 1011);
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg5)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));
  LogMessage msg6("my message6", 2);
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg6)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());
  ASSERT_EQ(ZX_OK, ReceiveLogMessage(listener));

  fflush(buf_file);
  ASSERT_STR_EQ(R"([00093.892493][1024][1034][] INFO: my message1
[00093.892493][1024][1034][] WARNING: Dropped logs count:1
[00093.892493][1024][1034][] INFO: my message2
[00093.892493][1011][1034][] INFO: my message3
[00093.892493][1011][1034][] WARNING: Dropped logs count:1
[00093.892493][1011][1034][] INFO: my message4
[00093.892493][1011][1034][] INFO: my message5
[00093.892493][1011][1034][] WARNING: Dropped logs count:2
[00093.892493][1024][1034][] INFO: my message6
[00093.892493][1024][1034][] WARNING: Dropped logs count:2
)",
                buf);
}

TEST(LogListenerTests, TestBadOutputFile) {
  zx::channel listener, listener_request;
  ASSERT_EQ(ZX_OK, zx::channel::create(0, &listener, &listener_request));

  char buf[1024];
  memset(buf, 0, sizeof(buf));
  FILE* buf_file = fmemopen(buf, sizeof(buf), "r");

  // start listener
  auto log_listener = std::make_unique<LogExporter>(std::move(listener_request), buf_file);
  log_listener->set_error_handler(
      [](zx_status_t status) { EXPECT_EQ(ZX_ERR_ACCESS_DENIED, status); });

  LogMessage msg1("my message");
  ASSERT_EQ(ZX_OK, SendLogMessage(listener, std::move(msg1)));
  ASSERT_EQ(ZX_OK, log_listener->RunUntilIdle());

  ASSERT_STR_EQ("", buf);
}

}  // namespace
}  // namespace runtests
