1# Copyright (C) 2022 The Android Open Source Project
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
15load("@bazel_skylib//lib:paths.bzl", "paths")
16load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
17load("//build/bazel/rules:prebuilt_file.bzl", "PrebuiltFileInfo")
18load("//build/bazel/rules:prebuilt_xml.bzl", "prebuilt_xml")
19load("//build/bazel/rules/test_common:args.bzl", "get_arg_value")
20
21SRC = "fooSrc.xml"
22DIR = "etc/xml"
23DTD_SCHEMA = "bar.dtd"
24XSD_SCHEMA = "baz.xsd"
25FILENAME = "fooFilename"
26
27def _test_prebuilt_xml_commands_impl(ctx):
28    env = analysistest.begin(ctx)
29    actions = analysistest.target_actions(env)
30    asserts.equals(env, 1, len(actions), "expected  1 action got {}".format(actions))
31    args = actions[0].argv
32
33    asserts.true(env, len(args) >= 8, "expected at least 8 arguments but got {} {}".format(len(args), args))
34
35    offset = 0
36    schema = ctx.attr.schema
37
38    if schema != "":
39        offset = 2
40        if schema == "--schema":
41            asserts.equals(env, paths.basename(get_arg_value(args, schema)), XSD_SCHEMA)
42        elif schema == "--dtdvalid":
43            asserts.equals(env, paths.basename(get_arg_value(args, schema)), DTD_SCHEMA)
44        else:
45            analysistest.fail(
46                env,
47                "Expected schema attr to be --schema or --dtdvalid but got {}".format(schema),
48            )
49
50    asserts.equals(env, SRC, paths.basename(args[1 + offset]))
51    asserts.equals(env, ">", args[2 + offset])
52    asserts.equals(env, "/dev/null", args[3 + offset])
53    asserts.equals(env, "&&", args[4 + offset])
54    asserts.equals(env, "touch", args[5 + offset])
55    asserts.equals(env, "-a", args[6 + offset])
56
57    return analysistest.end(env)
58
59prebuilt_xml_commands_test = analysistest.make(
60    _test_prebuilt_xml_commands_impl,
61    attrs = {
62        "schema": attr.string(),
63    },
64)
65
66def _test_prebuilt_xml_commands():
67    name = "prebuilt_xml_commands"
68    test_name = name + "_test"
69
70    prebuilt_xml(
71        name = name,
72        src = SRC,
73        filename = FILENAME,
74        tags = ["manual"],
75    )
76    prebuilt_xml_commands_test(
77        name = test_name,
78        target_under_test = name,
79    )
80
81    return test_name
82
83def _test_prebuilt_xml_commands_dtd():
84    name = "prebuilt_xml_commands_dtd"
85    test_name = name + "_test"
86
87    prebuilt_xml(
88        name = name,
89        src = SRC,
90        schema = DTD_SCHEMA,
91        filename = FILENAME,
92        tags = ["manual"],
93    )
94    prebuilt_xml_commands_test(
95        name = test_name,
96        schema = "--dtdvalid",
97        target_under_test = name,
98    )
99
100    return test_name
101
102def _test_prebuilt_xml_commands_xsd():
103    name = "prebuilt_xml_commands_xsd"
104    test_name = name + "_test"
105    prebuilt_xml(
106        name = name,
107        schema = XSD_SCHEMA,
108        filename = FILENAME,
109        src = SRC,
110        tags = ["manual"],
111    )
112    prebuilt_xml_commands_test(
113        name = test_name,
114        schema = "--schema",
115        target_under_test = name,
116    )
117
118    return test_name
119
120def _test_prebuilt_xml_PrebuiltFileInfo_impl(ctx):
121    env = analysistest.begin(ctx)
122    target_under_test = analysistest.target_under_test(env)
123    prebuilt_file_info = target_under_test[PrebuiltFileInfo]
124
125    asserts.equals(
126        env,
127        FILENAME,
128        prebuilt_file_info.filename,
129        "expected PrebuiltFileInfo filename to be {} but got {}".format(FILENAME, prebuilt_file_info.filename),
130    )
131
132    asserts.equals(
133        env,
134        SRC,
135        prebuilt_file_info.src.basename,
136        "expected PrebuiltFileInfo src to be {} but got {}".format(SRC, prebuilt_file_info.src),
137    )
138
139    asserts.equals(
140        env,
141        DIR,
142        prebuilt_file_info.dir,
143        "expected PrebuiltFileInfo dir to be {} but got {}".format(DIR, prebuilt_file_info.dir),
144    )
145
146    return analysistest.end(env)
147
148prebuilt_xml_PrebuiltFileInfo_test = analysistest.make(_test_prebuilt_xml_PrebuiltFileInfo_impl)
149
150def _test_prebuilt_xml_PrebuiltFileInfo():
151    name = "prebuilt_xml_PrebuiltFileInfo"
152    test_name = name + "_test"
153    prebuilt_xml(
154        name = name,
155        src = SRC,
156        filename = FILENAME,
157        tags = ["manual"],
158    )
159    prebuilt_xml_PrebuiltFileInfo_test(
160        name = test_name,
161        target_under_test = name,
162    )
163
164    return test_name
165
166def _test_prebuilt_xml_schema_validation_impl(ctx):
167    env = analysistest.begin(ctx)
168
169    actions = analysistest.target_actions(env)
170    target = analysistest.target_under_test(env)
171    validation_outputs = target.output_groups._validation.to_list()
172    for action in actions:
173        for validation_output in validation_outputs:
174            if validation_output in action.inputs.to_list():
175                analysistest.fail(
176                    env,
177                    "%s is a validation action output, but is an input to action %s" % (
178                        validation_output,
179                        action,
180                    ),
181                )
182
183    return analysistest.end(env)
184
185prebuilt_xml_schema_validation_test = analysistest.make(_test_prebuilt_xml_schema_validation_impl)
186
187def _test_prebuilt_xml_dtd_schema_validation():
188    name = "prebuilt_xml_dtd_schema_validation"
189    test_name = name + "_test"
190    prebuilt_xml(
191        name = name,
192        src = SRC,
193        schema = DTD_SCHEMA,
194        filename = FILENAME,
195        tags = ["manual"],
196    )
197    prebuilt_xml_schema_validation_test(
198        name = test_name,
199        target_under_test = name,
200    )
201
202    return test_name
203
204def _test_prebuilt_xml_xsd_schema_validation():
205    name = "prebuilt_xml_xsd_schema_validation"
206    test_name = name + "_test"
207    prebuilt_xml(
208        name = name,
209        schema = XSD_SCHEMA,
210        filename = FILENAME,
211        src = SRC,
212        tags = ["manual"],
213    )
214    prebuilt_xml_schema_validation_test(
215        name = test_name,
216        target_under_test = name,
217    )
218
219    return test_name
220
221def _test_prebuilt_xml_minimal_schema_validation():
222    name = "prebuilt_xml_minimal_schema_validation"
223    test_name = name + "_test"
224    prebuilt_xml(
225        name = name,
226        src = SRC,
227        filename = FILENAME,
228        tags = ["manual"],
229    )
230    prebuilt_xml_schema_validation_test(
231        name = test_name,
232        target_under_test = name,
233    )
234
235    return test_name
236
237def prebuilt_xml_test_suite(name):
238    native.test_suite(
239        name = name,
240        tests = [
241            _test_prebuilt_xml_commands(),
242            _test_prebuilt_xml_commands_dtd(),
243            _test_prebuilt_xml_commands_xsd(),
244            _test_prebuilt_xml_minimal_schema_validation(),
245            _test_prebuilt_xml_dtd_schema_validation(),
246            _test_prebuilt_xml_xsd_schema_validation(),
247            _test_prebuilt_xml_PrebuiltFileInfo(),
248        ],
249    )
250