blob: 90b3d0b09c1842a00795aed930c6ef045d8411e3 [file] [log] [blame]
Paul Duffin67b9d612021-07-21 17:38:47 +01001#!/usr/bin/env python
2#
3# Copyright (C) 2021 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.
Paul Duffin67b9d612021-07-21 17:38:47 +010016"""Unit tests for signature_patterns.py."""
17import io
18import unittest
19
Paul Duffin1024f1d2022-03-15 17:45:57 +000020import signature_patterns
Spandan Das2c2219b2021-08-25 17:47:43 +000021
Paul Duffin67b9d612021-07-21 17:38:47 +010022
23class TestGeneratedPatterns(unittest.TestCase):
Paul Duffin67b9d612021-07-21 17:38:47 +010024
Paul Duffin1024f1d2022-03-15 17:45:57 +000025 csv_flags = """
Paul Duffin6ffdff82021-08-09 13:47:19 +010026Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V,blocked
27Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;,public-api
Paul Duffin67b9d612021-07-21 17:38:47 +010028Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
29Ljava/lang/Object;->toString()Ljava/lang/String;,blocked
Paul Duffin1e18e982021-08-03 15:42:27 +010030"""
31
Paul Duffin1024f1d2022-03-15 17:45:57 +000032 @staticmethod
33 def produce_patterns_from_string(csv_text,
34 split_packages=None,
Paul Duffin846beb72022-03-15 17:45:57 +000035 single_packages=None,
Paul Duffin1024f1d2022-03-15 17:45:57 +000036 package_prefixes=None):
37 with io.StringIO(csv_text) as f:
38 return signature_patterns.produce_patterns_from_stream(
Paul Duffin846beb72022-03-15 17:45:57 +000039 f, split_packages, single_packages, package_prefixes)
40
41 def test_generate_unmatched(self):
42 _, errors = self.produce_patterns_from_string(
43 TestGeneratedPatterns.csv_flags)
44 self.assertEqual([
45 'The following packages were unexpected, please add them to one of '
46 'the hidden_api properties, split_packages, single_packages or '
47 'package_prefixes:\n'
48 ' java.lang'
49 ], errors)
Paul Duffin1e18e982021-08-03 15:42:27 +010050
51 def test_generate_default(self):
Paul Duffin846beb72022-03-15 17:45:57 +000052 patterns, errors = self.produce_patterns_from_string(
53 TestGeneratedPatterns.csv_flags, single_packages=['java/lang'])
54 self.assertEqual([], errors)
55
Paul Duffin67b9d612021-07-21 17:38:47 +010056 expected = [
Paul Duffin1e18e982021-08-03 15:42:27 +010057 'java/lang/*',
Paul Duffin67b9d612021-07-21 17:38:47 +010058 ]
59 self.assertEqual(expected, patterns)
60
Paul Duffin1e18e982021-08-03 15:42:27 +010061 def test_generate_split_package(self):
Paul Duffin846beb72022-03-15 17:45:57 +000062 patterns, errors = self.produce_patterns_from_string(
Paul Duffin1024f1d2022-03-15 17:45:57 +000063 TestGeneratedPatterns.csv_flags, split_packages={'java/lang'})
Paul Duffin846beb72022-03-15 17:45:57 +000064 self.assertEqual([], errors)
65
Paul Duffin1e18e982021-08-03 15:42:27 +010066 expected = [
67 'java/lang/Character',
68 'java/lang/Object',
69 'java/lang/ProcessBuilder',
70 ]
71 self.assertEqual(expected, patterns)
72
73 def test_generate_split_package_wildcard(self):
Paul Duffin846beb72022-03-15 17:45:57 +000074 patterns, errors = self.produce_patterns_from_string(
Paul Duffin1024f1d2022-03-15 17:45:57 +000075 TestGeneratedPatterns.csv_flags, split_packages={'*'})
Paul Duffin846beb72022-03-15 17:45:57 +000076 self.assertEqual([], errors)
77
Paul Duffin1e18e982021-08-03 15:42:27 +010078 expected = [
79 'java/lang/Character',
80 'java/lang/Object',
81 'java/lang/ProcessBuilder',
82 ]
83 self.assertEqual(expected, patterns)
84
85 def test_generate_package_prefix(self):
Paul Duffin846beb72022-03-15 17:45:57 +000086 patterns, errors = self.produce_patterns_from_string(
Paul Duffin1024f1d2022-03-15 17:45:57 +000087 TestGeneratedPatterns.csv_flags, package_prefixes={'java/lang'})
Paul Duffin846beb72022-03-15 17:45:57 +000088 self.assertEqual([], errors)
89
Paul Duffin1e18e982021-08-03 15:42:27 +010090 expected = [
91 'java/lang/**',
92 ]
93 self.assertEqual(expected, patterns)
94
95 def test_generate_package_prefix_top_package(self):
Paul Duffin846beb72022-03-15 17:45:57 +000096 patterns, errors = self.produce_patterns_from_string(
Paul Duffin1024f1d2022-03-15 17:45:57 +000097 TestGeneratedPatterns.csv_flags, package_prefixes={'java'})
Paul Duffin846beb72022-03-15 17:45:57 +000098 self.assertEqual([], errors)
99
Paul Duffin1e18e982021-08-03 15:42:27 +0100100 expected = [
101 'java/**',
102 ]
103 self.assertEqual(expected, patterns)
104
105 def test_split_package_wildcard_conflicts_with_other_split_packages(self):
Paul Duffin1024f1d2022-03-15 17:45:57 +0000106 errors = signature_patterns.validate_split_packages({'*', 'java'})
Paul Duffin1e18e982021-08-03 15:42:27 +0100107 expected = [
108 'split packages are invalid as they contain both the wildcard (*)'
109 ' and specific packages, use the wildcard or specific packages,'
110 ' not a mixture'
111 ]
112 self.assertEqual(expected, errors)
113
114 def test_split_package_wildcard_conflicts_with_package_prefixes(self):
Paul Duffin1024f1d2022-03-15 17:45:57 +0000115 errors = signature_patterns.validate_package_prefixes(
Paul Duffin846beb72022-03-15 17:45:57 +0000116 {'*'}, [], package_prefixes={'java'})
Paul Duffin1e18e982021-08-03 15:42:27 +0100117 expected = [
Paul Duffin1024f1d2022-03-15 17:45:57 +0000118 "split package '*' conflicts with all package prefixes java\n"
Paul Duffin1e18e982021-08-03 15:42:27 +0100119 ' add split_packages:[] to fix',
120 ]
121 self.assertEqual(expected, errors)
122
Paul Duffin846beb72022-03-15 17:45:57 +0000123 def test_split_package_conflicts_with_package_prefixes(self):
Paul Duffin1024f1d2022-03-15 17:45:57 +0000124 errors = signature_patterns.validate_package_prefixes(
Paul Duffin846beb72022-03-15 17:45:57 +0000125 {'java/split'}, [], package_prefixes={'java'})
Paul Duffin1e18e982021-08-03 15:42:27 +0100126 expected = [
127 'split package java.split is matched by package prefix java',
128 ]
129 self.assertEqual(expected, errors)
130
Paul Duffin846beb72022-03-15 17:45:57 +0000131 def test_single_package_conflicts_with_package_prefixes(self):
132 errors = signature_patterns.validate_package_prefixes(
133 {}, ['java/single'], package_prefixes={'java'})
134 expected = [
135 'single package java.single is matched by package prefix java',
136 ]
137 self.assertEqual(expected, errors)
138
139 def test_single_package_conflicts_with_split_packages(self):
140 errors = signature_patterns.validate_single_packages({'java/pkg'},
141 ['java/pkg'])
142 expected = [
143 'single_packages and split_packages overlap, please ensure the '
144 'following packages are only present in one:\n java/pkg'
145 ]
146 self.assertEqual(expected, errors)
147
Spandan Das2c2219b2021-08-25 17:47:43 +0000148
Paul Duffin67b9d612021-07-21 17:38:47 +0100149if __name__ == '__main__':
150 unittest.main(verbosity=2)