[Fuchsia] Enable code coverage for Cr-Fuchsia test targets.

Support combining cmx files with cmc_merge tool.
Add coverage cmx file for test binaries built with use_clang_coverage flag. The file contains the fuchsia.debugdata.DebugData service, which is used by the Fuchsia profile runtime to gather coverage information.

Bug: 1156885
Change-Id: Iba91a865e0f707706e0550fcea69cb8cc440a781
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2596114
Reviewed-by: Wez <[email protected]>
Reviewed-by: Dirk Pranke <[email protected]>
Reviewed-by: Kevin Marshall <[email protected]>
Commit-Queue: Chong Gu <[email protected]>
Auto-Submit: Chong Gu <[email protected]>
Cr-Commit-Position: refs/heads/master@{#848384}
diff --git a/testing/test.gni b/testing/test.gni
index a9a0ece..a522190 100644
--- a/testing/test.gni
+++ b/testing/test.gni
@@ -16,8 +16,10 @@
   import("//build/config/sanitizers/sanitizers.gni")
 } else if (is_fuchsia) {
   import("//build/config/chromecast_build.gni")
+  import("//build/config/coverage/coverage.gni")
   import("//build/config/fuchsia/generate_runner_scripts.gni")
   import("//build/config/fuchsia/package.gni")
+  import("//third_party/fuchsia-sdk/sdk/build/cmc.gni")
 } else if (is_chromeos_ash) {
   import("//build/config/chromeos/rules.gni")
   import("//build/config/sanitizers/sanitizers.gni")
@@ -245,6 +247,26 @@
     _pkg_target = "${_output_name}_pkg"
     _exec_target = "${_output_name}__exec"
 
+    # TODO(1019938): switch the default to tests.cmx which doesn't request
+    # the deprecated-ambient-replace-as-executable feature.
+    if (!defined(invoker.manifest)) {
+      manifest = "//build/config/fuchsia/tests-with-exec.cmx"
+    } else {
+      manifest = invoker.manifest
+    }
+
+    if (use_clang_coverage) {
+      component_with_coverage_manifest = "${target_name}-coverage.test-cmx"
+      cmc_merge(component_with_coverage_manifest) {
+        sources = [
+          "//build/config/fuchsia/add_DebugData_service.test-cmx",
+          manifest,
+        ]
+        output_name = target_name
+      }
+      manifest = "${target_out_dir}/${component_with_coverage_manifest}"
+    }
+
     fuchsia_package_runner(target_name) {
       is_test_exe = true
       forward_variables_from(invoker,
@@ -261,9 +283,11 @@
     }
 
     cr_fuchsia_package(_pkg_target) {
-      forward_variables_from(invoker, [ "manifest" ])
       binary = ":$_exec_target"
       package_name_override = _output_name
+      if (use_clang_coverage) {
+        deps = [ ":$component_with_coverage_manifest" ]
+      }
     }
 
     executable(_exec_target) {