blob: 6a290ec941aeeb0f183d34817fff75b1eb71c35d [file] [log] [blame]
Greg Estren2323dfe2020-07-15 12:02:51 -07001# Copyright 2020 The Bazel Authors. 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"""Tests for bazel_api.py."""
15import os
16import unittest
17from src.test.py.bazel import test_base
18from tools.ctexplain.bazel_api import BazelApi
19from tools.ctexplain.types import HostConfiguration
20from tools.ctexplain.types import NullConfiguration
21
22
23class BazelApiTest(test_base.TestBase):
24
25 _bazel_api: BazelApi = None
26
27 def setUp(self):
28 test_base.TestBase.setUp(self)
29 self._bazel_api = BazelApi(self.RunBazel)
Greg Estren2323dfe2020-07-15 12:02:51 -070030
31 def tearDown(self):
32 test_base.TestBase.tearDown(self)
33
34 def testBasicCquery(self):
35 self.ScratchFile('testapp/BUILD', [
36 'filegroup(name = "fg", srcs = ["a.file"])',
37 ])
38 res = self._bazel_api.cquery(['//testapp:all'])
39 success = res[0]
40 cts = res[2]
41 self.assertTrue(success)
42 self.assertEqual(len(cts), 1)
43 self.assertEqual(cts[0].label, '//testapp:fg')
44 self.assertIsNone(cts[0].config)
45 self.assertGreater(len(cts[0].config_hash), 10)
46 self.assertIn('PlatformConfiguration', cts[0].transitive_fragments)
47
48 def testFailedCquery(self):
49 self.ScratchFile('testapp/BUILD', [
50 'filegroup(name = "fg", srcs = ["a.file"])',
51 ])
52 (success, stderr, cts) = self._bazel_api.cquery(['//testapp:typo'])
53 self.assertFalse(success)
54 self.assertEqual(len(cts), 0)
55 self.assertIn("target 'typo' not declared in package 'testapp'",
56 os.linesep.join(stderr))
57
58 def testTransitiveFragmentsAccuracy(self):
59 self.ScratchFile('testapp/BUILD', [
60 'filegroup(name = "fg", srcs = ["a.file"])',
61 'filegroup(name = "ccfg", srcs = [":ccbin"])',
62 'cc_binary(name = "ccbin", srcs = ["ccbin.cc"])'
63 ])
64 cts1 = self._bazel_api.cquery(['//testapp:fg'])[2]
65 self.assertNotIn('CppConfiguration', cts1[0].transitive_fragments)
66 cts2 = self._bazel_api.cquery(['//testapp:ccfg'])[2]
67 self.assertIn('CppConfiguration', cts2[0].transitive_fragments)
68
69 def testGetTargetConfig(self):
70 self.ScratchFile('testapp/BUILD', [
71 'filegroup(name = "fg", srcs = ["a.file"])',
72 ])
73 cts = self._bazel_api.cquery(['//testapp:fg'])[2]
74 config = self._bazel_api.get_config(cts[0].config_hash)
75 expected_fragments = ['PlatformConfiguration', 'JavaConfiguration']
76 for exp in expected_fragments:
Greg Estrenc1d70872020-08-25 07:17:08 -070077 self.assertIn(exp, config.fragments.keys())
Greg Estren2323dfe2020-07-15 12:02:51 -070078 core_options = config.options['CoreOptions']
79 self.assertIsNotNone(core_options)
80 self.assertIn(('stamp', 'false'), core_options.items())
81
82 def testGetHostConfig(self):
83 self.ScratchFile('testapp/BUILD', [
84 'genrule(',
85 ' name = "g",',
86 ' srcs = [],',
87 ' cmd = "",',
88 ' outs = ["g.out"],',
89 ' tools = [":fg"])',
90 'filegroup(name = "fg", srcs = ["a.file"])',
91 ])
92 query = ['//testapp:fg', '--universe_scope=//testapp:g']
93 cts = self._bazel_api.cquery(query)[2]
94 config = self._bazel_api.get_config(cts[0].config_hash)
95 self.assertIsInstance(config, HostConfiguration)
96 # We don't currently populate or read a host configuration's details.
97 self.assertEqual(len(config.fragments), 0)
98 self.assertEqual(len(config.options), 0)
99
100 def testGetNullConfig(self):
101 self.ScratchFile('testapp/BUILD', [
102 'filegroup(name = "fg", srcs = ["a.file"])',
103 ])
104 cts = self._bazel_api.cquery(['//testapp:a.file'])[2]
105 config = self._bazel_api.get_config(cts[0].config_hash)
106 self.assertIsInstance(config, NullConfiguration)
107 # Null configurations have no information by definition.
108 self.assertEqual(len(config.fragments), 0)
109 self.assertEqual(len(config.options), 0)
110
Greg Estrenc1d70872020-08-25 07:17:08 -0700111 def testConfigFragmentsMap(self):
112 self.ScratchFile('testapp/BUILD', [
113 'filegroup(name = "fg", srcs = ["a.file"])',
114 ])
115 cts = self._bazel_api.cquery(['//testapp:fg'])[2]
116 fragments_map = self._bazel_api.get_config(cts[0].config_hash).fragments
117 self.assertIn('PlatformOptions', fragments_map['PlatformConfiguration'])
118 self.assertIn('ShellConfiguration$Options',
119 fragments_map['ShellConfiguration'])
120
Greg Estren2323dfe2020-07-15 12:02:51 -0700121 def testConfigWithDefines(self):
122 self.ScratchFile('testapp/BUILD', [
123 'filegroup(name = "fg", srcs = ["a.file"])',
124 ])
125 cquery_args = ['//testapp:fg', '--define', 'a=b']
126 cts = self._bazel_api.cquery(cquery_args)[2]
127 config = self._bazel_api.get_config(cts[0].config_hash)
128 user_defined_options = config.options['user-defined']
129 self.assertIsNotNone(user_defined_options)
130 self.assertDictEqual(user_defined_options._dict, {'--define:a': 'b'})
131
132 def testConfigWithStarlarkFlags(self):
133 self.ScratchFile('testapp/defs.bzl', [
Marek uppab6090a82022-02-01 13:28:58 -0800134 'def _flag_impl(settings, attr):',
135 ' pass',
136 'string_flag = rule(',
Greg Estren2323dfe2020-07-15 12:02:51 -0700137 ' implementation = _flag_impl,',
Marek uppab6090a82022-02-01 13:28:58 -0800138 ' build_setting = config.string(flag = True)',
139 ')',
Greg Estren2323dfe2020-07-15 12:02:51 -0700140 ])
141 self.ScratchFile('testapp/BUILD', [
142 'load(":defs.bzl", "string_flag")',
143 'string_flag(name = "my_flag", build_setting_default = "nada")',
144 'filegroup(name = "fg", srcs = ["a.file"])',
145 ])
146 cquery_args = ['//testapp:fg', '--//testapp:my_flag', 'algo']
147 cts = self._bazel_api.cquery(cquery_args)[2]
148 config = self._bazel_api.get_config(cts[0].config_hash)
149 user_defined_options = config.options['user-defined']
150 self.assertIsNotNone(user_defined_options)
151 self.assertDictEqual(user_defined_options._dict,
152 {'//testapp:my_flag': 'algo'})
153
154
155if __name__ == '__main__':
156 unittest.main()