xref: /aosp_15_r20/external/angle/build/rust/rust_unit_test.gni (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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