xref: /aosp_15_r20/build/soong/scripts/hiddenapi/verify_overlaps_test.py (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker#!/usr/bin/env python
2*333d2b36SAndroid Build Coastguard Worker#
3*333d2b36SAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project
4*333d2b36SAndroid Build Coastguard Worker#
5*333d2b36SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the 'License');
6*333d2b36SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*333d2b36SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*333d2b36SAndroid Build Coastguard Worker#
9*333d2b36SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*333d2b36SAndroid Build Coastguard Worker#
11*333d2b36SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*333d2b36SAndroid Build Coastguard Worker# distributed under the License is distributed on an 'AS IS' BASIS,
13*333d2b36SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*333d2b36SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*333d2b36SAndroid Build Coastguard Worker# limitations under the License.
16*333d2b36SAndroid Build Coastguard Worker"""Unit tests for verify_overlaps_test.py."""
17*333d2b36SAndroid Build Coastguard Workerimport io
18*333d2b36SAndroid Build Coastguard Workerimport unittest
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Workerimport verify_overlaps as vo
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Workerclass TestDetectOverlaps(unittest.TestCase):
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker    @staticmethod
26*333d2b36SAndroid Build Coastguard Worker    def read_flag_trie_from_string(csvdata):
27*333d2b36SAndroid Build Coastguard Worker        with io.StringIO(csvdata) as f:
28*333d2b36SAndroid Build Coastguard Worker            return vo.read_flag_trie_from_stream(f)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker    @staticmethod
31*333d2b36SAndroid Build Coastguard Worker    def read_signature_csv_from_string_as_dict(csvdata):
32*333d2b36SAndroid Build Coastguard Worker        with io.StringIO(csvdata) as f:
33*333d2b36SAndroid Build Coastguard Worker            return vo.read_signature_csv_from_stream_as_dict(f)
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Worker    @staticmethod
36*333d2b36SAndroid Build Coastguard Worker    def extract_subset_from_monolithic_flags_as_dict_from_string(
37*333d2b36SAndroid Build Coastguard Worker            monolithic, patterns):
38*333d2b36SAndroid Build Coastguard Worker        with io.StringIO(patterns) as f:
39*333d2b36SAndroid Build Coastguard Worker            return vo.extract_subset_from_monolithic_flags_as_dict_from_stream(
40*333d2b36SAndroid Build Coastguard Worker                monolithic, f)
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker    extractInput = """
43*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I,public-api,system-api,test-api
44*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,blocked
45*333d2b36SAndroid Build Coastguard WorkerLjava/util/zip/ZipFile;-><clinit>()V,blocked
46*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;,blocked
47*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Character;->serialVersionUID:J,sdk
48*333d2b36SAndroid Build Coastguard WorkerLjava/lang/ProcessBuilder$Redirect$1;-><init>()V,blocked
49*333d2b36SAndroid Build Coastguard Worker"""
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker    def test_extract_subset_signature(self):
52*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_flag_trie_from_string(
53*333d2b36SAndroid Build Coastguard Worker            TestDetectOverlaps.extractInput)
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker        patterns = "Ljava/lang/Object;->hashCode()I"
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker        subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
58*333d2b36SAndroid Build Coastguard Worker            monolithic, patterns)
59*333d2b36SAndroid Build Coastguard Worker        expected = {
60*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Object;->hashCode()I": {
61*333d2b36SAndroid Build Coastguard Worker                None: ["public-api", "system-api", "test-api"],
62*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Object;->hashCode()I",
63*333d2b36SAndroid Build Coastguard Worker            },
64*333d2b36SAndroid Build Coastguard Worker        }
65*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, subset)
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker    def test_extract_subset_class(self):
68*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_flag_trie_from_string(
69*333d2b36SAndroid Build Coastguard Worker            TestDetectOverlaps.extractInput)
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Worker        patterns = "java/lang/Object"
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker        subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
74*333d2b36SAndroid Build Coastguard Worker            monolithic, patterns)
75*333d2b36SAndroid Build Coastguard Worker        expected = {
76*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Object;->hashCode()I": {
77*333d2b36SAndroid Build Coastguard Worker                None: ["public-api", "system-api", "test-api"],
78*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Object;->hashCode()I",
79*333d2b36SAndroid Build Coastguard Worker            },
80*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Object;->toString()Ljava/lang/String;": {
81*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
82*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Object;->toString()Ljava/lang/String;",
83*333d2b36SAndroid Build Coastguard Worker            },
84*333d2b36SAndroid Build Coastguard Worker        }
85*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, subset)
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker    def test_extract_subset_outer_class(self):
88*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_flag_trie_from_string(
89*333d2b36SAndroid Build Coastguard Worker            TestDetectOverlaps.extractInput)
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker        patterns = "java/lang/Character"
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker        subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
94*333d2b36SAndroid Build Coastguard Worker            monolithic, patterns)
95*333d2b36SAndroid Build Coastguard Worker        expected = {
96*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Character$UnicodeScript;"
97*333d2b36SAndroid Build Coastguard Worker            "->of(I)Ljava/lang/Character$UnicodeScript;": {
98*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
99*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Character$UnicodeScript;"
100*333d2b36SAndroid Build Coastguard Worker                             "->of(I)Ljava/lang/Character$UnicodeScript;",
101*333d2b36SAndroid Build Coastguard Worker            },
102*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Character;->serialVersionUID:J": {
103*333d2b36SAndroid Build Coastguard Worker                None: ["sdk"],
104*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Character;->serialVersionUID:J",
105*333d2b36SAndroid Build Coastguard Worker            },
106*333d2b36SAndroid Build Coastguard Worker        }
107*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, subset)
108*333d2b36SAndroid Build Coastguard Worker
109*333d2b36SAndroid Build Coastguard Worker    def test_extract_subset_nested_class(self):
110*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_flag_trie_from_string(
111*333d2b36SAndroid Build Coastguard Worker            TestDetectOverlaps.extractInput)
112*333d2b36SAndroid Build Coastguard Worker
113*333d2b36SAndroid Build Coastguard Worker        patterns = "java/lang/Character$UnicodeScript"
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker        subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
116*333d2b36SAndroid Build Coastguard Worker            monolithic, patterns)
117*333d2b36SAndroid Build Coastguard Worker        expected = {
118*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Character$UnicodeScript;"
119*333d2b36SAndroid Build Coastguard Worker            "->of(I)Ljava/lang/Character$UnicodeScript;": {
120*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
121*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Character$UnicodeScript;"
122*333d2b36SAndroid Build Coastguard Worker                             "->of(I)Ljava/lang/Character$UnicodeScript;",
123*333d2b36SAndroid Build Coastguard Worker            },
124*333d2b36SAndroid Build Coastguard Worker        }
125*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, subset)
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Worker    def test_extract_subset_package(self):
128*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_flag_trie_from_string(
129*333d2b36SAndroid Build Coastguard Worker            TestDetectOverlaps.extractInput)
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Worker        patterns = "java/lang/*"
132*333d2b36SAndroid Build Coastguard Worker
133*333d2b36SAndroid Build Coastguard Worker        subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
134*333d2b36SAndroid Build Coastguard Worker            monolithic, patterns)
135*333d2b36SAndroid Build Coastguard Worker        expected = {
136*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Character$UnicodeScript;"
137*333d2b36SAndroid Build Coastguard Worker            "->of(I)Ljava/lang/Character$UnicodeScript;": {
138*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
139*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Character$UnicodeScript;"
140*333d2b36SAndroid Build Coastguard Worker                             "->of(I)Ljava/lang/Character$UnicodeScript;",
141*333d2b36SAndroid Build Coastguard Worker            },
142*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Character;->serialVersionUID:J": {
143*333d2b36SAndroid Build Coastguard Worker                None: ["sdk"],
144*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Character;->serialVersionUID:J",
145*333d2b36SAndroid Build Coastguard Worker            },
146*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Object;->hashCode()I": {
147*333d2b36SAndroid Build Coastguard Worker                None: ["public-api", "system-api", "test-api"],
148*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Object;->hashCode()I",
149*333d2b36SAndroid Build Coastguard Worker            },
150*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Object;->toString()Ljava/lang/String;": {
151*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
152*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Object;->toString()Ljava/lang/String;",
153*333d2b36SAndroid Build Coastguard Worker            },
154*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V": {
155*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
156*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V",
157*333d2b36SAndroid Build Coastguard Worker            },
158*333d2b36SAndroid Build Coastguard Worker        }
159*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, subset)
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Worker    def test_extract_subset_recursive_package(self):
162*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_flag_trie_from_string(
163*333d2b36SAndroid Build Coastguard Worker            TestDetectOverlaps.extractInput)
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Worker        patterns = "java/**"
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker        subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
168*333d2b36SAndroid Build Coastguard Worker            monolithic, patterns)
169*333d2b36SAndroid Build Coastguard Worker        expected = {
170*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Character$UnicodeScript;"
171*333d2b36SAndroid Build Coastguard Worker            "->of(I)Ljava/lang/Character$UnicodeScript;": {
172*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
173*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Character$UnicodeScript;"
174*333d2b36SAndroid Build Coastguard Worker                             "->of(I)Ljava/lang/Character$UnicodeScript;",
175*333d2b36SAndroid Build Coastguard Worker            },
176*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Character;->serialVersionUID:J": {
177*333d2b36SAndroid Build Coastguard Worker                None: ["sdk"],
178*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Character;->serialVersionUID:J",
179*333d2b36SAndroid Build Coastguard Worker            },
180*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Object;->hashCode()I": {
181*333d2b36SAndroid Build Coastguard Worker                None: ["public-api", "system-api", "test-api"],
182*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Object;->hashCode()I",
183*333d2b36SAndroid Build Coastguard Worker            },
184*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/Object;->toString()Ljava/lang/String;": {
185*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
186*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/Object;->toString()Ljava/lang/String;",
187*333d2b36SAndroid Build Coastguard Worker            },
188*333d2b36SAndroid Build Coastguard Worker            "Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V": {
189*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
190*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V",
191*333d2b36SAndroid Build Coastguard Worker            },
192*333d2b36SAndroid Build Coastguard Worker            "Ljava/util/zip/ZipFile;-><clinit>()V": {
193*333d2b36SAndroid Build Coastguard Worker                None: ["blocked"],
194*333d2b36SAndroid Build Coastguard Worker                "signature": "Ljava/util/zip/ZipFile;-><clinit>()V",
195*333d2b36SAndroid Build Coastguard Worker            },
196*333d2b36SAndroid Build Coastguard Worker        }
197*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, subset)
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Worker    def test_read_trie_duplicate(self):
200*333d2b36SAndroid Build Coastguard Worker        with self.assertRaises(Exception) as context:
201*333d2b36SAndroid Build Coastguard Worker            self.read_flag_trie_from_string("""
202*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I,public-api,system-api,test-api
203*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I,blocked
204*333d2b36SAndroid Build Coastguard Worker""")
205*333d2b36SAndroid Build Coastguard Worker        self.assertTrue("Duplicate signature: Ljava/lang/Object;->hashCode()I"
206*333d2b36SAndroid Build Coastguard Worker                        in str(context.exception))
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Worker    def test_read_trie_missing_member(self):
209*333d2b36SAndroid Build Coastguard Worker        with self.assertRaises(Exception) as context:
210*333d2b36SAndroid Build Coastguard Worker            self.read_flag_trie_from_string("""
211*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object,public-api,system-api,test-api
212*333d2b36SAndroid Build Coastguard Worker""")
213*333d2b36SAndroid Build Coastguard Worker        self.assertTrue(
214*333d2b36SAndroid Build Coastguard Worker            "Invalid signature: Ljava/lang/Object, "
215*333d2b36SAndroid Build Coastguard Worker            "does not identify a specific member" in str(context.exception))
216*333d2b36SAndroid Build Coastguard Worker
217*333d2b36SAndroid Build Coastguard Worker    def test_match(self):
218*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("""
219*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I,public-api,system-api,test-api
220*333d2b36SAndroid Build Coastguard Worker""")
221*333d2b36SAndroid Build Coastguard Worker        modular = self.read_signature_csv_from_string_as_dict("""
222*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I,public-api,system-api,test-api
223*333d2b36SAndroid Build Coastguard Worker""")
224*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular,
225*333d2b36SAndroid Build Coastguard Worker                                                ["blocked"])
226*333d2b36SAndroid Build Coastguard Worker        expected = []
227*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
228*333d2b36SAndroid Build Coastguard Worker
229*333d2b36SAndroid Build Coastguard Worker    def test_mismatch_overlapping_flags(self):
230*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("""
231*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,public-api
232*333d2b36SAndroid Build Coastguard Worker""")
233*333d2b36SAndroid Build Coastguard Worker        modular = self.read_signature_csv_from_string_as_dict("""
234*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
235*333d2b36SAndroid Build Coastguard Worker""")
236*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular,
237*333d2b36SAndroid Build Coastguard Worker                                                ["blocked"])
238*333d2b36SAndroid Build Coastguard Worker        expected = [
239*333d2b36SAndroid Build Coastguard Worker            (
240*333d2b36SAndroid Build Coastguard Worker                "Ljava/lang/Object;->toString()Ljava/lang/String;",
241*333d2b36SAndroid Build Coastguard Worker                ["public-api", "system-api", "test-api"],
242*333d2b36SAndroid Build Coastguard Worker                ["public-api"],
243*333d2b36SAndroid Build Coastguard Worker            ),
244*333d2b36SAndroid Build Coastguard Worker        ]
245*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Worker    def test_mismatch_monolithic_blocked(self):
248*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("""
249*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,blocked
250*333d2b36SAndroid Build Coastguard Worker""")
251*333d2b36SAndroid Build Coastguard Worker        modular = self.read_signature_csv_from_string_as_dict("""
252*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
253*333d2b36SAndroid Build Coastguard Worker""")
254*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular,
255*333d2b36SAndroid Build Coastguard Worker                                                ["blocked"])
256*333d2b36SAndroid Build Coastguard Worker        expected = [
257*333d2b36SAndroid Build Coastguard Worker            (
258*333d2b36SAndroid Build Coastguard Worker                "Ljava/lang/Object;->toString()Ljava/lang/String;",
259*333d2b36SAndroid Build Coastguard Worker                ["public-api", "system-api", "test-api"],
260*333d2b36SAndroid Build Coastguard Worker                ["blocked"],
261*333d2b36SAndroid Build Coastguard Worker            ),
262*333d2b36SAndroid Build Coastguard Worker        ]
263*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Worker    def test_mismatch_modular_blocked(self):
266*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("""
267*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
268*333d2b36SAndroid Build Coastguard Worker""")
269*333d2b36SAndroid Build Coastguard Worker        modular = self.read_signature_csv_from_string_as_dict("""
270*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,blocked
271*333d2b36SAndroid Build Coastguard Worker""")
272*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular,
273*333d2b36SAndroid Build Coastguard Worker                                                ["blocked"])
274*333d2b36SAndroid Build Coastguard Worker        expected = [
275*333d2b36SAndroid Build Coastguard Worker            (
276*333d2b36SAndroid Build Coastguard Worker                "Ljava/lang/Object;->toString()Ljava/lang/String;",
277*333d2b36SAndroid Build Coastguard Worker                ["blocked"],
278*333d2b36SAndroid Build Coastguard Worker                ["public-api", "system-api", "test-api"],
279*333d2b36SAndroid Build Coastguard Worker            ),
280*333d2b36SAndroid Build Coastguard Worker        ]
281*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
282*333d2b36SAndroid Build Coastguard Worker
283*333d2b36SAndroid Build Coastguard Worker    def test_match_treat_missing_from_modular_as_blocked(self):
284*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("")
285*333d2b36SAndroid Build Coastguard Worker        modular = self.read_signature_csv_from_string_as_dict("""
286*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
287*333d2b36SAndroid Build Coastguard Worker""")
288*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular,
289*333d2b36SAndroid Build Coastguard Worker                                                ["blocked"])
290*333d2b36SAndroid Build Coastguard Worker        expected = [
291*333d2b36SAndroid Build Coastguard Worker            (
292*333d2b36SAndroid Build Coastguard Worker                "Ljava/lang/Object;->toString()Ljava/lang/String;",
293*333d2b36SAndroid Build Coastguard Worker                ["public-api", "system-api", "test-api"],
294*333d2b36SAndroid Build Coastguard Worker                [],
295*333d2b36SAndroid Build Coastguard Worker            ),
296*333d2b36SAndroid Build Coastguard Worker        ]
297*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker    def test_mismatch_treat_missing_from_modular_as_blocked(self):
300*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("""
301*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I,public-api,system-api,test-api
302*333d2b36SAndroid Build Coastguard Worker""")
303*333d2b36SAndroid Build Coastguard Worker        modular = {}
304*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular,
305*333d2b36SAndroid Build Coastguard Worker                                                ["blocked"])
306*333d2b36SAndroid Build Coastguard Worker        expected = [
307*333d2b36SAndroid Build Coastguard Worker            (
308*333d2b36SAndroid Build Coastguard Worker                "Ljava/lang/Object;->hashCode()I",
309*333d2b36SAndroid Build Coastguard Worker                ["blocked"],
310*333d2b36SAndroid Build Coastguard Worker                ["public-api", "system-api", "test-api"],
311*333d2b36SAndroid Build Coastguard Worker            ),
312*333d2b36SAndroid Build Coastguard Worker        ]
313*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
314*333d2b36SAndroid Build Coastguard Worker
315*333d2b36SAndroid Build Coastguard Worker    def test_blocked_missing_from_modular(self):
316*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("""
317*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I,blocked
318*333d2b36SAndroid Build Coastguard Worker""")
319*333d2b36SAndroid Build Coastguard Worker        modular = {}
320*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular,
321*333d2b36SAndroid Build Coastguard Worker                                                ["blocked"])
322*333d2b36SAndroid Build Coastguard Worker        expected = []
323*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
324*333d2b36SAndroid Build Coastguard Worker
325*333d2b36SAndroid Build Coastguard Worker    def test_match_treat_missing_from_modular_as_empty(self):
326*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("")
327*333d2b36SAndroid Build Coastguard Worker        modular = self.read_signature_csv_from_string_as_dict("""
328*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
329*333d2b36SAndroid Build Coastguard Worker""")
330*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular, [])
331*333d2b36SAndroid Build Coastguard Worker        expected = [
332*333d2b36SAndroid Build Coastguard Worker            (
333*333d2b36SAndroid Build Coastguard Worker                "Ljava/lang/Object;->toString()Ljava/lang/String;",
334*333d2b36SAndroid Build Coastguard Worker                ["public-api", "system-api", "test-api"],
335*333d2b36SAndroid Build Coastguard Worker                [],
336*333d2b36SAndroid Build Coastguard Worker            ),
337*333d2b36SAndroid Build Coastguard Worker        ]
338*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
339*333d2b36SAndroid Build Coastguard Worker
340*333d2b36SAndroid Build Coastguard Worker    def test_mismatch_treat_missing_from_modular_as_empty(self):
341*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("""
342*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I,public-api,system-api,test-api
343*333d2b36SAndroid Build Coastguard Worker""")
344*333d2b36SAndroid Build Coastguard Worker        modular = {}
345*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular, [])
346*333d2b36SAndroid Build Coastguard Worker        expected = [
347*333d2b36SAndroid Build Coastguard Worker            (
348*333d2b36SAndroid Build Coastguard Worker                "Ljava/lang/Object;->hashCode()I",
349*333d2b36SAndroid Build Coastguard Worker                [],
350*333d2b36SAndroid Build Coastguard Worker                ["public-api", "system-api", "test-api"],
351*333d2b36SAndroid Build Coastguard Worker            ),
352*333d2b36SAndroid Build Coastguard Worker        ]
353*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
354*333d2b36SAndroid Build Coastguard Worker
355*333d2b36SAndroid Build Coastguard Worker    def test_empty_missing_from_modular(self):
356*333d2b36SAndroid Build Coastguard Worker        monolithic = self.read_signature_csv_from_string_as_dict("""
357*333d2b36SAndroid Build Coastguard WorkerLjava/lang/Object;->hashCode()I
358*333d2b36SAndroid Build Coastguard Worker""")
359*333d2b36SAndroid Build Coastguard Worker        modular = {}
360*333d2b36SAndroid Build Coastguard Worker        mismatches = vo.compare_signature_flags(monolithic, modular, [])
361*333d2b36SAndroid Build Coastguard Worker        expected = []
362*333d2b36SAndroid Build Coastguard Worker        self.assertEqual(expected, mismatches)
363*333d2b36SAndroid Build Coastguard Worker
364*333d2b36SAndroid Build Coastguard Worker
365*333d2b36SAndroid Build Coastguard Workerif __name__ == "__main__":
366*333d2b36SAndroid Build Coastguard Worker    unittest.main(verbosity=2)
367