// Copyright 2021 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 "src/sys/fuzzing/framework/engine/corpus.h"

#include <unordered_set>

#include <gtest/gtest.h>

#include "src/lib/files/directory.h"
#include "src/lib/files/file.h"
#include "src/lib/files/path.h"

namespace fuzzing {
namespace {

// Test fixtures.

Input input0() { return Input(); }
Input input1() { return Input({0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48}); }
Input input2() { return Input({0x21, 0x22}); }
Input input3() { return Input({0x31, 0x32, 0x33, 0x34, 0x35, 0x36}); }
Input input4() { return Input({0x41, 0x42, 0x43, 0x44}); }

OptionsPtr DefaultOptions() {
  auto options = MakeOptions();
  Corpus::AddDefaults(options.get());
  return options;
}

void AddAllToCorpus(Corpus *corpus) {
  ASSERT_EQ(corpus->Add(input1()), ZX_OK);
  ASSERT_EQ(corpus->Add(input2()), ZX_OK);
  ASSERT_EQ(corpus->Add(input3()), ZX_OK);
  ASSERT_EQ(corpus->Add(input4()), ZX_OK);
}

// Unit tests.

TEST(CorpusTest, AddDefaults) {
  Options options;
  Corpus::AddDefaults(&options);
  EXPECT_EQ(options.seed(), kDefaultSeed);
  EXPECT_EQ(options.max_input_size(), kDefaultMaxInputSize);
}

TEST(CorpusTest, Load) {
  Corpus corpus;
  corpus.Configure(DefaultOptions());

  // Double check that the unit test component manifest includes the tmp-storage shard...
  ASSERT_TRUE(files::IsDirectory("/tmp"));

  // Create a hierarchy of temporary directories. The unusual names are chosen to make the
  // structure more apparent to the reader of this file.
  auto r______ = files::JoinPath("/tmp", "corpus-test");
  auto d_1____ = files::JoinPath(r______, "1");
  auto d_1_1__ = files::JoinPath(d_1____, "1");
  auto d_1_2__ = files::JoinPath(d_1____, "2");
  auto d_2____ = files::JoinPath(r______, "2");
  auto d_2_1__ = files::JoinPath(d_2____, "1");
  auto d_2_2__ = files::JoinPath(d_2____, "2");
  auto d_2_1_1 = files::JoinPath(d_2_1__, "1");

  // |CreateDirectory| automatically creates parents, so it only needs to be called on the leaves.
  EXPECT_TRUE(files::CreateDirectory(d_1_1__));
  EXPECT_TRUE(files::CreateDirectory(d_1_2__));
  EXPECT_TRUE(files::CreateDirectory(d_2_1_1));
  EXPECT_TRUE(files::CreateDirectory(d_2_2__));

  // Create some files to include conditions like:
  //  * a directory with more than one file (d_1_1__).
  //  * a directory with exactly one file (d_1_2__)
  //  * a directory with only nested files (d_2_1__)
  //  * a directory with no files (d_2_2__)
  EXPECT_TRUE(files::WriteFile(files::JoinPath(d_1_1__, "1"), "foo"));
  EXPECT_TRUE(files::WriteFile(files::JoinPath(d_1_1__, "2"), "bar"));
  EXPECT_TRUE(files::WriteFile(files::JoinPath(d_1_2__, "1"), "baz"));
  EXPECT_TRUE(files::WriteFile(files::JoinPath(d_2_1_1, "1"), "qux"));

  EXPECT_EQ(corpus.LoadAt(r______, {"1", "2"}), ZX_OK);

  Input inputs[5];
  for (size_t i = 0; i < 4; ++i) {
    EXPECT_TRUE(corpus.At(i + 1, &inputs[i]));
  }
  EXPECT_FALSE(corpus.At(5, &inputs[4]));
  // Should be sorted on return.
  EXPECT_EQ(inputs[0], Input("bar"));
  EXPECT_EQ(inputs[1], Input("baz"));
  EXPECT_EQ(inputs[2], Input("foo"));
  EXPECT_EQ(inputs[3], Input("qux"));
}

TEST(CorpusTest, AddInputs) {
  Corpus corpus;
  auto options = DefaultOptions();
  options->set_max_input_size(8);
  corpus.Configure(options);

  // Empty input is implicitly included.
  EXPECT_EQ(corpus.num_inputs(), 1U);
  EXPECT_EQ(corpus.total_size(), 0U);

  size_t expected = input1().size() + input2().size();
  EXPECT_EQ(corpus.Add(input1()), ZX_OK);
  EXPECT_EQ(corpus.Add(input2()), ZX_OK);

  EXPECT_EQ(corpus.num_inputs(), 3U);
  EXPECT_EQ(corpus.total_size(), expected);

  // Empty inputs are not added.
  EXPECT_EQ(corpus.Add(input0()), ZX_OK);
  EXPECT_EQ(corpus.num_inputs(), 3U);
  EXPECT_EQ(corpus.total_size(), expected);

  // Over-large inputs return an error.
  Input large_input;
  large_input.Resize(9);
  EXPECT_EQ(corpus.Add(std::move(large_input)), ZX_ERR_BUFFER_TOO_SMALL);
  EXPECT_EQ(corpus.num_inputs(), 3U);
  EXPECT_EQ(corpus.total_size(), expected);

  // Adding an existing input doesn't change the  number of inputs or total size.
  EXPECT_EQ(corpus.Add(input1()), ZX_OK);
  EXPECT_EQ(corpus.Add(input2()), ZX_OK);
  EXPECT_EQ(corpus.num_inputs(), 3U);
  EXPECT_EQ(corpus.total_size(), expected);
}

TEST(CorpusTest, AddCorpus) {
  auto corpus1 = Corpus::MakePtr();
  auto options = DefaultOptions();
  options->set_max_input_size(4);
  corpus1->Configure(options);
  EXPECT_EQ(corpus1->Add(Input("foo")), ZX_OK);
  EXPECT_EQ(corpus1->Add(Input("bar")), ZX_OK);

  // Null pointer.
  CorpusPtr corpus2;
  EXPECT_EQ(corpus1->Add(corpus2), ZX_ERR_INVALID_ARGS);

  // Long input.
  corpus2 = Corpus::MakePtr();
  corpus2->Configure(DefaultOptions());
  EXPECT_EQ(corpus2->Add(Input("foobarbaz")), ZX_OK);
  EXPECT_EQ(corpus1->Add(corpus2), ZX_ERR_BUFFER_TOO_SMALL);

  // Valid
  corpus2 = Corpus::MakePtr();
  corpus2->Configure(DefaultOptions());
  EXPECT_EQ(corpus2->Add(Input("bar")), ZX_OK);
  EXPECT_EQ(corpus2->Add(Input("baz")), ZX_OK);
  EXPECT_EQ(corpus1->Add(corpus2), ZX_OK);

  Input inputs[4];
  for (size_t i = 0; i < 3; ++i) {
    EXPECT_TRUE(corpus1->At(i + 1, &inputs[i]));
  }
  EXPECT_FALSE(corpus1->At(4, &inputs[3]));
  // Should be sorted on return.
  EXPECT_EQ(inputs[0], Input("bar"));
  EXPECT_EQ(inputs[1], Input("baz"));
  EXPECT_EQ(inputs[2], Input("foo"));
}

TEST(CorpusTest, At) {
  Corpus corpus;
  corpus.Configure(DefaultOptions());

  // Empty input is always present.
  Input input;
  EXPECT_TRUE(corpus.At(0, &input));
  EXPECT_EQ(input.ToHex(), input0().ToHex());

  // Add some elements.
  AddAllToCorpus(&corpus);

  // Corpus should been in sorted order: shortest to longest.
  EXPECT_TRUE(corpus.At(0, &input));
  EXPECT_EQ(input.ToHex(), input0().ToHex());

  EXPECT_TRUE(corpus.At(1, &input));
  EXPECT_EQ(input.ToHex(), input2().ToHex());

  EXPECT_TRUE(corpus.At(2, &input));
  EXPECT_EQ(input.ToHex(), input4().ToHex());

  EXPECT_TRUE(corpus.At(3, &input));
  EXPECT_EQ(input.ToHex(), input3().ToHex());

  EXPECT_TRUE(corpus.At(4, &input));
  EXPECT_EQ(input.ToHex(), input1().ToHex());

  // Out-of-bounds returns empty input.
  EXPECT_FALSE(corpus.At(5, &input));
  EXPECT_EQ(input.ToHex(), input0().ToHex());
}

TEST(CorpusTest, Pick) {
  Corpus corpus;

  // Set the seed explicitly. In the real system, omitting the seed option will cause the engine to
  // derive one from the current time.
  auto options = DefaultOptions();
  options->set_seed(100);
  corpus.Configure(options);

  // Corpus always has an empty input.
  Input input;
  corpus.Pick(&input);
  EXPECT_EQ(input.ToHex(), input0().ToHex());

  // |Pick| doesn't exhaust, but does shuffle.
  AddAllToCorpus(&corpus);
  std::vector<std::string> ordered_a;
  for (size_t i = 0; i < 100; ++i) {
    corpus.Pick(&input);
    ordered_a.push_back(input.ToHex());
  }
  std::vector<std::string> ordered_b;
  for (size_t i = 0; i < 100; ++i) {
    corpus.Pick(&input);
    ordered_b.push_back(input.ToHex());
  }
  std::unordered_set<std::string> unique_a(ordered_a.begin(), ordered_a.end());
  std::unordered_set<std::string> unique_b(ordered_b.begin(), ordered_b.end());

  // The loop above should pick all inputs, but in different order. These assertions are very likely
  // but not guaranteed for an arbitrary seed. For the given seed, they work.
  EXPECT_EQ(unique_a.size(), corpus.num_inputs());
  EXPECT_EQ(unique_b.size(), corpus.num_inputs());
  EXPECT_NE(ordered_a, ordered_b);
}

TEST(CorpusTest, PickIsDeterministic) {
  Corpus corpus1;
  Corpus corpus2;

  // Set the seed explicitly. In the real system, omitting the seed option will cause the engine to
  // derive one from the current time.
  auto options = DefaultOptions();
  options->set_seed(100);
  corpus1.Configure(options);
  corpus2.Configure(options);

  // Same seed and inputs should produce same order.
  AddAllToCorpus(&corpus1);
  AddAllToCorpus(&corpus2);

  Input input1;
  Input input2;
  for (size_t i = 0; i < 100; ++i) {
    corpus1.Pick(&input1);
    corpus2.Pick(&input2);
    EXPECT_EQ(input1.ToHex(), input2.ToHex());
  }
}

}  // namespace
}  // namespace fuzzing
