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

import("//build/assembly/product_assembly_configuration.gni")
import("//build/testing/boot_tests/kernel_zbi_test.gni")
import("//src/sys/core/build/core.gni")

# Core realm definition to be used only instances of cuckoo_kernel_zbi_test()
core_realm_definition("cuckoo-core-realm") {
  testonly = true
  deps = board_core_realm_shards
  foreach(input_group, cuckoo_kernel_zbi_test_params.input_groups) {
    input_group_label = "//bundles/assembly_input_groups:${input_group}"
    deps += [ "${input_group_label}.core_realm_shards" ]
  }
}

# Generates a product_assembly_configuration for a cukoo tests with a set of
# default settings. Some of these settings may be overridden, see the list
# of parameters for more details.
#
#  Parameters:
#     filesystems: (Required)
#         (scope) Must me a valid filesystems scope that will be forwarded to
#          product_assembly_configuration template.
template("cuckoo_product_assembly_config") {
  product_assembly_configuration(target_name) {
    assert(defined(invoker.filesystems))
    testonly = true
    platform = {
      build_type = "eng"
      intl = {
        # A fake intl_services will be injected
        config_type = "none"
      }
      storage = {
        filesystems = invoker.filesystems
      }
      development_support = {
        authorized_ssh_keys_path =
            rebase_path("//.ssh/pkey.pub", root_build_dir)
      }
    }
    product = {
    }
  }
}

# Default configuration.
cuckoo_product_assembly_config("cuckoo-product-configuration") {
  filesystems = {
    volume = "fxfs"
  }
}

# Use FVM and Fxfs for the data partition.
cuckoo_product_assembly_config("cuckoo-product-configuration-fxfs") {
  filesystems = {
    volume = {
      fvm = {
        data = {
        }
        blob = {
        }
      }
    }
  }
}

# Use FVM and minfs for the data partition.
cuckoo_product_assembly_config("cuckoo-product-configuration-minfs") {
  filesystems = {
    volume = {
      fvm = {
        data = {
          data_filesystem_format = "minfs"
        }
        blob = {
        }
      }
    }
  }
}
