123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- #!/usr/bin/env python
- #
- # Copyright (C) 2021 The Android Open Source Project
- #
- # Licensed under the Apache License, Version 2.0 (the 'License');
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an 'AS IS' BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- """Unit tests for verify_overlaps_test.py."""
- import io
- import unittest
- import verify_overlaps as vo
- class TestDetectOverlaps(unittest.TestCase):
- @staticmethod
- def read_flag_trie_from_string(csvdata):
- with io.StringIO(csvdata) as f:
- return vo.read_flag_trie_from_stream(f)
- @staticmethod
- def read_signature_csv_from_string_as_dict(csvdata):
- with io.StringIO(csvdata) as f:
- return vo.read_signature_csv_from_stream_as_dict(f)
- @staticmethod
- def extract_subset_from_monolithic_flags_as_dict_from_string(
- monolithic, patterns):
- with io.StringIO(patterns) as f:
- return vo.extract_subset_from_monolithic_flags_as_dict_from_stream(
- monolithic, f)
- extractInput = """
- Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
- Ljava/lang/Object;->toString()Ljava/lang/String;,blocked
- Ljava/util/zip/ZipFile;-><clinit>()V,blocked
- Ljava/lang/Character$UnicodeScript;->of(I)Ljava/lang/Character$UnicodeScript;,blocked
- Ljava/lang/Character;->serialVersionUID:J,sdk
- Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V,blocked
- """
- def test_extract_subset_signature(self):
- monolithic = self.read_flag_trie_from_string(
- TestDetectOverlaps.extractInput)
- patterns = "Ljava/lang/Object;->hashCode()I"
- subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
- monolithic, patterns)
- expected = {
- "Ljava/lang/Object;->hashCode()I": {
- None: ["public-api", "system-api", "test-api"],
- "signature": "Ljava/lang/Object;->hashCode()I",
- },
- }
- self.assertEqual(expected, subset)
- def test_extract_subset_class(self):
- monolithic = self.read_flag_trie_from_string(
- TestDetectOverlaps.extractInput)
- patterns = "java/lang/Object"
- subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
- monolithic, patterns)
- expected = {
- "Ljava/lang/Object;->hashCode()I": {
- None: ["public-api", "system-api", "test-api"],
- "signature": "Ljava/lang/Object;->hashCode()I",
- },
- "Ljava/lang/Object;->toString()Ljava/lang/String;": {
- None: ["blocked"],
- "signature": "Ljava/lang/Object;->toString()Ljava/lang/String;",
- },
- }
- self.assertEqual(expected, subset)
- def test_extract_subset_outer_class(self):
- monolithic = self.read_flag_trie_from_string(
- TestDetectOverlaps.extractInput)
- patterns = "java/lang/Character"
- subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
- monolithic, patterns)
- expected = {
- "Ljava/lang/Character$UnicodeScript;"
- "->of(I)Ljava/lang/Character$UnicodeScript;": {
- None: ["blocked"],
- "signature": "Ljava/lang/Character$UnicodeScript;"
- "->of(I)Ljava/lang/Character$UnicodeScript;",
- },
- "Ljava/lang/Character;->serialVersionUID:J": {
- None: ["sdk"],
- "signature": "Ljava/lang/Character;->serialVersionUID:J",
- },
- }
- self.assertEqual(expected, subset)
- def test_extract_subset_nested_class(self):
- monolithic = self.read_flag_trie_from_string(
- TestDetectOverlaps.extractInput)
- patterns = "java/lang/Character$UnicodeScript"
- subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
- monolithic, patterns)
- expected = {
- "Ljava/lang/Character$UnicodeScript;"
- "->of(I)Ljava/lang/Character$UnicodeScript;": {
- None: ["blocked"],
- "signature": "Ljava/lang/Character$UnicodeScript;"
- "->of(I)Ljava/lang/Character$UnicodeScript;",
- },
- }
- self.assertEqual(expected, subset)
- def test_extract_subset_package(self):
- monolithic = self.read_flag_trie_from_string(
- TestDetectOverlaps.extractInput)
- patterns = "java/lang/*"
- subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
- monolithic, patterns)
- expected = {
- "Ljava/lang/Character$UnicodeScript;"
- "->of(I)Ljava/lang/Character$UnicodeScript;": {
- None: ["blocked"],
- "signature": "Ljava/lang/Character$UnicodeScript;"
- "->of(I)Ljava/lang/Character$UnicodeScript;",
- },
- "Ljava/lang/Character;->serialVersionUID:J": {
- None: ["sdk"],
- "signature": "Ljava/lang/Character;->serialVersionUID:J",
- },
- "Ljava/lang/Object;->hashCode()I": {
- None: ["public-api", "system-api", "test-api"],
- "signature": "Ljava/lang/Object;->hashCode()I",
- },
- "Ljava/lang/Object;->toString()Ljava/lang/String;": {
- None: ["blocked"],
- "signature": "Ljava/lang/Object;->toString()Ljava/lang/String;",
- },
- "Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V": {
- None: ["blocked"],
- "signature": "Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V",
- },
- }
- self.assertEqual(expected, subset)
- def test_extract_subset_recursive_package(self):
- monolithic = self.read_flag_trie_from_string(
- TestDetectOverlaps.extractInput)
- patterns = "java/**"
- subset = self.extract_subset_from_monolithic_flags_as_dict_from_string(
- monolithic, patterns)
- expected = {
- "Ljava/lang/Character$UnicodeScript;"
- "->of(I)Ljava/lang/Character$UnicodeScript;": {
- None: ["blocked"],
- "signature": "Ljava/lang/Character$UnicodeScript;"
- "->of(I)Ljava/lang/Character$UnicodeScript;",
- },
- "Ljava/lang/Character;->serialVersionUID:J": {
- None: ["sdk"],
- "signature": "Ljava/lang/Character;->serialVersionUID:J",
- },
- "Ljava/lang/Object;->hashCode()I": {
- None: ["public-api", "system-api", "test-api"],
- "signature": "Ljava/lang/Object;->hashCode()I",
- },
- "Ljava/lang/Object;->toString()Ljava/lang/String;": {
- None: ["blocked"],
- "signature": "Ljava/lang/Object;->toString()Ljava/lang/String;",
- },
- "Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V": {
- None: ["blocked"],
- "signature": "Ljava/lang/ProcessBuilder$Redirect$1;-><init>()V",
- },
- "Ljava/util/zip/ZipFile;-><clinit>()V": {
- None: ["blocked"],
- "signature": "Ljava/util/zip/ZipFile;-><clinit>()V",
- },
- }
- self.assertEqual(expected, subset)
- def test_read_trie_duplicate(self):
- with self.assertRaises(Exception) as context:
- self.read_flag_trie_from_string("""
- Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
- Ljava/lang/Object;->hashCode()I,blocked
- """)
- self.assertTrue("Duplicate signature: Ljava/lang/Object;->hashCode()I"
- in str(context.exception))
- def test_read_trie_missing_member(self):
- with self.assertRaises(Exception) as context:
- self.read_flag_trie_from_string("""
- Ljava/lang/Object,public-api,system-api,test-api
- """)
- self.assertTrue(
- "Invalid signature: Ljava/lang/Object, "
- "does not identify a specific member" in str(context.exception))
- def test_match(self):
- monolithic = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
- """)
- modular = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
- """)
- mismatches = vo.compare_signature_flags(monolithic, modular,
- ["blocked"])
- expected = []
- self.assertEqual(expected, mismatches)
- def test_mismatch_overlapping_flags(self):
- monolithic = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->toString()Ljava/lang/String;,public-api
- """)
- modular = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
- """)
- mismatches = vo.compare_signature_flags(monolithic, modular,
- ["blocked"])
- expected = [
- (
- "Ljava/lang/Object;->toString()Ljava/lang/String;",
- ["public-api", "system-api", "test-api"],
- ["public-api"],
- ),
- ]
- self.assertEqual(expected, mismatches)
- def test_mismatch_monolithic_blocked(self):
- monolithic = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->toString()Ljava/lang/String;,blocked
- """)
- modular = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
- """)
- mismatches = vo.compare_signature_flags(monolithic, modular,
- ["blocked"])
- expected = [
- (
- "Ljava/lang/Object;->toString()Ljava/lang/String;",
- ["public-api", "system-api", "test-api"],
- ["blocked"],
- ),
- ]
- self.assertEqual(expected, mismatches)
- def test_mismatch_modular_blocked(self):
- monolithic = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
- """)
- modular = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->toString()Ljava/lang/String;,blocked
- """)
- mismatches = vo.compare_signature_flags(monolithic, modular,
- ["blocked"])
- expected = [
- (
- "Ljava/lang/Object;->toString()Ljava/lang/String;",
- ["blocked"],
- ["public-api", "system-api", "test-api"],
- ),
- ]
- self.assertEqual(expected, mismatches)
- def test_match_treat_missing_from_modular_as_blocked(self):
- monolithic = self.read_signature_csv_from_string_as_dict("")
- modular = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
- """)
- mismatches = vo.compare_signature_flags(monolithic, modular,
- ["blocked"])
- expected = [
- (
- "Ljava/lang/Object;->toString()Ljava/lang/String;",
- ["public-api", "system-api", "test-api"],
- [],
- ),
- ]
- self.assertEqual(expected, mismatches)
- def test_mismatch_treat_missing_from_modular_as_blocked(self):
- monolithic = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
- """)
- modular = {}
- mismatches = vo.compare_signature_flags(monolithic, modular,
- ["blocked"])
- expected = [
- (
- "Ljava/lang/Object;->hashCode()I",
- ["blocked"],
- ["public-api", "system-api", "test-api"],
- ),
- ]
- self.assertEqual(expected, mismatches)
- def test_blocked_missing_from_modular(self):
- monolithic = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->hashCode()I,blocked
- """)
- modular = {}
- mismatches = vo.compare_signature_flags(monolithic, modular,
- ["blocked"])
- expected = []
- self.assertEqual(expected, mismatches)
- def test_match_treat_missing_from_modular_as_empty(self):
- monolithic = self.read_signature_csv_from_string_as_dict("")
- modular = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->toString()Ljava/lang/String;,public-api,system-api,test-api
- """)
- mismatches = vo.compare_signature_flags(monolithic, modular, [])
- expected = [
- (
- "Ljava/lang/Object;->toString()Ljava/lang/String;",
- ["public-api", "system-api", "test-api"],
- [],
- ),
- ]
- self.assertEqual(expected, mismatches)
- def test_mismatch_treat_missing_from_modular_as_empty(self):
- monolithic = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->hashCode()I,public-api,system-api,test-api
- """)
- modular = {}
- mismatches = vo.compare_signature_flags(monolithic, modular, [])
- expected = [
- (
- "Ljava/lang/Object;->hashCode()I",
- [],
- ["public-api", "system-api", "test-api"],
- ),
- ]
- self.assertEqual(expected, mismatches)
- def test_empty_missing_from_modular(self):
- monolithic = self.read_signature_csv_from_string_as_dict("""
- Ljava/lang/Object;->hashCode()I
- """)
- modular = {}
- mismatches = vo.compare_signature_flags(monolithic, modular, [])
- expected = []
- self.assertEqual(expected, mismatches)
- if __name__ == "__main__":
- unittest.main(verbosity=2)
|