Make signature_to_elements stricter and more consistent
Previously, signature_to_elements would return a string array where
non-wildcard strings were of the form <type>:<value> but wildcard
strings were just * or **. This change makes it handle wildcards
consistently with the other element types and adds some extra
checking for edge cases.
Bug: 202154151
Test: m out/soong/hiddenapi/hiddenapi-flags.csv
atest --host signature_trie_test verify_overlaps_test
pyformat -s 4 --force_quote_type double -i scripts/hiddenapi/signature_trie*
/usr/bin/pylint --rcfile $ANDROID_BUILD_TOP/tools/repohooks/tools/pylintrc scripts/hiddenapi/signature_trie*
Change-Id: I5bfaf5e75c7da54b6241f68e03231939c9d65501
diff --git a/scripts/hiddenapi/signature_trie_test.py b/scripts/hiddenapi/signature_trie_test.py
index 2dc79d0..6bae08a 100755
--- a/scripts/hiddenapi/signature_trie_test.py
+++ b/scripts/hiddenapi/signature_trie_test.py
@@ -77,7 +77,7 @@
elements = [
"package:java",
"package:lang",
- "*",
+ "wildcard:*",
]
signature = "java/lang/*"
self.assertEqual(elements, self.signature_to_elements(signature))
@@ -86,25 +86,33 @@
elements = [
"package:java",
"package:lang",
- "**",
+ "wildcard:**",
]
signature = "java/lang/**"
self.assertEqual(elements, self.signature_to_elements(signature))
def test_no_packages_wildcard(self):
elements = [
- "*",
+ "wildcard:*",
]
signature = "*"
self.assertEqual(elements, self.signature_to_elements(signature))
def test_no_packages_recursive_wildcard(self):
elements = [
- "**",
+ "wildcard:**",
]
signature = "**"
self.assertEqual(elements, self.signature_to_elements(signature))
+ def test_invalid_no_class_or_wildcard(self):
+ signature = "java/lang"
+ with self.assertRaises(Exception) as context:
+ self.signature_to_elements(signature)
+ self.assertIn(
+ "last element 'lang' is lower case but should be an "
+ "upper case class name or wildcard", str(context.exception))
+
def test_non_standard_class_name(self):
elements = [
"package:javax",
@@ -114,12 +122,19 @@
signature = "Ljavax/crypto/extObjectInputStream"
self.assertEqual(elements, self.signature_to_elements(signature))
+ def test_invalid_pattern_wildcard(self):
+ pattern = "Ljava/lang/Class*"
+ with self.assertRaises(Exception) as context:
+ self.signature_to_elements(pattern)
+ self.assertIn("invalid wildcard 'Class*'", str(context.exception))
+
def test_invalid_pattern_wildcard_and_member(self):
pattern = "Ljava/lang/*;->hashCode()I"
with self.assertRaises(Exception) as context:
self.signature_to_elements(pattern)
- self.assertIn("contains wildcard * and member signature hashCode()I",
- str(context.exception))
+ self.assertIn(
+ "contains wildcard '*' and member signature 'hashCode()I'",
+ str(context.exception))
class TestGetMatchingRows(unittest.TestCase):