[component][fuzzing] Reorganize manifests This CL reorganizes the manifests according to the following heuristic: * Manifests for each component's binaries are found in a meta/ directory under the corresponding source directory, e.g. .../framework/engine/meta/engine.cml. * Manifest shards for libraries are located alongside their source code, e.g. .../framework/adapters/llvm.shard.cml. * Unit test packages are at the top-level, so their manifests are under .../framework/meta. * Integration tests are under .../tests, and otherwise follow the rules above. Change-Id: I88ea53488fad9cd1f02e05a46b1d6893f7f7903c Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/680317 Commit-Queue: Aaron Green <aarongreen@google.com> Reviewed-by: Dmitry Yatsushkevich <dmitryya@google.com>
diff --git a/src/sys/fuzzing/common/meta/test.shard.cml b/src/sys/fuzzing/common/meta/test.shard.cml deleted file mode 100644 index 0ffb3db..0000000 --- a/src/sys/fuzzing/common/meta/test.shard.cml +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2022 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: [ - "//sdk/lib/inspect/client.shard.cml", - "//src/sys/test_runners/gtest/default.shard.cml", - "syslog/client.shard.cml", - ], - use: [ - { - protocol: [ "fuchsia.process.Launcher" ], - }, - ], -}
diff --git a/src/sys/fuzzing/common/meta/unittests.cml b/src/sys/fuzzing/common/meta/unittests.cml index 3de4dbf..b2a87c3 100644 --- a/src/sys/fuzzing/common/meta/unittests.cml +++ b/src/sys/fuzzing/common/meta/unittests.cml
@@ -2,7 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. { - include: [ "//src/sys/fuzzing/common/meta/test.shard.cml" ], + include: [ + "//sdk/lib/inspect/client.shard.cml", + "//src/sys/test_runners/gtest/default.shard.cml", + "syslog/client.shard.cml", + ], program: { binary: "test/component_fuzzing_common_unittests", },
diff --git a/src/sys/fuzzing/framework/BUILD.gn b/src/sys/fuzzing/framework/BUILD.gn index 2478b92..99e644c 100644 --- a/src/sys/fuzzing/framework/BUILD.gn +++ b/src/sys/fuzzing/framework/BUILD.gn
@@ -8,12 +8,15 @@ group("tests") { testonly = true deps = [ - ":default-tests", - ":fatal-tests", + ":fatal-unittests-pkg", + ":unittests-pkg", + "tests", ] } -test("unittests_bin") { +# This package contains "normal" unit tests. + +test("unittests-bin") { output_name = "component_fuzzing_framework_unittests" visibility = [ ":*" ] testonly = true @@ -26,7 +29,22 @@ ] } -test("fatal_unittests_bin") { +fuchsia_test_component("unittests") { + manifest = "meta/unittests.cml" + deps = [ + ":unittests-bin", + "testing/data:corpus", + ] +} + +fuchsia_test_package("unittests-pkg") { + package_name = "component-fuzzing-framework-tests" + test_components = [ ":unittests" ] +} + +# This package contains unit tests that produce fatal error messages. + +test("fatal-unittests-bin") { output_name = "component_fuzzing_framework_fatal_unittests" visibility = [ "../*" ] testonly = true @@ -36,81 +54,12 @@ ] } -fuchsia_test_component("unittests") { - manifest = "meta/unittests.cml" - deps = [ - ":unittests_bin", - "testing/data:corpus", - ] -} - fuchsia_test_component("fatal-unittests") { manifest = "meta/fatal-unittests.cml" - deps = [ ":fatal_unittests_bin" ] + deps = [ ":fatal-unittests-bin" ] } -fuchsia_test_component("test-engine") { - manifest = "meta/test-engine.cml" - deps = [ "testing:engine" ] -} - -fuchsia_test_component("integration-tests") { - visibility = [ ":*" ] - manifest = "meta/integration-tests.cml" - deps = [ - "tests:framework-integration-tests", - "//src/sys/fuzzing/framework/engine:engine-bin", - ] -} - -fuchsia_test_component("test-fuzzer") { - manifest = "meta/test-fuzzer.cml" - deps = [ - "testing/data:corpus", - "tests:fuzzer", - ] -} - -fuchsia_test_component("test-fuzzer-uninstrumented") { - manifest = "meta/test-fuzzer-uninstrumented.cml" - deps = [ - "testing/data:corpus", - "tests:fuzzer-uninstrumented", - ] -} - -# This component contains an integration test that uses the "real" fuzzing engine that generates -# inputs to drive a simple test fuzzer, thereby imitating a real fuzzer. -fuchsia_test_component("fuzzer-realm") { - manifest = "meta/fuzzer-realm.cml" - deps = [ - ":integration-tests", - ":test-fuzzer", - "//src/sys/fuzzing/framework/coverage", - ] -} - -# This component contains an integration test that uses a test "engine" that uses fixed inputs to -# drive a simple test fuzzer, thereby imitating the auto-generated fuzzer tests that run in CQ. -fuchsia_test_component("fuzzer-test-realm") { - manifest = "meta/fuzzer-test-realm.cml" - deps = [ - ":test-engine", - ":test-fuzzer-uninstrumented", - "//src/sys/fuzzing/framework/coverage", - ] -} - -fuchsia_test_package("default-tests") { - package_name = "component-fuzzing-framework-tests" - test_components = [ - ":unittests", - ":fuzzer-realm", - ":fuzzer-test-realm", - ] -} - -fuchsia_test_package("fatal-tests") { +fuchsia_test_package("fatal-unittests-pkg") { package_name = "component-fuzzing-framework-fatal-tests" # Some tests involve handling intentional crashes.
diff --git a/src/sys/fuzzing/framework/meta/test-fuzzer.shard.cml b/src/sys/fuzzing/framework/adapters/llvm.shard.cml similarity index 77% rename from src/sys/fuzzing/framework/meta/test-fuzzer.shard.cml rename to src/sys/fuzzing/framework/adapters/llvm.shard.cml index d3f873c..c823701 100644 --- a/src/sys/fuzzing/framework/meta/test-fuzzer.shard.cml +++ b/src/sys/fuzzing/framework/adapters/llvm.shard.cml
@@ -1,6 +1,9 @@ // Copyright 2022 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. + +// This manifest shard corresponds to the fuzz target adapter component, which +// maps test inputs from the engine to the target component(s) being fuzzed. { include: [ "//sdk/lib/inspect/client.shard.cml", @@ -8,16 +11,12 @@ ], program: { runner: "elf", - args: [ "data/corpus" ], }, capabilities: [ { protocol: [ "fuchsia.fuzzer.TargetAdapter" ], }, ], - use: [ - { protocol: "fuchsia.process.Launcher" }, - ], expose: [ { protocol: [ "fuchsia.fuzzer.TargetAdapter" ],
diff --git a/src/sys/fuzzing/framework/coverage/BUILD.gn b/src/sys/fuzzing/framework/coverage/BUILD.gn index 147de10..0f9d075 100644 --- a/src/sys/fuzzing/framework/coverage/BUILD.gn +++ b/src/sys/fuzzing/framework/coverage/BUILD.gn
@@ -40,7 +40,7 @@ fuchsia_component("coverage") { testonly = true - manifest = "../meta/coverage.cml" + manifest = "meta/coverage.cml" deps = [ ":coverage-bin" ] } @@ -56,8 +56,8 @@ ] deps = [ ":coverage-lib", - "../testing", "//src/sys/fuzzing/fidl:fuchsia.fuzzer", + "//src/sys/fuzzing/framework/testing", "//third_party/googletest:gtest", ] }
diff --git a/src/sys/fuzzing/framework/coverage/meta/coverage.cml b/src/sys/fuzzing/framework/coverage/meta/coverage.cml new file mode 100644 index 0000000..8920f438 --- /dev/null +++ b/src/sys/fuzzing/framework/coverage/meta/coverage.cml
@@ -0,0 +1,26 @@ +// Copyright 2022 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. + +// This manifest corresponds to the coverage component that forwards coverage +// data from targets to the engine. +{ + include: [ "syslog/client.shard.cml" ], + program: { + runner: "elf", + binary: "bin/component_fuzzing_coverage", + }, + capabilities: [ + { protocol: "fuchsia.fuzzer.Instrumentation" }, + { protocol: "fuchsia.fuzzer.CoverageProvider" }, + ], + expose: [ + { + protocol: [ + "fuchsia.fuzzer.CoverageProvider", + "fuchsia.fuzzer.Instrumentation", + ], + from: "self", + }, + ], +}
diff --git a/src/sys/fuzzing/framework/engine/BUILD.gn b/src/sys/fuzzing/framework/engine/BUILD.gn index 2fca1b6..d0c9c3e 100644 --- a/src/sys/fuzzing/framework/engine/BUILD.gn +++ b/src/sys/fuzzing/framework/engine/BUILD.gn
@@ -4,6 +4,9 @@ import("//build/components/fuchsia_component.gni") +# Both the "real" and "test" engines used in fuzzers and fuzzer tests, +# respectively, use the adapter-client code to connect to the fuzz target +# adapter component. source_set("adapter-client") { visibility = [ "../*" ] testonly = true @@ -26,6 +29,8 @@ ] } +# This source set is the core of the "real" engine and includes the coverage +# processing and input mutation. source_set("engine-lib") { visibility = [ "../*" ] testonly = true @@ -71,7 +76,7 @@ fuchsia_component("engine") { testonly = true - manifest = "../meta/engine.cml" + manifest = "meta/engine.cml" deps = [ ":engine-bin" ] } @@ -88,11 +93,12 @@ ] public_deps = [ ":engine-lib", - "../target:no_hooks", - "../testing", "//src/sys/fuzzing/common:runner-unittests", "//src/sys/fuzzing/common/testing", "//src/sys/fuzzing/fidl:fuchsia.fuzzer", + "//src/sys/fuzzing/framework/coverage:coverage-lib", + "//src/sys/fuzzing/framework/target:no_hooks", + "//src/sys/fuzzing/framework/testing", "//third_party/googletest:gtest", ] } @@ -113,9 +119,9 @@ ] deps = [ ":testing", - "../testing:test-target", "//src/lib/files", "//src/sys/fuzzing/common:runner-unittests", + "//src/sys/fuzzing/framework/testing:test-target", ] } @@ -129,7 +135,7 @@ ] deps = [ ":testing", - "../testing:test-target", "//src/sys/fuzzing/common:runner-fatal-unittests", + "//src/sys/fuzzing/framework/testing:test-target", ] }
diff --git a/src/sys/fuzzing/framework/engine/default.shard.cml b/src/sys/fuzzing/framework/engine/default.shard.cml new file mode 100644 index 0000000..d51fd00 --- /dev/null +++ b/src/sys/fuzzing/framework/engine/default.shard.cml
@@ -0,0 +1,34 @@ +// Copyright 2022 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. + +// This manifest shard corresponds to both the "real" and "test" engines used in +// fuzzers and fuzzer tests, respectively. +{ + include: [ + "//sdk/lib/inspect/client.shard.cml", + "syslog/client.shard.cml", + ], + children: [ + { + name: "fuzzer", + url: "#meta/fuzzer.cm", + }, + ], + use: [ + { + protocol: "fuchsia.fuzzer.TargetAdapter", + from: "#fuzzer", + }, + ], + offer: [ + { + protocol: [ + "fuchsia.logger.LogSink", + "fuchsia.process.Launcher", + ], + from: "parent", + to: "#fuzzer", + }, + ], +}
diff --git a/src/sys/fuzzing/framework/engine/meta/engine.cml b/src/sys/fuzzing/framework/engine/meta/engine.cml new file mode 100644 index 0000000..5c4728a --- /dev/null +++ b/src/sys/fuzzing/framework/engine/meta/engine.cml
@@ -0,0 +1,25 @@ +// Copyright 2022 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. + +// This manifest corresponds to the "real" engine used by fuzzers. +{ + include: [ + "//src/sys/fuzzing/framework/engine/default.shard.cml", + "//src/sys/test_runners/fuzz/default.shard.cml", + ], + program: { + binary: "bin/component_fuzzing_engine", + }, + use: [ + { protocol: "fuchsia.fuzzer.CoverageProvider" }, + { protocol: "fuchsia.process.Launcher" }, + ], + offer: [ + { + protocol: "fuchsia.fuzzer.Instrumentation", + from: "parent", + to: "#fuzzer", + }, + ], +}
diff --git a/src/sys/fuzzing/framework/meta/coverage.cml b/src/sys/fuzzing/framework/meta/coverage.cml deleted file mode 100644 index 43bc7b2..0000000 --- a/src/sys/fuzzing/framework/meta/coverage.cml +++ /dev/null
@@ -1,24 +0,0 @@ -// 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: [ "syslog/client.shard.cml" ], - program: { - runner: "elf", - binary: "bin/component_fuzzing_coverage", - }, - capabilities: [ - { protocol: "fuchsia.fuzzer.Instrumentation" }, - { protocol: "fuchsia.fuzzer.CoverageProvider" }, - ], - expose: [ - { - protocol: [ "fuchsia.fuzzer.Instrumentation" ], - from: "self", - }, - { - protocol: [ "fuchsia.fuzzer.CoverageProvider" ], - from: "self", - }, - ], -}
diff --git a/src/sys/fuzzing/framework/meta/engine.cml b/src/sys/fuzzing/framework/meta/engine.cml deleted file mode 100644 index 8fd1b70..0000000 --- a/src/sys/fuzzing/framework/meta/engine.cml +++ /dev/null
@@ -1,16 +0,0 @@ -// 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/test_runners/fuzz/default.shard.cml", - "syslog/client.shard.cml", - ], - program: { - binary: "bin/component_fuzzing_engine", - }, - use: [ - { protocol: "fuchsia.fuzzer.TargetAdapter" }, - { protocol: "fuchsia.fuzzer.CoverageProvider" }, - ], -}
diff --git a/src/sys/fuzzing/framework/meta/fatal-unittests.cml b/src/sys/fuzzing/framework/meta/fatal-unittests.cml index 94b87cc..74feddb 100644 --- a/src/sys/fuzzing/framework/meta/fatal-unittests.cml +++ b/src/sys/fuzzing/framework/meta/fatal-unittests.cml
@@ -2,8 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. { - include: [ "//src/sys/fuzzing/common/meta/test.shard.cml" ], + include: [ + "//sdk/lib/inspect/client.shard.cml", + "//src/sys/test_runners/gtest/default.shard.cml", + "syslog/client.shard.cml", + ], program: { binary: "test/component_fuzzing_framework_fatal_unittests", }, + use: [ + { protocol: "fuchsia.process.Launcher" }, + ], }
diff --git a/src/sys/fuzzing/framework/meta/fuzzer-realm.cml b/src/sys/fuzzing/framework/meta/fuzzer-realm.cml deleted file mode 100644 index a1cdd85..0000000 --- a/src/sys/fuzzing/framework/meta/fuzzer-realm.cml +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2022 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/meta/realm.shard.cml" ], - children: [ - { - name: "engine", - url: "#meta/integration-tests.cm", - }, - { - name: "fuzzer", - url: "#meta/test-fuzzer.cm", - }, - { - name: "coverage", - url: "#meta/coverage.cm", - }, - ], - offer: [ - { - protocol: [ "fuchsia.fuzzer.CoverageProvider" ], - from: "#coverage", - to: "#engine", - }, - { - protocol: [ "fuchsia.fuzzer.Instrumentation" ], - from: "#coverage", - to: "#fuzzer", - }, - { - protocol: [ "fuchsia.logger.LogSink" ], - from: "parent", - to: "#coverage", - }, - ], -}
diff --git a/src/sys/fuzzing/framework/meta/fuzzer-test-realm.cml b/src/sys/fuzzing/framework/meta/fuzzer-test-realm.cml deleted file mode 100644 index eafd824..0000000 --- a/src/sys/fuzzing/framework/meta/fuzzer-test-realm.cml +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright 2022 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/meta/realm.shard.cml" ], - children: [ - { - name: "engine", - url: "#meta/test-engine.cm", - }, - { - name: "fuzzer", - url: "#meta/test-fuzzer-uninstrumented.cm", - }, - ], -}
diff --git a/src/sys/fuzzing/framework/meta/integration-tests.cml b/src/sys/fuzzing/framework/meta/integration-tests.cml deleted file mode 100644 index 3e8beb9..0000000 --- a/src/sys/fuzzing/framework/meta/integration-tests.cml +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright 2022 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/common/meta/test.shard.cml" ], - program: { - binary: "test/component_fuzzing_framework_tests", - }, - use: [ - { protocol: "fuchsia.fuzzer.TargetAdapter" }, - { protocol: "fuchsia.fuzzer.CoverageProvider" }, - ], -}
diff --git a/src/sys/fuzzing/framework/meta/realm.shard.cml b/src/sys/fuzzing/framework/meta/realm.shard.cml deleted file mode 100644 index 1b51abe..0000000 --- a/src/sys/fuzzing/framework/meta/realm.shard.cml +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2022 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. -{ - offer: [ - { - runner: "gtest_runner", - from: "parent", - to: [ "#engine" ], - }, - { - protocol: "fuchsia.process.Launcher", - from: "parent", - to: [ - "#engine", - "#fuzzer", - ], - }, - { - protocol: [ "fuchsia.fuzzer.TargetAdapter" ], - from: "#fuzzer", - to: "#engine", - }, - { - protocol: [ "fuchsia.logger.LogSink" ], - from: "parent", - to: [ - "#engine", - "#fuzzer", - ], - }, - ], - expose: [ - { - protocol: "fuchsia.test.Suite", - from: "#engine", - }, - ], -}
diff --git a/src/sys/fuzzing/framework/meta/test-engine.cml b/src/sys/fuzzing/framework/meta/test-engine.cml deleted file mode 100644 index e69c299..0000000 --- a/src/sys/fuzzing/framework/meta/test-engine.cml +++ /dev/null
@@ -1,12 +0,0 @@ -// 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/common/meta/test.shard.cml" ], - program: { - binary: "bin/component_fuzzing_test_engine", - }, - use: [ - { protocol: "fuchsia.fuzzer.TargetAdapter" }, - ], -}
diff --git a/src/sys/fuzzing/framework/meta/test-fuzzer-uninstrumented.cml b/src/sys/fuzzing/framework/meta/test-fuzzer-uninstrumented.cml deleted file mode 100644 index 00aa46f..0000000 --- a/src/sys/fuzzing/framework/meta/test-fuzzer-uninstrumented.cml +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2022 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/meta/test-fuzzer.shard.cml" ], - program: { - binary: "bin/component_fuzzing_framework_test_fuzzer_uninstrumented", - }, -}
diff --git a/src/sys/fuzzing/framework/meta/unittests.cml b/src/sys/fuzzing/framework/meta/unittests.cml index 87a8a42..ded3bd1 100644 --- a/src/sys/fuzzing/framework/meta/unittests.cml +++ b/src/sys/fuzzing/framework/meta/unittests.cml
@@ -3,11 +3,16 @@ // found in the LICENSE file. { include: [ - "//src/sys/fuzzing/common/meta/test.shard.cml", + "//sdk/lib/inspect/client.shard.cml", + "//src/sys/test_runners/gtest/default.shard.cml", "//src/sys/test_runners/tmp_storage.shard.cml", + "syslog/client.shard.cml", ], program: { binary: "test/component_fuzzing_framework_unittests", args: [ "data/corpus" ], }, + use: [ + { protocol: "fuchsia.process.Launcher" }, + ], }
diff --git a/src/sys/fuzzing/framework/testing/BUILD.gn b/src/sys/fuzzing/framework/testing/BUILD.gn index 6dafa1e..81cf271 100644 --- a/src/sys/fuzzing/framework/testing/BUILD.gn +++ b/src/sys/fuzzing/framework/testing/BUILD.gn
@@ -4,6 +4,7 @@ import("//build/components/fuchsia_test_component.gni") +# This source set contains various fakes used in framework unit tests. source_set("testing") { visibility = [ "../*" ] testonly = true @@ -20,7 +21,6 @@ "target.h", ] public_deps = [ - "../coverage:coverage-lib", "../engine:engine-lib", "../target:no_hooks", "//src/sys/fuzzing/common", @@ -31,6 +31,7 @@ deps = [ "//sdk/lib/fdio" ] } +# This executable is used for unit tests that manipulate processes. executable("test-target") { output_name = "component_fuzzing_framework_test_target" visibility = [ "//src/sys/fuzzing/*" ] @@ -43,17 +44,24 @@ ] } -executable("engine") { +# The test engine is used to drive the target adapter with fixed inputs from the seed corpus. This +# is used to create fuzzer tests that can be run as part of CQ. +executable("engine-bin") { output_name = "component_fuzzing_test_engine" testonly = true sources = [ "engine.cc" ] deps = [ - "../engine:adapter-client", "//sdk/lib/fidl/cpp", "//sdk/lib/sys/cpp", "//src/lib/fxl/test:gtest_main", "//src/sys/fuzzing/common", "//src/sys/fuzzing/common/testing", + "//src/sys/fuzzing/framework/engine:adapter-client", "//third_party/googletest:gtest", ] } + +fuchsia_test_component("engine") { + manifest = "meta/engine.cml" + deps = [ ":engine-bin" ] +}
diff --git a/src/sys/fuzzing/framework/testing/meta/engine.cml b/src/sys/fuzzing/framework/testing/meta/engine.cml new file mode 100644 index 0000000..ff426d1 --- /dev/null +++ b/src/sys/fuzzing/framework/testing/meta/engine.cml
@@ -0,0 +1,14 @@ +// Copyright 2022 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. + +// This manifest corresponds to the "test" engine used in fuzzer tests. +{ + include: [ + "//src/sys/fuzzing/framework/engine/default.shard.cml", + "//src/sys/test_runners/gtest/default.shard.cml", + ], + program: { + binary: "bin/component_fuzzing_test_engine", + }, +}
diff --git a/src/sys/fuzzing/framework/tests/BUILD.gn b/src/sys/fuzzing/framework/tests/BUILD.gn index 4fbb4214..322e6a8 100644 --- a/src/sys/fuzzing/framework/tests/BUILD.gn +++ b/src/sys/fuzzing/framework/tests/BUILD.gn
@@ -2,24 +2,22 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/components.gni") +import("//build/dist/renamed_binary.gni") import("//build/test.gni") -test("framework-integration-tests") { - output_name = "component_fuzzing_framework_tests" - sources = [ "framework-integration-test.cc" ] +group("tests") { + testonly = true deps = [ - "//sdk/lib/fdio", - "//sdk/lib/sys/cpp", - "//src/lib/fxl", - "//src/lib/fxl/test:gtest_main", - "//src/sys/fuzzing/common", - "//src/sys/fuzzing/common/testing", - "//src/sys/fuzzing/fidl:fuchsia.fuzzer", - "//third_party/googletest:gtest", + ":fuzzer-integration-tests-pkg", + ":fuzzer-test-integration-tests-pkg", ] } -executable("fuzzer") { +# This package contains integration tests that use the "real" fuzzing engine, which generates inputs +# to drive a simple test fuzzer, to imitates a real fuzzer. + +executable("fuzzer-bin") { testonly = true output_name = "component_fuzzing_framework_test_fuzzer" sources = [ "fuzzer.cc" ] @@ -31,10 +29,89 @@ exclude_toolchain_tags = [ "instrumented" ] } -executable("fuzzer-uninstrumented") { +fuchsia_test_component("fuzzer") { + manifest = "meta/fuzzer.cml" + deps = [ + ":fuzzer-bin", + "//src/sys/fuzzing/framework/testing/data:corpus", + ] +} + +test("integration-test-bin") { + output_name = "component_fuzzing_framework_tests" + sources = [ "framework-integration-test.cc" ] + deps = [ + "//sdk/lib/fdio", + "//sdk/lib/sys/cpp", + "//src/lib/fxl", + "//src/lib/fxl/test:gtest_main", + "//src/sys/fuzzing/common", + "//src/sys/fuzzing/common/testing", + "//src/sys/fuzzing/fidl:fuchsia.fuzzer", + "//src/sys/fuzzing/framework/engine:engine-lib", + "//third_party/googletest:gtest", + ] +} + +fuchsia_test_component("engine") { + manifest = "meta/engine.cml" + deps = [ + ":integration-test-bin", + "//src/sys/fuzzing/framework/engine:engine-bin", + ] +} + +fuchsia_test_component("fuzzer-integration-tests") { + manifest = "meta/integration-tests.cml" + deps = [ + ":engine", + ":fuzzer", + "//src/sys/fuzzing/framework/coverage", + ] +} + +fuchsia_test_package("fuzzer-integration-tests-pkg") { + package_name = "component-fuzzer-integration-tests" + test_components = [ ":fuzzer-integration-tests" ] +} + +# This package contains integration tests that use a test "engine", which uses fixed inputs to drive +# a simple test fuzzer without instrumentation, to imitate the fuzzer tests that run in CQ. + +executable("fuzzer-uninstrumented-bin") { testonly = true output_name = "component_fuzzing_framework_test_fuzzer_uninstrumented" sources = [ "fuzzer.cc" ] - deps = [ "//src/sys/fuzzing/framework/adapters:llvm" ] + deps = [ "../adapters:llvm" ] exclude_toolchain_tags = [ "instrumented" ] } + +renamed_binary("fuzzer-uninstrumented-renamed") { + testonly = true + dest = "bin/component_fuzzing_framework_test_fuzzer" + source = + "$root_out_dir/component_fuzzing_framework_test_fuzzer_uninstrumented" + source_deps = [ ":fuzzer-uninstrumented-bin" ] +} + +fuchsia_test_component("fuzzer-uninstrumented") { + component_name = "fuzzer" + manifest = "meta/fuzzer.cml" + deps = [ + ":fuzzer-uninstrumented-renamed", + "//src/sys/fuzzing/framework/testing/data:corpus", + ] +} + +fuchsia_test_component("fuzzer-test-integration-test") { + manifest = "../testing/meta/engine.cml" + deps = [ + ":fuzzer-uninstrumented", + "//src/sys/fuzzing/framework/testing:engine", + ] +} + +fuchsia_test_package("fuzzer-test-integration-tests-pkg") { + package_name = "component-fuzzer-test-integration-test" + test_components = [ ":fuzzer-test-integration-test" ] +}
diff --git a/src/sys/fuzzing/framework/tests/meta/engine.cml b/src/sys/fuzzing/framework/tests/meta/engine.cml new file mode 100644 index 0000000..355e529 --- /dev/null +++ b/src/sys/fuzzing/framework/tests/meta/engine.cml
@@ -0,0 +1,25 @@ +// Copyright 2022 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. + +// This manifest corresponds to the "real" engine used by the integration tests. +{ + include: [ + "//src/sys/fuzzing/framework/engine/default.shard.cml", + "//src/sys/test_runners/gtest/default.shard.cml", + ], + program: { + binary: "test/component_fuzzing_framework_tests", + }, + use: [ + { protocol: "fuchsia.fuzzer.CoverageProvider" }, + { protocol: "fuchsia.process.Launcher" }, + ], + offer: [ + { + protocol: "fuchsia.fuzzer.Instrumentation", + from: "parent", + to: "#fuzzer", + }, + ], +}
diff --git a/src/sys/fuzzing/framework/meta/test-fuzzer.cml b/src/sys/fuzzing/framework/tests/meta/fuzzer.cml similarity index 61% rename from src/sys/fuzzing/framework/meta/test-fuzzer.cml rename to src/sys/fuzzing/framework/tests/meta/fuzzer.cml index 6cf0fce..d84ebcb 100644 --- a/src/sys/fuzzing/framework/meta/test-fuzzer.cml +++ b/src/sys/fuzzing/framework/tests/meta/fuzzer.cml
@@ -1,10 +1,14 @@ // Copyright 2022 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. + +// This manifest corresponds to the fuzzer used by the integration tests. { - include: [ "//src/sys/fuzzing/framework/meta/test-fuzzer.shard.cml" ], + include: [ "//src/sys/fuzzing/framework/adapters/llvm.shard.cml" ], program: { + runner: "elf", binary: "bin/component_fuzzing_framework_test_fuzzer", + args: [ "data/corpus" ], }, use: [ { protocol: "fuchsia.fuzzer.Instrumentation" },
diff --git a/src/sys/fuzzing/framework/tests/meta/integration-tests.cml b/src/sys/fuzzing/framework/tests/meta/integration-tests.cml new file mode 100644 index 0000000..66b2191 --- /dev/null +++ b/src/sys/fuzzing/framework/tests/meta/integration-tests.cml
@@ -0,0 +1,47 @@ +// Copyright 2022 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. + +// This manifest corresponds to the root of the realm used for the integration +// tests. +{ + children: [ + { + name: "coverage", + url: "#meta/coverage.cm", + }, + { + name: "engine", + url: "#meta/engine.cm", + }, + ], + offer: [ + { + protocol: [ + "fuchsia.fuzzer.CoverageProvider", + "fuchsia.fuzzer.Instrumentation", + ], + from: "#coverage", + to: "#engine", + }, + { + protocol: "fuchsia.process.Launcher", + from: "parent", + to: "#engine", + }, + { + protocol: "fuchsia.logger.LogSink", + from: "parent", + to: [ + "#coverage", + "#engine", + ], + }, + ], + expose: [ + { + protocol: "fuchsia.test.Suite", + from: "#engine", + }, + ], +}
diff --git a/src/sys/fuzzing/libfuzzer/meta/error-unittests.cml b/src/sys/fuzzing/libfuzzer/meta/error-unittests.cml index d51ca97..4b1db2e 100644 --- a/src/sys/fuzzing/libfuzzer/meta/error-unittests.cml +++ b/src/sys/fuzzing/libfuzzer/meta/error-unittests.cml
@@ -3,10 +3,16 @@ // found in the LICENSE file. { include: [ - "//src/sys/fuzzing/common/meta/test.shard.cml", + "//sdk/lib/inspect/client.shard.cml", + "//src/sys/test_runners/gtest/default.shard.cml", "//src/sys/test_runners/tmp_storage.shard.cml", + "syslog/client.shard.cml", ], program: { binary: "test/component_fuzzing_libfuzzer_error_unittests", }, + use: [ + { protocol: "test.fuzzer.Relay" }, + { protocol: "fuchsia.process.Launcher" }, + ], }
diff --git a/src/sys/fuzzing/libfuzzer/meta/unittests.cml b/src/sys/fuzzing/libfuzzer/meta/unittests.cml index 6f79128..17b14ba 100644 --- a/src/sys/fuzzing/libfuzzer/meta/unittests.cml +++ b/src/sys/fuzzing/libfuzzer/meta/unittests.cml
@@ -3,13 +3,16 @@ // found in the LICENSE file. { include: [ - "//src/sys/fuzzing/common/meta/test.shard.cml", + "//sdk/lib/inspect/client.shard.cml", + "//src/sys/test_runners/gtest/default.shard.cml", "//src/sys/test_runners/tmp_storage.shard.cml", + "syslog/client.shard.cml", ], program: { binary: "test/component_fuzzing_libfuzzer_unittests", }, use: [ { protocol: "test.fuzzer.Relay" }, + { protocol: "fuchsia.process.Launcher" }, ], }
diff --git a/src/sys/fuzzing/registry/tests/meta/integration-tests.cml b/src/sys/fuzzing/registry/tests/meta/integration-tests.cml index 653fe55..0f1c282 100644 --- a/src/sys/fuzzing/registry/tests/meta/integration-tests.cml +++ b/src/sys/fuzzing/registry/tests/meta/integration-tests.cml
@@ -2,16 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. { - include: [ "//src/sys/fuzzing/common/meta/test.shard.cml" ], + include: [ + "//sdk/lib/inspect/client.shard.cml", + "//src/sys/test_runners/gtest/default.shard.cml", + "syslog/client.shard.cml", + ], program: { binary: "test/registry_integration_tests", }, use: [ - { - protocol: [ - "fuchsia.fuzzer.Registrar", - "fuchsia.fuzzer.Registry", - ], - }, + { protocol: "fuchsia.fuzzer.Registrar" }, + { protocol: "fuchsia.fuzzer.Registry" }, + { protocol: "fuchsia.process.Launcher" }, ], }