xref: /aosp_15_r20/build/soong/scripts/manifest_check_test.py (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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