1012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley#!/usr/bin/env python
2012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
3012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# Copyright (C) 2016 The Android Open Source Project
4012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley#
5012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# Licensed under the Apache License, Version 2.0 (the "License");
6012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# you may not use this file except in compliance with the License.
7012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# You may obtain a copy of the License at
8012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley#
9012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley#      http://www.apache.org/licenses/LICENSE-2.0
10012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley#
11012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# Unless required by applicable law or agreed to in writing, software
12012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# distributed under the License is distributed on an "AS IS" BASIS,
13012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# See the License for the specific language governing permissions and
15012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley# limitations under the License.
16012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
17012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wileyimport os
18012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wileyimport subprocess
19012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wileyimport sys
20012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
21012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher WileyINSTRUMENTED_PACKAGE_RUNNER = ('com.android.frameworks.servicestests/'
22012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley                               'android.support.test.runner.AndroidJUnitRunner')
23012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
24012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher WileyPACKAGE_WHITELIST = (
25012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    'android.net',
26012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    'com.android.server.connectivity',
27012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley)
28012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
29012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher WileyCOLOR_RED = '\033[0;31m'
30012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher WileyCOLOR_NONE ='\033[0m'
31012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
32012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wileydef run(shell_command, echo=True):
33012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    if echo:
34012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley        print '%s + %s%s' % (
35012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley                COLOR_RED,
36012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley                echo if isinstance(echo, str) else shell_command,
37012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley                COLOR_NONE)
38012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    return subprocess.check_call(shell_command, shell=True)
39012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
40012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
41012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wileydef main():
42012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    build_top = os.environ.get('ANDROID_BUILD_TOP', None)
43012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    out_dir = os.environ.get('OUT', None)
44012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    if build_top is None or out_dir is None:
45012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley        print 'You need to source and lunch before you can use this script'
46012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley        return 1
47012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
48012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    print 'Building tests...'
49012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    run('make -j32 -C %s -f build/core/main.mk '
50012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley        'MODULES-IN-frameworks-base-services-tests-servicestests' % build_top,
51012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley        echo='mmma -j32 %s/frameworks/base/services/tests/servicestests' %
52012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley             build_top)
53012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
54012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    print 'Installing tests...'
55012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    run('adb root')
56012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    run('adb wait-for-device')
57012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    apk_path = (
58012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley            '%s/data/app/FrameworksServicesTests/FrameworksServicesTests.apk' %
59012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley            out_dir)
60012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    run('adb install -r -g "%s"' % apk_path)
61012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
62012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    print 'Running tests...'
63012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    if len(sys.argv) != 1:
6431dc3db9a4d36475f464c5543d9b7df4a2f36aa3Etan Cohen        run('adb shell am instrument -w %s "%s"' %
6531dc3db9a4d36475f464c5543d9b7df4a2f36aa3Etan Cohen            (' '.join(sys.argv[1:]), INSTRUMENTED_PACKAGE_RUNNER))
66012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley        return 0
67012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
68012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    # It would be nice if the activity manager accepted a list of packages, but
69012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    # in lieu of that...
70012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    for package in PACKAGE_WHITELIST:
71012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley        run('adb shell am instrument -w -e package %s %s' %
72012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley            (package, INSTRUMENTED_PACKAGE_RUNNER))
73012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
74012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    return 0
75012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
76012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley
77012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wileyif __name__ == '__main__':
78012ab106424b5ce2d9d9e442deab8b81b8bc2279Christopher Wiley    sys.exit(main())
79