// 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 "gtest/gtest.h"
#include "src/developer/debug/ipc/message_reader.h"
#include "src/developer/debug/ipc/message_writer.h"

namespace debug_ipc {

TEST(Message, ReadWriteBytes) {
  constexpr uint32_t byte_count = 12;
  char bytes[byte_count] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

  MessageWriter writer;
  writer.WriteBytes(bytes, byte_count);
  writer.WriteBytes(bytes, byte_count);

  std::vector<char> output = writer.MessageComplete();
  EXPECT_EQ(byte_count * 2, output.size());

  // First 4 bytes should encode the size (little-endian).
  EXPECT_EQ(byte_count * 2, static_cast<uint32_t>(output[0]));
  EXPECT_EQ(0, output[1]);
  EXPECT_EQ(0, output[2]);
  EXPECT_EQ(0, output[3]);

  // Remaining bytes should be identical to their indices mod the array size
  // (since it was
  // written twice).
  for (size_t i = 4; i < output.size(); i++) {
    EXPECT_EQ(i % byte_count, static_cast<uint32_t>(output[i]));
  }

  MessageReader reader(std::move(output));
  uint32_t read_size = 0;
  ASSERT_TRUE(reader.ReadUint32(&read_size));
  EXPECT_EQ(byte_count * 2, read_size);

  char read_first[byte_count - 4];
  ASSERT_TRUE(reader.ReadBytes(byte_count - 4, read_first));
  EXPECT_EQ(4, read_first[0]);
  EXPECT_EQ(5, read_first[1]);
  EXPECT_EQ(6, read_first[2]);
  EXPECT_EQ(7, read_first[3]);

  char read_second[byte_count];
  ASSERT_TRUE(reader.ReadBytes(byte_count, read_second));
  for (uint32_t i = 0; i < byte_count; i++) {
    EXPECT_EQ(i, static_cast<uint32_t>(read_second[i]));
  }

  // Reading one more byte should fail.
  EXPECT_FALSE(reader.has_error());
  char one_more;
  EXPECT_FALSE(reader.ReadBytes(1, &one_more));
  EXPECT_TRUE(reader.has_error());
}

TEST(Message, ReadWriteNumbers) {
  MessageWriter writer;
  writer.WriteUint32(0);  // Message size header.

  int64_t expected_int64 = -7;
  uint64_t expected_uint64 = static_cast<uint64_t>(-8);

  writer.WriteInt64(expected_int64);
  writer.WriteUint64(expected_uint64);

  std::vector<char> message = writer.MessageComplete();
  constexpr uint32_t expected_message_size = 20;
  ASSERT_EQ(expected_message_size, message.size());

  MessageReader reader(std::move(message));

  // Message size header.
  uint32_t read_message_size = 0;
  ASSERT_TRUE(reader.ReadUint32(&read_message_size));
  EXPECT_EQ(expected_message_size, read_message_size);

  int64_t read_int64 = 0;
  ASSERT_TRUE(reader.ReadInt64(&read_int64));
  EXPECT_EQ(expected_int64, read_int64);

  uint64_t read_uint64 = 0;
  ASSERT_TRUE(reader.ReadUint64(&read_uint64));
  EXPECT_EQ(expected_uint64, read_uint64);

  // Reading one more byte should fail.
  EXPECT_FALSE(reader.has_error());
  int64_t one_more;
  EXPECT_FALSE(reader.ReadInt64(&one_more));
  EXPECT_TRUE(reader.has_error());
}

}  // namespace debug_ipc
