# 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/zbi/migrated_zbi_test.gni")
import("//build/unification/zbi/resource.gni")

# Pick out the tests.
group("mexec") {
  testonly = true
  deps = [
    ":zbi-child-image",
    ":zbi-parent-image",
  ]
}

### Defines the child.

# A test binary that returns success unconditionally. This binary running at
# all indicates that the system booted sufficiently to run a userspace process.
test("zbi-child") {
  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
    }
  }
  test_group = "core"
  sources = [ "success.cc" ]
}

# The parent binary mexecs into this child image. The parent image is booted
# with kernel.mexec-force-high-ramdisk=true meaning that it will place the child
# image's ramdisk in high (>4GiB) memory.
migrated_zbi_test("zbi-child-image") {
  assert(current_cpu != "")

  args = [ "userboot=test/core/zbi-child-test" ]
  deps = [
    ":zbi-child",
    "//build/unification/zbi:kernel",
  ]
}

### Defines the parent.

zbi_outputs = get_target_outputs(":zbi-child-image_zbi")

resource("zbi-child-image-resource") {
  testonly = true
  deps = [ ":zbi-child-image_zbi" ]
  sources = [ zbi_outputs[0] ]
  outputs = [ "testdata/zbi-bootfs/zbi-child-image.zbi" ]
}

# Simple binary that mexecs into the child binary.
test("zbi-parent") {
  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
    }
  }
  test_group = "core"
  sources = [ "parent.cc" ]

  data_deps = [ ":zbi-child-image-resource" ]

  deps = [
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/fidl",
    "//zircon/public/lib/libzbi",
    "//zircon/public/lib/zx",
    "//zircon/public/lib/zxtest",
  ]
}

migrated_zbi_test("zbi-parent-image") {
  assert(current_cpu != "")
  args = [
    "bootsvc.next=test/core/zbi-parent-test",
    "kernel.enable-debugging-syscalls=true",  # Enables mexec.
    "kernel.mexec-force-high-ramdisk=true",  # Force the child to put the RD in
                                             # high memory
  ]
  deps = [
    ":zbi-parent",
    "//build/unification/zbi:kernel",
    "//zircon/system/core/bootsvc",
  ]

  assert_no_deps = [ "//zircon/system/dev/*" ]
}
