xref: /aosp_15_r20/external/cronet/build/rust/rust_unit_test.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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