1*333d2b36SAndroid Build Coastguard Worker#!/usr/bin/env python 2*333d2b36SAndroid Build Coastguard Worker# 3*333d2b36SAndroid Build Coastguard Worker# Copyright (C) 2018 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# 17*333d2b36SAndroid Build Coastguard Worker"""Unit tests for manifest_fixer.py.""" 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerimport io 20*333d2b36SAndroid Build Coastguard Workerimport sys 21*333d2b36SAndroid Build Coastguard Workerimport unittest 22*333d2b36SAndroid Build Coastguard Workerfrom xml.dom import minidom 23*333d2b36SAndroid Build Coastguard Workerimport xml.etree.ElementTree as ElementTree 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workerimport manifest_fixer 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workersys.dont_write_bytecode = True 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workerclass CompareVersionGtTest(unittest.TestCase): 31*333d2b36SAndroid Build Coastguard Worker """Unit tests for compare_version_gt function.""" 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker def test_sdk(self): 34*333d2b36SAndroid Build Coastguard Worker """Test comparing sdk versions.""" 35*333d2b36SAndroid Build Coastguard Worker self.assertTrue(manifest_fixer.compare_version_gt('28', '27')) 36*333d2b36SAndroid Build Coastguard Worker self.assertFalse(manifest_fixer.compare_version_gt('27', '28')) 37*333d2b36SAndroid Build Coastguard Worker self.assertFalse(manifest_fixer.compare_version_gt('28', '28')) 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Worker def test_codename(self): 40*333d2b36SAndroid Build Coastguard Worker """Test comparing codenames.""" 41*333d2b36SAndroid Build Coastguard Worker self.assertTrue(manifest_fixer.compare_version_gt('Q', 'P')) 42*333d2b36SAndroid Build Coastguard Worker self.assertFalse(manifest_fixer.compare_version_gt('P', 'Q')) 43*333d2b36SAndroid Build Coastguard Worker self.assertFalse(manifest_fixer.compare_version_gt('Q', 'Q')) 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker def test_sdk_codename(self): 46*333d2b36SAndroid Build Coastguard Worker """Test comparing sdk versions with codenames.""" 47*333d2b36SAndroid Build Coastguard Worker self.assertTrue(manifest_fixer.compare_version_gt('Q', '28')) 48*333d2b36SAndroid Build Coastguard Worker self.assertFalse(manifest_fixer.compare_version_gt('28', 'Q')) 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker def test_compare_numeric(self): 51*333d2b36SAndroid Build Coastguard Worker """Test that numbers are compared in numeric and not lexicographic order.""" 52*333d2b36SAndroid Build Coastguard Worker self.assertTrue(manifest_fixer.compare_version_gt('18', '8')) 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Workerclass RaiseMinSdkVersionTest(unittest.TestCase): 56*333d2b36SAndroid Build Coastguard Worker """Unit tests for raise_min_sdk_version function.""" 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker def raise_min_sdk_version_test(self, input_manifest, min_sdk_version, 59*333d2b36SAndroid Build Coastguard Worker target_sdk_version, library): 60*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 61*333d2b36SAndroid Build Coastguard Worker manifest_fixer.raise_min_sdk_version(doc, min_sdk_version, 62*333d2b36SAndroid Build Coastguard Worker target_sdk_version, library) 63*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 64*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 65*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 68*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 69*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 70*333d2b36SAndroid Build Coastguard Worker '%s' 71*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker def uses_sdk(self, min_sdk=None, target_sdk=None, extra=''): 74*333d2b36SAndroid Build Coastguard Worker attrs = '' 75*333d2b36SAndroid Build Coastguard Worker if min_sdk: 76*333d2b36SAndroid Build Coastguard Worker attrs += ' android:minSdkVersion="%s"' % min_sdk 77*333d2b36SAndroid Build Coastguard Worker if target_sdk: 78*333d2b36SAndroid Build Coastguard Worker attrs += ' android:targetSdkVersion="%s"' % target_sdk 79*333d2b36SAndroid Build Coastguard Worker if extra: 80*333d2b36SAndroid Build Coastguard Worker attrs += ' ' + extra 81*333d2b36SAndroid Build Coastguard Worker return ' <uses-sdk%s/>\n' % attrs 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 84*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Worker def test_no_uses_sdk(self): 87*333d2b36SAndroid Build Coastguard Worker """Tests inserting a uses-sdk element into a manifest.""" 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '' 90*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='28') 91*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False) 92*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker def test_no_min(self): 95*333d2b36SAndroid Build Coastguard Worker """Tests inserting a minSdkVersion attribute into a uses-sdk element.""" 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ' <uses-sdk extra="foo"/>\n' 98*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='28', 99*333d2b36SAndroid Build Coastguard Worker extra='extra="foo"') 100*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False) 101*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker def test_raise_min(self): 104*333d2b36SAndroid Build Coastguard Worker """Tests inserting a minSdkVersion attribute into a uses-sdk element.""" 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='27') 107*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='28') 108*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False) 109*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker def test_raise(self): 112*333d2b36SAndroid Build Coastguard Worker """Tests raising a minSdkVersion attribute.""" 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='27') 115*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='28') 116*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False) 117*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker def test_no_raise_min(self): 120*333d2b36SAndroid Build Coastguard Worker """Tests a minSdkVersion that doesn't need raising.""" 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='28') 123*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='27') 124*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '27', '27', False) 125*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Worker def test_raise_codename(self): 128*333d2b36SAndroid Build Coastguard Worker """Tests raising a minSdkVersion attribute to a codename.""" 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='28') 131*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='P', target_sdk='P') 132*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, 'P', 'P', False) 133*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker def test_no_raise_codename(self): 136*333d2b36SAndroid Build Coastguard Worker """Tests a minSdkVersion codename that doesn't need raising.""" 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='P') 139*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='P', target_sdk='28') 140*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False) 141*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker def test_target(self): 144*333d2b36SAndroid Build Coastguard Worker """Tests an existing targetSdkVersion is preserved.""" 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='26', target_sdk='27') 147*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='27') 148*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False) 149*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker def test_no_target(self): 152*333d2b36SAndroid Build Coastguard Worker """Tests inserting targetSdkVersion when minSdkVersion exists.""" 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='27') 155*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='29') 156*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False) 157*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker def test_target_no_min(self): 160*333d2b36SAndroid Build Coastguard Worker """"Tests inserting targetSdkVersion when minSdkVersion exists.""" 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(target_sdk='27') 163*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='27') 164*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False) 165*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Worker def test_no_target_no_min(self): 168*333d2b36SAndroid Build Coastguard Worker """Tests inserting targetSdkVersion when minSdkVersion does not exist.""" 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '' 171*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='29') 172*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False) 173*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Worker def test_library_no_target(self): 176*333d2b36SAndroid Build Coastguard Worker """Tests inserting targetSdkVersion when minSdkVersion exists.""" 177*333d2b36SAndroid Build Coastguard Worker 178*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(min_sdk='27') 179*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='16') 180*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', True) 181*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker def test_library_target_no_min(self): 184*333d2b36SAndroid Build Coastguard Worker """Tests inserting targetSdkVersion when minSdkVersion exists.""" 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_sdk(target_sdk='27') 187*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='27') 188*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', True) 189*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker def test_library_no_target_no_min(self): 192*333d2b36SAndroid Build Coastguard Worker """Tests inserting targetSdkVersion when minSdkVersion does not exist.""" 193*333d2b36SAndroid Build Coastguard Worker 194*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '' 195*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_sdk(min_sdk='28', target_sdk='16') 196*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', True) 197*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 198*333d2b36SAndroid Build Coastguard Worker 199*333d2b36SAndroid Build Coastguard Worker def test_extra(self): 200*333d2b36SAndroid Build Coastguard Worker """Tests that extra attributes and elements are maintained.""" 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ( 203*333d2b36SAndroid Build Coastguard Worker ' <!-- comment -->\n' 204*333d2b36SAndroid Build Coastguard Worker ' <uses-sdk android:minSdkVersion="27" extra="foo"/>\n' 205*333d2b36SAndroid Build Coastguard Worker ' <application/>\n') 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Worker # pylint: disable=line-too-long 208*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ( 209*333d2b36SAndroid Build Coastguard Worker ' <!-- comment -->\n' 210*333d2b36SAndroid Build Coastguard Worker ' <uses-sdk android:minSdkVersion="28" extra="foo" android:targetSdkVersion="29"/>\n' 211*333d2b36SAndroid Build Coastguard Worker ' <application/>\n') 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False) 214*333d2b36SAndroid Build Coastguard Worker 215*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 216*333d2b36SAndroid Build Coastguard Worker 217*333d2b36SAndroid Build Coastguard Worker def test_indent(self): 218*333d2b36SAndroid Build Coastguard Worker """Tests that an inserted element copies the existing indentation.""" 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ' <!-- comment -->\n' 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker # pylint: disable=line-too-long 223*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ( 224*333d2b36SAndroid Build Coastguard Worker ' <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="29"/>\n' 225*333d2b36SAndroid Build Coastguard Worker ' <!-- comment -->\n') 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '29', False) 228*333d2b36SAndroid Build Coastguard Worker 229*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 230*333d2b36SAndroid Build Coastguard Worker 231*333d2b36SAndroid Build Coastguard Worker def test_multiple_uses_sdks(self): 232*333d2b36SAndroid Build Coastguard Worker """Tests a manifest that contains multiple uses_sdks elements.""" 233*333d2b36SAndroid Build Coastguard Worker 234*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ( 235*333d2b36SAndroid Build Coastguard Worker ' <uses-sdk android:featureFlag="foo" android:minSdkVersion="21" />\n' 236*333d2b36SAndroid Build Coastguard Worker ' <uses-sdk android:featureFlag="!foo" android:minSdkVersion="22" />\n') 237*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ( 238*333d2b36SAndroid Build Coastguard Worker ' <uses-sdk android:featureFlag="foo" android:minSdkVersion="28" android:targetSdkVersion="28" />\n' 239*333d2b36SAndroid Build Coastguard Worker ' <uses-sdk android:featureFlag="!foo" android:minSdkVersion="28" android:targetSdkVersion="28" />\n') 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker output = self.raise_min_sdk_version_test(manifest_input, '28', '28', False) 242*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 243*333d2b36SAndroid Build Coastguard Worker 244*333d2b36SAndroid Build Coastguard Workerclass AddLoggingParentTest(unittest.TestCase): 245*333d2b36SAndroid Build Coastguard Worker """Unit tests for add_logging_parent function.""" 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 248*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 249*333d2b36SAndroid Build Coastguard Worker 250*333d2b36SAndroid Build Coastguard Worker def add_logging_parent_test(self, input_manifest, logging_parent=None): 251*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 252*333d2b36SAndroid Build Coastguard Worker if logging_parent: 253*333d2b36SAndroid Build Coastguard Worker manifest_fixer.add_logging_parent(doc, logging_parent) 254*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 255*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 256*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 259*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 260*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 261*333d2b36SAndroid Build Coastguard Worker '%s' 262*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Worker def uses_logging_parent(self, logging_parent=None): 265*333d2b36SAndroid Build Coastguard Worker attrs = '' 266*333d2b36SAndroid Build Coastguard Worker if logging_parent: 267*333d2b36SAndroid Build Coastguard Worker meta_text = ('<meta-data android:name="android.content.pm.LOGGING_PARENT" ' 268*333d2b36SAndroid Build Coastguard Worker 'android:value="%s"/>\n') % logging_parent 269*333d2b36SAndroid Build Coastguard Worker attrs += ' <application>\n %s </application>\n' % meta_text 270*333d2b36SAndroid Build Coastguard Worker 271*333d2b36SAndroid Build Coastguard Worker return attrs 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Worker def test_no_logging_parent(self): 274*333d2b36SAndroid Build Coastguard Worker """Tests manifest_fixer with no logging_parent.""" 275*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '' 276*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_logging_parent() 277*333d2b36SAndroid Build Coastguard Worker output = self.add_logging_parent_test(manifest_input) 278*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 279*333d2b36SAndroid Build Coastguard Worker 280*333d2b36SAndroid Build Coastguard Worker def test_logging_parent(self): 281*333d2b36SAndroid Build Coastguard Worker """Tests manifest_fixer with no logging_parent.""" 282*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '' 283*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_logging_parent('FOO') 284*333d2b36SAndroid Build Coastguard Worker output = self.add_logging_parent_test(manifest_input, 'FOO') 285*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Workerclass AddUsesLibrariesTest(unittest.TestCase): 289*333d2b36SAndroid Build Coastguard Worker """Unit tests for add_uses_libraries function.""" 290*333d2b36SAndroid Build Coastguard Worker 291*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 292*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 293*333d2b36SAndroid Build Coastguard Worker 294*333d2b36SAndroid Build Coastguard Worker def run_test(self, input_manifest, new_uses_libraries): 295*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 296*333d2b36SAndroid Build Coastguard Worker manifest_fixer.add_uses_libraries(doc, new_uses_libraries, True) 297*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 298*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 299*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 302*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 303*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 304*333d2b36SAndroid Build Coastguard Worker '%s' 305*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 306*333d2b36SAndroid Build Coastguard Worker 307*333d2b36SAndroid Build Coastguard Worker def uses_libraries(self, name_required_pairs): 308*333d2b36SAndroid Build Coastguard Worker ret = ' <application>\n' 309*333d2b36SAndroid Build Coastguard Worker for name, required in name_required_pairs: 310*333d2b36SAndroid Build Coastguard Worker ret += ( 311*333d2b36SAndroid Build Coastguard Worker ' <uses-library android:name="%s" android:required="%s"/>\n' 312*333d2b36SAndroid Build Coastguard Worker ) % (name, required) 313*333d2b36SAndroid Build Coastguard Worker ret += ' </application>\n' 314*333d2b36SAndroid Build Coastguard Worker return ret 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker def test_empty(self): 317*333d2b36SAndroid Build Coastguard Worker """Empty new_uses_libraries must not touch the manifest.""" 318*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_libraries([ 319*333d2b36SAndroid Build Coastguard Worker ('foo', 'true'), 320*333d2b36SAndroid Build Coastguard Worker ('bar', 'false')]) 321*333d2b36SAndroid Build Coastguard Worker expected = manifest_input 322*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, []) 323*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker def test_not_overwrite(self): 326*333d2b36SAndroid Build Coastguard Worker """new_uses_libraries must not overwrite existing tags.""" 327*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_libraries([ 328*333d2b36SAndroid Build Coastguard Worker ('foo', 'true'), 329*333d2b36SAndroid Build Coastguard Worker ('bar', 'false')]) 330*333d2b36SAndroid Build Coastguard Worker expected = manifest_input 331*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, ['foo', 'bar']) 332*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Worker def test_add(self): 335*333d2b36SAndroid Build Coastguard Worker """New names are added with 'required:true'.""" 336*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_libraries([ 337*333d2b36SAndroid Build Coastguard Worker ('foo', 'true'), 338*333d2b36SAndroid Build Coastguard Worker ('bar', 'false')]) 339*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_libraries([ 340*333d2b36SAndroid Build Coastguard Worker ('foo', 'true'), 341*333d2b36SAndroid Build Coastguard Worker ('bar', 'false'), 342*333d2b36SAndroid Build Coastguard Worker ('baz', 'true'), 343*333d2b36SAndroid Build Coastguard Worker ('qux', 'true')]) 344*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, ['bar', 'baz', 'qux']) 345*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 346*333d2b36SAndroid Build Coastguard Worker 347*333d2b36SAndroid Build Coastguard Worker def test_no_application(self): 348*333d2b36SAndroid Build Coastguard Worker """When there is no <application> tag, the tag is added.""" 349*333d2b36SAndroid Build Coastguard Worker manifest_input = ( 350*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 351*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android=' 352*333d2b36SAndroid Build Coastguard Worker '"http://schemas.android.com/apk/res/android">\n' 353*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 354*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_libraries([ 355*333d2b36SAndroid Build Coastguard Worker ('foo', 'true'), 356*333d2b36SAndroid Build Coastguard Worker ('bar', 'true')]) 357*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, ['foo', 'bar']) 358*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 359*333d2b36SAndroid Build Coastguard Worker 360*333d2b36SAndroid Build Coastguard Worker def test_empty_application(self): 361*333d2b36SAndroid Build Coastguard Worker """Even when here is an empty <application/> tag, the libs are added.""" 362*333d2b36SAndroid Build Coastguard Worker manifest_input = ( 363*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 364*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android=' 365*333d2b36SAndroid Build Coastguard Worker '"http://schemas.android.com/apk/res/android">\n' 366*333d2b36SAndroid Build Coastguard Worker ' <application/>\n' 367*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 368*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_libraries([ 369*333d2b36SAndroid Build Coastguard Worker ('foo', 'true'), 370*333d2b36SAndroid Build Coastguard Worker ('bar', 'true')]) 371*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, ['foo', 'bar']) 372*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 373*333d2b36SAndroid Build Coastguard Worker 374*333d2b36SAndroid Build Coastguard Worker def test_multiple_application(self): 375*333d2b36SAndroid Build Coastguard Worker """When there are multiple applications, the libs are added to each.""" 376*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ( 377*333d2b36SAndroid Build Coastguard Worker self.uses_libraries([('foo', 'false')]) + 378*333d2b36SAndroid Build Coastguard Worker self.uses_libraries([('bar', 'false')])) 379*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ( 380*333d2b36SAndroid Build Coastguard Worker self.uses_libraries([('foo', 'false'), ('bar', 'true')]) + 381*333d2b36SAndroid Build Coastguard Worker self.uses_libraries([('bar', 'false'), ('foo', 'true')])) 382*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, ['foo', 'bar']) 383*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 384*333d2b36SAndroid Build Coastguard Worker 385*333d2b36SAndroid Build Coastguard Worker 386*333d2b36SAndroid Build Coastguard Workerclass AddUsesNonSdkApiTest(unittest.TestCase): 387*333d2b36SAndroid Build Coastguard Worker """Unit tests for add_uses_libraries function.""" 388*333d2b36SAndroid Build Coastguard Worker 389*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 390*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Worker def run_test(self, input_manifest): 393*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 394*333d2b36SAndroid Build Coastguard Worker manifest_fixer.add_uses_non_sdk_api(doc) 395*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 396*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 397*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 398*333d2b36SAndroid Build Coastguard Worker 399*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 400*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 401*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 402*333d2b36SAndroid Build Coastguard Worker ' %s\n' 403*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 404*333d2b36SAndroid Build Coastguard Worker 405*333d2b36SAndroid Build Coastguard Worker def uses_non_sdk_api(self, value): 406*333d2b36SAndroid Build Coastguard Worker return '<application %s/>' % ('android:usesNonSdkApi="true"' if value else '') 407*333d2b36SAndroid Build Coastguard Worker 408*333d2b36SAndroid Build Coastguard Worker def test_set_true(self): 409*333d2b36SAndroid Build Coastguard Worker """Empty new_uses_libraries must not touch the manifest.""" 410*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_non_sdk_api(False) 411*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_non_sdk_api(True) 412*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 413*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 414*333d2b36SAndroid Build Coastguard Worker 415*333d2b36SAndroid Build Coastguard Worker def test_already_set(self): 416*333d2b36SAndroid Build Coastguard Worker """new_uses_libraries must not overwrite existing tags.""" 417*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_non_sdk_api(True) 418*333d2b36SAndroid Build Coastguard Worker expected = manifest_input 419*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 420*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 421*333d2b36SAndroid Build Coastguard Worker 422*333d2b36SAndroid Build Coastguard Worker def test_multiple_applications(self): 423*333d2b36SAndroid Build Coastguard Worker """new_uses_libraries must be added to all applications.""" 424*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % (self.uses_non_sdk_api(True) + self.uses_non_sdk_api(False)) 425*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % (self.uses_non_sdk_api(True) + self.uses_non_sdk_api(True)) 426*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 427*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 428*333d2b36SAndroid Build Coastguard Worker 429*333d2b36SAndroid Build Coastguard Worker 430*333d2b36SAndroid Build Coastguard Workerclass UseEmbeddedDexTest(unittest.TestCase): 431*333d2b36SAndroid Build Coastguard Worker """Unit tests for add_use_embedded_dex function.""" 432*333d2b36SAndroid Build Coastguard Worker 433*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 434*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 435*333d2b36SAndroid Build Coastguard Worker 436*333d2b36SAndroid Build Coastguard Worker def run_test(self, input_manifest): 437*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 438*333d2b36SAndroid Build Coastguard Worker manifest_fixer.add_use_embedded_dex(doc) 439*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 440*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 441*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 442*333d2b36SAndroid Build Coastguard Worker 443*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 444*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 445*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 446*333d2b36SAndroid Build Coastguard Worker ' %s\n' 447*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 448*333d2b36SAndroid Build Coastguard Worker 449*333d2b36SAndroid Build Coastguard Worker def use_embedded_dex(self, value): 450*333d2b36SAndroid Build Coastguard Worker return '<application android:useEmbeddedDex="%s" />' % value 451*333d2b36SAndroid Build Coastguard Worker 452*333d2b36SAndroid Build Coastguard Worker def test_manifest_with_undeclared_preference(self): 453*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '<application/>' 454*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.use_embedded_dex('true') 455*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 456*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 457*333d2b36SAndroid Build Coastguard Worker 458*333d2b36SAndroid Build Coastguard Worker def test_manifest_with_use_embedded_dex(self): 459*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.use_embedded_dex('true') 460*333d2b36SAndroid Build Coastguard Worker expected = manifest_input 461*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 462*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 463*333d2b36SAndroid Build Coastguard Worker 464*333d2b36SAndroid Build Coastguard Worker def test_manifest_with_not_use_embedded_dex(self): 465*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.use_embedded_dex('false') 466*333d2b36SAndroid Build Coastguard Worker self.assertRaises(RuntimeError, self.run_test, manifest_input) 467*333d2b36SAndroid Build Coastguard Worker 468*333d2b36SAndroid Build Coastguard Worker def test_multiple_applications(self): 469*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ( 470*333d2b36SAndroid Build Coastguard Worker self.use_embedded_dex('true') + 471*333d2b36SAndroid Build Coastguard Worker '<application/>' 472*333d2b36SAndroid Build Coastguard Worker ) 473*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ( 474*333d2b36SAndroid Build Coastguard Worker self.use_embedded_dex('true') + 475*333d2b36SAndroid Build Coastguard Worker self.use_embedded_dex('true') 476*333d2b36SAndroid Build Coastguard Worker ) 477*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 478*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 479*333d2b36SAndroid Build Coastguard Worker 480*333d2b36SAndroid Build Coastguard Worker 481*333d2b36SAndroid Build Coastguard Workerclass AddExtractNativeLibsTest(unittest.TestCase): 482*333d2b36SAndroid Build Coastguard Worker """Unit tests for add_extract_native_libs function.""" 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 485*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 486*333d2b36SAndroid Build Coastguard Worker 487*333d2b36SAndroid Build Coastguard Worker def run_test(self, input_manifest, value): 488*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 489*333d2b36SAndroid Build Coastguard Worker manifest_fixer.add_extract_native_libs(doc, value) 490*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 491*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 492*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 493*333d2b36SAndroid Build Coastguard Worker 494*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 495*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 496*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 497*333d2b36SAndroid Build Coastguard Worker ' %s\n' 498*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 499*333d2b36SAndroid Build Coastguard Worker 500*333d2b36SAndroid Build Coastguard Worker def extract_native_libs(self, value): 501*333d2b36SAndroid Build Coastguard Worker return '<application android:extractNativeLibs="%s" />' % value 502*333d2b36SAndroid Build Coastguard Worker 503*333d2b36SAndroid Build Coastguard Worker def test_set_true(self): 504*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '<application/>' 505*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.extract_native_libs('true') 506*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, True) 507*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 508*333d2b36SAndroid Build Coastguard Worker 509*333d2b36SAndroid Build Coastguard Worker def test_set_false(self): 510*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '<application/>' 511*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.extract_native_libs('false') 512*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, False) 513*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 514*333d2b36SAndroid Build Coastguard Worker 515*333d2b36SAndroid Build Coastguard Worker def test_match(self): 516*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.extract_native_libs('true') 517*333d2b36SAndroid Build Coastguard Worker expected = manifest_input 518*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, True) 519*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 520*333d2b36SAndroid Build Coastguard Worker 521*333d2b36SAndroid Build Coastguard Worker def test_conflict(self): 522*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.extract_native_libs('true') 523*333d2b36SAndroid Build Coastguard Worker self.assertRaises(RuntimeError, self.run_test, manifest_input, False) 524*333d2b36SAndroid Build Coastguard Worker 525*333d2b36SAndroid Build Coastguard Worker def test_multiple_applications(self): 526*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % (self.extract_native_libs('true') + '<application/>') 527*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % (self.extract_native_libs('true') + self.extract_native_libs('true')) 528*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, True) 529*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 530*333d2b36SAndroid Build Coastguard Worker 531*333d2b36SAndroid Build Coastguard Worker 532*333d2b36SAndroid Build Coastguard Workerclass AddNoCodeApplicationTest(unittest.TestCase): 533*333d2b36SAndroid Build Coastguard Worker """Unit tests for set_has_code_to_false function.""" 534*333d2b36SAndroid Build Coastguard Worker 535*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 536*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 537*333d2b36SAndroid Build Coastguard Worker 538*333d2b36SAndroid Build Coastguard Worker def run_test(self, input_manifest): 539*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 540*333d2b36SAndroid Build Coastguard Worker manifest_fixer.set_has_code_to_false(doc) 541*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 542*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 543*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 544*333d2b36SAndroid Build Coastguard Worker 545*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 546*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 547*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 548*333d2b36SAndroid Build Coastguard Worker '%s' 549*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 550*333d2b36SAndroid Build Coastguard Worker 551*333d2b36SAndroid Build Coastguard Worker def test_no_application(self): 552*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '' 553*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ' <application android:hasCode="false"/>\n' 554*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 555*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 556*333d2b36SAndroid Build Coastguard Worker 557*333d2b36SAndroid Build Coastguard Worker def test_has_application_no_has_code(self): 558*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ' <application/>\n' 559*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ' <application android:hasCode="false"/>\n' 560*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 561*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 562*333d2b36SAndroid Build Coastguard Worker 563*333d2b36SAndroid Build Coastguard Worker def test_has_application_has_code_false(self): 564*333d2b36SAndroid Build Coastguard Worker """ Do nothing if there's already an application element. """ 565*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ' <application android:hasCode="false"/>\n' 566*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 567*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, manifest_input) 568*333d2b36SAndroid Build Coastguard Worker 569*333d2b36SAndroid Build Coastguard Worker def test_has_application_has_code_true(self): 570*333d2b36SAndroid Build Coastguard Worker """ Do nothing if there's already an application element even if its 571*333d2b36SAndroid Build Coastguard Worker hasCode attribute is true. """ 572*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ' <application android:hasCode="true"/>\n' 573*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 574*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, manifest_input) 575*333d2b36SAndroid Build Coastguard Worker 576*333d2b36SAndroid Build Coastguard Worker def test_multiple_applications(self): 577*333d2b36SAndroid Build Coastguard Worker """ Apply to all applications """ 578*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ( 579*333d2b36SAndroid Build Coastguard Worker ' <application android:hasCode="true" />\n' + 580*333d2b36SAndroid Build Coastguard Worker ' <application android:hasCode="false" />\n' + 581*333d2b36SAndroid Build Coastguard Worker ' <application/>\n') 582*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ( 583*333d2b36SAndroid Build Coastguard Worker ' <application android:hasCode="true" />\n' + 584*333d2b36SAndroid Build Coastguard Worker ' <application android:hasCode="false" />\n' + 585*333d2b36SAndroid Build Coastguard Worker ' <application android:hasCode="false" />\n') 586*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 587*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 588*333d2b36SAndroid Build Coastguard Worker 589*333d2b36SAndroid Build Coastguard Worker 590*333d2b36SAndroid Build Coastguard Workerclass AddTestOnlyApplicationTest(unittest.TestCase): 591*333d2b36SAndroid Build Coastguard Worker """Unit tests for set_test_only_flag_to_true function.""" 592*333d2b36SAndroid Build Coastguard Worker 593*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 594*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 595*333d2b36SAndroid Build Coastguard Worker 596*333d2b36SAndroid Build Coastguard Worker def run_test(self, input_manifest): 597*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 598*333d2b36SAndroid Build Coastguard Worker manifest_fixer.set_test_only_flag_to_true(doc) 599*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 600*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 601*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 602*333d2b36SAndroid Build Coastguard Worker 603*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 604*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 605*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 606*333d2b36SAndroid Build Coastguard Worker '%s' 607*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 608*333d2b36SAndroid Build Coastguard Worker 609*333d2b36SAndroid Build Coastguard Worker def test_no_application(self): 610*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '' 611*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ' <application android:testOnly="true"/>\n' 612*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 613*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 614*333d2b36SAndroid Build Coastguard Worker 615*333d2b36SAndroid Build Coastguard Worker def test_has_application_no_test_only(self): 616*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ' <application/>\n' 617*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ' <application android:testOnly="true"/>\n' 618*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 619*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 620*333d2b36SAndroid Build Coastguard Worker 621*333d2b36SAndroid Build Coastguard Worker def test_has_application_test_only_true(self): 622*333d2b36SAndroid Build Coastguard Worker """ If there's already an application element.""" 623*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ' <application android:testOnly="true"/>\n' 624*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 625*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, manifest_input) 626*333d2b36SAndroid Build Coastguard Worker 627*333d2b36SAndroid Build Coastguard Worker def test_has_application_test_only_false(self): 628*333d2b36SAndroid Build Coastguard Worker """ If there's already an application element with the testOnly attribute as false.""" 629*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ' <application android:testOnly="false"/>\n' 630*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 631*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, manifest_input) 632*333d2b36SAndroid Build Coastguard Worker 633*333d2b36SAndroid Build Coastguard Worker def test_multiple_applications(self): 634*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % ( 635*333d2b36SAndroid Build Coastguard Worker ' <application android:testOnly="true" />\n' + 636*333d2b36SAndroid Build Coastguard Worker ' <application android:testOnly="false" />\n' + 637*333d2b36SAndroid Build Coastguard Worker ' <application/>\n' 638*333d2b36SAndroid Build Coastguard Worker ) 639*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % ( 640*333d2b36SAndroid Build Coastguard Worker ' <application android:testOnly="true" />\n' + 641*333d2b36SAndroid Build Coastguard Worker ' <application android:testOnly="false" />\n' + 642*333d2b36SAndroid Build Coastguard Worker ' <application android:testOnly="true" />\n' 643*333d2b36SAndroid Build Coastguard Worker ) 644*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input) 645*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 646*333d2b36SAndroid Build Coastguard Worker 647*333d2b36SAndroid Build Coastguard Worker 648*333d2b36SAndroid Build Coastguard Workerclass SetMaxSdkVersionTest(unittest.TestCase): 649*333d2b36SAndroid Build Coastguard Worker """Unit tests for set_max_sdk_version function.""" 650*333d2b36SAndroid Build Coastguard Worker 651*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 652*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 653*333d2b36SAndroid Build Coastguard Worker 654*333d2b36SAndroid Build Coastguard Worker def run_test(self, input_manifest, max_sdk_version): 655*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 656*333d2b36SAndroid Build Coastguard Worker manifest_fixer.set_max_sdk_version(doc, max_sdk_version) 657*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 658*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 659*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 660*333d2b36SAndroid Build Coastguard Worker 661*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 662*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 663*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' 664*333d2b36SAndroid Build Coastguard Worker '%s' 665*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 666*333d2b36SAndroid Build Coastguard Worker 667*333d2b36SAndroid Build Coastguard Worker def permission(self, max_sdk=None): 668*333d2b36SAndroid Build Coastguard Worker if max_sdk is None: 669*333d2b36SAndroid Build Coastguard Worker return ' <permission/>' 670*333d2b36SAndroid Build Coastguard Worker return ' <permission android:maxSdkVersion="%s"/>\n' % max_sdk 671*333d2b36SAndroid Build Coastguard Worker 672*333d2b36SAndroid Build Coastguard Worker def uses_permission(self, max_sdk=None): 673*333d2b36SAndroid Build Coastguard Worker if max_sdk is None: 674*333d2b36SAndroid Build Coastguard Worker return ' <uses-permission/>' 675*333d2b36SAndroid Build Coastguard Worker return ' <uses-permission android:maxSdkVersion="%s"/>\n' % max_sdk 676*333d2b36SAndroid Build Coastguard Worker 677*333d2b36SAndroid Build Coastguard Worker def test_permission_no_max_sdk_version(self): 678*333d2b36SAndroid Build Coastguard Worker """Tests if permission has no maxSdkVersion attribute""" 679*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.permission() 680*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.permission() 681*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, '9000') 682*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 683*333d2b36SAndroid Build Coastguard Worker 684*333d2b36SAndroid Build Coastguard Worker def test_permission_max_sdk_version_changed(self): 685*333d2b36SAndroid Build Coastguard Worker """Tests if permission maxSdkVersion attribute is set to current""" 686*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.permission('current') 687*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.permission(9000) 688*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, '9000') 689*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 690*333d2b36SAndroid Build Coastguard Worker 691*333d2b36SAndroid Build Coastguard Worker def test_permission_max_sdk_version_not_changed(self): 692*333d2b36SAndroid Build Coastguard Worker """Tests if permission maxSdkVersion attribute is not set to current""" 693*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.permission(30) 694*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.permission(30) 695*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, '9000') 696*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 697*333d2b36SAndroid Build Coastguard Worker 698*333d2b36SAndroid Build Coastguard Worker def test_uses_permission_no_max_sdk_version(self): 699*333d2b36SAndroid Build Coastguard Worker """Tests if uses-permission has no maxSdkVersion attribute""" 700*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_permission() 701*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_permission() 702*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, '9000') 703*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 704*333d2b36SAndroid Build Coastguard Worker 705*333d2b36SAndroid Build Coastguard Worker def test_uses_permission_max_sdk_version_changed(self): 706*333d2b36SAndroid Build Coastguard Worker """Tests if uses-permission maxSdkVersion attribute is set to current""" 707*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_permission('current') 708*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_permission(9000) 709*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, '9000') 710*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 711*333d2b36SAndroid Build Coastguard Worker 712*333d2b36SAndroid Build Coastguard Worker def test_uses_permission_max_sdk_version_not_changed(self): 713*333d2b36SAndroid Build Coastguard Worker """Tests if uses-permission maxSdkVersion attribute is not set to current""" 714*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % self.uses_permission(30) 715*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % self.uses_permission(30) 716*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, '9000') 717*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 718*333d2b36SAndroid Build Coastguard Worker 719*333d2b36SAndroid Build Coastguard Worker 720*333d2b36SAndroid Build Coastguard Workerclass OverrideDefaultVersionTest(unittest.TestCase): 721*333d2b36SAndroid Build Coastguard Worker """Unit tests for override_default_version function.""" 722*333d2b36SAndroid Build Coastguard Worker 723*333d2b36SAndroid Build Coastguard Worker def assert_xml_equal(self, output, expected): 724*333d2b36SAndroid Build Coastguard Worker self.assertEqual(ElementTree.canonicalize(output), ElementTree.canonicalize(expected)) 725*333d2b36SAndroid Build Coastguard Worker 726*333d2b36SAndroid Build Coastguard Worker def run_test(self, input_manifest, version): 727*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(input_manifest) 728*333d2b36SAndroid Build Coastguard Worker manifest_fixer.override_placeholder_version(doc, version) 729*333d2b36SAndroid Build Coastguard Worker output = io.StringIO() 730*333d2b36SAndroid Build Coastguard Worker manifest_fixer.write_xml(output, doc) 731*333d2b36SAndroid Build Coastguard Worker return output.getvalue() 732*333d2b36SAndroid Build Coastguard Worker 733*333d2b36SAndroid Build Coastguard Worker manifest_tmpl = ( 734*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n' 735*333d2b36SAndroid Build Coastguard Worker '<manifest xmlns:android="http://schemas.android.com/apk/res/android" ' 736*333d2b36SAndroid Build Coastguard Worker 'android:versionCode="%s">\n' 737*333d2b36SAndroid Build Coastguard Worker '</manifest>\n') 738*333d2b36SAndroid Build Coastguard Worker 739*333d2b36SAndroid Build Coastguard Worker def test_doesnt_override_existing_version(self): 740*333d2b36SAndroid Build Coastguard Worker """Tests that an existing version is not overridden""" 741*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '12345' 742*333d2b36SAndroid Build Coastguard Worker expected = manifest_input 743*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, '67890') 744*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 745*333d2b36SAndroid Build Coastguard Worker 746*333d2b36SAndroid Build Coastguard Worker def test_overrides_default_version(self): 747*333d2b36SAndroid Build Coastguard Worker """Tests that a default version is overridden""" 748*333d2b36SAndroid Build Coastguard Worker manifest_input = self.manifest_tmpl % '0' 749*333d2b36SAndroid Build Coastguard Worker expected = self.manifest_tmpl % '67890' 750*333d2b36SAndroid Build Coastguard Worker output = self.run_test(manifest_input, '67890') 751*333d2b36SAndroid Build Coastguard Worker self.assert_xml_equal(output, expected) 752*333d2b36SAndroid Build Coastguard Worker 753*333d2b36SAndroid Build Coastguard Worker 754*333d2b36SAndroid Build Coastguard Workerif __name__ == '__main__': 755*333d2b36SAndroid Build Coastguard Worker unittest.main(verbosity=2) 756