From e1ab849b391c6d5c7fbf57310701c99cad88ba21 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Wed, 11 Sep 2024 13:28:16 -0700 Subject: Support multiple or elements in manifest_*.py Manifests may now have multiple copies of elements if they are disambiguated with android:featureFlag attributes. Remove the restrictions on duplicate elements from manifest_check.py and manifest_fixer.py, and instead iterate over all matching elements. Test: manifest_check_test.py, manifest_fixer_test.py Bug: 365170653 Flag: EXEMPT bugfix Change-Id: Ib577439d03a808a20a5fcc3e15a3117e0970d729 --- scripts/manifest_fixer_test.py | 99 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 13 deletions(-) (limited to 'scripts/manifest_fixer_test.py') diff --git a/scripts/manifest_fixer_test.py b/scripts/manifest_fixer_test.py index 24828c787..e4d8dc383 100755 --- a/scripts/manifest_fixer_test.py +++ b/scripts/manifest_fixer_test.py @@ -228,6 +228,18 @@ class RaiseMinSdkVersionTest(unittest.TestCase): self.assert_xml_equal(output, expected) + def test_multiple_uses_sdks(self): + """Tests a manifest that contains multiple uses_sdks elements.""" + + manifest_input = self.manifest_tmpl % ( + ' \n' + ' \n') + expected = self.manifest_tmpl % ( + ' \n' + ' \n') + + output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False) + self.assert_xml_equal(output, expected) class AddLoggingParentTest(unittest.TestCase): """Unit tests for add_logging_parent function.""" @@ -289,18 +301,16 @@ class AddUsesLibrariesTest(unittest.TestCase): manifest_tmpl = ( '\n' '\n' - ' \n' '%s' - ' \n' '\n') def uses_libraries(self, name_required_pairs): - ret = '' + ret = ' \n' for name, required in name_required_pairs: ret += ( ' \n' ) % (name, required) - + ret += ' \n' return ret def test_empty(self): @@ -361,6 +371,17 @@ class AddUsesLibrariesTest(unittest.TestCase): output = self.run_test(manifest_input, ['foo', 'bar']) self.assert_xml_equal(output, expected) + def test_multiple_application(self): + """When there are multiple applications, the libs are added to each.""" + manifest_input = self.manifest_tmpl % ( + self.uses_libraries([('foo', 'false')]) + + self.uses_libraries([('bar', 'false')])) + expected = self.manifest_tmpl % ( + self.uses_libraries([('foo', 'false'), ('bar', 'true')]) + + self.uses_libraries([('bar', 'false'), ('foo', 'true')])) + output = self.run_test(manifest_input, ['foo', 'bar']) + self.assert_xml_equal(output, expected) + class AddUsesNonSdkApiTest(unittest.TestCase): """Unit tests for add_uses_libraries function.""" @@ -378,11 +399,11 @@ class AddUsesNonSdkApiTest(unittest.TestCase): manifest_tmpl = ( '\n' '\n' - ' \n' + ' %s\n' '\n') def uses_non_sdk_api(self, value): - return ' android:usesNonSdkApi="true"' if value else '' + return '' % ('android:usesNonSdkApi="true"' if value else '') def test_set_true(self): """Empty new_uses_libraries must not touch the manifest.""" @@ -398,6 +419,13 @@ class AddUsesNonSdkApiTest(unittest.TestCase): output = self.run_test(manifest_input) self.assert_xml_equal(output, expected) + def test_multiple_applications(self): + """new_uses_libraries must be added to all applications.""" + manifest_input = self.manifest_tmpl % (self.uses_non_sdk_api(True) + self.uses_non_sdk_api(False)) + expected = self.manifest_tmpl % (self.uses_non_sdk_api(True) + self.uses_non_sdk_api(True)) + output = self.run_test(manifest_input) + self.assert_xml_equal(output, expected) + class UseEmbeddedDexTest(unittest.TestCase): """Unit tests for add_use_embedded_dex function.""" @@ -415,14 +443,14 @@ class UseEmbeddedDexTest(unittest.TestCase): manifest_tmpl = ( '\n' '\n' - ' \n' + ' %s\n' '\n') def use_embedded_dex(self, value): - return ' android:useEmbeddedDex="%s"' % value + return '' % value def test_manifest_with_undeclared_preference(self): - manifest_input = self.manifest_tmpl % '' + manifest_input = self.manifest_tmpl % '' expected = self.manifest_tmpl % self.use_embedded_dex('true') output = self.run_test(manifest_input) self.assert_xml_equal(output, expected) @@ -437,6 +465,18 @@ class UseEmbeddedDexTest(unittest.TestCase): manifest_input = self.manifest_tmpl % self.use_embedded_dex('false') self.assertRaises(RuntimeError, self.run_test, manifest_input) + def test_multiple_applications(self): + manifest_input = self.manifest_tmpl % ( + self.use_embedded_dex('true') + + '' + ) + expected = self.manifest_tmpl % ( + self.use_embedded_dex('true') + + self.use_embedded_dex('true') + ) + output = self.run_test(manifest_input) + self.assert_xml_equal(output, expected) + class AddExtractNativeLibsTest(unittest.TestCase): """Unit tests for add_extract_native_libs function.""" @@ -454,20 +494,20 @@ class AddExtractNativeLibsTest(unittest.TestCase): manifest_tmpl = ( '\n' '\n' - ' \n' + ' %s\n' '\n') def extract_native_libs(self, value): - return ' android:extractNativeLibs="%s"' % value + return '' % value def test_set_true(self): - manifest_input = self.manifest_tmpl % '' + manifest_input = self.manifest_tmpl % '' expected = self.manifest_tmpl % self.extract_native_libs('true') output = self.run_test(manifest_input, True) self.assert_xml_equal(output, expected) def test_set_false(self): - manifest_input = self.manifest_tmpl % '' + manifest_input = self.manifest_tmpl % '' expected = self.manifest_tmpl % self.extract_native_libs('false') output = self.run_test(manifest_input, False) self.assert_xml_equal(output, expected) @@ -482,6 +522,12 @@ class AddExtractNativeLibsTest(unittest.TestCase): manifest_input = self.manifest_tmpl % self.extract_native_libs('true') self.assertRaises(RuntimeError, self.run_test, manifest_input, False) + def test_multiple_applications(self): + manifest_input = self.manifest_tmpl % (self.extract_native_libs('true') + '') + expected = self.manifest_tmpl % (self.extract_native_libs('true') + self.extract_native_libs('true')) + output = self.run_test(manifest_input, True) + self.assert_xml_equal(output, expected) + class AddNoCodeApplicationTest(unittest.TestCase): """Unit tests for set_has_code_to_false function.""" @@ -527,6 +573,19 @@ class AddNoCodeApplicationTest(unittest.TestCase): output = self.run_test(manifest_input) self.assert_xml_equal(output, manifest_input) + def test_multiple_applications(self): + """ Apply to all applications """ + manifest_input = self.manifest_tmpl % ( + ' \n' + + ' \n' + + ' \n') + expected = self.manifest_tmpl % ( + ' \n' + + ' \n' + + ' \n') + output = self.run_test(manifest_input) + self.assert_xml_equal(output, expected) + class AddTestOnlyApplicationTest(unittest.TestCase): """Unit tests for set_test_only_flag_to_true function.""" @@ -571,6 +630,20 @@ class AddTestOnlyApplicationTest(unittest.TestCase): output = self.run_test(manifest_input) self.assert_xml_equal(output, manifest_input) + def test_multiple_applications(self): + manifest_input = self.manifest_tmpl % ( + ' \n' + + ' \n' + + ' \n' + ) + expected = self.manifest_tmpl % ( + ' \n' + + ' \n' + + ' \n' + ) + output = self.run_test(manifest_input) + self.assert_xml_equal(output, expected) + class SetMaxSdkVersionTest(unittest.TestCase): """Unit tests for set_max_sdk_version function.""" -- cgit v1.2.3-59-g8ed1b