// 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
