# Copyright 2019 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.

##########################################
# Though under //zircon, this build file #
# is meant to be used in the Fuchsia GN  #
# build.                                 #
# See fxb/36139.                         #
##########################################

assert(!defined(zx) || zx != "/",
       "This file can only be used in the Fuchsia GN build.")

import("//build/test.gni")
import("//build/unification/images/migrated_manifest.gni")
import("//build/unification/zbi/migrated_zbi_test.gni")
import("//build/unification/zbi/resource.gni")
import("//build/unification/zbi/zbi_input.gni")
import("//zircon/public/gn/test/zbi_test_success.gni")

test("bootsvc-unit-test") {
  # Dependent manifests unfortunately cannot be marked as `testonly`.
  # TODO(44278): Remove when converting this file to proper GN build idioms.
  if (is_fuchsia) {
    testonly = false
  }
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  if (is_fuchsia) {
    fdio_config = [ "//build/config/fuchsia:fdio_config" ]
    if (configs + fdio_config - fdio_config != configs) {
      configs -= fdio_config
    }
  }
  output_name = "bootsvc-unit-test"
  sources = [ "unit-test.cc" ]
  deps = [
    "..:util",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/unittest",
  ]
}

executable("bootsvc-integration-test") {
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  if (is_fuchsia) {
    fdio_config = [ "//build/config/fuchsia:fdio_config" ]
    if (configs + fdio_config - fdio_config != configs) {
      configs -= fdio_config
    }
  }

  # TODO(44278): Revert to true when converting this file to proper GN build
  # idioms.
  testonly = false
  defines = [ "ZBI_TEST_SUCCESS_STRING=\"$zbi_test_success_string\"" ]
  sources = [ "integration-test.cc" ]
  deps = [
    "..:util",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/safemath",
    "//zircon/public/lib/zx",
    "//zircon/public/lib/zxtest",
    "//zircon/system/fidl/fuchsia-boot:c",
    "//zircon/system/fidl/fuchsia-io:llcpp",
  ]
}

# This collects all the runtime dependencies of bootsvc-integration-test,
# to bring them into a test ZBI.
zbi_input("integration-test-deps") {
  visibility = [ ":*" ]
  testonly = true
  deps = [
    # Include the three additional ZBI items that we test the behavior of in
    # the integration test.
    ":integration-test-crashlog",
    ":integration-test-factory-item",
    ":integration-test-image-arg",
    ":shutdown-flag",

    # Include a fake file in the ZBI in meta/, so we can test against a file that shouldn't be
    # executable.
    ":fake-cm-file",

    # Include some fake libraries at both packaged and unpackaged locations to test that they can be
    # opened executable. This is done so that the test doesn't need to look at different paths
    # depending on whether the build is using sanitizers.
    ":fake-packaged-library",
    ":fake-unpackaged-library",

    # Pull in the dependencies of devcoordinator so that we can test
    # requesting libdriver.so from the bootsvc loader service.
    # This could possibly be smaller, but seems pretty reasonable.
    "//zircon/system/core/netsvc:device-name-provider",
    "//zircon/system/core/miscsvc",
    "//zircon/system/core/netsvc",
    "//build/unification/zbi:bin.pwrbtn-monitor-zbi",
    "//build/unification/zbi:bin.svchost-zbi",
    "//build/unification/zbi:driver.fragment-zbi",
    "//build/unification/zbi:driver.fragment.proxy-zbi",
  ]
}

# The bootsvc integration tests exercises reading several different kinds of
# entries from the ZBI.  Make sure we include one of each, so that we can test
# that bootsvc is exposing access to them correctly.
zbi_input("integration-test-factory-item") {
  visibility = [ ":*" ]
  testonly = true
  type = "BOOTFS_FACTORY"
  args = [ "--entry=IAmAFactoryItemHooray" ]
}

zbi_input("integration-test-crashlog") {
  visibility = [ ":*" ]
  testonly = true
  type = "CRASHLOG"
  args = [ "--entry=IAmACrashLogButNotAVeryLongOne" ]
}

# This flag is passed to the bootsvc so that when the test binary exits bootsvc
# shuts the system down.
zbi_input("shutdown-flag") {
  visibility = [ ":*" ]
  testonly = true
  type = "cmdline"
  args = [ "--entry=bootsvc.on_next_process_exit=shutdown" ]
}

# This file must contain a trailing newline, but you can't inline that in a
# shell command with --entry, so generate a file and pass that as the argument
# when building the bootsvc-integration-tests zbi.
generated_file("bootsvc-integration-test-image-arg") {
  visibility = [ ":*" ]
  testonly = true

  outputs = [ "$target_out_dir/$target_name.txt" ]

  # Writing out a list rather than a string means it gets a trailing newline.
  contents = [ "testkey=testvalue" ]
}

zbi_input("integration-test-image-arg") {
  visibility = [ ":*" ]
  testonly = true
  deps = [ ":bootsvc-integration-test-image-arg" ]
  type = "IMAGE_ARGS"
  sources = get_target_outputs(deps[0])
}

generated_file("gen-dummy-file") {
  outputs = [ "$target_out_dir/$target_name" ]
  contents = "doesn't matter"
}

resource("fake-cm-file") {
  visibility = [ ":*" ]
  deps = [ ":gen-dummy-file" ]
  sources = [ "$target_out_dir/gen-dummy-file" ]
  outputs = [ "meta/fake.cm" ]
}

resource("fake-packaged-library") {
  visibility = [ ":*" ]
  deps = [ ":gen-dummy-file" ]
  sources = [ "$target_out_dir/gen-dummy-file" ]
  outputs = [ "pkg/dummy_pkg/lib/dummy.so" ]
}

resource("fake-unpackaged-library") {
  visibility = [ ":*" ]
  deps = [ ":gen-dummy-file" ]
  sources = [ "$target_out_dir/gen-dummy-file" ]
  outputs = [ "lib/dummy.so" ]
}

migrated_zbi_test("bootsvc-integration-tests") {
  assert(current_cpu != "")

  args = [
    "userboot=bin/bootsvc",
    "bootsvc.next=bin/bootsvc-integration-test,testargument",
    "kernel.root-job.behavior=shutdown",
  ]
  deps = [
    # We need a zircon kernel to get off the ground at all.
    "//build/unification/zbi:kernel",

    # Include bootsvc itself, since that's what we're testing here.  Note
    # that this uses the package() target for bootsvc, which comes with its
    # own data_deps to exercise the `userboot.root` option to find bootsvc
    # and its libraries inside a package directory in the BOOTFS.
    "..",

    # Include the integration test binary, which bootsvc will launch.
    ":bootsvc-integration-test",

    # Include the test's own runtime dependencies.
    ":integration-test-deps",
  ]

  output_dir = root_build_dir
  output_name = "$target_name-$current_cpu"
}

migrated_zbi_test("bootsvc-root-job-test") {
  args = [
    "userboot=bin/bootsvc",
    "bootsvc.next=test/core/zbi-child-test",
    "kernel.root-job.behavior=shutdown",
    "kernel.root-job.notice=$zbi_test_success_string",
  ]
  deps = [
    # We need a zircon kernel to get off the ground at all.
    "//build/unification/zbi:kernel",

    # Include bootsvc itself, since that's what we're testing here.  Note
    # that this uses the package() target for bootsvc, which comes with its
    # own data_deps to exercise the `userboot.root` option to find bootsvc
    # and its libraries inside a package directory in the BOOTFS.
    "..",

    # Include the integration test binary, which bootsvc will launch.
    "//zircon/system/utest/mexec:zbi-child",
  ]
}

migrated_manifest("bootsvc-unit-test-manifest") {
  deps = [ ":bootsvc-unit-test" ]
}
