|  | diff --git a/server/site_tests/android_Binder/android_Binder.py b/server/site_tests/android_Binder/android_Binder.py | 
|  | new file mode 100644 | 
|  | index 000000000..b233b586a | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Binder/android_Binder.py | 
|  | @@ -0,0 +1,57 @@ | 
|  | +# Tests for android Binder | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import bench_config | 
|  | +import logging | 
|  | +import os | 
|  | +import re | 
|  | + | 
|  | +from autotest_lib.server import test | 
|  | + | 
|  | +class android_Binder(test.test): | 
|  | +    version = 1 | 
|  | + | 
|  | +    def run_once(self, host=None): | 
|  | +        self.client = host | 
|  | + | 
|  | +        out_dir = os.path.join(bench_config.android_home, | 
|  | +                              'out/target/product/' + bench_config.product) | 
|  | + | 
|  | +        # Set binary directories | 
|  | +        lib_dir = os.path.join(out_dir, 'system/lib/libbinder.so') | 
|  | +        lib_dir_DUT = '/system/lib/libbinder.so' | 
|  | +        lib64_dir = os.path.join(out_dir, 'system/lib64/libbinder.so') | 
|  | +        lib64_dir_DUT = '/system/lib64/libbinder.so' | 
|  | +        bench_dir = os.path.join(out_dir, | 
|  | +                                 'symbols/data/nativetest64', | 
|  | +                                 'binderThroughputTest/binderThroughputTest') | 
|  | +        bench_dir_DUT = os.path.join('/data/local/tmp', | 
|  | +                                     'binderThroughputTest') | 
|  | + | 
|  | +        # Push binary to the device | 
|  | +        print('Pushing binaries of Binder benchmark onto device!') | 
|  | +        host.send_file(bench_dir, bench_dir_DUT, delete_dest=True) | 
|  | +        host.send_file(lib_dir, lib_dir_DUT, delete_dest=True) | 
|  | +        host.send_file(lib64_dir, lib64_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        # Make sure the binary is executable | 
|  | +        self.client.run('chmod u+x ' + bench_dir_DUT) | 
|  | + | 
|  | +        print('Running tests on the device...') | 
|  | +        # First run creates bench_result | 
|  | +        self.client.run('taskset %s /data/local/tmp/' | 
|  | +                        'binderThroughputTest > /data/local/tmp/bench_result' | 
|  | +                        % os.getenv('TEST_MODE')) | 
|  | +        # Next 4 runs add to bench_result | 
|  | +        for i in xrange(4): | 
|  | +          self.client.run('taskset %s /data/local/tmp/' | 
|  | +                          'binderThroughputTest >> ' | 
|  | +                          '/data/local/tmp/bench_result' | 
|  | +                          % os.getenv('TEST_MODE')) | 
|  | + | 
|  | +        # Pull result from the device | 
|  | +        out_dir = bench_config.bench_suite_dir | 
|  | +        result_dir_DUT = '/data/local/tmp/bench_result' | 
|  | + | 
|  | +        host.get_file(result_dir_DUT, out_dir, delete_dest=True) | 
|  | +        print('Result has been pulled back to file bench_result!') | 
|  | diff --git a/server/site_tests/android_Binder/bench_config.py b/server/site_tests/android_Binder/bench_config.py | 
|  | new file mode 100644 | 
|  | index 000000000..20f685eb9 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Binder/bench_config.py | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#!/bin/bash/python | 
|  | +import os | 
|  | + | 
|  | +home = os.environ["HOME"] | 
|  | + | 
|  | +android_home = os.getenv("ANDROID_HOME", | 
|  | +                         default=os.path.join(home, | 
|  | +                                 'android_source/master-googleplex/')) | 
|  | +bench_suite_dir = os.getenv('BENCH_SUITE_DIR', | 
|  | +                            default=os.path.join(android_home, | 
|  | +                                                 'benchtoolchain')) | 
|  | + | 
|  | +synthmark_dir = 'framework/native/libs/binder' | 
|  | + | 
|  | +real_synthmark_dir = os.path.join(android_home, synthmark_dir) | 
|  | + | 
|  | +out_dir = os.path.join(android_home, 'out') | 
|  | + | 
|  | +product = os.getenv("PRODUCT", default="generic") | 
|  | diff --git a/server/site_tests/android_Binder/control b/server/site_tests/android_Binder/control | 
|  | new file mode 100644 | 
|  | index 000000000..d91854b11 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Binder/control | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#Control | 
|  | + | 
|  | +NAME = "Binder" | 
|  | +AUTHOR = "Zhizhou Yang" | 
|  | +ATTRIBUTES = "suite:android_toolchain_benchmark" | 
|  | +TIME = "MEDIUM" | 
|  | +TEST_CATEGORY = "Functional" | 
|  | +TEST_CLASS = "application" | 
|  | +TEST_TYPE = "server" | 
|  | + | 
|  | +DOC = """ | 
|  | + | 
|  | +""" | 
|  | + | 
|  | +def run_binder_test(machine): | 
|  | +    host = hosts.create_host(machine) | 
|  | +    job.run_test("android_Binder", host=host) | 
|  | + | 
|  | +parallel_simple(run_binder_test, machines) | 
|  | diff --git a/server/site_tests/android_Dex2oat/android_Dex2oat.py b/server/site_tests/android_Dex2oat/android_Dex2oat.py | 
|  | new file mode 100644 | 
|  | index 000000000..dd6af0b53 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Dex2oat/android_Dex2oat.py | 
|  | @@ -0,0 +1,70 @@ | 
|  | +# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. | 
|  | +# Use of this source code is governed by a BSD-style license that can be | 
|  | +# found in the LICENSE file. | 
|  | + | 
|  | +import bench_config | 
|  | +import time | 
|  | +import logging | 
|  | +import os | 
|  | +import re | 
|  | + | 
|  | +from autotest_lib.client.common_lib import error | 
|  | +from autotest_lib.server import test | 
|  | + | 
|  | +class android_Dex2oat(test.test): | 
|  | +    version = 1 | 
|  | + | 
|  | +    def run_once(self, host=None): | 
|  | +        self.client = host | 
|  | + | 
|  | +        out_dir = os.path.join(bench_config.android_home, | 
|  | +                              'out/target/product/', | 
|  | +                               bench_config.product) | 
|  | + | 
|  | +        # Set binary directories | 
|  | +        bench_dir = os.path.join(out_dir, 'system/lib/libart-compiler.so') | 
|  | +        bench_dir_DUT = '/system/lib/libart-compiler.so' | 
|  | +        bench64_dir = os.path.join(out_dir, 'system/lib64/libart-compiler.so') | 
|  | +        bench64_dir_DUT = '/system/lib64/libart-compiler.so' | 
|  | + | 
|  | +        # Push libart-compiler.so to the device | 
|  | +        print('Pushing binaries of newly generated library onto device!') | 
|  | +        host.send_file(bench_dir, bench_dir_DUT, delete_dest=True) | 
|  | +        host.send_file(bench64_dir, bench64_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        # Set testcase directories | 
|  | +        test_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), | 
|  | +                                 'dex2oat_input') | 
|  | +        test_dir_DUT = '/data/local/tmp/' | 
|  | + | 
|  | +        # Push testcases to the device | 
|  | +        print('Pushing tests onto device!') | 
|  | +        host.send_file(test_dir, test_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        # Open file to write the result | 
|  | +        with open(os.path.join(bench_config.bench_suite_dir, | 
|  | +                               'bench_result'), 'w') as f: | 
|  | + | 
|  | +          # There are two benchmarks, chrome and camera. | 
|  | +          for i in xrange(2): | 
|  | +            f.write('Test %d:\n' % i) | 
|  | +            total_time = 0 | 
|  | +            # Run benchmark for several times for accurancy | 
|  | +            for j in xrange(3): | 
|  | +              f.write('Iteration %d: ' % j) | 
|  | +              result = self.client.run('time taskset %s dex2oat' | 
|  | +                         ' --dex-file=data/local/tmp/dex2oat_input/test%d.apk' | 
|  | +                         ' --oat-file=data/local/tmp/dex2oat_input/test%d.oat' | 
|  | +                         % (os.getenv('TEST_MODE'), i+1, i+1)) | 
|  | +              # Find and record real time of the run | 
|  | +              time_str = '' | 
|  | +              for t in result.stdout.split() + result.stderr.split(): | 
|  | +                if 'm' in t and 's' in t: | 
|  | +                  time_str = t.split('m') | 
|  | +                  break | 
|  | +              time_sec = float(time_str[0]) * 60 | 
|  | +              time_sec += float(time_str[1].split('s')[0]) | 
|  | +              f.write('User Time: %.2f seconds\n' % time_sec) | 
|  | +              total_time += time_sec | 
|  | + | 
|  | +            f.write('Total elapsed time: %.2f seconds.\n\n' % total_time) | 
|  | diff --git a/server/site_tests/android_Dex2oat/bench_config.py b/server/site_tests/android_Dex2oat/bench_config.py | 
|  | new file mode 100644 | 
|  | index 000000000..d2855f22c | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Dex2oat/bench_config.py | 
|  | @@ -0,0 +1,15 @@ | 
|  | +#!/bin/bash/python | 
|  | +import os | 
|  | + | 
|  | +home = os.environ["HOME"] | 
|  | + | 
|  | +android_home = os.getenv("ANDROID_HOME", | 
|  | +                         default=os.path.join(home, | 
|  | +                                 'android_source/master-googleplex/')) | 
|  | +bench_suite_dir = os.getenv('BENCH_SUITE_DIR', | 
|  | +                            default=os.path.join(android_home, | 
|  | +                                                 'benchtoolchain')) | 
|  | + | 
|  | +out_dir = os.path.join(android_home, 'out') | 
|  | + | 
|  | +product = os.getenv("PRODUCT", default="generic") | 
|  | diff --git a/server/site_tests/android_Dex2oat/control b/server/site_tests/android_Dex2oat/control | 
|  | new file mode 100644 | 
|  | index 000000000..763864f3a | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Dex2oat/control | 
|  | @@ -0,0 +1,21 @@ | 
|  | +# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. | 
|  | +# Use of this source code is governed by a BSD-style license that can be | 
|  | +# found in the LICENSE file. | 
|  | + | 
|  | +NAME = "Dex2oat" | 
|  | +AUTHOR = "Zhizhou Yang" | 
|  | +ATTRIBUTES = "suite:android_toolchain_benchmark" | 
|  | +TIME = "SHORT" | 
|  | +TEST_CATEGORY = "Functional" | 
|  | +TEST_CLASS = "kernel" | 
|  | +TEST_TYPE = "server" | 
|  | + | 
|  | +DOC = """ | 
|  | + | 
|  | +""" | 
|  | + | 
|  | +def run_dex2oat(machine): | 
|  | +    host = hosts.create_host(machine) | 
|  | +    job.run_test("android_Dex2oat", host=host) | 
|  | + | 
|  | +parallel_simple(run_dex2oat, machines) | 
|  | diff --git a/server/site_tests/android_Hwui/android_Hwui.py b/server/site_tests/android_Hwui/android_Hwui.py | 
|  | new file mode 100644 | 
|  | index 000000000..21e77fd54 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Hwui/android_Hwui.py | 
|  | @@ -0,0 +1,67 @@ | 
|  | +# Tests for android Hwui | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import bench_config | 
|  | +import logging | 
|  | +import os | 
|  | +import re | 
|  | + | 
|  | +from autotest_lib.server import test | 
|  | + | 
|  | +class android_Hwui(test.test): | 
|  | +    version = 1 | 
|  | + | 
|  | +    def run_once(self, host=None): | 
|  | +        self.client = host | 
|  | + | 
|  | +        out_dir = os.path.join(bench_config.android_home, | 
|  | +                              'out/target/product/' + bench_config.product) | 
|  | + | 
|  | +        lib_dir = os.path.join(out_dir, 'system/lib/libhwui.so') | 
|  | +        lib_dir_DUT = '/system/lib/libhwui.so' | 
|  | +        lib64_dir = os.path.join(out_dir, 'system/lib64/libhwui.so') | 
|  | +        lib64_dir_DUT = '/system/lib64/libhwui.so' | 
|  | +        bench_dir = os.path.join(out_dir, | 
|  | +                                 'symbols/data/benchmarktest64/', | 
|  | +                                 'hwuimicro/hwuimicro') | 
|  | +        bench_dir_DUT = '/data/local/tmp/hwuimicro' | 
|  | + | 
|  | +        # Push binary to the device | 
|  | +        print('Pushing Hwui benchmark onto device!') | 
|  | +        host.send_file(bench_dir, bench_dir_DUT, delete_dest=True) | 
|  | +        host.send_file(lib_dir, lib_dir_DUT, delete_dest=True) | 
|  | +        host.send_file(lib64_dir, lib64_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        # Make sure the binary is executable | 
|  | +        self.client.run('chmod u+x ' + bench_dir_DUT) | 
|  | + | 
|  | + | 
|  | +        print('Running tests on the device...') | 
|  | +        self.client.run('taskset %s /data/local/tmp/hwuimicro' | 
|  | +                        ' > /data/local/tmp/bench_result' | 
|  | +                        % os.getenv('TEST_MODE')) | 
|  | + | 
|  | +        # Pull result from the device | 
|  | +        out_dir = bench_config.bench_suite_dir | 
|  | +        result_dir_DUT = '/data/local/tmp/bench_result' | 
|  | + | 
|  | +        host.get_file(result_dir_DUT, out_dir, delete_dest=True) | 
|  | + | 
|  | +        # Update total time of the test | 
|  | +        t = 0 | 
|  | +        with open(os.path.join(out_dir, 'bench_result'), 'r') as fin: | 
|  | + | 
|  | +          for lines in fin: | 
|  | +            line = lines.split() | 
|  | +            print(line) | 
|  | + | 
|  | +            # Check if there is test result in this line | 
|  | +            if len(line) == 8: | 
|  | +              # Accumulate the Run time for the testcase | 
|  | +              t += int(line[2]) | 
|  | + | 
|  | +        # Append total time to the file | 
|  | +        with open(os.path.join(out_dir, 'bench_result'), 'a') as fout: | 
|  | +          fout.write('\nTotal elapsed time: %d ns.\n' % t) | 
|  | + | 
|  | +        print('Result has been pulled back to file bench_result!') | 
|  | diff --git a/server/site_tests/android_Hwui/bench_config.py b/server/site_tests/android_Hwui/bench_config.py | 
|  | new file mode 100644 | 
|  | index 000000000..a98d259f9 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Hwui/bench_config.py | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#!/bin/bash/python | 
|  | +import os | 
|  | + | 
|  | +home = os.environ["HOME"] | 
|  | + | 
|  | +android_home = os.getenv("ANDROID_HOME", | 
|  | +                         default=os.path.join(home, | 
|  | +                                 'android_source/master-googleplex/')) | 
|  | +bench_suite_dir = os.getenv('BENCH_SUITE_DIR', | 
|  | +                            default=os.path.join(android_home, | 
|  | +                                                 'benchtoolchain')) | 
|  | + | 
|  | +hwui_dir = 'frameworks/base/libs/hwui/' | 
|  | + | 
|  | +real_hwui_dir = os.path.join(android_home, hwui_dir) | 
|  | + | 
|  | +out_dir = os.path.join(android_home, 'out') | 
|  | + | 
|  | +product = os.getenv("PRODUCT", default="generic") | 
|  | diff --git a/server/site_tests/android_Hwui/control b/server/site_tests/android_Hwui/control | 
|  | new file mode 100644 | 
|  | index 000000000..89c47da20 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Hwui/control | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#Control | 
|  | + | 
|  | +NAME = "Hwui" | 
|  | +AUTHOR = "Zhizhou Yang" | 
|  | +ATTRIBUTES = "suite:android_toolchain_benchmark" | 
|  | +TIME = "MEDIUM" | 
|  | +TEST_CATEGORY = "Functional" | 
|  | +TEST_CLASS = "library" | 
|  | +TEST_TYPE = "server" | 
|  | + | 
|  | +DOC = """ | 
|  | + | 
|  | +""" | 
|  | + | 
|  | +def run_hwui_test(machine): | 
|  | +    host = hosts.create_host(machine) | 
|  | +    job.run_test("android_Hwui", host=host) | 
|  | + | 
|  | +parallel_simple(run_hwui_test, machines) | 
|  | diff --git a/server/site_tests/android_Panorama/android_Panorama.py b/server/site_tests/android_Panorama/android_Panorama.py | 
|  | new file mode 100644 | 
|  | index 000000000..89b2355e5 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Panorama/android_Panorama.py | 
|  | @@ -0,0 +1,53 @@ | 
|  | +# Tests for android Panorama | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import bench_config | 
|  | +import logging | 
|  | +import os | 
|  | +import re | 
|  | + | 
|  | +from autotest_lib.server import test | 
|  | + | 
|  | +class android_Panorama(test.test): | 
|  | +    version = 1 | 
|  | + | 
|  | +    def run_once(self, host=None): | 
|  | +        self.client = host | 
|  | + | 
|  | +        out_dir = os.path.join(bench_config.android_home, | 
|  | +                              'out/target/product/' + bench_config.product) | 
|  | + | 
|  | +        # Set binary directories | 
|  | +        bench_dir = os.path.join(out_dir, | 
|  | +                                 'data/local/tmp/panorama_bench64') | 
|  | +        bench_dir_DUT = '/data/local/tmp/panorama_bench64' | 
|  | + | 
|  | +        # Set tests directories | 
|  | +        tests_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), | 
|  | +                                                 'panorama_input') | 
|  | +        tests_dir_DUT = '/data/local/tmp/panorama_input/' | 
|  | + | 
|  | +        # Push binary to the device | 
|  | +        print('Pushing binaries of Panorama benchmark onto device!') | 
|  | +        host.send_file(bench_dir, bench_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        # Make sure the binary is executable | 
|  | +        self.client.run('chmod u+x ' + bench_dir_DUT) | 
|  | + | 
|  | +        # Push testcases to the device | 
|  | +        print('Pushing tests onto device!') | 
|  | +        host.send_file(tests_dir, tests_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        print('Running tests on the device...') | 
|  | +        self.client.run('taskset %s /data/local/tmp/panorama_bench64 ' | 
|  | +                        '/data/local/tmp/panorama_input/panorama_input/test ' | 
|  | +                        '/data/local/tmp/panorama.ppm' | 
|  | +                        ' > /data/local/tmp/bench_result' | 
|  | +                        % os.getenv('TEST_MODE')) | 
|  | + | 
|  | +        # Pull result from the device | 
|  | +        out_dir = bench_config.bench_suite_dir | 
|  | +        result_dir_DUT = '/data/local/tmp/bench_result' | 
|  | + | 
|  | +        host.get_file(result_dir_DUT, out_dir, delete_dest=True) | 
|  | +        print('Result has been pulled back to file bench_result!') | 
|  | diff --git a/server/site_tests/android_Panorama/bench_config.py b/server/site_tests/android_Panorama/bench_config.py | 
|  | new file mode 100644 | 
|  | index 000000000..075beec76 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Panorama/bench_config.py | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#!/bin/bash/python | 
|  | +import os | 
|  | + | 
|  | +home = os.environ["HOME"] | 
|  | + | 
|  | +android_home = os.getenv("ANDROID_HOME", | 
|  | +                         default=os.path.join(home, | 
|  | +                                 'android_source/master-googleplex/')) | 
|  | +bench_suite_dir = os.getenv('BENCH_SUITE_DIR', | 
|  | +                            default=os.path.join(android_home, | 
|  | +                                                 'benchtoolchain')) | 
|  | + | 
|  | +panorama_dir = 'perftests/panorama/' | 
|  | + | 
|  | +real_panorama_dir = os.path.join(android_home, panorama_dir) | 
|  | + | 
|  | +out_dir = os.path.join(android_home, 'out') | 
|  | + | 
|  | +product = os.getenv("PRODUCT", default="generic") | 
|  | diff --git a/server/site_tests/android_Panorama/control b/server/site_tests/android_Panorama/control | 
|  | new file mode 100644 | 
|  | index 000000000..3cd589eed | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Panorama/control | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#Control | 
|  | + | 
|  | +NAME = "Panorama" | 
|  | +AUTHOR = "Zhizhou Yang" | 
|  | +ATTRIBUTES = "suite:android_toolchain_benchmark" | 
|  | +TIME = "MEDIUM" | 
|  | +TEST_CATEGORY = "Functional" | 
|  | +TEST_CLASS = "application" | 
|  | +TEST_TYPE = "server" | 
|  | + | 
|  | +DOC = """ | 
|  | + | 
|  | +""" | 
|  | + | 
|  | +def run_panorama_test(machine): | 
|  | +    host = hosts.create_host(machine) | 
|  | +    job.run_test("android_Panorama", host=host) | 
|  | + | 
|  | +parallel_simple(run_panorama_test, machines) | 
|  | diff --git a/server/site_tests/android_Pull/android_Pull.py b/server/site_tests/android_Pull/android_Pull.py | 
|  | new file mode 100644 | 
|  | index 000000000..cff373899 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Pull/android_Pull.py | 
|  | @@ -0,0 +1,30 @@ | 
|  | +# Pull profraw data from device | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import bench_config | 
|  | + | 
|  | +from autotest_lib.server import test | 
|  | + | 
|  | +class android_Pull(test.test): | 
|  | +    version = 1 | 
|  | + | 
|  | +    def run_once(self, host=None): | 
|  | +        self.client = host | 
|  | + | 
|  | +        # Tar all the files in profraw directory | 
|  | +        tar_file= bench_config.location_DUT + '.tar' | 
|  | +        raw_cmd = ('tar -cvf {tar_file} {location_DUT}'.format( | 
|  | +                      tar_file=tar_file, | 
|  | +                      location_DUT=bench_config.location_DUT)) | 
|  | +        self.client.run(raw_cmd) | 
|  | + | 
|  | +        # Pull tar of profraw data from the device | 
|  | +        out_dir = bench_config.location | 
|  | + | 
|  | +        host.get_file(tar_file, out_dir, delete_dest=True) | 
|  | + | 
|  | +        # Remove the data on the device | 
|  | +        self.client.run('rm %s' % tar_file) | 
|  | +        self.client.run('rm -rf %s' % bench_config.location_DUT) | 
|  | + | 
|  | +        print('Profraw data has been pulled from device to local.') | 
|  | diff --git a/server/site_tests/android_Pull/bench_config.py b/server/site_tests/android_Pull/bench_config.py | 
|  | new file mode 100644 | 
|  | index 000000000..37967c2f9 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Pull/bench_config.py | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#!/bin/bash/python | 
|  | +import os | 
|  | + | 
|  | +home = os.environ["HOME"] | 
|  | + | 
|  | +android_home = os.getenv("ANDROID_HOME", | 
|  | +                         default=os.path.join(home, | 
|  | +                                 'android_source/master-googleplex/')) | 
|  | +bench_suite_dir = os.getenv('BENCH_SUITE_DIR', | 
|  | +                            default=os.path.join(android_home, | 
|  | +                                                 'benchtoolchain')) | 
|  | + | 
|  | +bench = os.getenv('BENCH', default='Hwui') | 
|  | +location_DUT = os.getenv('LOCATION_DUT', | 
|  | +                         default=os.path.join('/data/local/tmp', | 
|  | +                                              bench + '_profraw')) | 
|  | +location = os.getenv('LOCATION', default=bench_suite_dir) | 
|  | + | 
|  | +product = os.getenv("PRODUCT", default="generic") | 
|  | diff --git a/server/site_tests/android_Pull/control b/server/site_tests/android_Pull/control | 
|  | new file mode 100644 | 
|  | index 000000000..7b00df7cb | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Pull/control | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#Control | 
|  | + | 
|  | +NAME = "Pull" | 
|  | +AUTHOR = "Zhizhou Yang" | 
|  | +ATTRIBUTES = "suite:android_toolchain_benchmark" | 
|  | +TIME = "MEDIUM" | 
|  | +TEST_CATEGORY = "Functional" | 
|  | +TEST_CLASS = "library" | 
|  | +TEST_TYPE = "server" | 
|  | + | 
|  | +DOC = """ | 
|  | + | 
|  | +""" | 
|  | + | 
|  | +def run_pull_test(machine): | 
|  | +    host = hosts.create_host(machine) | 
|  | +    job.run_test("android_Pull", host=host) | 
|  | + | 
|  | +parallel_simple(run_pull_test, machines) | 
|  | diff --git a/server/site_tests/android_SetDevice/android_SetDevice.py b/server/site_tests/android_SetDevice/android_SetDevice.py | 
|  | new file mode 100644 | 
|  | index 000000000..7a7134d58 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_SetDevice/android_SetDevice.py | 
|  | @@ -0,0 +1,77 @@ | 
|  | +# Set device modes such as cpu frequency | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import logging | 
|  | +import os | 
|  | +import re | 
|  | +import time | 
|  | + | 
|  | +from autotest_lib.server import test | 
|  | + | 
|  | +def _get_cat_value(result): | 
|  | +    return result.stdout.split('\n')[0] | 
|  | + | 
|  | +class android_SetDevice(test.test): | 
|  | +    version = 1 | 
|  | + | 
|  | +    def run_once(self, host=None): | 
|  | +        self.client = host | 
|  | + | 
|  | +        # Disable GPU | 
|  | +        self.client.run('setprop debug.rs.default-GPU-driver 1') | 
|  | + | 
|  | +        # Freeze system | 
|  | +        # Stop perfd, mpdecision and thermal-engine to ensure setting runs | 
|  | +        # without unexpected errors. | 
|  | +        self.client.run('stop thermal-engine') | 
|  | +        self.client.run('stop mpdecision') | 
|  | +        self.client.run('stop perfd') | 
|  | + | 
|  | +        # Set airplane mode on the device | 
|  | +        self.client.run('settings put global airplane_mode_on 1') | 
|  | + | 
|  | +        print('Setting frequency on the device...') | 
|  | +        frequency = os.getenv('FREQUENCY') | 
|  | + | 
|  | +        # Get number of cores on device | 
|  | +        result = self.client.run('ls /sys/devices/system/cpu/ ' | 
|  | +                                 '| grep cpu[0-9].*') | 
|  | +        cores = result.stdout.splitlines() | 
|  | +        for core in cores: | 
|  | +          if core.startswith('cpu'): | 
|  | +            # First set all cores online | 
|  | +            online = os.path.join('/sys/devices/system/cpu', core, 'online') | 
|  | +            online_status = _get_cat_value(self.client.run('cat %s' % online)) | 
|  | +            if online_status == '0': | 
|  | +              self.client.run('echo %s > %s' % ('1', online)) | 
|  | + | 
|  | +            freq_path = os.path.join('/sys/devices/system/cpu', core, | 
|  | +                                     'cpufreq') | 
|  | + | 
|  | +            # Check if the frequency user entered is legal or not. | 
|  | +            available_freq = self.client.run('cat %s/' | 
|  | +                                             'scaling_available_frequencies' | 
|  | +                                             % (freq_path)) | 
|  | +            available_freq_list = _get_cat_value(available_freq).split() | 
|  | + | 
|  | +            if frequency not in available_freq_list: | 
|  | +              raise ValueError('Wrong freqeuncy input, ' | 
|  | +                               'please select from: \n%s' | 
|  | +                               % (' '.join(available_freq_list))) | 
|  | + | 
|  | +            # Set frequency | 
|  | +            self.client.run('echo %s > %s/scaling_min_freq' | 
|  | +                            % (frequency, freq_path)) | 
|  | +            self.client.run('echo %s > %s/scaling_max_freq' | 
|  | +                            % (frequency, freq_path)) | 
|  | + | 
|  | +            # Sleep for 2 seconds, let device update the frequency. | 
|  | +            time.sleep(2) | 
|  | + | 
|  | +            # Get current frequency | 
|  | +            freq = self.client.run('cat %s/cpuinfo_cur_freq' % freq_path) | 
|  | +            f = _get_cat_value(freq) | 
|  | +            if f != frequency: | 
|  | +              raise RuntimeError('Expected frequency for %s to be %s, ' | 
|  | +                                 'but is %s' % (core, frequency, f)) | 
|  | +            print('CPU frequency has been set to %s' % (frequency)) | 
|  | diff --git a/server/site_tests/android_SetDevice/control b/server/site_tests/android_SetDevice/control | 
|  | new file mode 100644 | 
|  | index 000000000..85163706d | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_SetDevice/control | 
|  | @@ -0,0 +1,19 @@ | 
|  | +# Control | 
|  | + | 
|  | +NAME = "SetDevice" | 
|  | +AUTHOR = "Zhizhou Yang" | 
|  | +ATTRIBUTES = "suite:android_toolchain_benchmark" | 
|  | +TIME = "MEDIUM" | 
|  | +TEST_CATEGORY = "Functional" | 
|  | +TEST_CLASS = "application" | 
|  | +TEST_TYPE = "server" | 
|  | + | 
|  | +DOC = """ | 
|  | +Set the core frequency and which core online for devices. | 
|  | +""" | 
|  | + | 
|  | +def run_set_device_test(machine): | 
|  | +    host = hosts.create_host(machine) | 
|  | +    job.run_test("android_SetDevice", host=host) | 
|  | + | 
|  | +parallel_simple(run_set_device_test, machines) | 
|  | diff --git a/server/site_tests/android_Skia/android_Skia.py b/server/site_tests/android_Skia/android_Skia.py | 
|  | new file mode 100644 | 
|  | index 000000000..80b39a027 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Skia/android_Skia.py | 
|  | @@ -0,0 +1,59 @@ | 
|  | +# Tests for android Skia | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import bench_config | 
|  | +import logging | 
|  | +import os | 
|  | +import re | 
|  | + | 
|  | +from autotest_lib.server import test | 
|  | + | 
|  | +class android_Skia(test.test): | 
|  | +    version = 1 | 
|  | + | 
|  | +    def run_once(self, host=None): | 
|  | +        self.client = host | 
|  | + | 
|  | +        out_dir = os.path.join(bench_config.android_home, | 
|  | +                              'out/target/product/' + bench_config.product) | 
|  | + | 
|  | +        # Set binary directories | 
|  | +        bench_dir = os.path.join(out_dir, | 
|  | +                                 'data/nativetest64/', | 
|  | +                                 'skia_nanobench/skia_nanobench') | 
|  | +        bench_dir_DUT = '/data/local/tmp/skia_nanobench' | 
|  | + | 
|  | +        # Push binary to the device | 
|  | +        print('Pushing Skia benchmark onto device!') | 
|  | +        host.send_file(bench_dir, bench_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        # Make sure the binary is executable | 
|  | +        self.client.run('chmod u+x ' + bench_dir_DUT) | 
|  | + | 
|  | +        # Set resource directory | 
|  | +        resource_dir = os.path.join(bench_config.real_skia_dir, 'resources') | 
|  | +        resource_dir_DUT = '/data/local/tmp/skia_resources/' | 
|  | + | 
|  | +        # Push binary to the device | 
|  | +        print('Pushing Skia resources onto device!') | 
|  | +        host.send_file(resource_dir, resource_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        # Run tests | 
|  | +        print('Running tests on the device...') | 
|  | +        try: | 
|  | +          self.client.run('taskset %s ./data/local/tmp/skia_nanobench' | 
|  | +                          ' --outResultsFile /data/local/tmp/bench_result' | 
|  | +                          ' --samples 25' | 
|  | +                          ' --config nonrendering' | 
|  | +                          % os.getenv('TEST_MODE')) | 
|  | +        except: | 
|  | +          # Ignore Abort caused failure | 
|  | +          None | 
|  | + | 
|  | +        # Pull result from the device | 
|  | +        out_dir = bench_config.bench_suite_dir | 
|  | +        result_dir_DUT = '/data/local/tmp/bench_result' | 
|  | + | 
|  | +        host.get_file(result_dir_DUT, out_dir, delete_dest=True) | 
|  | + | 
|  | +        print('Result has been pulled back to file bench_result!') | 
|  | diff --git a/server/site_tests/android_Skia/bench_config.py b/server/site_tests/android_Skia/bench_config.py | 
|  | new file mode 100644 | 
|  | index 000000000..5d38d452f | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Skia/bench_config.py | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#!/bin/bash/python | 
|  | +import os | 
|  | + | 
|  | +home = os.environ["HOME"] | 
|  | + | 
|  | +android_home = os.getenv("ANDROID_HOME", | 
|  | +                         default=os.path.join(home, | 
|  | +                                 'android_source/master-googleplex/')) | 
|  | +bench_suite_dir = os.getenv('BENCH_SUITE_DIR', | 
|  | +                            default=os.path.join(android_home, | 
|  | +                                                 'benchtoolchain')) | 
|  | + | 
|  | +skia_dir = 'external/skia' | 
|  | + | 
|  | +real_skia_dir = os.path.join(android_home, skia_dir) | 
|  | + | 
|  | +out_dir = os.path.join(android_home, 'out') | 
|  | + | 
|  | +product = os.getenv("PRODUCT", default="generic") | 
|  | diff --git a/server/site_tests/android_Skia/control b/server/site_tests/android_Skia/control | 
|  | new file mode 100644 | 
|  | index 000000000..e38195a8c | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Skia/control | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#Control | 
|  | + | 
|  | +NAME = "Skia" | 
|  | +AUTHOR = "Zhizhou Yang" | 
|  | +ATTRIBUTES = "suite:android_toolchain_benchmark" | 
|  | +TIME = "MEDIUM" | 
|  | +TEST_CATEGORY = "Functional" | 
|  | +TEST_CLASS = "library" | 
|  | +TEST_TYPE = "server" | 
|  | + | 
|  | +DOC = """ | 
|  | + | 
|  | +""" | 
|  | + | 
|  | +def run_skia_test(machine): | 
|  | +    host = hosts.create_host(machine) | 
|  | +    job.run_test("android_Skia", host=host) | 
|  | + | 
|  | +parallel_simple(run_skia_test, machines) | 
|  | diff --git a/server/site_tests/android_Synthmark/android_Synthmark.py b/server/site_tests/android_Synthmark/android_Synthmark.py | 
|  | new file mode 100644 | 
|  | index 000000000..b317bd0f3 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Synthmark/android_Synthmark.py | 
|  | @@ -0,0 +1,48 @@ | 
|  | +# Tests for android Synthmark | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import bench_config | 
|  | +import logging | 
|  | +import os | 
|  | +import re | 
|  | + | 
|  | +from autotest_lib.server import test | 
|  | + | 
|  | +class android_Synthmark(test.test): | 
|  | +    version = 1 | 
|  | + | 
|  | +    def run_once(self, host=None): | 
|  | +        self.client = host | 
|  | + | 
|  | +        out_dir = os.path.join(bench_config.android_home, | 
|  | +                              'out/target/product/' + bench_config.product) | 
|  | + | 
|  | +        # Set binary directories | 
|  | +        bench_dir = os.path.join(out_dir, | 
|  | +                                 'symbols/system/bin/synthmark') | 
|  | +        bench_dir_DUT = '/data/local/tmp/synthmark' | 
|  | + | 
|  | +        # Push binary to the device | 
|  | +        print('Pushing binaries of Synthmark benchmark onto device!') | 
|  | +        host.send_file(bench_dir, bench_dir_DUT, delete_dest=True) | 
|  | + | 
|  | +        # Make sure the binary is executable | 
|  | +        self.client.run('chmod u+x ' + bench_dir_DUT) | 
|  | + | 
|  | +        print('Running tests on the device...') | 
|  | +        # First run creates bench_result | 
|  | +        self.client.run('taskset %s /data/local/tmp/synthmark' | 
|  | +                        ' > /data/local/tmp/bench_result' | 
|  | +                        % os.getenv('TEST_MODE')) | 
|  | +        # Next 4 runs add to bench_result | 
|  | +        for i in xrange(4): | 
|  | +          self.client.run('taskset %s /data/local/tmp/synthmark' | 
|  | +                          ' >> /data/local/tmp/bench_result' | 
|  | +                          % os.getenv('TEST_MODE')) | 
|  | + | 
|  | +        # Pull result from the device | 
|  | +        out_dir = bench_config.bench_suite_dir | 
|  | +        result_dir_DUT = '/data/local/tmp/bench_result' | 
|  | + | 
|  | +        host.get_file(result_dir_DUT, out_dir, delete_dest=True) | 
|  | +        print('Result has been pulled back to file bench_result!') | 
|  | diff --git a/server/site_tests/android_Synthmark/bench_config.py b/server/site_tests/android_Synthmark/bench_config.py | 
|  | new file mode 100644 | 
|  | index 000000000..7d7aacacd | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Synthmark/bench_config.py | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#!/bin/bash/python | 
|  | +import os | 
|  | + | 
|  | +home = os.environ["HOME"] | 
|  | + | 
|  | +android_home = os.getenv("ANDROID_HOME", | 
|  | +                         default=os.path.join(home, | 
|  | +                                 'android_source/master-googleplex/')) | 
|  | +bench_suite_dir = os.getenv('BENCH_SUITE_DIR', | 
|  | +                            default=os.path.join(android_home, | 
|  | +                                                 'benchtoolchain')) | 
|  | + | 
|  | +synthmark_dir = 'synthmark' | 
|  | + | 
|  | +real_synthmark_dir = os.path.join(android_home, synthmark_dir) | 
|  | + | 
|  | +out_dir = os.path.join(android_home, 'out') | 
|  | + | 
|  | +product = os.getenv("PRODUCT", default="generic") | 
|  | diff --git a/server/site_tests/android_Synthmark/control b/server/site_tests/android_Synthmark/control | 
|  | new file mode 100644 | 
|  | index 000000000..144766351 | 
|  | --- /dev/null | 
|  | +++ b/server/site_tests/android_Synthmark/control | 
|  | @@ -0,0 +1,19 @@ | 
|  | +#Control | 
|  | + | 
|  | +NAME = "Synthmark" | 
|  | +AUTHOR = "Zhizhou Yang" | 
|  | +ATTRIBUTES = "suite:android_toolchain_benchmark" | 
|  | +TIME = "MEDIUM" | 
|  | +TEST_CATEGORY = "Functional" | 
|  | +TEST_CLASS = "application" | 
|  | +TEST_TYPE = "server" | 
|  | + | 
|  | +DOC = """ | 
|  | + | 
|  | +""" | 
|  | + | 
|  | +def run_synthmark_test(machine): | 
|  | +    host = hosts.create_host(machine) | 
|  | +    job.run_test("android_Synthmark", host=host) | 
|  | + | 
|  | +parallel_simple(run_synthmark_test, machines) | 
|  | diff --git a/site_utils/pull_device.py b/site_utils/pull_device.py | 
|  | new file mode 100755 | 
|  | index 000000000..959c4443d | 
|  | --- /dev/null | 
|  | +++ b/site_utils/pull_device.py | 
|  | @@ -0,0 +1,116 @@ | 
|  | +#!/usr/bin/python | 
|  | +# | 
|  | +# Script to pull data from android device | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import argparse | 
|  | +import common | 
|  | +import logging | 
|  | +import os | 
|  | +import sys | 
|  | + | 
|  | +# Turn the logging level to INFO before importing other autotest | 
|  | +# code, to avoid having failed import logging messages confuse the | 
|  | +# test_droid user. | 
|  | +logging.basicConfig(level=logging.INFO) | 
|  | + | 
|  | +# Unfortunately, autotest depends on external packages for assorted | 
|  | +# functionality regardless of whether or not it is needed in a particular | 
|  | +# context. | 
|  | +# Since we can't depend on people to import these utilities in any principled | 
|  | +# way, we dynamically download code before any autotest imports. | 
|  | +try: | 
|  | +    import chromite.lib.terminal  # pylint: disable=unused-import | 
|  | +    import django.http  # pylint: disable=unused-import | 
|  | +except ImportError: | 
|  | +    # Ensure the chromite site-package is installed. | 
|  | +    import subprocess | 
|  | +    build_externals_path = os.path.join( | 
|  | +            os.path.dirname(os.path.dirname(os.path.realpath(__file__))), | 
|  | +            'utils', 'build_externals.py') | 
|  | +    subprocess.check_call([build_externals_path, '--names_to_check', | 
|  | +                           'chromiterepo', 'django']) | 
|  | +    # Restart the script so python now finds the autotest site-packages. | 
|  | +    sys.exit(os.execv(__file__, sys.argv)) | 
|  | + | 
|  | +from autotest_lib.client.common_lib import utils | 
|  | +from autotest_lib.server.hosts import adb_host | 
|  | +from autotest_lib.site_utils import test_runner_utils | 
|  | +from autotest_lib.site_utils import tester_feedback | 
|  | + | 
|  | +def _parse_arguments_internal(argv): | 
|  | +    """ | 
|  | +    Parse command line arguments | 
|  | + | 
|  | +    @param argv: argument list to parse | 
|  | + | 
|  | +    @returns:    tuple of parsed arguments and argv suitable for remote runs | 
|  | + | 
|  | +    @raises SystemExit if arguments are malformed, or required arguments | 
|  | +            are not present. | 
|  | +    """ | 
|  | + | 
|  | +    parser = argparse.ArgumentParser(description='Run remote tests.') | 
|  | + | 
|  | +    parser.add_argument('-b', '--bench', metavar='BENCH', required=True, | 
|  | +                        help='Select the benchmark want to be run for ' | 
|  | +                             'test.') | 
|  | +    parser.add_argument('-s', '--serials', metavar='SERIALS', | 
|  | +                        help='Comma separate list of device serials under ' | 
|  | +                             'test.') | 
|  | +    parser.add_argument('-r', '--remote', metavar='REMOTE', | 
|  | +                        default='localhost', | 
|  | +                        help='hostname[:port] if the ADB device is connected ' | 
|  | +                             'to a remote machine. Ensure this workstation ' | 
|  | +                             'is configured for passwordless ssh access as ' | 
|  | +                             'users "root" or "adb"') | 
|  | + | 
|  | +    parser.add_argument('-d', '--pathDUT', | 
|  | +                        help='Specify the location to put the file on DUT.') | 
|  | +    parser.add_argument('-p', '--path', | 
|  | +                        help='Specify the location to put the file locally.') | 
|  | + | 
|  | +    return parser.parse_args(argv) | 
|  | + | 
|  | +def main(argv): | 
|  | +    """ | 
|  | +    Entry point for pull_device script. | 
|  | + | 
|  | +    @param argv: arguments list | 
|  | +    """ | 
|  | +    arguments = _parse_arguments_internal(argv) | 
|  | + | 
|  | +    serials = arguments.serials | 
|  | +    if serials is None: | 
|  | +        result = utils.run(['adb', 'devices']) | 
|  | +        devices = adb_host.ADBHost.parse_device_serials(result.stdout) | 
|  | +        if len(devices) != 1: | 
|  | +            logging.error('Could not detect exactly one device; please select ' | 
|  | +                          'one with -s: %s', devices) | 
|  | +            return 1 | 
|  | +        serials = devices[0] | 
|  | + | 
|  | +    autotest_path = os.path.dirname(os.path.dirname( | 
|  | +            os.path.realpath(__file__))) | 
|  | +    site_utils_path = os.path.join(autotest_path, 'site_utils') | 
|  | +    realpath = os.path.realpath(__file__) | 
|  | +    site_utils_path = os.path.realpath(site_utils_path) | 
|  | +    host_attributes = {'serials': serials, | 
|  | +                       'os_type': 'android'} | 
|  | +    results_directory = test_runner_utils.create_results_directory(None) | 
|  | + | 
|  | +    os.environ['BENCH'] = arguments.bench | 
|  | +    os.environ['LOCATION_DUT'] = arguments.pathDUT | 
|  | +    os.environ['LOCATION'] = arguments.path | 
|  | + | 
|  | +    tests = ['Pull'] | 
|  | + | 
|  | +    if test_runner_utils.perform_run_from_autotest_root( | 
|  | +                      autotest_path, argv, tests, arguments.remote, | 
|  | +                      host_attributes=host_attributes, | 
|  | +                      results_directory=results_directory): | 
|  | +        logging.error('Error while running on device.') | 
|  | +        return 1 | 
|  | + | 
|  | +if __name__ == '__main__': | 
|  | +    sys.exit(main(sys.argv[1:])) | 
|  | diff --git a/site_utils/set_device.py b/site_utils/set_device.py | 
|  | new file mode 100755 | 
|  | index 000000000..abb8a8dcc | 
|  | --- /dev/null | 
|  | +++ b/site_utils/set_device.py | 
|  | @@ -0,0 +1,110 @@ | 
|  | +#!/usr/bin/python | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import argparse | 
|  | +import common | 
|  | +import logging | 
|  | +import os | 
|  | +import sys | 
|  | + | 
|  | +# Turn the logging level to INFO before importing other autotest code, to avoid | 
|  | +# having failed import logging messages confuse the test_droid user. | 
|  | +logging.basicConfig(level=logging.INFO) | 
|  | + | 
|  | +# Unfortunately, autotest depends on external packages for assorted | 
|  | +# functionality regardless of whether or not it is needed in a particular | 
|  | +# context.  Since we can't depend on people to import these utilities in any | 
|  | +# principled way, we dynamically download code before any autotest imports. | 
|  | +try: | 
|  | +    import chromite.lib.terminal  # pylint: disable=unused-import | 
|  | +    import django.http  # pylint: disable=unused-import | 
|  | +except ImportError: | 
|  | +    # Ensure the chromite site-package is installed. | 
|  | +    import subprocess | 
|  | +    build_externals_path = os.path.join( | 
|  | +            os.path.dirname(os.path.dirname(os.path.realpath(__file__))), | 
|  | +            'utils', 'build_externals.py') | 
|  | +    subprocess.check_call([build_externals_path, '--names_to_check', | 
|  | +                           'chromiterepo', 'django']) | 
|  | +    # Restart the script so python now finds the autotest site-packages. | 
|  | +    sys.exit(os.execv(__file__, sys.argv)) | 
|  | + | 
|  | +from autotest_lib.client.common_lib import utils | 
|  | +from autotest_lib.server.hosts import adb_host | 
|  | +from autotest_lib.site_utils import test_runner_utils | 
|  | +from autotest_lib.site_utils import tester_feedback | 
|  | + | 
|  | +def _parse_arguments_internal(argv): | 
|  | +    """ | 
|  | +    Parse command line arguments | 
|  | + | 
|  | +    @param argv: argument list to parse | 
|  | + | 
|  | +    @returns:    tuple of parsed arguments and argv suitable for remote runs | 
|  | + | 
|  | +    @raises SystemExit if arguments are malformed, or required arguments | 
|  | +            are not present. | 
|  | +    """ | 
|  | + | 
|  | +    parser = argparse.ArgumentParser(description='Set device cpu cores and ' | 
|  | +                                                 'frequency.') | 
|  | + | 
|  | +    parser.add_argument('-s', '--serials', metavar='SERIALS', | 
|  | +                        help='Comma separate list of device serials under ' | 
|  | +                             'test.') | 
|  | +    parser.add_argument('-r', '--remote', metavar='REMOTE', | 
|  | +                        default='localhost', | 
|  | +                        help='hostname[:port] if the ADB device is connected ' | 
|  | +                             'to a remote machine. Ensure this workstation ' | 
|  | +                             'is configured for passwordless ssh access as ' | 
|  | +                             'users "root" or "adb"') | 
|  | +    parser.add_argument('-q', '--frequency', type=int, default=960000, | 
|  | +                        help='Specify the CPU frequency of the device, lower ' | 
|  | +                             'frequency will slow down the performance but ' | 
|  | +                             'reduce noise.') | 
|  | + | 
|  | +    return parser.parse_args(argv) | 
|  | + | 
|  | +def main(argv): | 
|  | +    """ | 
|  | +    Entry point for set_device script. | 
|  | + | 
|  | +    @param argv: arguments list | 
|  | +    """ | 
|  | +    arguments = _parse_arguments_internal(argv) | 
|  | + | 
|  | +    serials = arguments.serials | 
|  | +    if serials is None: | 
|  | +        result = utils.run(['adb', 'devices']) | 
|  | +        devices = adb_host.ADBHost.parse_device_serials(result.stdout) | 
|  | +        if len(devices) != 1: | 
|  | +            logging.error('Could not detect exactly one device; please select ' | 
|  | +                          'one with -s: %s', devices) | 
|  | +            return 1 | 
|  | +        serials = devices[0] | 
|  | + | 
|  | +    autotest_path = os.path.dirname(os.path.dirname( | 
|  | +            os.path.realpath(__file__))) | 
|  | +    site_utils_path = os.path.join(autotest_path, 'site_utils') | 
|  | +    realpath = os.path.realpath(__file__) | 
|  | +    site_utils_path = os.path.realpath(site_utils_path) | 
|  | +    host_attributes = {'serials': serials, | 
|  | +                       'os_type': 'android'} | 
|  | +    results_directory = test_runner_utils.create_results_directory(None) | 
|  | + | 
|  | +    logging.info('Start setting CPU frequency on the device...') | 
|  | + | 
|  | +    os.environ['FREQUENCY'] = str(arguments.frequency) | 
|  | + | 
|  | +    set_device = ['SetDevice'] | 
|  | +    if test_runner_utils.perform_run_from_autotest_root( | 
|  | +                      autotest_path, argv, set_device, arguments.remote, | 
|  | +                      host_attributes=host_attributes, | 
|  | +                      results_directory=results_directory): | 
|  | +      logging.error('Error while setting device!') | 
|  | +      return 1 | 
|  | + | 
|  | +    return 0 | 
|  | + | 
|  | +if __name__ == '__main__': | 
|  | +    sys.exit(main(sys.argv[1:])) | 
|  | diff --git a/site_utils/test_bench.py b/site_utils/test_bench.py | 
|  | new file mode 100755 | 
|  | index 000000000..4d0773ad9 | 
|  | --- /dev/null | 
|  | +++ b/site_utils/test_bench.py | 
|  | @@ -0,0 +1,133 @@ | 
|  | +#!/usr/bin/python | 
|  | +from __future__ import print_function | 
|  | + | 
|  | +import argparse | 
|  | +import common | 
|  | +import logging | 
|  | +import os | 
|  | +import sys | 
|  | + | 
|  | +# Turn the logging level to INFO before importing other autotest | 
|  | +# code, to avoid having failed import logging messages confuse the | 
|  | +# test_droid user. | 
|  | +logging.basicConfig(level=logging.INFO) | 
|  | + | 
|  | +# Unfortunately, autotest depends on external packages for assorted | 
|  | +# functionality regardless of whether or not it is needed in a particular | 
|  | +# context. | 
|  | +# Since we can't depend on people to import these utilities in any principled | 
|  | +# way, we dynamically download code before any autotest imports. | 
|  | +try: | 
|  | +    import chromite.lib.terminal  # pylint: disable=unused-import | 
|  | +    import django.http  # pylint: disable=unused-import | 
|  | +except ImportError: | 
|  | +    # Ensure the chromite site-package is installed. | 
|  | +    import subprocess | 
|  | +    build_externals_path = os.path.join( | 
|  | +            os.path.dirname(os.path.dirname(os.path.realpath(__file__))), | 
|  | +            'utils', 'build_externals.py') | 
|  | +    subprocess.check_call([build_externals_path, '--names_to_check', | 
|  | +                           'chromiterepo', 'django']) | 
|  | +    # Restart the script so python now finds the autotest site-packages. | 
|  | +    sys.exit(os.execv(__file__, sys.argv)) | 
|  | + | 
|  | +from autotest_lib.client.common_lib import utils | 
|  | +from autotest_lib.server.hosts import adb_host | 
|  | +from autotest_lib.site_utils import test_runner_utils | 
|  | +from autotest_lib.site_utils import tester_feedback | 
|  | + | 
|  | +def _parse_arguments_internal(argv): | 
|  | +    """ | 
|  | +    Parse command line arguments | 
|  | + | 
|  | +    @param argv: argument list to parse | 
|  | + | 
|  | +    @returns:    tuple of parsed arguments and argv suitable for remote runs | 
|  | + | 
|  | +    @raises SystemExit if arguments are malformed, or required arguments | 
|  | +            are not present. | 
|  | +    """ | 
|  | + | 
|  | +    parser = argparse.ArgumentParser(description='Run remote tests.') | 
|  | + | 
|  | +    parser.add_argument('-b', '--bench', metavar='BENCH', required=True, | 
|  | +                        help='Select the benchmark want to be run for ' | 
|  | +                             'test.') | 
|  | +    parser.add_argument('-s', '--serials', metavar='SERIALS', | 
|  | +                        help='Comma separate list of device serials under ' | 
|  | +                             'test.') | 
|  | +    parser.add_argument('-r', '--remote', metavar='REMOTE', | 
|  | +                        default='localhost', | 
|  | +                        help='hostname[:port] if the ADB device is connected ' | 
|  | +                             'to a remote machine. Ensure this workstation ' | 
|  | +                             'is configured for passwordless ssh access as ' | 
|  | +                             'users "root" or "adb"') | 
|  | +    parser.add_argument('-m', '--mode', default='little', | 
|  | +                        help='Two modes can be chosen, little mode runs on a ' | 
|  | +                             'single core of Cortex-A53, while big mode runs ' | 
|  | +                             'on single core of Cortex-A57.') | 
|  | + | 
|  | +    return parser.parse_args(argv) | 
|  | + | 
|  | +def main(argv): | 
|  | +    """ | 
|  | +    Entry point for test_bench script. | 
|  | + | 
|  | +    @param argv: arguments list | 
|  | +    """ | 
|  | +    arguments = _parse_arguments_internal(argv) | 
|  | + | 
|  | +    serials = arguments.serials | 
|  | +    if serials is None: | 
|  | +        result = utils.run(['adb', 'devices']) | 
|  | +        devices = adb_host.ADBHost.parse_device_serials(result.stdout) | 
|  | +        if len(devices) != 1: | 
|  | +            logging.error('Could not detect exactly one device; please select ' | 
|  | +                          'one with -s: %s', devices) | 
|  | +            return 1 | 
|  | +        serials = devices[0] | 
|  | + | 
|  | +    autotest_path = os.path.dirname(os.path.dirname( | 
|  | +            os.path.realpath(__file__))) | 
|  | +    site_utils_path = os.path.join(autotest_path, 'site_utils') | 
|  | +    realpath = os.path.realpath(__file__) | 
|  | +    site_utils_path = os.path.realpath(site_utils_path) | 
|  | +    host_attributes = {'serials': serials, | 
|  | +                       'os_type': 'android'} | 
|  | +    results_directory = test_runner_utils.create_results_directory(None) | 
|  | + | 
|  | +    bench = arguments.bench | 
|  | + | 
|  | +    benchlist = ['Panorama', 'Skia', 'Dex2oat', 'Hwui', "Synthmark", "Binder"] | 
|  | + | 
|  | +    logging.info('Start testing benchmark on the device...') | 
|  | + | 
|  | +    if bench not in benchlist: | 
|  | +        logging.error('Please select one benchmark from the list below: \n%s', | 
|  | +                      '\n'.join(benchlist)) | 
|  | +        return 1 | 
|  | + | 
|  | +    # Use taskset command to run benchmarks with different CPU core settings. | 
|  | +    # | 
|  | +    # TEST_MODE variable is set to either 7 or 56 for coremask in taskset. | 
|  | +    # | 
|  | +    # While Nexus 6P has 8 cores and 5X has 6 cores. CPU number 0-3 in both | 
|  | +    # devices belongs to Cortex 53, which are slow. CPU number 4-5 in 5X and 4-7 | 
|  | +    # in 6P belongs to Cortex 57, which are fast. | 
|  | +    # | 
|  | +    # So we set 7(0x00000111) for little mode, that runs the benchmark on three | 
|  | +    # slow cores; 56(0x00111000) for big mode, that runs the benchmark on two | 
|  | +    # fast and one slow cores. | 
|  | +    os.environ['TEST_MODE'] = '7' if arguments.mode == 'little' else '56' | 
|  | + | 
|  | +    tests = [bench] | 
|  | + | 
|  | +    if test_runner_utils.perform_run_from_autotest_root( | 
|  | +                      autotest_path, argv, tests, arguments.remote, | 
|  | +                      host_attributes=host_attributes, | 
|  | +                      results_directory=results_directory): | 
|  | +      logging.error('Error while testing on device.') | 
|  | +      return 1 | 
|  | + | 
|  | +if __name__ == '__main__': | 
|  | +    sys.exit(main(sys.argv[1:])) |