| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| import re |
| import unittest |
| from unittest.mock import Mock |
| |
| from bazel_query import BazelQuery, BazelQueryRunner |
| |
| |
| class TestBazelQuery(unittest.TestCase): |
| |
| def test_rule_exact(self): |
| query = BazelQuery.rule_exact("foo", "bar") |
| self.assertEqual(query, 'kind("^foo rule$", bar)') |
| |
| def test_tag_exact(self): |
| query = BazelQuery.tag_exact("manual", "foo") |
| self.assertEqual(query, 'attr("tags", "[\\[ ]manual[,\\]]", foo)') |
| |
| def test_regex_for_tag(self): |
| regex = BazelQuery.regex_for_tag("foo") |
| self.assertEqual(regex, '[\\[ ]foo[,\\]]') |
| |
| # Regex doesn't match lists without "foo". |
| self.assertFalse(re.search(regex, "[]")) |
| self.assertFalse(re.search(regex, "[bar]")) |
| self.assertFalse(re.search(regex, "[bar, baz]")) |
| |
| # Regex does not match superstrings of "foo". |
| self.assertFalse(re.search(regex, "[foobar]")) |
| self.assertFalse(re.search(regex, "[barfoo]")) |
| self.assertFalse(re.search(regex, "[foofoo]")) |
| |
| # Regex matches "foo" in any position. |
| self.assertTrue(re.search(regex, "[bar, foo, baz]")) |
| self.assertTrue(re.search(regex, "[bar, foo]")) |
| self.assertTrue(re.search(regex, "[foo, baz]")) |
| self.assertTrue(re.search(regex, "[foo]")) |
| |
| |
| class TestFindTargetsWithBannedChars(unittest.TestCase): |
| |
| def test_no_test_suites(self): |
| backend = Mock() |
| backend.return_value = [] |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_targets_with_banned_chars() |
| self.assertEqual(list(targets), []) |
| |
| def test_one_target_empty_string(self): |
| """Bazel does not allow targets to have empty names. |
| |
| This test simply documents how we respond to the impossible scenario. |
| """ |
| backend = Mock() |
| backend.return_value = [""] |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_targets_with_banned_chars() |
| self.assertEqual(list(targets), []) |
| |
| def test_only_good_chars(self): |
| backend = Mock() |
| backend.return_value = ["//foo:bar", "//bar_baz:foo"] |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_targets_with_banned_chars() |
| self.assertEqual(list(targets), []) |
| |
| def test_only_bad_chars(self): |
| backend = Mock() |
| backend.return_value = ["!@#$", "^&*()", "\x01"] |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_targets_with_banned_chars() |
| self.assertCountEqual(list(targets), [ |
| ("!@#$", set("!@#$")), |
| ("^&*()", set("^&*()")), |
| ("\x01", set("\x01")), |
| ]) |
| |
| def test_mixed(self): |
| backend = Mock() |
| backend.return_value = [ |
| '!@#$', '\x01', '//foo:bar', '^&*()', '//bar_baz:foo' |
| ] |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_targets_with_banned_chars() |
| self.assertCountEqual(list(targets), [ |
| ("!@#$", set("!@#$")), |
| ("\x01", set("\x01")), |
| ("^&*()", set("^&*()")), |
| ]) |
| |
| |
| class TestFindEmptyTestSuites(unittest.TestCase): |
| |
| def test_empty(self): |
| backend = Mock() |
| backend.return_value = [] |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_empty_test_suites() |
| self.assertEqual(list(targets), []) |
| |
| def test_one_empty_suite(self): |
| query_result_sequence = [ |
| ["//foo:some_test_suite"], # List of test suites. |
| [], # List of tests in the first test suite. |
| ] |
| |
| def backend(_query): |
| return query_result_sequence.pop(0) |
| |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_empty_test_suites() |
| self.assertEqual(list(targets), ["//foo:some_test_suite"]) |
| self.assertEqual(query_result_sequence, []) |
| |
| def test_second_suite_empty(self): |
| query_result_sequence = [[ |
| "//foo:some_test_suite", "//foo:another_test_suite" |
| ], ["//foo:test"], []] |
| |
| def backend(_query): |
| return query_result_sequence.pop(0) |
| |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_empty_test_suites() |
| self.assertEqual(list(targets), ["//foo:another_test_suite"]) |
| self.assertEqual(query_result_sequence, []) |
| |
| |
| class TestFindNonManualTestSuites(unittest.TestCase): |
| |
| def test_simple(self): |
| backend = Mock() |
| backend.return_value = ["//foo:bar"] |
| |
| bazel = BazelQueryRunner(backend=backend) |
| targets = bazel.find_non_manual_test_suites() |
| self.assertEqual(list(targets), ["//foo:bar"]) |
| backend.assert_called_once_with( |
| 'kind("^test_suite rule$", //...) except attr("tags", "[\\[ ]manual[,\\]]", //...)' |
| ) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |