blob: 2a0fcfbf564b5d25cea07603bbbdcdc88cfc8453 [file] [log] [blame]
// 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