// 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 <limits.h>
#include <stdint.h>
#include <stdio.h>

#include <fbl/string_printf.h>
#include <unittest/unittest.h>

#include "fuzzer-fixture.h"

namespace fuzzing {
namespace testing {

// Public methods

bool FuzzerFixture::CreateZircon() {
    BEGIN_HELPER;
    ASSERT_TRUE(Fixture::Create());

    // Zircon binaries
    ASSERT_TRUE(CreateFile("boot/test/fuzz/target1"));
    ASSERT_TRUE(CreateFile("boot/test/fuzz/target2"));

    // Data from "previous" runs
    ASSERT_TRUE(CreateData("zircon_fuzzers", "target2"));

    END_HELPER;
}

bool FuzzerFixture::CreateFuchsia() {
    BEGIN_HELPER;
    ASSERT_TRUE(Fixture::Create());

    // Zircon binaries without packages
    ASSERT_TRUE(CreateFile("boot/test/fuzz/target1"));

    // Fuchsia packages
    ASSERT_TRUE(CreatePackage("zircon_fuzzers", 0, "target2"));
    ASSERT_TRUE(CreatePackage("fuchsia1_fuzzers", 1, "target1"));
    ASSERT_TRUE(CreatePackage("fuchsia1_fuzzers", 2, "target1"));
    ASSERT_TRUE(CreatePackage("fuchsia1_fuzzers", 5, "target1"));
    ASSERT_TRUE(CreatePackage("fuchsia1_fuzzers", 5, "target2"));
    ASSERT_TRUE(CreatePackage("fuchsia1_fuzzers", 5, "target3"));
    ASSERT_TRUE(CreatePackage("fuchsia2_fuzzers", 2, "target4"));
    ASSERT_TRUE(CreatePackage("fuchsia2_fuzzers", 5, "target4"));
    ASSERT_TRUE(CreatePackage("fuchsia2_fuzzers", 10, "target4"));

    // Data from "previous" runs
    ASSERT_TRUE(CreateData("zircon_fuzzers", "target2"));
    ASSERT_TRUE(CreateData("fuchsia2_fuzzers", "target4"));

    END_HELPER;
}

const char* FuzzerFixture::max_version(const char* package) const {
    const char* max = max_versions_.get(package);
    return max ? max : "0";
}

// Protected methods

void FuzzerFixture::Reset() {
    max_versions_.clear();
    Fixture::Reset();
}

// Private methods

bool FuzzerFixture::CreatePackage(const char* package, long int version, const char* target) {
    BEGIN_HELPER;
    auto base = fbl::StringPrintf("pkgfs/packages/%s/%ld", package, version);
    const char* max = max_version(package);
    if (!max || strtol(max, nullptr, 0) < version) {
        max_versions_.set(package, fbl::StringPrintf("%ld", version));
    }

    if (strcmp(package, "zircon_fuzzers") == 0) {
        ASSERT_TRUE(CreateFile(path("boot/test/fuzz/%s", target)));
    } else {
        ASSERT_TRUE(CreateFile(path("%s/bin/%s", base.c_str(), target)));
        ASSERT_TRUE(CreateFile(path("%s/meta/%s.cmx", base.c_str(), target)));
    }

    ASSERT_TRUE(CreateFile(path("%s/data/%s/corpora", base.c_str(), target),
                           "//path/to/seed/corpus\n "
                           "//path/to/cipd/ensure/file\n"
                           "https://gcs/url\n"));
    ASSERT_TRUE(CreateFile(path("%s/data/%s/dictionary", base.c_str(), target), "foo\n"
                                                                                "bar\n"
                                                                                "baz\n"));
    ASSERT_TRUE(CreateFile(path("%s/data/%s/options", base.c_str(), target), "foo = bar\n"
                                                                             "baz = qux\n"));

    END_HELPER;
}

bool FuzzerFixture::CreateData(const char* package, const char* target) {
    BEGIN_HELPER;

    ASSERT_TRUE(CreateDirectory(path("data/fuzzing/%s/%s/corpus", package, target)));
    ASSERT_TRUE(CreateFile(path("data/fuzzing/%s/%s/crash-deadbeef", package, target)));
    ASSERT_TRUE(CreateFile(path("data/fuzzing/%s/%s/leak-deadfa11", package, target)));
    ASSERT_TRUE(CreateFile(path("data/fuzzing/%s/%s/oom-feedface", package, target)));

    END_HELPER;
}

} // namespace testing
} // namespace fuzzing
