blob: 42282c171938be1241306c5f111d7a965197b7b3 [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)
30 self.ScratchFile('WORKSPACE')
31 self.CreateWorkspaceWithDefaultRepos('repo/WORKSPACE')
32
33 def tearDown(self):
34 test_base.TestBase.tearDown(self)
35
36 def testBasicCquery(self):
37 self.ScratchFile('testapp/BUILD', [
38 'filegroup(name = "fg", srcs = ["a.file"])',
39 ])
40 res = self._bazel_api.cquery(['//testapp:all'])
41 success = res[0]
42 cts = res[2]
43 self.assertTrue(success)
44 self.assertEqual(len(cts), 1)
45 self.assertEqual(cts[0].label, '//testapp:fg')
46 self.assertIsNone(cts[0].config)
47 self.assertGreater(len(cts[0].config_hash), 10)
48 self.assertIn('PlatformConfiguration', cts[0].transitive_fragments)
49
50 def testFailedCquery(self):
51 self.ScratchFile('testapp/BUILD', [
52 'filegroup(name = "fg", srcs = ["a.file"])',
53 ])
54 (success, stderr, cts) = self._bazel_api.cquery(['//testapp:typo'])
55 self.assertFalse(success)
56 self.assertEqual(len(cts), 0)
57 self.assertIn("target 'typo' not declared in package 'testapp'",
58 os.linesep.join(stderr))
59
60 def testTransitiveFragmentsAccuracy(self):
61 self.ScratchFile('testapp/BUILD', [
62 'filegroup(name = "fg", srcs = ["a.file"])',
63 'filegroup(name = "ccfg", srcs = [":ccbin"])',
64 'cc_binary(name = "ccbin", srcs = ["ccbin.cc"])'
65 ])
66 cts1 = self._bazel_api.cquery(['//testapp:fg'])[2]
67 self.assertNotIn('CppConfiguration', cts1[0].transitive_fragments)
68 cts2 = self._bazel_api.cquery(['//testapp:ccfg'])[2]
69 self.assertIn('CppConfiguration', cts2[0].transitive_fragments)
70
71 def testGetTargetConfig(self):
72 self.ScratchFile('testapp/BUILD', [
73 'filegroup(name = "fg", srcs = ["a.file"])',
74 ])
75 cts = self._bazel_api.cquery(['//testapp:fg'])[2]
76 config = self._bazel_api.get_config(cts[0].config_hash)
77 expected_fragments = ['PlatformConfiguration', 'JavaConfiguration']
78 for exp in expected_fragments:
Greg Estrenc1d70872020-08-25 07:17:08 -070079 self.assertIn(exp, config.fragments.keys())
Greg Estren2323dfe2020-07-15 12:02:51 -070080 core_options = config.options['CoreOptions']
81 self.assertIsNotNone(core_options)
82 self.assertIn(('stamp', 'false'), core_options.items())
83
84 def testGetHostConfig(self):
85 self.ScratchFile('testapp/BUILD', [
86 'genrule(',
87 ' name = "g",',
88 ' srcs = [],',
89 ' cmd = "",',
90 ' outs = ["g.out"],',
91 ' tools = [":fg"])',
92 'filegroup(name = "fg", srcs = ["a.file"])',
93 ])
94 query = ['//testapp:fg', '--universe_scope=//testapp:g']
95 cts = self._bazel_api.cquery(query)[2]
96 config = self._bazel_api.get_config(cts[0].config_hash)
97 self.assertIsInstance(config, HostConfiguration)
98 # We don't currently populate or read a host configuration's details.
99 self.assertEqual(len(config.fragments), 0)
100 self.assertEqual(len(config.options), 0)
101
102 def testGetNullConfig(self):
103 self.ScratchFile('testapp/BUILD', [
104 'filegroup(name = "fg", srcs = ["a.file"])',
105 ])
106 cts = self._bazel_api.cquery(['//testapp:a.file'])[2]
107 config = self._bazel_api.get_config(cts[0].config_hash)
108 self.assertIsInstance(config, NullConfiguration)
109 # Null configurations have no information by definition.
110 self.assertEqual(len(config.fragments), 0)
111 self.assertEqual(len(config.options), 0)
112
Greg Estrenc1d70872020-08-25 07:17:08 -0700113 def testConfigFragmentsMap(self):
114 self.ScratchFile('testapp/BUILD', [
115 'filegroup(name = "fg", srcs = ["a.file"])',
116 ])
117 cts = self._bazel_api.cquery(['//testapp:fg'])[2]
118 fragments_map = self._bazel_api.get_config(cts[0].config_hash).fragments
119 self.assertIn('PlatformOptions', fragments_map['PlatformConfiguration'])
120 self.assertIn('ShellConfiguration$Options',
121 fragments_map['ShellConfiguration'])
122
Greg Estren2323dfe2020-07-15 12:02:51 -0700123 def testConfigWithDefines(self):
124 self.ScratchFile('testapp/BUILD', [
125 'filegroup(name = "fg", srcs = ["a.file"])',
126 ])
127 cquery_args = ['//testapp:fg', '--define', 'a=b']
128 cts = self._bazel_api.cquery(cquery_args)[2]
129 config = self._bazel_api.get_config(cts[0].config_hash)
130 user_defined_options = config.options['user-defined']
131 self.assertIsNotNone(user_defined_options)
132 self.assertDictEqual(user_defined_options._dict, {'--define:a': 'b'})
133
134 def testConfigWithStarlarkFlags(self):
135 self.ScratchFile('testapp/defs.bzl', [
Marek uppab6090a82022-02-01 13:28:58 -0800136 'def _flag_impl(settings, attr):',
137 ' pass',
138 'string_flag = rule(',
Greg Estren2323dfe2020-07-15 12:02:51 -0700139 ' implementation = _flag_impl,',
Marek uppab6090a82022-02-01 13:28:58 -0800140 ' build_setting = config.string(flag = True)',
141 ')',
Greg Estren2323dfe2020-07-15 12:02:51 -0700142 ])
143 self.ScratchFile('testapp/BUILD', [
144 'load(":defs.bzl", "string_flag")',
145 'string_flag(name = "my_flag", build_setting_default = "nada")',
146 'filegroup(name = "fg", srcs = ["a.file"])',
147 ])
148 cquery_args = ['//testapp:fg', '--//testapp:my_flag', 'algo']
149 cts = self._bazel_api.cquery(cquery_args)[2]
150 config = self._bazel_api.get_config(cts[0].config_hash)
151 user_defined_options = config.options['user-defined']
152 self.assertIsNotNone(user_defined_options)
153 self.assertDictEqual(user_defined_options._dict,
154 {'//testapp:my_flag': 'algo'})
155
156
157if __name__ == '__main__':
158 unittest.main()