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