1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2021 The Chromium Authors 2*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 4*8975f5c5SAndroid Build Coastguard Worker 5*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/rust.gni") 6*8975f5c5SAndroid Build Coastguard Workerimport("//build/rust/rust_unit_tests_group.gni") 7*8975f5c5SAndroid Build Coastguard Worker 8*8975f5c5SAndroid Build Coastguard Worker# Defines a Rust unit test. 9*8975f5c5SAndroid Build Coastguard Worker# 10*8975f5c5SAndroid Build Coastguard Worker# This generates an executable + a script that can be run on Chromium bots. 11*8975f5c5SAndroid Build Coastguard Worker# Future iterations of this template may do something smarter with the test 12*8975f5c5SAndroid Build Coastguard Worker# code in order to automatically contribute it to test steps on the bots. 13*8975f5c5SAndroid Build Coastguard Worker# 14*8975f5c5SAndroid Build Coastguard Worker# Parameters 15*8975f5c5SAndroid Build Coastguard Worker# 16*8975f5c5SAndroid Build Coastguard Worker# sources 17*8975f5c5SAndroid Build Coastguard Worker# edition (optional) 18*8975f5c5SAndroid Build Coastguard Worker# allow_unsafe (optional) 19*8975f5c5SAndroid Build Coastguard Worker# configs (optional) 20*8975f5c5SAndroid Build Coastguard Worker# deps (optional) 21*8975f5c5SAndroid Build Coastguard Worker# crate_root (optional) 22*8975f5c5SAndroid Build Coastguard Worker# features (optional) 23*8975f5c5SAndroid Build Coastguard Worker# rustflags (optional) 24*8975f5c5SAndroid Build Coastguard Worker# inputs (optional) 25*8975f5c5SAndroid Build Coastguard Worker# All as in rust_static_library. 26*8975f5c5SAndroid Build Coastguard Worker# 27*8975f5c5SAndroid Build Coastguard Worker# Example of usage: 28*8975f5c5SAndroid Build Coastguard Worker# 29*8975f5c5SAndroid Build Coastguard Worker# rust_unit_test("foo_tests") { 30*8975f5c5SAndroid Build Coastguard Worker# deps = [ 31*8975f5c5SAndroid Build Coastguard Worker# "//third_party/rust/test_utils/v1:lib", 32*8975f5c5SAndroid Build Coastguard Worker# ] 33*8975f5c5SAndroid Build Coastguard Worker# sources = [ "src/lib.rs" ] 34*8975f5c5SAndroid Build Coastguard Worker# } 35*8975f5c5SAndroid Build Coastguard Worker# 36*8975f5c5SAndroid Build Coastguard Worker# Implementation note: you might assume it makes sense to implement this 37*8975f5c5SAndroid Build Coastguard Worker# in terms of rust_target in order to avoid the duplication of logic around 38*8975f5c5SAndroid Build Coastguard Worker# features and editions. We don't do that because rust_target actually 39*8975f5c5SAndroid Build Coastguard Worker# depends on this template in order to build embedded unit tests 40*8975f5c5SAndroid Build Coastguard Worker# (and therefore depending on rust_target here would lead to an infinite 41*8975f5c5SAndroid Build Coastguard Worker# import loop). 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Workertemplate("rust_unit_test") { 44*8975f5c5SAndroid Build Coastguard Worker assert(can_build_rust_unit_tests) 45*8975f5c5SAndroid Build Coastguard Worker if (defined(invoker.crate_name)) { 46*8975f5c5SAndroid Build Coastguard Worker _crate_name = invoker.crate_name 47*8975f5c5SAndroid Build Coastguard Worker } else { 48*8975f5c5SAndroid Build Coastguard Worker _crate_name = target_name 49*8975f5c5SAndroid Build Coastguard Worker } 50*8975f5c5SAndroid Build Coastguard Worker if (defined(invoker.crate_root)) { 51*8975f5c5SAndroid Build Coastguard Worker _crate_root = invoker.crate_root 52*8975f5c5SAndroid Build Coastguard Worker } else { 53*8975f5c5SAndroid Build Coastguard Worker _crate_root = "src/lib.rs" 54*8975f5c5SAndroid Build Coastguard Worker } 55*8975f5c5SAndroid Build Coastguard Worker _rustflags = invoker.rustflags 56*8975f5c5SAndroid Build Coastguard Worker if (defined(invoker.features)) { 57*8975f5c5SAndroid Build Coastguard Worker foreach(i, invoker.features) { 58*8975f5c5SAndroid Build Coastguard Worker _rustflags += [ "--cfg=feature=\"${i}\"" ] 59*8975f5c5SAndroid Build Coastguard Worker } 60*8975f5c5SAndroid Build Coastguard Worker } 61*8975f5c5SAndroid Build Coastguard Worker _configs = invoker.configs 62*8975f5c5SAndroid Build Coastguard Worker _edition = "2021" 63*8975f5c5SAndroid Build Coastguard Worker if (defined(invoker.edition)) { 64*8975f5c5SAndroid Build Coastguard Worker _edition = invoker.edition 65*8975f5c5SAndroid Build Coastguard Worker } 66*8975f5c5SAndroid Build Coastguard Worker _configs += [ "//build/rust:edition_${_edition}" ] 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker # We require that all source files are listed, even though this is 69*8975f5c5SAndroid Build Coastguard Worker # not a requirement for rustc. The reason is to ensure that tools 70*8975f5c5SAndroid Build Coastguard Worker # such as `gn deps` give the correct answer, and thus we trigger 71*8975f5c5SAndroid Build Coastguard Worker # the right test suites etc. on code change. 72*8975f5c5SAndroid Build Coastguard Worker # TODO(crbug.com/40200431) - verify this is correct 73*8975f5c5SAndroid Build Coastguard Worker assert(defined(invoker.sources), "sources must be listed") 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker _exe_target_name = target_name + "_exe" 76*8975f5c5SAndroid Build Coastguard Worker rust_unit_tests_group(target_name) { 77*8975f5c5SAndroid Build Coastguard Worker deps = [ ":$_exe_target_name" ] 78*8975f5c5SAndroid Build Coastguard Worker } 79*8975f5c5SAndroid Build Coastguard Worker 80*8975f5c5SAndroid Build Coastguard Worker # The OUT_DIR for a crate's tests should point to the same OUT_DIR that the 81*8975f5c5SAndroid Build Coastguard Worker # library it's testing used. The `env_out_dir` variable can be used to specify 82*8975f5c5SAndroid Build Coastguard Worker # that directory. 83*8975f5c5SAndroid Build Coastguard Worker if (defined(invoker.env_out_dir)) { 84*8975f5c5SAndroid Build Coastguard Worker _env_out_dir = invoker.env_out_dir 85*8975f5c5SAndroid Build Coastguard Worker } else { 86*8975f5c5SAndroid Build Coastguard Worker _env_out_dir = target_gen_dir 87*8975f5c5SAndroid Build Coastguard Worker } 88*8975f5c5SAndroid Build Coastguard Worker 89*8975f5c5SAndroid Build Coastguard Worker executable(_exe_target_name) { 90*8975f5c5SAndroid Build Coastguard Worker testonly = true 91*8975f5c5SAndroid Build Coastguard Worker forward_variables_from(invoker, 92*8975f5c5SAndroid Build Coastguard Worker "*", 93*8975f5c5SAndroid Build Coastguard Worker [ 94*8975f5c5SAndroid Build Coastguard Worker "allow_unsafe", 95*8975f5c5SAndroid Build Coastguard Worker "edition", 96*8975f5c5SAndroid Build Coastguard Worker "features", 97*8975f5c5SAndroid Build Coastguard Worker "rustflags", 98*8975f5c5SAndroid Build Coastguard Worker "configs", 99*8975f5c5SAndroid Build Coastguard Worker "crate_name", 100*8975f5c5SAndroid Build Coastguard Worker "crate_root", 101*8975f5c5SAndroid Build Coastguard Worker "env_out_dir", 102*8975f5c5SAndroid Build Coastguard Worker ]) 103*8975f5c5SAndroid Build Coastguard Worker if (!defined(output_name) || output_name == "") { 104*8975f5c5SAndroid Build Coastguard Worker output_name = _crate_name 105*8975f5c5SAndroid Build Coastguard Worker } 106*8975f5c5SAndroid Build Coastguard Worker 107*8975f5c5SAndroid Build Coastguard Worker rustflags = [ 108*8975f5c5SAndroid Build Coastguard Worker "--cfg", 109*8975f5c5SAndroid Build Coastguard Worker "feature=\"test\"", 110*8975f5c5SAndroid Build Coastguard Worker "--test", 111*8975f5c5SAndroid Build Coastguard Worker ] 112*8975f5c5SAndroid Build Coastguard Worker rustflags += _rustflags 113*8975f5c5SAndroid Build Coastguard Worker configs = [] 114*8975f5c5SAndroid Build Coastguard Worker configs = _configs 115*8975f5c5SAndroid Build Coastguard Worker crate_name = _crate_name 116*8975f5c5SAndroid Build Coastguard Worker crate_root = _crate_root 117*8975f5c5SAndroid Build Coastguard Worker if (!defined(rustenv)) { 118*8975f5c5SAndroid Build Coastguard Worker rustenv = [] 119*8975f5c5SAndroid Build Coastguard Worker } 120*8975f5c5SAndroid Build Coastguard Worker 121*8975f5c5SAndroid Build Coastguard Worker rustenv += [ "OUT_DIR=" + 122*8975f5c5SAndroid Build Coastguard Worker rebase_path(_env_out_dir, get_path_info(_crate_root, "dir")) ] 123*8975f5c5SAndroid Build Coastguard Worker metadata = { 124*8975f5c5SAndroid Build Coastguard Worker # Consumed by "rust_unit_tests_group" gni template. 125*8975f5c5SAndroid Build Coastguard Worker rust_unit_test_executables = [ _crate_name ] 126*8975f5c5SAndroid Build Coastguard Worker } 127*8975f5c5SAndroid Build Coastguard Worker 128*8975f5c5SAndroid Build Coastguard Worker # Duplicated from rust_target since we didn't use the rust_executable 129*8975f5c5SAndroid Build Coastguard Worker # template as it causes a GN cycle. 130*8975f5c5SAndroid Build Coastguard Worker if (!defined(deps)) { 131*8975f5c5SAndroid Build Coastguard Worker deps = [] 132*8975f5c5SAndroid Build Coastguard Worker } 133*8975f5c5SAndroid Build Coastguard Worker if (!defined(invoker.no_chromium_prelude) || !invoker.no_chromium_prelude) { 134*8975f5c5SAndroid Build Coastguard Worker if (enable_chromium_prelude) { 135*8975f5c5SAndroid Build Coastguard Worker deps += [ "//build/rust/chromium_prelude" ] 136*8975f5c5SAndroid Build Coastguard Worker } 137*8975f5c5SAndroid Build Coastguard Worker } 138*8975f5c5SAndroid Build Coastguard Worker } 139*8975f5c5SAndroid Build Coastguard Worker} 140*8975f5c5SAndroid Build Coastguard Worker 141*8975f5c5SAndroid Build Coastguard Workerset_defaults("rust_unit_test") { 142*8975f5c5SAndroid Build Coastguard Worker configs = default_executable_configs 143*8975f5c5SAndroid Build Coastguard Worker deps = [] 144*8975f5c5SAndroid Build Coastguard Worker rustflags = [] 145*8975f5c5SAndroid Build Coastguard Worker} 146