xref: /aosp_15_r20/build/soong/scripts/hiddenapi/generate_hiddenapi_lists_test.py (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1#!/usr/bin/env python
2#
3# Copyright (C) 2018 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the 'License');
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#      http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an 'AS IS' BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16"""Unit tests for Hidden API list generation."""
17import unittest
18from generate_hiddenapi_lists import *  # pylint: disable=wildcard-import,unused-wildcard-import
19
20
21class TestHiddenapiListGeneration(unittest.TestCase):
22    def test_filter_apis(self):
23        # Initialize flags so that A and B are put on the allow list and
24        # C, D, E are left unassigned. Try filtering for the unassigned ones.
25        flags = FlagsDict()
26        flags.parse_and_merge_csv(
27            ['A,' + FLAG_SDK, 'B,' + FLAG_SDK, 'C', 'D', 'E']
28        )
29        filter_set = flags.filter_apis(lambda api, flags: not flags)
30        self.assertTrue(isinstance(filter_set, set))
31        self.assertEqual(filter_set, set(['C', 'D', 'E']))
32
33    def test_get_valid_subset_of_unassigned_keys(self):
34        # Create flags where only A is unassigned.
35        flags = FlagsDict()
36        flags.parse_and_merge_csv(['A,' + FLAG_SDK, 'B', 'C'])
37        flags.assign_flag(FLAG_UNSUPPORTED, set(['C']))
38        self.assertEqual(
39            flags.generate_csv(),
40            ['A,' + FLAG_SDK, 'B', 'C,' + FLAG_UNSUPPORTED],
41        )
42
43        # Check three things:
44        # (1) B is selected as valid unassigned
45        # (2) A is not selected because it is assigned to the allow list
46        # (3) D is not selected because it is not a valid key
47        self.assertEqual(
48            flags.get_valid_subset_of_unassigned_apis(set(['A', 'B', 'D'])),
49            set(['B']),
50        )
51
52    def test_parse_and_merge_csv(self):
53        flags = FlagsDict()
54
55        # Test empty CSV entry.
56        self.assertEqual(flags.generate_csv(), [])
57
58        # Test new additions.
59        flags.parse_and_merge_csv(
60            [
61                'A,' + FLAG_UNSUPPORTED,
62                'B,' + FLAG_BLOCKED + ',' + FLAG_MAX_TARGET_O,
63                'C,' + FLAG_SDK + ',' + FLAG_SYSTEM_API,
64                'D,' + FLAG_UNSUPPORTED + ',' + FLAG_TEST_API,
65                'E,' + FLAG_BLOCKED + ',' + FLAG_TEST_API,
66            ]
67        )
68        self.assertEqual(
69            flags.generate_csv(),
70            [
71                'A,' + FLAG_UNSUPPORTED,
72                'B,' + FLAG_BLOCKED + "," + FLAG_MAX_TARGET_O,
73                'C,' + FLAG_SDK + ',' + FLAG_SYSTEM_API,
74                'D,' + FLAG_TEST_API + ',' + FLAG_UNSUPPORTED,
75                'E,' + FLAG_BLOCKED + ',' + FLAG_TEST_API,
76            ],
77        )
78
79        # Test unknown flag.
80        with self.assertRaises(AssertionError):
81            flags.parse_and_merge_csv(['Z,foo'])
82
83    def test_assign_flag(self):
84        flags = FlagsDict()
85        flags.parse_and_merge_csv(['A,' + FLAG_SDK, 'B'])
86
87        # Test new additions.
88        flags.assign_flag(FLAG_UNSUPPORTED, set(['A', 'B']))
89        self.assertEqual(
90            flags.generate_csv(),
91            ['A,' + FLAG_SDK + "," + FLAG_UNSUPPORTED, 'B,' + FLAG_UNSUPPORTED],
92        )
93
94        # Test invalid API signature.
95        with self.assertRaises(AssertionError):
96            flags.assign_flag(FLAG_SDK, set(['C']))
97
98        # Test invalid flag.
99        with self.assertRaises(AssertionError):
100            flags.assign_flag('foo', set(['A']))
101
102    def test_extract_package(self):
103        signature = 'Lcom/foo/bar/Baz;->method1()Lcom/bar/Baz;'
104        expected_package = 'com.foo.bar'
105        self.assertEqual(extract_package(signature), expected_package)
106
107        signature = 'Lcom/foo1/bar/MyClass;->method2()V'
108        expected_package = 'com.foo1.bar'
109        self.assertEqual(extract_package(signature), expected_package)
110
111        signature = 'Lcom/foo_bar/baz/MyClass;->method3()V'
112        expected_package = 'com.foo_bar.baz'
113        self.assertEqual(extract_package(signature), expected_package)
114
115
116if __name__ == '__main__':
117    unittest.main(verbosity=2)
118