blob: 402d4b01311c0425b1e090787cf5de8199dd43c6 [file] [log] [blame]
Liz Kammer2dd9ca42020-11-25 16:06:39 -08001// Copyright 2020 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://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,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package bp2build
16
17import (
Liz Kammer2dd9ca42020-11-25 16:06:39 -080018 "io/ioutil"
19 "os"
20 "strings"
21 "testing"
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +000022
23 "android/soong/android"
Liz Kammer2dd9ca42020-11-25 16:06:39 -080024)
25
Liz Kammer2dd9ca42020-11-25 16:06:39 -080026func setUp() {
27 var err error
28 buildDir, err = ioutil.TempDir("", "bazel_queryview_test")
29 if err != nil {
30 panic(err)
31 }
32}
33
34func tearDown() {
35 os.RemoveAll(buildDir)
36}
37
38func TestMain(m *testing.M) {
39 run := func() int {
40 setUp()
41 defer tearDown()
42
43 return m.Run()
44 }
45
46 os.Exit(run())
47}
48
49func TestGenerateModuleRuleShims(t *testing.T) {
50 moduleTypeFactories := map[string]android.ModuleFactory{
51 "custom": customModuleFactoryBase,
52 "custom_test": customTestModuleFactoryBase,
53 "custom_defaults": customDefaultsModuleFactoryBasic,
54 }
55 ruleShims := CreateRuleShims(moduleTypeFactories)
56
57 if len(ruleShims) != 1 {
58 t.Errorf("Expected to generate 1 rule shim, but got %d", len(ruleShims))
59 }
60
61 ruleShim := ruleShims["bp2build"]
62 expectedRules := []string{
63 "custom",
64 "custom_defaults",
65 "custom_test_",
66 }
67
68 if len(ruleShim.rules) != len(expectedRules) {
69 t.Errorf("Expected %d rules, but got %d", len(expectedRules), len(ruleShim.rules))
70 }
71
72 for i, rule := range ruleShim.rules {
73 if rule != expectedRules[i] {
74 t.Errorf("Expected rule shim to contain %s, but got %s", expectedRules[i], rule)
75 }
76 }
77 expectedBzl := `load("//build/bazel/queryview_rules:providers.bzl", "SoongModuleInfo")
78
79def _custom_impl(ctx):
80 return [SoongModuleInfo()]
81
82custom = rule(
83 implementation = _custom_impl,
84 attrs = {
Jingwen Chen288e2ba2021-01-25 04:36:04 -050085 "soong_module_name": attr.string(mandatory = True),
86 "soong_module_variant": attr.string(),
87 "soong_module_deps": attr.label_list(providers = [SoongModuleInfo]),
Spandan Das5af0bd32022-09-28 20:43:08 +000088 "api": attr.string(),
Liz Kammer4562a3b2021-04-21 18:15:34 -040089 "arch_paths": attr.string_list(),
Liz Kammer32b77cf2021-08-04 15:17:02 -040090 "arch_paths_exclude": attr.string_list(),
Jingwen Chen77e8b7b2021-02-05 03:03:24 -050091 # bazel_module start
92# "label": attr.string(),
93# "bp2build_available": attr.bool(),
94 # bazel_module end
Liz Kammer2dd9ca42020-11-25 16:06:39 -080095 "bool_prop": attr.bool(),
96 "bool_ptr_prop": attr.bool(),
Spandan Das3131d672023-08-03 22:33:47 +000097 "dir": attr.string(),
Liz Kammer32a03392021-09-14 11:17:21 -040098 "embedded_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -080099 "int64_ptr_prop": attr.int(),
100 # nested_props start
101# "nested_prop": attr.string(),
102 # nested_props end
103 # nested_props_ptr start
104# "nested_prop": attr.string(),
105 # nested_props_ptr end
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400106 "one_to_many_prop": attr.bool(),
Liz Kammer32a03392021-09-14 11:17:21 -0400107 "other_embedded_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800108 "string_list_prop": attr.string_list(),
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000109 "string_literal_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800110 "string_prop": attr.string(),
111 "string_ptr_prop": attr.string(),
Spandan Das6a448ec2023-04-19 17:36:12 +0000112 "test_config_setting": attr.bool(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800113 },
114)
115
116def _custom_defaults_impl(ctx):
117 return [SoongModuleInfo()]
118
119custom_defaults = rule(
120 implementation = _custom_defaults_impl,
121 attrs = {
Jingwen Chen288e2ba2021-01-25 04:36:04 -0500122 "soong_module_name": attr.string(mandatory = True),
123 "soong_module_variant": attr.string(),
124 "soong_module_deps": attr.label_list(providers = [SoongModuleInfo]),
Spandan Das5af0bd32022-09-28 20:43:08 +0000125 "api": attr.string(),
Liz Kammer4562a3b2021-04-21 18:15:34 -0400126 "arch_paths": attr.string_list(),
Liz Kammer32b77cf2021-08-04 15:17:02 -0400127 "arch_paths_exclude": attr.string_list(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800128 "bool_prop": attr.bool(),
129 "bool_ptr_prop": attr.bool(),
Spandan Das3131d672023-08-03 22:33:47 +0000130 "dir": attr.string(),
Liz Kammer32a03392021-09-14 11:17:21 -0400131 "embedded_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800132 "int64_ptr_prop": attr.int(),
133 # nested_props start
134# "nested_prop": attr.string(),
135 # nested_props end
136 # nested_props_ptr start
137# "nested_prop": attr.string(),
138 # nested_props_ptr end
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400139 "one_to_many_prop": attr.bool(),
Liz Kammer32a03392021-09-14 11:17:21 -0400140 "other_embedded_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800141 "string_list_prop": attr.string_list(),
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000142 "string_literal_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800143 "string_prop": attr.string(),
144 "string_ptr_prop": attr.string(),
Spandan Das6a448ec2023-04-19 17:36:12 +0000145 "test_config_setting": attr.bool(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800146 },
147)
148
149def _custom_test__impl(ctx):
150 return [SoongModuleInfo()]
151
152custom_test_ = rule(
153 implementation = _custom_test__impl,
154 attrs = {
Jingwen Chen288e2ba2021-01-25 04:36:04 -0500155 "soong_module_name": attr.string(mandatory = True),
156 "soong_module_variant": attr.string(),
157 "soong_module_deps": attr.label_list(providers = [SoongModuleInfo]),
Spandan Das5af0bd32022-09-28 20:43:08 +0000158 "api": attr.string(),
Liz Kammer4562a3b2021-04-21 18:15:34 -0400159 "arch_paths": attr.string_list(),
Liz Kammer32b77cf2021-08-04 15:17:02 -0400160 "arch_paths_exclude": attr.string_list(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800161 "bool_prop": attr.bool(),
162 "bool_ptr_prop": attr.bool(),
Spandan Das3131d672023-08-03 22:33:47 +0000163 "dir": attr.string(),
Liz Kammer32a03392021-09-14 11:17:21 -0400164 "embedded_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800165 "int64_ptr_prop": attr.int(),
166 # nested_props start
167# "nested_prop": attr.string(),
168 # nested_props end
169 # nested_props_ptr start
170# "nested_prop": attr.string(),
171 # nested_props_ptr end
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400172 "one_to_many_prop": attr.bool(),
Liz Kammer32a03392021-09-14 11:17:21 -0400173 "other_embedded_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800174 "string_list_prop": attr.string_list(),
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000175 "string_literal_prop": attr.string(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800176 "string_prop": attr.string(),
177 "string_ptr_prop": attr.string(),
Spandan Das6a448ec2023-04-19 17:36:12 +0000178 "test_config_setting": attr.bool(),
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800179 # test_prop start
180# "test_string_prop": attr.string(),
181 # test_prop end
182 },
183)
184`
185
186 if ruleShim.content != expectedBzl {
187 t.Errorf(
188 "Expected the generated rule shim bzl to be:\n%s\nbut got:\n%s",
189 expectedBzl,
190 ruleShim.content)
191 }
192}
193
194func TestGenerateSoongModuleBzl(t *testing.T) {
195 ruleShims := map[string]RuleShim{
196 "file1": RuleShim{
197 rules: []string{"a", "b"},
198 content: "irrelevant",
199 },
200 "file2": RuleShim{
201 rules: []string{"c", "d"},
202 content: "irrelevant",
203 },
204 }
usta40caf952023-08-04 16:52:14 -0400205 files := CreateBazelFiles(ruleShims, make(map[string]BazelTargets), QueryView)
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800206
207 var actualSoongModuleBzl BazelFile
208 for _, f := range files {
209 if f.Basename == "soong_module.bzl" {
210 actualSoongModuleBzl = f
211 }
212 }
213
214 expectedLoad := `load("//build/bazel/queryview_rules:file1.bzl", "a", "b")
215load("//build/bazel/queryview_rules:file2.bzl", "c", "d")
216`
217 expectedRuleMap := `soong_module_rule_map = {
218 "a": a,
219 "b": b,
220 "c": c,
221 "d": d,
222}`
223 if !strings.Contains(actualSoongModuleBzl.Contents, expectedLoad) {
224 t.Errorf(
225 "Generated soong_module.bzl:\n\n%s\n\n"+
226 "Could not find the load statement in the generated soong_module.bzl:\n%s",
227 actualSoongModuleBzl.Contents,
228 expectedLoad)
229 }
230
231 if !strings.Contains(actualSoongModuleBzl.Contents, expectedRuleMap) {
232 t.Errorf(
233 "Generated soong_module.bzl:\n\n%s\n\n"+
234 "Could not find the module -> rule map in the generated soong_module.bzl:\n%s",
235 actualSoongModuleBzl.Contents,
236 expectedRuleMap)
237 }
238}