blob: 8cf295962763caab6030742c111f83361ff78dd9 [file] [log] [blame]
Paul Duffin428c6512021-07-21 15:33:22 +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 Duffin428c6512021-07-21 15:33:22 +010016"""Unit tests for verify_overlaps_test.py."""
17import io
18import unittest
19
Paul Duffinb5cd5222022-02-28 19:06:49 +000020from verify_overlaps import * #pylint: disable=unused-wildcard-import,wildcard-import
Spandan Das559132f2021-08-25 18:17:33 +000021
Paul Duffin428c6512021-07-21 15:33:22 +010022
Spandan Das559132f2021-08-25 18:17:33 +000023#pylint: disable=line-too-long
Paul Duffin428c6512021-07-21 15:33:22 +010024class TestDetectOverlaps(unittest.TestCase):
25
Spandan Das559132f2021-08-25 18:17:33 +000026 def read_flag_trie_from_string(self, csvdata):
27 with io.StringIO(csvdata) as f:
Paul Duffinc11f6672021-07-20 00:04:21 +010028 return read_flag_trie_from_stream(f)
29
Spandan Das559132f2021-08-25 18:17:33 +000030 def read_signature_csv_from_string_as_dict(self, csvdata):
31 with io.StringIO(csvdata) as f:
Paul Duffin428c6512021-07-21 15:33:22 +010032 return read_signature_csv_from_stream_as_dict(f)
33
Spandan Das559132f2021-08-25 18:17:33 +000034 def extract_subset_from_monolithic_flags_as_dict_from_string(
35 self, monolithic, patterns):
Paul Duffin67b9d612021-07-21 17:38:47 +010036 with io.StringIO(patterns) as f:
Spandan Das559132f2021-08-25 18:17:33 +000037 return extract_subset_from_monolithic_flags_as_dict_from_stream(
38 monolithic, f)
Paul Duffin67b9d612021-07-21 17:38:47 +010039
Spandan Das559132f2021-08-25 18:17:33 +000040 extractInput = """
Paul Duffin53a76072021-07-21 17:27:09 +010041Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
42Ljava/lang/Object;->toString()Ljava/lang/String;,blocked
Paul Duffinc11f6672021-07-20 00:04:21 +010043Ljava/util/zip/ZipFile;-><clinit>()V,blocked
44Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;,blocked
45Ljava/lang/Character;->serialVersionUID:J,sdk
46Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V,blocked
Spandan Das559132f2021-08-25 18:17:33 +000047"""
Paul Duffin53a76072021-07-21 17:27:09 +010048
Paul Duffinc11f6672021-07-20 00:04:21 +010049 def test_extract_subset_signature(self):
Spandan Das559132f2021-08-25 18:17:33 +000050 monolithic = self.read_flag_trie_from_string(
51 TestDetectOverlaps.extractInput)
Paul Duffin67b9d612021-07-21 17:38:47 +010052
53 patterns = 'Ljava/lang/Object;->hashCode()I'
54
Spandan Das559132f2021-08-25 18:17:33 +000055 subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
56 monolithic, patterns)
Paul Duffin53a76072021-07-21 17:27:09 +010057 expected = {
58 'Ljava/lang/Object;->hashCode()I': {
59 None: ['public-api', 'system-api', 'test-api'],
60 'signature': 'Ljava/lang/Object;->hashCode()I',
61 },
62 }
63 self.assertEqual(expected, subset)
64
Paul Duffinc11f6672021-07-20 00:04:21 +010065 def test_extract_subset_class(self):
Spandan Das559132f2021-08-25 18:17:33 +000066 monolithic = self.read_flag_trie_from_string(
67 TestDetectOverlaps.extractInput)
Paul Duffinc11f6672021-07-20 00:04:21 +010068
69 patterns = 'java/lang/Object'
70
Spandan Das559132f2021-08-25 18:17:33 +000071 subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
72 monolithic, patterns)
Paul Duffinc11f6672021-07-20 00:04:21 +010073 expected = {
74 'Ljava/lang/Object;->hashCode()I': {
75 None: ['public-api', 'system-api', 'test-api'],
76 'signature': 'Ljava/lang/Object;->hashCode()I',
77 },
78 'Ljava/lang/Object;->toString()Ljava/lang/String;': {
79 None: ['blocked'],
80 'signature': 'Ljava/lang/Object;->toString()Ljava/lang/String;',
81 },
82 }
83 self.assertEqual(expected, subset)
84
85 def test_extract_subset_outer_class(self):
Spandan Das559132f2021-08-25 18:17:33 +000086 monolithic = self.read_flag_trie_from_string(
87 TestDetectOverlaps.extractInput)
Paul Duffinc11f6672021-07-20 00:04:21 +010088
89 patterns = 'java/lang/Character'
90
Spandan Das559132f2021-08-25 18:17:33 +000091 subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
92 monolithic, patterns)
Paul Duffinc11f6672021-07-20 00:04:21 +010093 expected = {
Spandan Das559132f2021-08-25 18:17:33 +000094 'Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;':
95 {
96 None: ['blocked'],
97 'signature':
98 'Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;',
99 },
Paul Duffinc11f6672021-07-20 00:04:21 +0100100 'Ljava/lang/Character;->serialVersionUID:J': {
101 None: ['sdk'],
102 'signature': 'Ljava/lang/Character;->serialVersionUID:J',
103 },
104 }
105 self.assertEqual(expected, subset)
106
107 def test_extract_subset_nested_class(self):
Spandan Das559132f2021-08-25 18:17:33 +0000108 monolithic = self.read_flag_trie_from_string(
109 TestDetectOverlaps.extractInput)
Paul Duffinc11f6672021-07-20 00:04:21 +0100110
111 patterns = 'java/lang/Character$UnicodeScript'
112
Spandan Das559132f2021-08-25 18:17:33 +0000113 subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
114 monolithic, patterns)
Paul Duffinc11f6672021-07-20 00:04:21 +0100115 expected = {
Spandan Das559132f2021-08-25 18:17:33 +0000116 'Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;':
117 {
118 None: ['blocked'],
119 'signature':
120 'Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;',
121 },
Paul Duffinc11f6672021-07-20 00:04:21 +0100122 }
123 self.assertEqual(expected, subset)
124
125 def test_extract_subset_package(self):
Spandan Das559132f2021-08-25 18:17:33 +0000126 monolithic = self.read_flag_trie_from_string(
127 TestDetectOverlaps.extractInput)
Paul Duffinc11f6672021-07-20 00:04:21 +0100128
129 patterns = 'java/lang/*'
130
Spandan Das559132f2021-08-25 18:17:33 +0000131 subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
132 monolithic, patterns)
Paul Duffinc11f6672021-07-20 00:04:21 +0100133 expected = {
Spandan Das559132f2021-08-25 18:17:33 +0000134 'Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;':
135 {
136 None: ['blocked'],
137 'signature':
138 'Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;',
139 },
Paul Duffinc11f6672021-07-20 00:04:21 +0100140 'Ljava/lang/Character;->serialVersionUID:J': {
141 None: ['sdk'],
142 'signature': 'Ljava/lang/Character;->serialVersionUID:J',
143 },
144 'Ljava/lang/Object;->hashCode()I': {
145 None: ['public-api', 'system-api', 'test-api'],
146 'signature': 'Ljava/lang/Object;->hashCode()I',
147 },
148 'Ljava/lang/Object;->toString()Ljava/lang/String;': {
149 None: ['blocked'],
150 'signature': 'Ljava/lang/Object;->toString()Ljava/lang/String;',
151 },
152 'Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V': {
153 None: ['blocked'],
154 'signature': 'Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V',
155 },
156 }
157 self.assertEqual(expected, subset)
158
159 def test_extract_subset_recursive_package(self):
Spandan Das559132f2021-08-25 18:17:33 +0000160 monolithic = self.read_flag_trie_from_string(
161 TestDetectOverlaps.extractInput)
Paul Duffinc11f6672021-07-20 00:04:21 +0100162
163 patterns = 'java/**'
164
Spandan Das559132f2021-08-25 18:17:33 +0000165 subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
166 monolithic, patterns)
Paul Duffinc11f6672021-07-20 00:04:21 +0100167 expected = {
Spandan Das559132f2021-08-25 18:17:33 +0000168 'Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;':
169 {
170 None: ['blocked'],
171 'signature':
172 'Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;',
173 },
Paul Duffinc11f6672021-07-20 00:04:21 +0100174 'Ljava/lang/Character;->serialVersionUID:J': {
175 None: ['sdk'],
176 'signature': 'Ljava/lang/Character;->serialVersionUID:J',
177 },
178 'Ljava/lang/Object;->hashCode()I': {
179 None: ['public-api', 'system-api', 'test-api'],
180 'signature': 'Ljava/lang/Object;->hashCode()I',
181 },
182 'Ljava/lang/Object;->toString()Ljava/lang/String;': {
183 None: ['blocked'],
184 'signature': 'Ljava/lang/Object;->toString()Ljava/lang/String;',
185 },
186 'Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V': {
187 None: ['blocked'],
188 'signature': 'Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V',
189 },
190 'Ljava/util/zip/ZipFile;-><clinit>()V': {
191 None: ['blocked'],
192 'signature': 'Ljava/util/zip/ZipFile;-><clinit>()V',
193 },
194 }
195 self.assertEqual(expected, subset)
196
Paul Duffinc11f6672021-07-20 00:04:21 +0100197 def test_read_trie_duplicate(self):
198 with self.assertRaises(Exception) as context:
Spandan Das559132f2021-08-25 18:17:33 +0000199 self.read_flag_trie_from_string("""
Paul Duffinc11f6672021-07-20 00:04:21 +0100200Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
201Ljava/lang/Object;->hashCode()I,blocked
Spandan Das559132f2021-08-25 18:17:33 +0000202""")
203 self.assertTrue('Duplicate signature: Ljava/lang/Object;->hashCode()I'
204 in str(context.exception))
Paul Duffinc11f6672021-07-20 00:04:21 +0100205
206 def test_read_trie_missing_member(self):
207 with self.assertRaises(Exception) as context:
Spandan Das559132f2021-08-25 18:17:33 +0000208 self.read_flag_trie_from_string("""
Paul Duffinc11f6672021-07-20 00:04:21 +0100209Ljava/lang/Object,public-api,system-api,test-api
Spandan Das559132f2021-08-25 18:17:33 +0000210""")
211 self.assertTrue(
212 'Invalid signature: Ljava/lang/Object, does not identify a specific member'
213 in str(context.exception))
Paul Duffinc11f6672021-07-20 00:04:21 +0100214
Paul Duffin428c6512021-07-21 15:33:22 +0100215 def test_match(self):
Spandan Das559132f2021-08-25 18:17:33 +0000216 monolithic = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100217Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
Spandan Das559132f2021-08-25 18:17:33 +0000218""")
219 modular = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100220Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
Spandan Das559132f2021-08-25 18:17:33 +0000221""")
Paul Duffin428c6512021-07-21 15:33:22 +0100222 mismatches = compare_signature_flags(monolithic, modular)
223 expected = []
224 self.assertEqual(expected, mismatches)
225
226 def test_mismatch_overlapping_flags(self):
Spandan Das559132f2021-08-25 18:17:33 +0000227 monolithic = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100228Ljava/lang/Object;->toString()Ljava/lang/String;,public-api
Spandan Das559132f2021-08-25 18:17:33 +0000229""")
230 modular = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100231Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
Spandan Das559132f2021-08-25 18:17:33 +0000232""")
Paul Duffin428c6512021-07-21 15:33:22 +0100233 mismatches = compare_signature_flags(monolithic, modular)
234 expected = [
235 (
236 'Ljava/lang/Object;->toString()Ljava/lang/String;',
237 ['public-api', 'system-api', 'test-api'],
238 ['public-api'],
239 ),
240 ]
241 self.assertEqual(expected, mismatches)
242
Paul Duffin428c6512021-07-21 15:33:22 +0100243 def test_mismatch_monolithic_blocked(self):
Spandan Das559132f2021-08-25 18:17:33 +0000244 monolithic = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100245Ljava/lang/Object;->toString()Ljava/lang/String;,blocked
Spandan Das559132f2021-08-25 18:17:33 +0000246""")
247 modular = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100248Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
Spandan Das559132f2021-08-25 18:17:33 +0000249""")
Paul Duffin428c6512021-07-21 15:33:22 +0100250 mismatches = compare_signature_flags(monolithic, modular)
251 expected = [
252 (
253 'Ljava/lang/Object;->toString()Ljava/lang/String;',
254 ['public-api', 'system-api', 'test-api'],
255 ['blocked'],
256 ),
257 ]
258 self.assertEqual(expected, mismatches)
259
260 def test_mismatch_modular_blocked(self):
Spandan Das559132f2021-08-25 18:17:33 +0000261 monolithic = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100262Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
Spandan Das559132f2021-08-25 18:17:33 +0000263""")
264 modular = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100265Ljava/lang/Object;->toString()Ljava/lang/String;,blocked
Spandan Das559132f2021-08-25 18:17:33 +0000266""")
Paul Duffin428c6512021-07-21 15:33:22 +0100267 mismatches = compare_signature_flags(monolithic, modular)
268 expected = [
269 (
270 'Ljava/lang/Object;->toString()Ljava/lang/String;',
271 ['blocked'],
272 ['public-api', 'system-api', 'test-api'],
273 ),
274 ]
275 self.assertEqual(expected, mismatches)
276
Paul Duffin280bae62021-07-20 18:03:53 +0100277 def test_match_treat_missing_from_modular_as_blocked(self):
Paul Duffin53a76072021-07-21 17:27:09 +0100278 monolithic = self.read_signature_csv_from_string_as_dict('')
Spandan Das559132f2021-08-25 18:17:33 +0000279 modular = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100280Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
Spandan Das559132f2021-08-25 18:17:33 +0000281""")
Paul Duffin428c6512021-07-21 15:33:22 +0100282 mismatches = compare_signature_flags(monolithic, modular)
283 expected = [
284 (
285 'Ljava/lang/Object;->toString()Ljava/lang/String;',
286 ['public-api', 'system-api', 'test-api'],
287 [],
288 ),
289 ]
290 self.assertEqual(expected, mismatches)
291
Paul Duffin280bae62021-07-20 18:03:53 +0100292 def test_mismatch_treat_missing_from_modular_as_blocked(self):
Spandan Das559132f2021-08-25 18:17:33 +0000293 monolithic = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100294Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
Spandan Das559132f2021-08-25 18:17:33 +0000295""")
Paul Duffin428c6512021-07-21 15:33:22 +0100296 modular = {}
297 mismatches = compare_signature_flags(monolithic, modular)
Paul Duffin53a76072021-07-21 17:27:09 +0100298 expected = [
299 (
300 'Ljava/lang/Object;->hashCode()I',
Paul Duffin280bae62021-07-20 18:03:53 +0100301 ['blocked'],
Paul Duffin53a76072021-07-21 17:27:09 +0100302 ['public-api', 'system-api', 'test-api'],
303 ),
304 ]
Paul Duffin428c6512021-07-21 15:33:22 +0100305 self.assertEqual(expected, mismatches)
306
307 def test_blocked_missing_from_modular(self):
Spandan Das559132f2021-08-25 18:17:33 +0000308 monolithic = self.read_signature_csv_from_string_as_dict("""
Paul Duffin428c6512021-07-21 15:33:22 +0100309Ljava/lang/Object;->hashCode()I,blocked
Spandan Das559132f2021-08-25 18:17:33 +0000310""")
Paul Duffin428c6512021-07-21 15:33:22 +0100311 modular = {}
312 mismatches = compare_signature_flags(monolithic, modular)
Paul Duffin280bae62021-07-20 18:03:53 +0100313 expected = []
Paul Duffin428c6512021-07-21 15:33:22 +0100314 self.assertEqual(expected, mismatches)
Paul Duffinb5cd5222022-02-28 19:06:49 +0000315
316
Spandan Das559132f2021-08-25 18:17:33 +0000317#pylint: enable=line-too-long
Paul Duffin428c6512021-07-21 15:33:22 +0100318
319if __name__ == '__main__':
320 unittest.main(verbosity=2)