Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 1 | # Copyright 2019 The Pigweed Authors |
| 2 | # |
| 3 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| 4 | # use this file except in compliance with the License. You may obtain a copy of |
| 5 | # the License at |
| 6 | # |
| 7 | # https://www.apache.org/licenses/LICENSE-2.0 |
| 8 | # |
| 9 | # Unless required by applicable law or agreed to in writing, software |
| 10 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 11 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 12 | # License for the specific language governing permissions and limitations under |
| 13 | # the License. |
| 14 | |
| 15 | import("$dir_pw_build/pw_executable.gni") |
Alexei Frolov | d1f98fa | 2019-11-08 15:41:37 -0800 | [diff] [blame] | 16 | import("$dir_pw_build/python_script.gni") |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 17 | |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 18 | # Creates an executable target for a unit test. |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 19 | # |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 20 | # If the pw_automatic_test_runner variable is set, this template also creates a |
| 21 | # "${test_name}_run" target which runs the unit test executable after building |
| 22 | # it. |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 23 | # |
| 24 | # This template accepts all of the regular "executable" target args. |
| 25 | template("pw_test") { |
| 26 | # This is required in order to reference the pw_test template's target name |
| 27 | # within the test_metadata of the metadata group below. The group() definition |
| 28 | # creates a new scope where the "target_name" variable is set to its target, |
| 29 | # shadowing the one in this scope. |
Alexei Frolov | d1f98fa | 2019-11-08 15:41:37 -0800 | [diff] [blame] | 30 | _test_target_name = target_name |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 31 | |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 32 | pw_executable(_test_target_name) { |
| 33 | # Metadata for this test when used as part of a pw_test_group target. |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 34 | metadata = { |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 35 | tests = [ |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 36 | { |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 37 | type = "test" |
Alexei Frolov | d1f98fa | 2019-11-08 15:41:37 -0800 | [diff] [blame] | 38 | test_name = _test_target_name |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 39 | test_directory = rebase_path(target_out_dir, root_build_dir) |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 40 | }, |
| 41 | ] |
| 42 | } |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 43 | |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 44 | forward_variables_from(invoker, "*", [ "metadata" ]) |
Paul Mathieu | 97b967a | 2019-11-21 09:01:03 -0800 | [diff] [blame] | 45 | |
| 46 | if (!defined(deps)) { |
| 47 | deps = [] |
| 48 | } |
| 49 | deps += [ pw_unit_test_main ] |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 50 | } |
| 51 | |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 52 | if (pw_automatic_test_runner != "") { |
| 53 | # When the automatic runner is set, create an action which runs the unit |
| 54 | # test executable using the test runner script. |
Alexei Frolov | d1f98fa | 2019-11-08 15:41:37 -0800 | [diff] [blame] | 55 | _run_action_name = _test_target_name + "_run" |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 56 | |
Alexei Frolov | d1f98fa | 2019-11-08 15:41:37 -0800 | [diff] [blame] | 57 | pw_python_script(_run_action_name) { |
Rob Mohr | a0ba54f | 2020-02-27 11:43:49 -0800 | [diff] [blame] | 58 | deps = [ ":$_test_target_name" ] |
| 59 | inputs = [ pw_automatic_test_runner ] |
Alexei Frolov | 3dbfcf0 | 2019-11-22 16:38:02 -0800 | [diff] [blame] | 60 | script = "$dir_pw_unit_test/py/pw_unit_test/test_runner.py" |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 61 | args = [ |
| 62 | "--runner", |
| 63 | pw_automatic_test_runner, |
| 64 | "--test", |
| 65 | get_path_info("$target_out_dir:$_test_target_name", "abspath"), |
| 66 | ] |
Alexei Frolov | 917756d | 2019-11-12 14:34:34 -0800 | [diff] [blame] | 67 | stamp = true |
Alexei Frolov | 925fb8f | 2019-11-05 16:32:30 -0800 | [diff] [blame] | 68 | } |
| 69 | } |
| 70 | } |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 71 | |
| 72 | # Defines a related collection of unit tests. |
| 73 | # |
| 74 | # pw_test_group targets output a JSON metadata file for the Pigweed test runner. |
| 75 | # |
| 76 | # Args: |
| 77 | # tests: List of pw_test targets for each of the tests in the group. |
| 78 | # group_deps: Optional pw_test_group targets on which this group depends. |
| 79 | template("pw_test_group") { |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 80 | _group_target = target_name |
| 81 | _group_deps_metadata = [] |
Wyatt Hepler | edf6f29 | 2019-11-25 18:52:21 -0800 | [diff] [blame] | 82 | if (defined(invoker.tests)) { |
| 83 | _deps = invoker.tests |
| 84 | } else { |
| 85 | _deps = [] |
| 86 | } |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 87 | |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 88 | if (defined(invoker.group_deps)) { |
| 89 | # If the group specified any other group dependencies, create a metadata |
| 90 | # entry for each of them indicating that they are another group and a group |
| 91 | # target to collect that metadata. |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 92 | foreach(dep, invoker.group_deps) { |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 93 | _group_deps_metadata += [ |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 94 | { |
| 95 | type = "dep" |
| 96 | group = get_path_info(dep, "abspath") |
| 97 | }, |
| 98 | ] |
| 99 | } |
| 100 | |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 101 | _deps += invoker.group_deps |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 102 | } |
| 103 | |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 104 | _metadata_group_target = "${target_name}_pw_test_group_metadata" |
| 105 | group(_metadata_group_target) { |
| 106 | metadata = { |
| 107 | group_deps = _group_deps_metadata |
| 108 | self = [ |
| 109 | { |
| 110 | type = "self" |
| 111 | name = get_path_info(":$_group_target", "abspath") |
| 112 | }, |
| 113 | ] |
| 114 | |
| 115 | # Metadata from the group's own unit test targets is forwarded through |
| 116 | # the group dependencies group. This entry is listed as a "walk_key" in |
| 117 | # the generated file so that only test targets' metadata (not group |
| 118 | # targets) appear in the output. |
Wyatt Hepler | edf6f29 | 2019-11-25 18:52:21 -0800 | [diff] [blame] | 119 | if (defined(invoker.tests)) { |
| 120 | propagate_metadata_from = invoker.tests |
| 121 | } |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 122 | } |
| 123 | deps = _deps |
| 124 | } |
| 125 | |
| 126 | _test_group_deps = [ ":$_metadata_group_target" ] |
| 127 | |
| 128 | generated_file(_group_target) { |
Rob Mohr | a0ba54f | 2020-02-27 11:43:49 -0800 | [diff] [blame] | 129 | outputs = [ "$target_out_dir/$target_name.testinfo.json" ] |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 130 | data_keys = [ |
| 131 | "group_deps", |
Alexei Frolov | 8403f0a | 2019-11-20 13:57:54 -0800 | [diff] [blame] | 132 | "self", |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 133 | "tests", |
| 134 | ] |
| 135 | walk_keys = [ "propagate_metadata_from" ] |
| 136 | output_conversion = "json" |
| 137 | deps = _test_group_deps |
| 138 | } |
Wyatt Hepler | edf6f29 | 2019-11-25 18:52:21 -0800 | [diff] [blame] | 139 | |
| 140 | # If automatic test running is enabled, create a *_run group that collects all |
| 141 | # of the individual *_run targets and groups. |
| 142 | if (pw_automatic_test_runner != "") { |
| 143 | group(_group_target + "_run") { |
Rob Mohr | a0ba54f | 2020-02-27 11:43:49 -0800 | [diff] [blame] | 144 | deps = [ ":$_group_target" ] |
Wyatt Hepler | edf6f29 | 2019-11-25 18:52:21 -0800 | [diff] [blame] | 145 | foreach(_target, _deps) { |
| 146 | deps += [ "${_target}_run" ] |
| 147 | } |
| 148 | } |
| 149 | } |
Alexei Frolov | a454c68 | 2019-11-19 10:55:07 -0800 | [diff] [blame] | 150 | } |