// Copyright 2017 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 <stddef.h>
#include <stdint.h>
#include <zircon/types.h>

#include <crypto/bytes.h>
#include <zxtest/zxtest.h>

#include "utils.h"

namespace crypto {
namespace testing {
namespace {

const size_t kSize = 1024;

// This test only checks that the routine basically functions; it does NOT assure anything about the
// quality of the entropy.  That topic is beyond the scope of a deterministic unit test.
TEST(Bytes, Randomize) {
  Bytes bytes;

  ASSERT_OK(bytes.Resize(kSize));
  ASSERT_TRUE(AllEqual(bytes, 0, 0, kSize));

  EXPECT_OK(bytes.Randomize(kSize));
  EXPECT_FALSE(AllEqual(bytes, 0, 0, kSize));
}

TEST(Bytes, Resize) {
  Bytes bytes;
  EXPECT_OK(bytes.Resize(kSize, 0xff));
  EXPECT_EQ(bytes.len(), kSize);
  EXPECT_NOT_NULL(bytes.get());

#if !__has_feature(address_sanitizer)
  // The ASan allocator reports errors for unreasonable allocation sizes.
  EXPECT_STATUS(bytes.Resize(size_t(-1)), ZX_ERR_NO_MEMORY);
  EXPECT_EQ(bytes.len(), kSize);
  EXPECT_NOT_NULL(bytes.get());
  EXPECT_TRUE(AllEqual(bytes, 0xff, 0, kSize));
#endif

  EXPECT_OK(bytes.Resize(kSize));
  EXPECT_EQ(bytes.len(), kSize);
  EXPECT_NOT_NULL(bytes.get());
  EXPECT_TRUE(AllEqual(bytes, 0xff, 0, kSize));

  EXPECT_OK(bytes.Resize(kSize / 2));
  EXPECT_EQ(bytes.len(), kSize / 2);
  EXPECT_NOT_NULL(bytes.get());
  EXPECT_TRUE(AllEqual(bytes, 0xff, 0, kSize / 2));

  EXPECT_OK(bytes.Resize(kSize));
  EXPECT_EQ(bytes.len(), kSize);
  EXPECT_NOT_NULL(bytes.get());
  EXPECT_TRUE(AllEqual(bytes, 0xff, 0, kSize / 2));
  EXPECT_TRUE(AllEqual(bytes, 0, kSize / 2, kSize / 2));

  EXPECT_OK(bytes.Resize(0));
  EXPECT_EQ(bytes.len(), 0U);
  EXPECT_NULL(bytes.get());
}

TEST(Bytes, Copy) {
  Bytes bytes, copy;
  ASSERT_OK(bytes.Resize(kSize));

  uint8_t buf[kSize];
  memset(buf, 2, kSize);
  EXPECT_STATUS(bytes.Copy(nullptr, kSize, kSize), ZX_ERR_INVALID_ARGS);
  EXPECT_OK(bytes.Copy(buf, 0, kSize * 10));
  EXPECT_EQ(bytes.len(), kSize);
  EXPECT_TRUE(AllEqual(bytes, 0, 0, kSize));

  EXPECT_OK(bytes.Copy(buf, kSize, kSize));
  EXPECT_TRUE(AllEqual(bytes, 0, 0, kSize));
  EXPECT_TRUE(AllEqual(bytes, 2, kSize, kSize));

  memset(buf, 1, kSize);
  EXPECT_OK(bytes.Copy(buf, kSize / 2, kSize / 2));
  EXPECT_TRUE(AllEqual(bytes, 0, 0, kSize / 2));
  EXPECT_TRUE(AllEqual(bytes, 1, kSize / 2, kSize / 2));
  EXPECT_TRUE(AllEqual(bytes, 2, kSize, kSize));

  ASSERT_OK(bytes.Resize(0));
  EXPECT_OK(bytes.Copy(buf, kSize));
  EXPECT_EQ(bytes.len(), kSize);
  EXPECT_TRUE(AllEqual(bytes, 1, 0, kSize));

  EXPECT_OK(copy.Copy(bytes));
  EXPECT_TRUE(AllEqual(copy, 1, 0, kSize));

  EXPECT_OK(copy.Copy(bytes, kSize));
  EXPECT_TRUE(AllEqual(copy, 1, 0, kSize * 2));
}

TEST(Bytes, ArrayAccess) {
  Bytes bytes;
  ASSERT_OK(bytes.Resize(kSize, 1));
  for (size_t i = 0; i < kSize; ++i) {
    EXPECT_EQ(bytes[i], 1);
    bytes[i] = 2;
  }
  EXPECT_TRUE(AllEqual(bytes, 2, 0, kSize));
}

TEST(Bytes, Comparison) {
  Bytes bytes1, bytes2;
  ASSERT_OK(bytes1.Randomize(kSize));
  ASSERT_OK(bytes2.Copy(bytes1.get(), bytes1.len()));
  EXPECT_TRUE(bytes1 == bytes1);
  EXPECT_TRUE(bytes2 == bytes2);
  EXPECT_FALSE(bytes1 != bytes1);
  EXPECT_FALSE(bytes2 != bytes2);
  EXPECT_TRUE(bytes1 == bytes2);
  EXPECT_TRUE(bytes2 == bytes1);
  EXPECT_FALSE(bytes1 != bytes2);
  EXPECT_FALSE(bytes2 != bytes1);

  ASSERT_OK(bytes2.Randomize(kSize));
  EXPECT_TRUE(bytes1 == bytes1);
  EXPECT_TRUE(bytes2 == bytes2);
  EXPECT_FALSE(bytes1 != bytes1);
  EXPECT_FALSE(bytes2 != bytes2);
  EXPECT_FALSE(bytes1 == bytes2);
  EXPECT_FALSE(bytes2 == bytes1);
  EXPECT_TRUE(bytes1 != bytes2);
  EXPECT_TRUE(bytes2 != bytes1);
}

}  // namespace
}  // namespace testing
}  // namespace crypto
