|  | # Copyright 2015 The Chromium 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("ios_sdk.gni") | 
|  |  | 
|  | # Constants corresponding to the bundle type identifier for XCTest and XCUITest | 
|  | # targets. | 
|  | _ios_xcode_xctest_bundle_id = "com.apple.product-type.bundle.unit-test" | 
|  | _ios_xcode_xcuitest_bundle_id = "com.apple.product-type.bundle.ui-testing" | 
|  |  | 
|  | template("create_signed_bundle") { | 
|  | assert(defined(invoker.output_name), | 
|  | "output_name must be defined for $target_name") | 
|  | assert(defined(invoker.product_type), | 
|  | "product_type must be defined for $target_name") | 
|  | assert(defined(invoker.bundle_extension), | 
|  | "bundle_extension must be defined for $target_name") | 
|  | assert(defined(invoker.bundle_binary_target) != | 
|  | defined(invoker.bundle_executable_path), | 
|  | "Only one of bundle_binary_target or bundle_executable_path may be " + | 
|  | "specified for $target_name") | 
|  | if (defined(invoker.xcode_test_application_name)) { | 
|  | assert( | 
|  | invoker.product_type == _ios_xcode_xctest_bundle_id || | 
|  | invoker.product_type == _ios_xcode_xcuitest_bundle_id, | 
|  | "xcode_test_application_name can be only defined for Xcode unit or " + | 
|  | "ui test target.") | 
|  | } | 
|  |  | 
|  | if (defined(invoker.bundle_executable_path)) { | 
|  | _bundle_executable_path = invoker.bundle_executable_path | 
|  | } else { | 
|  | _bundle_binary_target = invoker.bundle_binary_target | 
|  | _bundle_binary_output = get_label_info(_bundle_binary_target, "name") | 
|  | if (defined(invoker.bundle_binary_output)) { | 
|  | _bundle_binary_output = invoker.bundle_binary_output | 
|  | } | 
|  | _bundle_executable_path = | 
|  | get_label_info(_bundle_binary_target, "target_out_dir") + | 
|  | "/$_bundle_binary_output" | 
|  | } | 
|  |  | 
|  | _output_name = invoker.output_name | 
|  | _bundle_gen_dir = root_out_dir | 
|  | _bundle_extension = invoker.bundle_extension | 
|  |  | 
|  | create_bundle(target_name) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "data_deps", | 
|  | "deps", | 
|  | "product_type", | 
|  | "public_configs", | 
|  | "public_deps", | 
|  | "testonly", | 
|  | "visibility", | 
|  | "xcode_test_application_name", | 
|  | ]) | 
|  | bundle_root_dir = "$_bundle_gen_dir/$_output_name$_bundle_extension" | 
|  | bundle_contents_dir = bundle_root_dir | 
|  | bundle_resources_dir = bundle_contents_dir | 
|  | bundle_executable_dir = bundle_contents_dir | 
|  |  | 
|  | code_signing_script = | 
|  | "//third_party/mini_chromium/mini_chromium/build/ios/codesign.py" | 
|  | code_signing_sources = [ _bundle_executable_path ] | 
|  | code_signing_outputs = [ "$bundle_executable_dir/$_output_name" ] | 
|  |  | 
|  | if (ios_enable_code_signing) { | 
|  | code_signing_outputs += | 
|  | [ "$bundle_contents_dir/_CodeSignature/CodeResources" ] | 
|  | } | 
|  |  | 
|  | if (defined(invoker.extra_system_frameworks)) { | 
|  | foreach(_framework, invoker.extra_system_frameworks) { | 
|  | code_signing_outputs += [ "$bundle_contents_dir/Frameworks/" + | 
|  | get_path_info(_framework, "file") ] | 
|  | } | 
|  | } | 
|  |  | 
|  | code_signing_args = [ | 
|  | "code-sign-bundle", | 
|  | "-t=" + ios_sdk_name, | 
|  | "-i=" + ios_code_signing_identity, | 
|  | "-b=" + rebase_path(_bundle_executable_path, root_build_dir), | 
|  | ] | 
|  | code_signing_args += [ rebase_path(bundle_root_dir, root_build_dir) ] | 
|  | if (!ios_enable_code_signing) { | 
|  | code_signing_args += [ "--disable-code-signature" ] | 
|  | } | 
|  | if (defined(invoker.extra_system_frameworks)) { | 
|  | # All framework in extra_system_frameworks are expected to be | 
|  | # system framework and the path to be already system absolute | 
|  | # so do not use rebase_path here. | 
|  | foreach(_framework, invoker.extra_system_frameworks) { | 
|  | code_signing_args += [ "-F=" + _framework ] | 
|  | } | 
|  | } | 
|  |  | 
|  | _entitlements_path = | 
|  | "//third_party/mini_chromium/mini_chromium/build/ios/entitlements.plist" | 
|  | code_signing_args += | 
|  | [ "-e=" + rebase_path(_entitlements_path, root_build_dir) ] | 
|  |  | 
|  | xcode_extra_attributes = { | 
|  | IPHONEOS_DEPLOYMENT_TARGET = ios_deployment_target | 
|  | CODE_SIGN_STYLE = "Manual" | 
|  | CODE_SIGN_IDENTITY = "" | 
|  |  | 
|  | if (defined(invoker.xcode_extra_attributes)) { | 
|  | forward_variables_from(invoker.xcode_extra_attributes, "*") | 
|  | } | 
|  | } | 
|  |  | 
|  | if (!defined(public_deps)) { | 
|  | public_deps = [] | 
|  | } | 
|  |  | 
|  | if (defined(invoker.bundle_binary_target)) { | 
|  | public_deps += [ invoker.bundle_binary_target ] | 
|  | } | 
|  |  | 
|  | if (defined(invoker.bundle_deps)) { | 
|  | if (!defined(deps)) { | 
|  | deps = [] | 
|  | } | 
|  | deps += invoker.bundle_deps | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | template("info_plist") { | 
|  | assert(defined(invoker.plist_templates), | 
|  | "A template plist file must be specified for $target_name") | 
|  | assert(defined(invoker.executable_name), | 
|  | "The executable_name must be specified for $target_name") | 
|  |  | 
|  | _plist_templates = invoker.plist_templates | 
|  | _executable_name = invoker.executable_name | 
|  | _target_name = target_name | 
|  | _output_name = "$target_gen_dir/$_target_name.plist" | 
|  |  | 
|  | _format = "binary1" | 
|  | _substitutions = [ | 
|  | "BUILD_MACHINE_OS_BUILD=$machine_os_build", | 
|  | "EXECUTABLE_NAME=$_executable_name", | 
|  | "GCC_VERSION=com.apple.compilers.llvm.clang.1_0", | 
|  | "PRODUCT_NAME=$_executable_name", | 
|  | "XCODE_BUILD=$xcode_build", | 
|  | "XCODE_VERSION=$xcode_version", | 
|  | "IOS_DEPLOYMENT_TARGET=$ios_deployment_target", | 
|  | "IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix", | 
|  | "IOS_PLATFORM_BUILD=$ios_platform_build", | 
|  | "IOS_PLATFORM_NAME=$ios_sdk_name", | 
|  | "IOS_PLATFORM_VERSION=$ios_sdk_version", | 
|  | "IOS_SDK_BUILD=$ios_sdk_build", | 
|  | "IOS_SDK_NAME=$ios_sdk_name$ios_sdk_version", | 
|  | "IOS_SUPPORTED_PLATFORM=$ios_sdk_platform", | 
|  | ] | 
|  | if (defined(invoker.extra_substitutions)) { | 
|  | foreach(_substitution, invoker.extra_substitutions) { | 
|  | _substitutions += [ _substitution ] | 
|  | } | 
|  | } | 
|  |  | 
|  | _merge_plist_target = _target_name + "_merge_plist" | 
|  | _merged_plist_output_name = "$target_gen_dir/${_target_name}_merged.plist" | 
|  | action(_merge_plist_target) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "testonly", | 
|  | "deps", | 
|  | ]) | 
|  | script = "//third_party/mini_chromium/mini_chromium/build/ios/plist_util.py" | 
|  |  | 
|  | sources = _plist_templates | 
|  |  | 
|  | outputs = [ _merged_plist_output_name ] | 
|  | args = [ | 
|  | "merge", | 
|  | "-f=xml1", | 
|  | "-o=" + rebase_path(_merged_plist_output_name, root_build_dir), | 
|  | ] + rebase_path(sources, root_build_dir) | 
|  | } | 
|  |  | 
|  | action(target_name) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "testonly", | 
|  | "visibility", | 
|  | ]) | 
|  | script = "//third_party/mini_chromium/mini_chromium/build/ios/plist_util.py" | 
|  | sources = [ _merged_plist_output_name ] | 
|  | outputs = [ _output_name ] | 
|  | args = [ | 
|  | "substitute", | 
|  | "-f=" + _format, | 
|  | "-o=" + rebase_path(_output_name, root_build_dir), | 
|  | "-t=" + rebase_path(_merged_plist_output_name, root_build_dir), | 
|  | ] | 
|  | foreach(_substitution, _substitutions) { | 
|  | args += [ "-s=$_substitution" ] | 
|  | } | 
|  | deps = [ ":$_merge_plist_target" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | template("ios_app_bundle") { | 
|  | _output_name = target_name | 
|  | _target_name = target_name | 
|  | _plist_templates = [] | 
|  | if (defined(invoker.info_plist)) { | 
|  | _plist_templates += [ invoker.info_plist ] | 
|  | } | 
|  | _plist_extra_substitutions = [] | 
|  | if (defined(invoker.extra_substitutions)) { | 
|  | _plist_extra_substitutions += invoker.extra_substitutions | 
|  | } | 
|  |  | 
|  | _executable_sources_target = _target_name + "_executable_sources" | 
|  | _generate_executable_target = _target_name + "_generate_executable" | 
|  | source_set(_executable_sources_target) { | 
|  | forward_variables_from(invoker, | 
|  | "*", | 
|  | [ | 
|  | "bundle_deps", | 
|  | "extra_system_frameworks", | 
|  | "visibility", | 
|  | "plist_templates", | 
|  | "plist_extra_substitutions", | 
|  | ]) | 
|  | visibility = [ ":$_generate_executable_target" ] | 
|  | } | 
|  |  | 
|  | executable(_generate_executable_target) { | 
|  | visibility = [ ":$_target_name" ] | 
|  | forward_variables_from(invoker, | 
|  | "*", | 
|  | [ | 
|  | "bundle_deps", | 
|  | "extra_system_frameworks", | 
|  | "sources", | 
|  | "visibility", | 
|  | "plist_templates", | 
|  | "plist_extra_substitutions", | 
|  | ]) | 
|  | if (!defined(deps)) { | 
|  | deps = [] | 
|  | } | 
|  | deps += [ ":$_executable_sources_target" ] | 
|  |  | 
|  | if (!defined(libs)) { | 
|  | libs = [] | 
|  | } | 
|  | libs += [ "UIKit.framework" ] | 
|  |  | 
|  | if (!defined(ldflags)) { | 
|  | ldflags = [] | 
|  | } | 
|  | ldflags += [ | 
|  | "-Wl,-rpath,@executable_path/Frameworks", | 
|  | "-Wl,-objc_abi_version,2", | 
|  | ] | 
|  |  | 
|  | output_name = _output_name | 
|  | output_prefix_override = true | 
|  | output_dir = "$target_out_dir" | 
|  | } | 
|  |  | 
|  | _generate_info_plist_target = target_name + "_generate_info_plist" | 
|  | _bundle_info_plist_target = target_name + "_bundle_info_plist" | 
|  | info_plist(_generate_info_plist_target) { | 
|  | visibility = [ ":$_bundle_info_plist_target" ] | 
|  | forward_variables_from(invoker, [ "testonly" ]) | 
|  | executable_name = _output_name | 
|  | plist_templates = [ | 
|  | "//third_party/mini_chromium/mini_chromium/build/ios/BuildInfo.plist", | 
|  | "//third_party/mini_chromium/mini_chromium/build/ios/Application-Info.plist", | 
|  | ] | 
|  | plist_templates += _plist_templates | 
|  | extra_substitutions = _plist_extra_substitutions | 
|  | } | 
|  |  | 
|  | bundle_data(_bundle_info_plist_target) { | 
|  | visibility = [ ":$_target_name" ] | 
|  | forward_variables_from(invoker, [ "testonly" ]) | 
|  | sources = get_target_outputs(":$_generate_info_plist_target") | 
|  | outputs = [ "{{bundle_contents_dir}}/Info.plist" ] | 
|  | public_deps = [ ":$_generate_info_plist_target" ] | 
|  | } | 
|  |  | 
|  | _bundle_executable_path = get_label_info(":$_generate_executable_target", | 
|  | "target_out_dir") + "/$_output_name" | 
|  |  | 
|  | create_signed_bundle(_target_name) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "bundle_deps", | 
|  | "data_deps", | 
|  | "deps", | 
|  | "extra_system_frameworks", | 
|  | "public_configs", | 
|  | "public_deps", | 
|  | "testonly", | 
|  | "visibility", | 
|  | ]) | 
|  | output_name = _output_name | 
|  | product_type = "com.apple.product-type.application" | 
|  | bundle_extension = ".app" | 
|  | bundle_executable_path = _bundle_executable_path | 
|  |  | 
|  | if (!defined(deps)) { | 
|  | deps = [] | 
|  | } | 
|  | deps += [ | 
|  | ":$_bundle_info_plist_target", | 
|  | ":$_generate_executable_target", | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | template("ios_xctest_bundle") { | 
|  | assert(defined(invoker.deps), "deps must be defined for $target_name") | 
|  | assert(defined(invoker.product_type), | 
|  | "product_type must be defined for $target_name") | 
|  | assert(invoker.product_type == _ios_xcode_xctest_bundle_id || | 
|  | invoker.product_type == _ios_xcode_xcuitest_bundle_id, | 
|  | "product_type defined for $target_name is invalid.") | 
|  | assert(defined(invoker.host_target), | 
|  | "host_target must be defined for $target_name") | 
|  | assert(defined(invoker.xcode_test_application_name), | 
|  | "xcode_test_application_name must be defined for $target_name") | 
|  | assert(invoker.xcode_test_application_name != target_name) | 
|  |  | 
|  | _target_name = target_name | 
|  | _output_name = target_name | 
|  |  | 
|  | if (defined(invoker.output_name)) { | 
|  | _output_name = invoker.output_name | 
|  | } | 
|  |  | 
|  | _loadable_module_source = _target_name + "_loadable_module_source" | 
|  | _loadable_module_target = _target_name + "_loadable_module" | 
|  |  | 
|  | source_set(_loadable_module_source) { | 
|  | forward_variables_from(invoker, [ "deps" ]) | 
|  |  | 
|  | testonly = true | 
|  | visibility = [ ":$_loadable_module_target" ] | 
|  | } | 
|  |  | 
|  | loadable_module(_loadable_module_target) { | 
|  | testonly = true | 
|  | visibility = [ ":$_target_name" ] | 
|  |  | 
|  | deps = [ ":$_loadable_module_source" ] | 
|  | configs += | 
|  | [ "//third_party/mini_chromium/mini_chromium/build/ios:xctest_config" ] | 
|  |  | 
|  | output_dir = "$target_out_dir" | 
|  | output_name = _output_name | 
|  | output_prefix_override = true | 
|  | output_extension = "" | 
|  | } | 
|  |  | 
|  | _info_plist_target = _target_name + "_info_plist" | 
|  | _info_plist_bundle = _target_name + "_info_plist_bundle" | 
|  |  | 
|  | info_plist(_info_plist_target) { | 
|  | testonly = true | 
|  | visibility = [ ":$_info_plist_bundle" ] | 
|  |  | 
|  | plist_templates = [ | 
|  | "//third_party/mini_chromium/mini_chromium/build/ios/Module-Info.plist", | 
|  | ] | 
|  | executable_name = _output_name | 
|  |  | 
|  | if (defined(invoker.xctest_bundle_principal_class)) { | 
|  | _principal_class = invoker.xctest_bundle_principal_class | 
|  | } else { | 
|  | # Fall back to a reasonable default value. | 
|  | _principal_class = "NSObject" | 
|  | } | 
|  | extra_substitutions = [ | 
|  | "XCTEST_BUNDLE_PRINCIPAL_CLASS=${_principal_class}", | 
|  | "MODULE_BUNDLE_ID=gtest.$_output_name", | 
|  | ] | 
|  | } | 
|  |  | 
|  | bundle_data(_info_plist_bundle) { | 
|  | testonly = true | 
|  | visibility = [ ":$_target_name" ] | 
|  |  | 
|  | public_deps = [ ":$_info_plist_target" ] | 
|  |  | 
|  | sources = get_target_outputs(":$_info_plist_target") | 
|  | outputs = [ "{{bundle_contents_dir}}/Info.plist" ] | 
|  | } | 
|  |  | 
|  | _xctest_bundle = _target_name + "_bundle" | 
|  | create_signed_bundle(_target_name) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "enable_code_signing", | 
|  | "product_type", | 
|  | "xcode_test_application_name", | 
|  | ]) | 
|  |  | 
|  | testonly = true | 
|  | visibility = [ ":$_xctest_bundle" ] | 
|  |  | 
|  | bundle_extension = ".xctest" | 
|  |  | 
|  | output_name = _output_name | 
|  | bundle_executable_path = get_label_info(":$_loadable_module_target", | 
|  | "target_out_dir") + "/$_output_name" | 
|  |  | 
|  | # Test files need to be known to Xcode for proper indexing and discovery | 
|  | # of tests function for XCTest, but the compilation is done via ninja and | 
|  | # thus must prevent Xcode from linking object files via this hack. | 
|  | xcode_extra_attributes = { | 
|  | OTHER_LDFLAGS = "-help" | 
|  | ONLY_ACTIVE_ARCH = "YES" | 
|  | DEBUG_INFORMATION_FORMAT = "dwarf" | 
|  |  | 
|  | # For XCUITest, Xcode requires specifying the host application name via | 
|  | # the TEST_TARGET_NAME attribute. | 
|  | if (invoker.product_type == _ios_xcode_xcuitest_bundle_id) { | 
|  | TEST_TARGET_NAME = invoker.xcode_test_application_name | 
|  | } | 
|  |  | 
|  | # For XCTest, Xcode requires specifying the host application path via | 
|  | # both BUNDLE_LOADER and TEST_HOST attributes. | 
|  | if (invoker.product_type == _ios_xcode_xctest_bundle_id) { | 
|  | BUNDLE_LOADER = "\$(TEST_HOST)" | 
|  | TEST_HOST = | 
|  | "\$(BUILT_PRODUCTS_DIR)/${invoker.xcode_test_application_name}" + | 
|  | ".app/${invoker.xcode_test_application_name}" | 
|  | } | 
|  | } | 
|  |  | 
|  | deps = [ ":$_info_plist_bundle" ] | 
|  | public_deps = [ ":$_loadable_module_target" ] | 
|  | } | 
|  |  | 
|  | bundle_data(_xctest_bundle) { | 
|  | forward_variables_from(invoker, [ "host_target" ]) | 
|  |  | 
|  | testonly = true | 
|  | visibility = [ ":$host_target" ] | 
|  |  | 
|  | public_deps = [ ":$_target_name" ] | 
|  | sources = [ "$root_out_dir/$_output_name.xctest" ] | 
|  | outputs = [ "{{bundle_contents_dir}}/PlugIns/$_output_name.xctest" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | template("ios_xctest_test") { | 
|  | # Invokers must specify their own target for the xctest module. | 
|  | assert(defined(invoker.xctest_module_target), | 
|  | "xctest_module_target is required.") | 
|  |  | 
|  | _target_name = target_name | 
|  | _output_name = target_name | 
|  |  | 
|  | _xctest_target = _target_name + "_module" | 
|  | _xctest_output = _output_name + "_module" | 
|  |  | 
|  | _host_target = _target_name | 
|  | _host_output = _output_name | 
|  |  | 
|  | _xctest_module_target = invoker.xctest_module_target | 
|  |  | 
|  | ios_xctest_bundle(_xctest_target) { | 
|  | output_name = _xctest_output | 
|  | product_type = _ios_xcode_xctest_bundle_id | 
|  | host_target = _host_target | 
|  | xcode_test_application_name = _host_output | 
|  |  | 
|  | deps = [ _xctest_module_target ] | 
|  | } | 
|  |  | 
|  | ios_app_bundle(_host_target) { | 
|  | forward_variables_from(invoker, "*", [ "testonly" ]) | 
|  | testonly = true | 
|  |  | 
|  | # Xcode needs the following frameworks installed in the application (and | 
|  | # signed) for the XCTest to run, so install them using | 
|  | # extra_system_frameworks. | 
|  | _ios_platform_library = "$ios_sdk_platform_path/Developer/Library" | 
|  | extra_system_frameworks = [ | 
|  | "$_ios_platform_library/Frameworks/XCTest.framework", | 
|  | "$ios_sdk_platform_path/Developer/Library/PrivateFrameworks/XCTAutomationSupport.framework", | 
|  | "$ios_sdk_platform_path/Developer/usr/lib/libXCTestBundleInject.dylib", | 
|  | ] | 
|  |  | 
|  | _xctest_bundle = _xctest_target + "_bundle" | 
|  | if (!defined(bundle_deps)) { | 
|  | bundle_deps = [] | 
|  | } | 
|  | bundle_deps += [ ":$_xctest_bundle" ] | 
|  |  | 
|  | if (!defined(ldflags)) { | 
|  | ldflags = [] | 
|  | } | 
|  | ldflags += [ | 
|  | "-Wl,-rpath,@executable_path/Frameworks", | 
|  | "-Wl,-rpath,@loader_path/Frameworks", | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | template("ios_xcuitest_test_runner_bundle") { | 
|  | assert(defined(invoker.xctest_bundle), | 
|  | "xctest_bundle must be defined for $target_name") | 
|  |  | 
|  | _target_name = target_name | 
|  | _output_name = target_name | 
|  | if (defined(invoker.output_name)) { | 
|  | _output_name = invoker.output_name | 
|  | } | 
|  |  | 
|  | _xctrunner_path = | 
|  | "$ios_sdk_platform_path/Developer/Library/Xcode/Agents/XCTRunner.app" | 
|  |  | 
|  | # When creating the test runner for an XCUITest, the arm64e slice of the binary | 
|  | # must be removed (at least until the app ships with arm64e slice which is not | 
|  | # yet supported by Apple). | 
|  | action("xctest_runner_without_arm64e") { | 
|  | testonly = true | 
|  | script = | 
|  | "//third_party/mini_chromium/mini_chromium/build/ios/strip_arm64e.py" | 
|  | sources = [ "$_xctrunner_path/XCTRunner" ] | 
|  | outputs = [ "$target_out_dir/XCTRunner" ] | 
|  | args = [ | 
|  | "--output", | 
|  | rebase_path(outputs[0], root_build_dir), | 
|  | "--input", | 
|  | rebase_path(sources[0], root_build_dir), | 
|  | ] | 
|  | } | 
|  |  | 
|  | _info_plist_target = _target_name + "_info_plist" | 
|  | _info_plist_bundle = _target_name + "_info_plist_bundle" | 
|  | info_plist(_info_plist_target) { | 
|  | testonly = true | 
|  | visibility = [ ":$_info_plist_bundle" ] | 
|  |  | 
|  | executable_name = _output_name | 
|  | plist_templates = [ | 
|  | "$_xctrunner_path/Info.plist", | 
|  |  | 
|  | # NOTE: The XCTRunnerAddition+Info.plist must come after the Info.plist | 
|  | # because it overrides the values under "CFBundleIdentifier" and | 
|  | # "CFBundleName". | 
|  | "//third_party/mini_chromium/mini_chromium/build/ios/XCTRunnerAddition+Info.plist", | 
|  | ] | 
|  | } | 
|  |  | 
|  | bundle_data(_info_plist_bundle) { | 
|  | testonly = true | 
|  | visibility = [ ":$_target_name" ] | 
|  |  | 
|  | public_deps = [ ":$_info_plist_target" ] | 
|  |  | 
|  | sources = get_target_outputs(":$_info_plist_target") | 
|  | outputs = [ "{{bundle_contents_dir}}/Info.plist" ] | 
|  | } | 
|  |  | 
|  | _pkginfo_bundle = _target_name + "_pkginfo_bundle" | 
|  | bundle_data(_pkginfo_bundle) { | 
|  | testonly = true | 
|  | visibility = [ ":$_target_name" ] | 
|  |  | 
|  | sources = [ "$_xctrunner_path/PkgInfo" ] | 
|  |  | 
|  | outputs = [ "{{bundle_contents_dir}}/PkgInfo" ] | 
|  | } | 
|  |  | 
|  | _xctest_bundle = invoker.xctest_bundle | 
|  | create_signed_bundle(_target_name) { | 
|  | testonly = true | 
|  |  | 
|  | bundle_binary_target = ":xctest_runner_without_arm64e" | 
|  | bundle_binary_output = "XCTRunner" | 
|  | bundle_extension = ".app" | 
|  | product_type = "com.apple.product-type.application" | 
|  |  | 
|  | output_name = _output_name | 
|  |  | 
|  | # Xcode needs the following frameworks installed in the application | 
|  | # (and signed) for the XCUITest to run, so install them using | 
|  | # extra_system_frameworks. | 
|  | extra_system_frameworks = [ | 
|  | "$ios_sdk_platform_path/Developer/Library/Frameworks/XCTest.framework", | 
|  | "$ios_sdk_platform_path/Developer/Library/PrivateFrameworks/XCTAutomationSupport.framework", | 
|  | ] | 
|  |  | 
|  | bundle_deps = [] | 
|  | if (defined(invoker.bundle_deps)) { | 
|  | bundle_deps += invoker.bundle_deps | 
|  | } | 
|  | bundle_deps += [ | 
|  | ":$_info_plist_bundle", | 
|  | ":$_pkginfo_bundle", | 
|  | ":$_xctest_bundle", | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | template("ios_xcuitest_test") { | 
|  | assert(defined(invoker.deps), "deps must be defined for $target_name") | 
|  | assert(defined(invoker.xcode_test_application_name), | 
|  | "xcode_test_application_name must be defined for $target_name") | 
|  |  | 
|  | _xcuitest_target = target_name | 
|  | _xcuitest_runner_target = _xcuitest_target + "_runner" | 
|  | _xcuitest_module_target = _xcuitest_target + "_module" | 
|  |  | 
|  | group(_xcuitest_target) { | 
|  | testonly = true | 
|  |  | 
|  | deps = [ ":$_xcuitest_runner_target" ] | 
|  | } | 
|  |  | 
|  | _xcuitest_module_output = _xcuitest_target | 
|  | ios_xctest_bundle(_xcuitest_module_target) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "xcode_test_application_name", | 
|  | "xctest_bundle_principal_class", | 
|  | ]) | 
|  |  | 
|  | product_type = _ios_xcode_xcuitest_bundle_id | 
|  | host_target = _xcuitest_runner_target | 
|  | output_name = _xcuitest_module_output | 
|  |  | 
|  | deps = invoker.deps | 
|  | } | 
|  |  | 
|  | _xcuitest_runner_output = _xcuitest_target + "-Runner" | 
|  | ios_xcuitest_test_runner_bundle(_xcuitest_runner_target) { | 
|  | output_name = _xcuitest_runner_output | 
|  | xctest_bundle = _xcuitest_module_target + "_bundle" | 
|  | forward_variables_from(invoker, [ "bundle_deps" ]) | 
|  | } | 
|  | } |