[audio_core][test] Split each test into a different component/executable

Prior CLs have started to organize integration tests by API, so that,
for example, audio_capturer_test.cc tests the AudioCapturer API. Since
there is no dependency across source files, each source file can be
compiled into a separate executable. This is conceptually cleaner and in
theory makes test execution more incremental (although the current build
infrastructure cannot execute tests incrementally).

Bug: 50645
Change-Id: Icd2cef9f9d68f6555b531b1b246f2e7918f25e74
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/404872
Commit-Queue: Tom Bergan <tombergan@google.com>
Reviewed-by: Tim Detwiler <tjdetwiler@google.com>
Testability-Review: Tim Detwiler <tjdetwiler@google.com>
diff --git a/garnet/bin/run_test_component/max_severity_fuchsia.json b/garnet/bin/run_test_component/max_severity_fuchsia.json
index d593364..b35224c 100644
--- a/garnet/bin/run_test_component/max_severity_fuchsia.json
+++ b/garnet/bin/run_test_component/max_severity_fuchsia.json
@@ -37,7 +37,11 @@
          "max_severity": "ERROR"
       },
       {
-         "url": "fuchsia-pkg://fuchsia.com/audio-core-api-tests#meta/audio-core-api-tests.cmx",
+         "url": "fuchsia-pkg://fuchsia.com/audio-core-api-tests#meta/audio-renderer-test.cmx",
+         "max_severity": "ERROR"
+      },
+      {
+         "url": "fuchsia-pkg://fuchsia.com/audio-core-api-tests#meta/audio-tuner-test.cmx",
          "max_severity": "ERROR"
       },
       {
diff --git a/src/media/audio/audio_core/test/api/BUILD.gn b/src/media/audio/audio_core/test/api/BUILD.gn
index 3cd06ab..cd20b5f 100644
--- a/src/media/audio/audio_core/test/api/BUILD.gn
+++ b/src/media/audio/audio_core/test/api/BUILD.gn
@@ -2,57 +2,71 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-# This directory contains two kinds of audio_core integration tests, in two
-# different binaries:
-#
-#   audio-core-api-tests
-#     Validates the "control plane" subset of the API. These tests do not
-#     check how data flows through the system.
-#
-#   audio-core-api-pipeline-tests
-#     Validates the flow of audio data. Verifying correct data flow requires
-#     timers, so these tests are run on real hardware only.
-#     TODO(50645): this binary doesn't exist yet
-#
-# For convenience, both tests are available in the same package.
+import("//build/testing/environments.gni")
+import("//src/media/audio/audio_core/test/api/api_test_component.gni")
+import("//src/sys/build/fuchsia_test_package.gni")
 
-import("//build/test/test_package.gni")
-
-test_package("audio-core-api-tests") {
-  deps = [ ":audio-core-api-tests-bin" ]
-
-  tests = [
-    {
-      name = "audio-core-api-tests"
-      environments = basic_envs
-    },
-  ]
+audio_core_api_test_component("activity-reporter-test") {
+  sources = [ "activity_reporter_test.cc" ]
 }
 
-executable("audio-core-api-tests-bin") {
-  testonly = true
-  output_name = "audio-core-api-tests"
-
-  sources = [
-    "activity_reporter_test.cc",
-    "audio_capturer_test.cc",
-    "audio_renderer_test.cc",
-    "audio_tuner_test.cc",
-    "gain_control_test.cc",
-    "usage_gain_reporter_test.cc",
-    "usage_reporter_test.cc",
-    "volume_control.cc",
-  ]
-
+audio_core_api_test_component("audio-capturer-test") {
+  sources = [ "audio_capturer_test.cc" ]
   deps = [
-    "//sdk/fidl/fuchsia.media",
-    "//sdk/fidl/fuchsia.virtualaudio",
     "//sdk/lib/media/audio/cpp",
-    "//src/lib/fxl/test:gtest_main",
     "//src/media/audio/lib/clock:clone_mono",
     "//src/media/audio/lib/clock/testing",
-    "//src/media/audio/lib/logging",
-    "//src/media/audio/lib/test:hermetic_audio_test",
-    "//third_party/googletest:gmock",
   ]
 }
+
+audio_core_api_test_component("audio-renderer-test") {
+  sources = [ "audio_renderer_test.cc" ]
+  deps = [
+    "//sdk/lib/media/audio/cpp",
+    "//src/media/audio/lib/clock:clone_mono",
+    "//src/media/audio/lib/clock/testing",
+  ]
+}
+
+audio_core_api_test_component("audio-tuner-test") {
+  sources = [ "audio_tuner_test.cc" ]
+  deps = [ "//sdk/fidl/fuchsia.media.tuning" ]
+}
+
+audio_core_api_test_component("gain-control-test") {
+  sources = [ "gain_control_test.cc" ]
+}
+
+audio_core_api_test_component("usage-gain-reporter-test") {
+  sources = [ "usage_gain_reporter_test.cc" ]
+  deps = [ "//sdk/fidl/fuchsia.media.audio" ]
+}
+
+audio_core_api_test_component("usage-reporter-test") {
+  sources = [ "usage_reporter_test.cc" ]
+}
+
+audio_core_api_test_component("volume-control-test") {
+  sources = [ "volume_control_test.cc" ]
+}
+
+# These tests can run anywhere, including in emulators.
+fuchsia_test_package("audio-core-api-tests") {
+  test_components = [
+    ":activity-reporter-test",
+    ":audio-capturer-test",
+    ":audio-renderer-test",
+    ":audio-tuner-test",
+    ":gain-control-test",
+    ":usage-gain-reporter-test",
+    ":usage-reporter-test",
+    ":volume-control-test",
+  ]
+}
+# TODO(50645): add after tests have been moved
+# These tests must run on real hardware because they depend on real time.
+#fuchsia_test_package("audio-core-api-tests-hw-only") {
+#  test_specs = [
+#    environments = hardware_envs
+#  ]
+#}
diff --git a/src/media/audio/audio_core/test/api/activity_reporter_test.cc b/src/media/audio/audio_core/test/api/activity_reporter_test.cc
index c4cbe0f..cb15923 100644
--- a/src/media/audio/audio_core/test/api/activity_reporter_test.cc
+++ b/src/media/audio/audio_core/test/api/activity_reporter_test.cc
@@ -3,9 +3,6 @@
 // found in the LICENSE file.
 
 #include <fuchsia/media/cpp/fidl.h>
-#include <fuchsia/media/tuning/cpp/fidl.h>
-#include <fuchsia/virtualaudio/cpp/fidl.h>
-#include <lib/zx/vmo.h>
 
 #include <cmath>
 
diff --git a/src/media/audio/audio_core/test/api/api_test_component.gni b/src/media/audio/audio_core/test/api/api_test_component.gni
new file mode 100644
index 0000000..ca50adc
--- /dev/null
+++ b/src/media/audio/audio_core/test/api/api_test_component.gni
@@ -0,0 +1,75 @@
+# Copyright 2020 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.
+
+import("//src/sys/build/fuchsia_component.gni")
+
+# Defines an API integration test.
+#
+# This template creates a fuchsia_component with the given name, where the
+# component contains a test executable built from sources and deps, along with
+# an auto-generated manifest for the test executable. By default, the deps
+# include libraries that will be needed by all tests in this directory.
+#
+# Example:
+# ```
+# audio_core_api_test_comonent(name) {
+#   sources = ["foo_test.cc"]
+#   deps = ["//lib"]
+# }
+# ```
+#
+# Parameters
+#
+#   sources (required)
+#     List of source files to include in this test component.
+#     Type: list(path)
+#
+#   deps (optional)
+#     List of dependencies files to include in this test component.
+#     Type: list(target)
+#
+template("audio_core_api_test_component") {
+  assert(defined(invoker.sources) && invoker.sources != [],
+         "sources must be non-empty")
+
+  binary = "${target_name}-bin"
+  cmx_target = "${target_name}_cmx"
+  cmx_output = "${target_gen_dir}/${target_name}.cmx"
+
+  generated_file(cmx_target) {
+    contents = read_file("meta/audio-core-api-tests.cmx", "string")
+    contents = string_replace(contents, "{binary}", binary)
+    outputs = [ cmx_output ]
+    output_conversion = "string"
+    testonly = true
+  }
+
+  fuchsia_component(target_name) {
+    testonly = true
+    manifest = get_target_outputs(":${cmx_target}")
+    manifest = manifest[0]
+    deps = [
+      ":${cmx_target}",
+      ":${target_name}-bin",
+    ]
+  }
+
+  executable("${target_name}-bin") {
+    forward_variables_from(invoker,
+                           [
+                             "deps",
+                             "sources",
+                           ])
+    if (!defined(deps)) {
+      deps = []
+    }
+    deps += [
+      "//sdk/fidl/fuchsia.media",
+      "//src/lib/fxl/test:gtest_main",
+      "//src/media/audio/lib/test:hermetic_audio_test",
+      "//third_party/googletest:gmock",
+    ]
+    testonly = true
+  }
+}
diff --git a/src/media/audio/audio_core/test/api/audio_capturer_test.cc b/src/media/audio/audio_core/test/api/audio_capturer_test.cc
index 2a03c26..bda5109 100644
--- a/src/media/audio/audio_core/test/api/audio_capturer_test.cc
+++ b/src/media/audio/audio_core/test/api/audio_capturer_test.cc
@@ -9,7 +9,6 @@
 #include "lib/media/audio/cpp/types.h"
 #include "src/media/audio/lib/clock/clone_mono.h"
 #include "src/media/audio/lib/clock/testing/clock_test.h"
-#include "src/media/audio/lib/logging/logging.h"
 #include "src/media/audio/lib/test/hermetic_audio_test.h"
 
 namespace media::audio::test {
diff --git a/src/media/audio/audio_core/test/api/audio_tuner_test.cc b/src/media/audio/audio_core/test/api/audio_tuner_test.cc
index 5567896..89abd73 100644
--- a/src/media/audio/audio_core/test/api/audio_tuner_test.cc
+++ b/src/media/audio/audio_core/test/api/audio_tuner_test.cc
@@ -4,7 +4,6 @@
 
 #include <fuchsia/media/cpp/fidl.h>
 #include <fuchsia/media/tuning/cpp/fidl.h>
-#include <fuchsia/virtualaudio/cpp/fidl.h>
 
 #include <cmath>
 
diff --git a/src/media/audio/audio_core/test/api/meta/audio-core-api-tests.cmx b/src/media/audio/audio_core/test/api/meta/audio-core-api-tests.cmx
index 206f870..5532f29 100644
--- a/src/media/audio/audio_core/test/api/meta/audio-core-api-tests.cmx
+++ b/src/media/audio/audio_core/test/api/meta/audio-core-api-tests.cmx
@@ -10,7 +10,7 @@
         }
     },
     "program": {
-        "binary": "test/audio-core-api-tests"
+        "binary": "bin/{binary}"
     },
     "sandbox": {
         "features": [
diff --git a/src/media/audio/audio_core/test/api/usage_gain_reporter_test.cc b/src/media/audio/audio_core/test/api/usage_gain_reporter_test.cc
index f8662db..b92aa59 100644
--- a/src/media/audio/audio_core/test/api/usage_gain_reporter_test.cc
+++ b/src/media/audio/audio_core/test/api/usage_gain_reporter_test.cc
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <fuchsia/media/audio/cpp/fidl.h>
 #include <fuchsia/media/cpp/fidl.h>
-#include <fuchsia/media/tuning/cpp/fidl.h>
-#include <fuchsia/virtualaudio/cpp/fidl.h>
 
 #include <cmath>
 #include <memory>
diff --git a/src/media/audio/audio_core/test/api/usage_reporter_test.cc b/src/media/audio/audio_core/test/api/usage_reporter_test.cc
index e3619e6..a4f074c 100644
--- a/src/media/audio/audio_core/test/api/usage_reporter_test.cc
+++ b/src/media/audio/audio_core/test/api/usage_reporter_test.cc
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 
 #include <fuchsia/media/cpp/fidl.h>
-#include <fuchsia/media/tuning/cpp/fidl.h>
-#include <fuchsia/virtualaudio/cpp/fidl.h>
 
 #include <cmath>
 
diff --git a/src/media/audio/audio_core/test/api/volume_control.cc b/src/media/audio/audio_core/test/api/volume_control_test.cc
similarity index 97%
rename from src/media/audio/audio_core/test/api/volume_control.cc
rename to src/media/audio/audio_core/test/api/volume_control_test.cc
index 43113bd..210b189 100644
--- a/src/media/audio/audio_core/test/api/volume_control.cc
+++ b/src/media/audio/audio_core/test/api/volume_control_test.cc
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 
 #include <fuchsia/media/cpp/fidl.h>
-#include <fuchsia/media/tuning/cpp/fidl.h>
-#include <fuchsia/virtualaudio/cpp/fidl.h>
 
 #include <cmath>