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 sys 20*333d2b36SAndroid Build Coastguard Workerimport unittest 21*333d2b36SAndroid Build Coastguard Workerfrom xml.dom import minidom 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workerimport manifest_check 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workersys.dont_write_bytecode = True 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workerdef uses_library_xml(name, attr=''): 29*333d2b36SAndroid Build Coastguard Worker return '<uses-library android:name="%s"%s />' % (name, attr) 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Workerdef required_xml(value): 33*333d2b36SAndroid Build Coastguard Worker return ' android:required="%s"' % ('true' if value else 'false') 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Workerdef uses_library_apk(name, sfx=''): 37*333d2b36SAndroid Build Coastguard Worker return "uses-library%s:'%s'" % (sfx, name) 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Workerdef required_apk(value): 41*333d2b36SAndroid Build Coastguard Worker return '' if value else '-not-required' 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workerclass EnforceUsesLibrariesTest(unittest.TestCase): 45*333d2b36SAndroid Build Coastguard Worker """Unit tests for add_extract_native_libs function.""" 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Worker def run_test(self, xml, apk, uses_libraries=(), optional_uses_libraries=(), 48*333d2b36SAndroid Build Coastguard Worker missing_optional_uses_libraries=()): #pylint: disable=dangerous-default-value 49*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(xml) 50*333d2b36SAndroid Build Coastguard Worker try: 51*333d2b36SAndroid Build Coastguard Worker relax = False 52*333d2b36SAndroid Build Coastguard Worker manifest_check.enforce_uses_libraries( 53*333d2b36SAndroid Build Coastguard Worker doc, uses_libraries, optional_uses_libraries, missing_optional_uses_libraries, 54*333d2b36SAndroid Build Coastguard Worker relax, False, 'path/to/X/AndroidManifest.xml') 55*333d2b36SAndroid Build Coastguard Worker manifest_check.enforce_uses_libraries(apk, uses_libraries, 56*333d2b36SAndroid Build Coastguard Worker optional_uses_libraries, 57*333d2b36SAndroid Build Coastguard Worker missing_optional_uses_libraries, 58*333d2b36SAndroid Build Coastguard Worker relax, True, 59*333d2b36SAndroid Build Coastguard Worker 'path/to/X/X.apk') 60*333d2b36SAndroid Build Coastguard Worker return True 61*333d2b36SAndroid Build Coastguard Worker except manifest_check.ManifestMismatchError: 62*333d2b36SAndroid Build Coastguard Worker return False 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker xml_tmpl = ( 65*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n<manifest ' 66*333d2b36SAndroid Build Coastguard Worker 'xmlns:android="http://schemas.android.com/apk/res/android">\n ' 67*333d2b36SAndroid Build Coastguard Worker '<application>\n %s\n </application>\n</manifest>\n') 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker apk_tmpl = ( 70*333d2b36SAndroid Build Coastguard Worker "package: name='com.google.android.something' versionCode='100'\n" 71*333d2b36SAndroid Build Coastguard Worker "sdkVersion:'29'\n" 72*333d2b36SAndroid Build Coastguard Worker "targetSdkVersion:'29'\n" 73*333d2b36SAndroid Build Coastguard Worker "uses-permission: name='android.permission.ACCESS_NETWORK_STATE'\n" 74*333d2b36SAndroid Build Coastguard Worker '%s\n' 75*333d2b36SAndroid Build Coastguard Worker "densities: '160' '240' '320' '480' '640' '65534") 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker def test_uses_library(self): 78*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % (uses_library_xml('foo')) 79*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % (uses_library_apk('foo')) 80*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, uses_libraries=['foo']) 81*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker def test_uses_library_required(self): 84*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % (uses_library_xml('foo', required_xml(True))) 85*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % (uses_library_apk('foo', required_apk(True))) 86*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, uses_libraries=['foo']) 87*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker def test_optional_uses_library(self): 90*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % (uses_library_xml('foo', required_xml(False))) 91*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % (uses_library_apk('foo', required_apk(False))) 92*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, optional_uses_libraries=['foo']) 93*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker def test_expected_uses_library(self): 96*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % (uses_library_xml('foo', required_xml(False))) 97*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % (uses_library_apk('foo', required_apk(False))) 98*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, uses_libraries=['foo']) 99*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker def test_expected_optional_uses_library(self): 102*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % (uses_library_xml('foo')) 103*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % (uses_library_apk('foo')) 104*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, optional_uses_libraries=['foo']) 105*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker def test_expected_missing_optional_uses_library(self): 108*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ( 109*333d2b36SAndroid Build Coastguard Worker uses_library_xml('foo') + uses_library_xml('missing') + uses_library_xml('bar')) 110*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ( 111*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo') + uses_library_apk('missing') + uses_library_apk('bar')) 112*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, optional_uses_libraries=['foo', 'bar'], 113*333d2b36SAndroid Build Coastguard Worker missing_optional_uses_libraries=['missing']) 114*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 115*333d2b36SAndroid Build Coastguard Worker 116*333d2b36SAndroid Build Coastguard Worker def test_missing_uses_library(self): 117*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % '' 118*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % '' 119*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, uses_libraries=['foo']) 120*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker def test_missing_optional_uses_library(self): 123*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % '' 124*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % '' 125*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, optional_uses_libraries=['foo']) 126*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 127*333d2b36SAndroid Build Coastguard Worker 128*333d2b36SAndroid Build Coastguard Worker def test_extra_uses_library(self): 129*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % (uses_library_xml('foo')) 130*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % (uses_library_xml('foo')) 131*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk) 132*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker def test_extra_optional_uses_library(self): 135*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % (uses_library_xml('foo', required_xml(False))) 136*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % (uses_library_apk('foo', required_apk(False))) 137*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk) 138*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker def test_multiple_uses_library(self): 141*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ('\n'.join( 142*333d2b36SAndroid Build Coastguard Worker [uses_library_xml('foo'), 143*333d2b36SAndroid Build Coastguard Worker uses_library_xml('bar')])) 144*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join( 145*333d2b36SAndroid Build Coastguard Worker [uses_library_apk('foo'), 146*333d2b36SAndroid Build Coastguard Worker uses_library_apk('bar')])) 147*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, uses_libraries=['foo', 'bar']) 148*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker def test_multiple_optional_uses_library(self): 151*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ('\n'.join([ 152*333d2b36SAndroid Build Coastguard Worker uses_library_xml('foo', required_xml(False)), 153*333d2b36SAndroid Build Coastguard Worker uses_library_xml('bar', required_xml(False)) 154*333d2b36SAndroid Build Coastguard Worker ])) 155*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join([ 156*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo', required_apk(False)), 157*333d2b36SAndroid Build Coastguard Worker uses_library_apk('bar', required_apk(False)) 158*333d2b36SAndroid Build Coastguard Worker ])) 159*333d2b36SAndroid Build Coastguard Worker matches = self.run_test( 160*333d2b36SAndroid Build Coastguard Worker xml, apk, optional_uses_libraries=['foo', 'bar']) 161*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Worker def test_order_uses_library(self): 164*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ('\n'.join( 165*333d2b36SAndroid Build Coastguard Worker [uses_library_xml('foo'), 166*333d2b36SAndroid Build Coastguard Worker uses_library_xml('bar')])) 167*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join( 168*333d2b36SAndroid Build Coastguard Worker [uses_library_apk('foo'), 169*333d2b36SAndroid Build Coastguard Worker uses_library_apk('bar')])) 170*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, uses_libraries=['bar', 'foo']) 171*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker def test_order_optional_uses_library(self): 174*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ('\n'.join([ 175*333d2b36SAndroid Build Coastguard Worker uses_library_xml('foo', required_xml(False)), 176*333d2b36SAndroid Build Coastguard Worker uses_library_xml('bar', required_xml(False)) 177*333d2b36SAndroid Build Coastguard Worker ])) 178*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join([ 179*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo', required_apk(False)), 180*333d2b36SAndroid Build Coastguard Worker uses_library_apk('bar', required_apk(False)) 181*333d2b36SAndroid Build Coastguard Worker ])) 182*333d2b36SAndroid Build Coastguard Worker matches = self.run_test( 183*333d2b36SAndroid Build Coastguard Worker xml, apk, optional_uses_libraries=['bar', 'foo']) 184*333d2b36SAndroid Build Coastguard Worker self.assertFalse(matches) 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Worker def test_duplicate_uses_library(self): 187*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ('\n'.join( 188*333d2b36SAndroid Build Coastguard Worker [uses_library_xml('foo'), 189*333d2b36SAndroid Build Coastguard Worker uses_library_xml('foo')])) 190*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join( 191*333d2b36SAndroid Build Coastguard Worker [uses_library_apk('foo'), 192*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo')])) 193*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, uses_libraries=['foo']) 194*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 195*333d2b36SAndroid Build Coastguard Worker 196*333d2b36SAndroid Build Coastguard Worker def test_duplicate_optional_uses_library(self): 197*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ('\n'.join([ 198*333d2b36SAndroid Build Coastguard Worker uses_library_xml('foo', required_xml(False)), 199*333d2b36SAndroid Build Coastguard Worker uses_library_xml('foo', required_xml(False)) 200*333d2b36SAndroid Build Coastguard Worker ])) 201*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join([ 202*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo', required_apk(False)), 203*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo', required_apk(False)) 204*333d2b36SAndroid Build Coastguard Worker ])) 205*333d2b36SAndroid Build Coastguard Worker matches = self.run_test(xml, apk, optional_uses_libraries=['foo']) 206*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker def test_mixed(self): 209*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ('\n'.join([ 210*333d2b36SAndroid Build Coastguard Worker uses_library_xml('foo'), 211*333d2b36SAndroid Build Coastguard Worker uses_library_xml('bar', required_xml(False)) 212*333d2b36SAndroid Build Coastguard Worker ])) 213*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join([ 214*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo'), 215*333d2b36SAndroid Build Coastguard Worker uses_library_apk('bar', required_apk(False)) 216*333d2b36SAndroid Build Coastguard Worker ])) 217*333d2b36SAndroid Build Coastguard Worker matches = self.run_test( 218*333d2b36SAndroid Build Coastguard Worker xml, apk, uses_libraries=['foo'], optional_uses_libraries=['bar']) 219*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Worker def test_mixed_with_namespace(self): 222*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % ('\n'.join([ 223*333d2b36SAndroid Build Coastguard Worker uses_library_xml('foo'), 224*333d2b36SAndroid Build Coastguard Worker uses_library_xml('bar', required_xml(False)) 225*333d2b36SAndroid Build Coastguard Worker ])) 226*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join([ 227*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo'), 228*333d2b36SAndroid Build Coastguard Worker uses_library_apk('bar', required_apk(False)) 229*333d2b36SAndroid Build Coastguard Worker ])) 230*333d2b36SAndroid Build Coastguard Worker matches = self.run_test( 231*333d2b36SAndroid Build Coastguard Worker xml, 232*333d2b36SAndroid Build Coastguard Worker apk, 233*333d2b36SAndroid Build Coastguard Worker uses_libraries=['//x/y/z:foo'], 234*333d2b36SAndroid Build Coastguard Worker optional_uses_libraries=['//x/y/z:bar']) 235*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Worker def test_multiple_applications(self): 238*333d2b36SAndroid Build Coastguard Worker xml = """<?xml version="1.0" encoding="utf-8"?> 239*333d2b36SAndroid Build Coastguard Worker <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 240*333d2b36SAndroid Build Coastguard Worker <application android:featureFlag="foo"> 241*333d2b36SAndroid Build Coastguard Worker <uses-library android:name="foo" /> 242*333d2b36SAndroid Build Coastguard Worker <uses-library android:name="bar" android:required="false" /> 243*333d2b36SAndroid Build Coastguard Worker </application> 244*333d2b36SAndroid Build Coastguard Worker <application android:featureFlag="!foo"> 245*333d2b36SAndroid Build Coastguard Worker <uses-library android:name="foo" /> 246*333d2b36SAndroid Build Coastguard Worker <uses-library android:name="qux" android:required="false" /> 247*333d2b36SAndroid Build Coastguard Worker </application> 248*333d2b36SAndroid Build Coastguard Worker </manifest> 249*333d2b36SAndroid Build Coastguard Worker """ 250*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % ('\n'.join([ 251*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo'), 252*333d2b36SAndroid Build Coastguard Worker uses_library_apk('bar', required_apk(False)), 253*333d2b36SAndroid Build Coastguard Worker uses_library_apk('foo'), 254*333d2b36SAndroid Build Coastguard Worker uses_library_apk('qux', required_apk(False)) 255*333d2b36SAndroid Build Coastguard Worker ])) 256*333d2b36SAndroid Build Coastguard Worker matches = self.run_test( 257*333d2b36SAndroid Build Coastguard Worker xml, 258*333d2b36SAndroid Build Coastguard Worker apk, 259*333d2b36SAndroid Build Coastguard Worker uses_libraries=['//x/y/z:foo'], 260*333d2b36SAndroid Build Coastguard Worker optional_uses_libraries=['//x/y/z:bar', '//x/y/z:qux']) 261*333d2b36SAndroid Build Coastguard Worker self.assertTrue(matches) 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Workerclass ExtractTargetSdkVersionTest(unittest.TestCase): 265*333d2b36SAndroid Build Coastguard Worker 266*333d2b36SAndroid Build Coastguard Worker def run_test(self, xml, apk, version): 267*333d2b36SAndroid Build Coastguard Worker doc = minidom.parseString(xml) 268*333d2b36SAndroid Build Coastguard Worker v = manifest_check.extract_target_sdk_version(doc, is_apk=False) 269*333d2b36SAndroid Build Coastguard Worker self.assertEqual(v, version) 270*333d2b36SAndroid Build Coastguard Worker v = manifest_check.extract_target_sdk_version(apk, is_apk=True) 271*333d2b36SAndroid Build Coastguard Worker self.assertEqual(v, version) 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Worker xml_tmpl = ( 274*333d2b36SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="utf-8"?>\n<manifest ' 275*333d2b36SAndroid Build Coastguard Worker 'xmlns:android="http://schemas.android.com/apk/res/android">\n ' 276*333d2b36SAndroid Build Coastguard Worker '<uses-sdk android:minSdkVersion="28" android:targetSdkVersion="%s" ' 277*333d2b36SAndroid Build Coastguard Worker '/>\n</manifest>\n') 278*333d2b36SAndroid Build Coastguard Worker 279*333d2b36SAndroid Build Coastguard Worker apk_tmpl = ( 280*333d2b36SAndroid Build Coastguard Worker "package: name='com.google.android.something' versionCode='100'\n" 281*333d2b36SAndroid Build Coastguard Worker "sdkVersion:'28'\n" 282*333d2b36SAndroid Build Coastguard Worker "targetSdkVersion:'%s'\n" 283*333d2b36SAndroid Build Coastguard Worker "uses-permission: name='android.permission.ACCESS_NETWORK_STATE'\n") 284*333d2b36SAndroid Build Coastguard Worker 285*333d2b36SAndroid Build Coastguard Worker def test_target_sdk_version_28(self): 286*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % '28' 287*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % '28' 288*333d2b36SAndroid Build Coastguard Worker self.run_test(xml, apk, '28') 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Worker def test_target_sdk_version_29(self): 291*333d2b36SAndroid Build Coastguard Worker xml = self.xml_tmpl % '29' 292*333d2b36SAndroid Build Coastguard Worker apk = self.apk_tmpl % '29' 293*333d2b36SAndroid Build Coastguard Worker self.run_test(xml, apk, '29') 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Worker 296*333d2b36SAndroid Build Coastguard Workerif __name__ == '__main__': 297*333d2b36SAndroid Build Coastguard Worker unittest.main(verbosity=2) 298