1bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui#!/usr/bin/env python 2bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# 3bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# Copyright (C) 2017 The Android Open Source Project 4bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# 5bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# Licensed under the Apache License, Version 2.0 (the "License"); 6bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# you may not use this file except in compliance with the License. 7bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# You may obtain a copy of the License at 8bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# 9bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# http://www.apache.org/licenses/LICENSE-2.0 10bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# 11bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# Unless required by applicable law or agreed to in writing, software 12bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# distributed under the License is distributed on an "AS IS" BASIS, 13bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# See the License for the specific language governing permissions and 15bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# limitations under the License. 16bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui# 17bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui"""test.py: Tests for simpleperf python scripts. 18bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 19bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin CuiThese are smoke tests Using examples to run python scripts. 20bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin CuiFor each example, we go through the steps of running each python script. 21bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin CuiExamples are collected from simpleperf/demo, which includes: 22bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui SimpleperfExamplePureJava 23bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui SimpleperfExampleWithNative 24bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui SimpleperfExampleOfKotlin 25bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 26bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin CuiTested python scripts include: 27bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui app_profiler.py 28bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui report.py 29bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui annotate.py 30bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui report_sample.py 31bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui pprof_proto_generator.py 32706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui report_html.py 33bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 34bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin CuiTest using both `adb root` and `adb unroot`. 35bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 36bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui""" 37bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 38bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiimport os 39bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiimport re 40bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiimport shutil 411dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cuiimport signal 42bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiimport sys 43bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiimport tempfile 441dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cuiimport time 45bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiimport unittest 46b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui 4733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cuifrom simpleperf_report_lib import ReportLib 48b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cuifrom utils import * 49bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 50bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuihas_google_protobuf = True 51bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuitry: 52bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui import google.protobuf 53bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiexcept: 54bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui has_google_protobuf = False 55bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 56e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cuiinferno_script = os.path.join(get_script_dir(), "inferno.bat" if is_windows() else "./inferno.sh") 5769bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui 5858d10880d69339f18faeb387de34619ec747749dYabin Cuisupport_trace_offcpu = None 5958d10880d69339f18faeb387de34619ec747749dYabin Cui 6058d10880d69339f18faeb387de34619ec747749dYabin Cuidef is_trace_offcpu_supported(): 6158d10880d69339f18faeb387de34619ec747749dYabin Cui global support_trace_offcpu 6258d10880d69339f18faeb387de34619ec747749dYabin Cui if support_trace_offcpu is None: 6358d10880d69339f18faeb387de34619ec747749dYabin Cui adb = AdbHelper() 6458d10880d69339f18faeb387de34619ec747749dYabin Cui adb.check_run_and_return_output(['push', 6558d10880d69339f18faeb387de34619ec747749dYabin Cui 'bin/android/%s/simpleperf' % adb.get_device_arch(), 6658d10880d69339f18faeb387de34619ec747749dYabin Cui "/data/local/tmp"]) 6758d10880d69339f18faeb387de34619ec747749dYabin Cui adb.check_run_and_return_output(['shell', 'chmod', 'a+x', '/data/local/tmp/simpleperf']) 6858d10880d69339f18faeb387de34619ec747749dYabin Cui output = adb.check_run_and_return_output(['shell', '/data/local/tmp/simpleperf', 'list', 6958d10880d69339f18faeb387de34619ec747749dYabin Cui '--show-features']) 7058d10880d69339f18faeb387de34619ec747749dYabin Cui support_trace_offcpu = 'trace-offcpu' in output 7158d10880d69339f18faeb387de34619ec747749dYabin Cui return support_trace_offcpu 72bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 73d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuidef build_testdata(): 74d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui """ Collect testdata from ../testdata and ../demo. """ 75d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui from_testdata_path = os.path.join('..', 'testdata') 76d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui from_demo_path = os.path.join('..', 'demo') 77b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui from_script_testdata_path = 'script_testdata' 78b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui if (not os.path.isdir(from_testdata_path) or not os.path.isdir(from_demo_path) or 79b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui not from_script_testdata_path): 80d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui return 81fd98e54a25cc5907f3f346e8744b85c0281181d4Yabin Cui copy_testdata_list = ['perf_with_symbols.data', 'perf_with_trace_offcpu.data', 82fd98e54a25cc5907f3f346e8744b85c0281181d4Yabin Cui 'perf_with_tracepoint_event.data'] 83d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui copy_demo_list = ['SimpleperfExamplePureJava', 'SimpleperfExampleWithNative', 84d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 'SimpleperfExampleOfKotlin'] 85d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 86d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui testdata_path = "testdata" 8758d10880d69339f18faeb387de34619ec747749dYabin Cui remove(testdata_path) 8858d10880d69339f18faeb387de34619ec747749dYabin Cui os.mkdir(testdata_path) 89d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui for testdata in copy_testdata_list: 90d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui shutil.copy(os.path.join(from_testdata_path, testdata), testdata_path) 91d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui for demo in copy_demo_list: 92d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui shutil.copytree(os.path.join(from_demo_path, demo), os.path.join(testdata_path, demo)) 93b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui for f in os.listdir(from_script_testdata_path): 94b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui shutil.copy(os.path.join(from_script_testdata_path, f), testdata_path) 95c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui 96c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cuiclass TestBase(unittest.TestCase): 97c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui def run_cmd(self, args, return_output=False): 98c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui if args[0].endswith('.py'): 99c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui args = [sys.executable] + args 100b5b94a68b333794dd619bd5ef684981df10652daYabin Cui use_shell = args[0].endswith('.bat') 101c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui try: 102c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui if not return_output: 103b5b94a68b333794dd619bd5ef684981df10652daYabin Cui returncode = subprocess.call(args, shell=use_shell) 104c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui else: 105b5b94a68b333794dd619bd5ef684981df10652daYabin Cui subproc = subprocess.Popen(args, stdout=subprocess.PIPE, shell=use_shell) 106c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui (output_data, _) = subproc.communicate() 107c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui returncode = subproc.returncode 108c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui except: 109c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui returncode = None 110c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui self.assertEqual(returncode, 0, msg="failed to run cmd: %s" % args) 111c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui if return_output: 112c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui return output_data 113c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui 114c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui 115c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cuiclass TestExampleBase(TestBase): 116bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 117bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def prepare(cls, example_name, package_name, activity_name, abi=None, adb_root=False): 118bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.adb = AdbHelper(enable_switch_to_root=adb_root) 119bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.example_path = os.path.join("testdata", example_name) 120bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if not os.path.isdir(cls.example_path): 121bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui log_fatal("can't find " + cls.example_path) 122d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui for root, _, files in os.walk(cls.example_path): 123d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui if 'app-profiling.apk' in files: 124d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui cls.apk_path = os.path.join(root, 'app-profiling.apk') 125d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui break 126d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui if not hasattr(cls, 'apk_path'): 127d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui log_fatal("can't find app-profiling.apk under " + cls.example_path) 128bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.package_name = package_name 129bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.activity_name = activity_name 130a1c5d2c465e5c040541f3574bba7b18222b99a41Yabin Cui cls.abi = "arm64" 131a1c5d2c465e5c040541f3574bba7b18222b99a41Yabin Cui if abi and abi != "arm64" and abi.find("arm") != -1: 132a1c5d2c465e5c040541f3574bba7b18222b99a41Yabin Cui cls.abi = "arm" 133bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args = ["install", "-r"] 134bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if abi: 135bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args += ["--abi", abi] 136bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args.append(cls.apk_path) 137bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.adb.check_run(args) 138bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.adb_root = adb_root 139bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.compiled = False 140bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 141d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def setUp(self): 14258d10880d69339f18faeb387de34619ec747749dYabin Cui if self.id().find('TraceOffCpu') != -1 and not is_trace_offcpu_supported(): 143d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.skipTest('trace-offcpu is not supported on device') 144d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 145bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 146bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def tearDownClass(cls): 1477cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui if hasattr(cls, 'test_result') and cls.test_result and not cls.test_result.wasSuccessful(): 1487cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui return 14958d10880d69339f18faeb387de34619ec747749dYabin Cui if hasattr(cls, 'package_name'): 15058d10880d69339f18faeb387de34619ec747749dYabin Cui cls.adb.check_run(["uninstall", cls.package_name]) 15158d10880d69339f18faeb387de34619ec747749dYabin Cui remove("binary_cache") 15258d10880d69339f18faeb387de34619ec747749dYabin Cui remove("annotated_files") 153d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui remove("perf.data") 15458d10880d69339f18faeb387de34619ec747749dYabin Cui remove("report.txt") 15558d10880d69339f18faeb387de34619ec747749dYabin Cui remove("pprof.profile") 156bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 1577cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui def run(self, result=None): 1587cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui self.__class__.test_result = result 1597cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui super(TestBase, self).run(result) 1607cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui 16145f61314ae070697a2ae15ad15198458880fcae8Yabin Cui def run_app_profiler(self, record_arg = "-g -f 1000 --duration 3 -e cpu-cycles:u", 162bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui build_binary_cache=True, skip_compile=False, start_activity=True, 163a1c5d2c465e5c040541f3574bba7b18222b99a41Yabin Cui native_lib_dir=None, profile_from_launch=False, add_arch=False): 164bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args = ["app_profiler.py", "--app", self.package_name, "--apk", self.apk_path, 16588387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui "-r", record_arg, "-o", "perf.data"] 166bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if not build_binary_cache: 167bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args.append("-nb") 168bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if skip_compile or self.__class__.compiled: 169bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args.append("-nc") 170bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if start_activity: 171bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args += ["-a", self.activity_name] 172bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if native_lib_dir: 173bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args += ["-lib", native_lib_dir] 174a1c5d2c465e5c040541f3574bba7b18222b99a41Yabin Cui if profile_from_launch: 175a1c5d2c465e5c040541f3574bba7b18222b99a41Yabin Cui args.append("--profile_from_launch") 176a1c5d2c465e5c040541f3574bba7b18222b99a41Yabin Cui if add_arch: 177a1c5d2c465e5c040541f3574bba7b18222b99a41Yabin Cui args += ["--arch", self.abi] 178bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if not self.adb_root: 179bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args.append("--disable_adb_root") 180bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(args) 181bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_exist(file="perf.data") 182bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if build_binary_cache: 183bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_exist(dir="binary_cache") 184bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if not skip_compile: 185bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.__class__.compiled = True 186bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 187bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def check_exist(self, file=None, dir=None): 188bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if file: 189bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.assertTrue(os.path.isfile(file), file) 190bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if dir: 191bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.assertTrue(os.path.isdir(dir), dir) 192bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 193bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def check_file_under_dir(self, dir, file): 194bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_exist(dir=dir) 195bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui for _, _, files in os.walk(dir): 196bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui for f in files: 197bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if f == file: 198bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui return 199bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.fail("Failed to call check_file_under_dir(dir=%s, file=%s)" % (dir, file)) 200bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 201bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 202bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def check_strings_in_file(self, file, strings): 203bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_exist(file=file) 204bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui with open(file, 'r') as fh: 205bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_strings_in_content(fh.read(), strings) 206bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 207bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def check_strings_in_content(self, content, strings): 208bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui for s in strings: 209bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.assertNotEqual(content.find(s), -1, "s: %s, content: %s" % (s, content)) 210bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 211bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def check_annotation_summary(self, summary_file, check_entries): 212bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui """ check_entries is a list of (name, accumulated_period, period). 213bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui This function checks for each entry, if the line containing [name] 214bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui has at least required accumulated_period and period. 215bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui """ 216bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_exist(file=summary_file) 217bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui with open(summary_file, 'r') as fh: 218bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui summary = fh.read() 219bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui fulfilled = [False for x in check_entries] 220bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if not hasattr(self, "summary_check_re"): 221bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.summary_check_re = re.compile(r'accumulated_period:\s*([\d.]+)%.*period:\s*([\d.]+)%') 222bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui for line in summary.split('\n'): 223bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui for i in range(len(check_entries)): 224bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui (name, need_acc_period, need_period) = check_entries[i] 22558d10880d69339f18faeb387de34619ec747749dYabin Cui if not fulfilled[i] and name in line: 226bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui m = self.summary_check_re.search(line) 227bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if m: 228bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui acc_period = float(m.group(1)) 229bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui period = float(m.group(2)) 230bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if acc_period >= need_acc_period and period >= need_period: 231bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui fulfilled[i] = True 232bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.assertEqual(len(fulfilled), sum([int(x) for x in fulfilled]), fulfilled) 233bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 234e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui def check_inferno_report_html(self, check_entries, file="report.html"): 235d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.check_exist(file=file) 236d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui with open(file, 'r') as fh: 237d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui data = fh.read() 238b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui fulfilled = [False for _ in check_entries] 239d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui for line in data.split('\n'): 240d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui # each entry is a (function_name, min_percentage) pair. 241d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui for i, entry in enumerate(check_entries): 242d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui if fulfilled[i] or line.find(entry[0]) == -1: 243d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui continue 244d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui m = re.search(r'(\d+\.\d+)%', line) 245d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui if m and float(m.group(1)) >= entry[1]: 246d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui fulfilled[i] = True 247d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui break 248d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.assertEqual(fulfilled, [True for x in check_entries]) 249d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui 250bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def common_test_app_profiler(self): 251bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["app_profiler.py", "-h"]) 25258d10880d69339f18faeb387de34619ec747749dYabin Cui remove("binary_cache") 253bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler(build_binary_cache=False) 254bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.assertFalse(os.path.isdir("binary_cache")) 255bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args = ["binary_cache_builder.py"] 256bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if not self.adb_root: 257bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui args.append("--disable_adb_root") 258bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(args) 259bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_exist(dir="binary_cache") 26058d10880d69339f18faeb387de34619ec747749dYabin Cui remove("binary_cache") 261bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler(build_binary_cache=True) 262bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler(skip_compile=True) 263bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler(start_activity=False) 264bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 265bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def common_test_report(self): 266bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report.py", "-h"]) 267bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler(build_binary_cache=False) 268bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report.py"]) 269bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report.py", "-i", "perf.data"]) 270bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report.py", "-g"]) 271bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report.py", "--self-kill-for-testing", "-g", "--gui"]) 272bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 273bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def common_test_annotate(self): 274bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["annotate.py", "-h"]) 275bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler() 27658d10880d69339f18faeb387de34619ec747749dYabin Cui remove("annotated_files") 277bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["annotate.py", "-s", self.example_path]) 278bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_exist(dir="annotated_files") 279bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 280bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def common_test_report_sample(self, check_strings): 281bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report_sample.py", "-h"]) 28258d10880d69339f18faeb387de34619ec747749dYabin Cui remove("binary_cache") 283bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler(build_binary_cache=False) 284bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report_sample.py"]) 285bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui output = self.run_cmd(["report_sample.py", "perf.data"], return_output=True) 286bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_strings_in_content(output, check_strings) 28745f61314ae070697a2ae15ad15198458880fcae8Yabin Cui self.run_app_profiler(record_arg="-g -f 1000 --duration 3 -e cpu-cycles:u --no-dump-symbols") 288bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui output = self.run_cmd(["report_sample.py", "--symfs", "binary_cache"], return_output=True) 289bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_strings_in_content(output, check_strings) 290bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 291bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def common_test_pprof_proto_generator(self, check_strings_with_lines, 292bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui check_strings_without_lines): 293bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui if not has_google_protobuf: 294bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui log_info('Skip test for pprof_proto_generator because google.protobuf is missing') 295bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui return 296bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["pprof_proto_generator.py", "-h"]) 297bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler() 298bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["pprof_proto_generator.py"]) 29958d10880d69339f18faeb387de34619ec747749dYabin Cui remove("pprof.profile") 300bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["pprof_proto_generator.py", "-i", "perf.data", "-o", "pprof.profile"]) 301bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_exist(file="pprof.profile") 302bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["pprof_proto_generator.py", "--show"]) 303bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui output = self.run_cmd(["pprof_proto_generator.py", "--show", "pprof.profile"], 304bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui return_output=True) 305bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_strings_in_content(output, check_strings_with_lines + 306bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["has_line_numbers: True"]) 30758d10880d69339f18faeb387de34619ec747749dYabin Cui remove("binary_cache") 308bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["pprof_proto_generator.py"]) 309bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui output = self.run_cmd(["pprof_proto_generator.py", "--show", "pprof.profile"], 310bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui return_output=True) 311bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_strings_in_content(output, check_strings_without_lines + 312bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["has_line_numbers: False"]) 313bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 31469bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui def common_test_inferno(self): 31569bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-h"]) 31669bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui remove("perf.data") 31769bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui append_args = [] if self.adb_root else ["--disable_adb_root"] 31869bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-p", self.package_name, "-t", "3"] + append_args) 31969bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.check_exist(file="perf.data") 32069bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-p", self.package_name, "-f", "1000", "-du", "-t", "1", 32169bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui "-nc"] + append_args) 32269bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-p", self.package_name, "-e", "100000 cpu-cycles", 32369bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui "-t", "1", "-nc"] + append_args) 32469bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-sc"]) 32569bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui 326706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui def common_test_report_html(self): 327706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui self.run_cmd(['report_html.py', '-h']) 328c1e72dfdd75f81d9b428395a8ec09628a89f753cYabin Cui self.run_app_profiler(record_arg='-g -f 1000 --duration 3 -e task-clock:u') 329706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui self.run_cmd(['report_html.py']) 330706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui self.run_cmd(['report_html.py', '--add_source_code', '--source_dirs', 'testdata']) 331b956d24108cab878b639e4d6ebd04e80c80ce780Yabin Cui self.run_cmd(['report_html.py', '--add_disassembly']) 332706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui # Test with multiple perf.data. 333706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui shutil.move('perf.data', 'perf2.data') 334706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui self.run_app_profiler() 335706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui self.run_cmd(['report_html.py', '-i', 'perf.data', 'perf2.data']) 336706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui remove('perf2.data') 337706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui 338bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 339d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExamplePureJava(TestExampleBase): 340bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 341bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def setUpClass(cls): 342bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.prepare("SimpleperfExamplePureJava", 343bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "com.example.simpleperf.simpleperfexamplepurejava", 344bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ".MainActivity") 345bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 346bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_app_profiler(self): 347bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_app_profiler() 348bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 34988387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui def test_app_profiler_profile_from_launch(self): 35088387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.run_app_profiler(profile_from_launch=True, add_arch=True, build_binary_cache=False) 35188387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 35288387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.check_strings_in_file("report.txt", 35388387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui ["com.example.simpleperf.simpleperfexamplepurejava.MainActivity$1.run()", 35488387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui "__start_thread"]) 35588387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui 3567cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui def test_app_profiler_multiprocesses(self): 3577cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui self.adb.check_run(['shell', 'am', 'force-stop', self.package_name]) 3587cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui self.adb.check_run(['shell', 'am', 'start', '-n', 3597cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui self.package_name + '/.MultiProcessActivity']) 3607cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui # Wait until both MultiProcessActivity and MultiProcessService set up. 3617cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui time.sleep(3) 3627cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui self.run_app_profiler(skip_compile=True, start_activity=False) 3637cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui self.run_cmd(["report.py", "-o", "report.txt"]) 3647cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui self.check_strings_in_file("report.txt", ["BusyService", "BusyThread"]) 3657cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui 3661dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui def test_app_profiler_with_ctrl_c(self): 3671dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui if is_windows(): 3681dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui return 369b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui self.adb.check_run(['shell', 'am', 'start', '-n', self.package_name + '/.MainActivity']) 370b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui time.sleep(1) 3711dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui args = [sys.executable, "app_profiler.py", "--app", self.package_name, 372b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui "-r", "--duration 10000", "-nc", "--disable_adb_root"] 3731dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui subproc = subprocess.Popen(args) 3741dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui time.sleep(3) 3751dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui 3761dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui subproc.send_signal(signal.SIGINT) 3771dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui subproc.wait() 3781dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui self.assertEqual(subproc.returncode, 0) 3791dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui self.run_cmd(["report.py"]) 3801dafb1a92d990811c1fa9b94a0ac51014c3a685aYabin Cui 381b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui def test_app_profiler_stop_after_app_exit(self): 382b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui self.adb.check_run(['shell', 'am', 'start', '-n', self.package_name + '/.MainActivity']) 383b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui time.sleep(1) 384b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui subproc = subprocess.Popen([sys.executable, 'app_profiler.py', '--app', self.package_name, 385b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui '-r', '--duration 10000', '-nc', '--disable_adb_root']) 386b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui time.sleep(3) 387b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui self.adb.check_run(['shell', 'am', 'force-stop', self.package_name]) 388b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui subproc.wait() 389b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui self.assertEqual(subproc.returncode, 0) 390b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui self.run_cmd(["report.py"]) 391b00b37dbee4bc1c0633ff0891b939200b32218d0Yabin Cui 392bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_report(self): 393bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_report() 394bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 395bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_strings_in_file("report.txt", 396bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["com.example.simpleperf.simpleperfexamplepurejava.MainActivity$1.run()", 397bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "__start_thread"]) 398bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 399bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_annotate(self): 400bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_annotate() 401bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_file_under_dir("annotated_files", "MainActivity.java") 402bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui summary_file = os.path.join("annotated_files", "summary") 403bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_annotation_summary(summary_file, 404bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui [("MainActivity.java", 80, 80), 405bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ("run", 80, 0), 406bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ("callFunction", 0, 0), 4077cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui ("line 23", 80, 0)]) 408bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 409bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_report_sample(self): 410bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_report_sample( 411bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["com.example.simpleperf.simpleperfexamplepurejava.MainActivity$1.run()", 412bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "__start_thread"]) 413bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 414bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_pprof_proto_generator(self): 415bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_pprof_proto_generator( 416bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui check_strings_with_lines= 417bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["com/example/simpleperf/simpleperfexamplepurejava/MainActivity.java", 418bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "run"], 419bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui check_strings_without_lines= 420bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["com.example.simpleperf.simpleperfexamplepurejava.MainActivity$1.run()"]) 421bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 42269bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui def test_inferno(self): 42369bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.common_test_inferno() 424d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.run_app_profiler() 425d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.run_cmd([inferno_script, "-sc"]) 426d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.check_inferno_report_html( 427d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui [('com.example.simpleperf.simpleperfexamplepurejava.MainActivity$1.run()', 80)]) 428e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui self.run_cmd([inferno_script, "-sc", "-o", "report2.html"]) 429e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui self.check_inferno_report_html( 430e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui [('com.example.simpleperf.simpleperfexamplepurejava.MainActivity$1.run()', 80)], 431e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui "report2.html") 432e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui remove("report2.html") 433e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui 434e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui def test_inferno_in_another_dir(self): 435e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui test_dir = 'inferno_testdir' 436e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui saved_dir = os.getcwd() 437e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui remove(test_dir) 438e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui os.mkdir(test_dir) 439e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui os.chdir(test_dir) 440a4af357c7cf90cf810c7e5191a7ac7d300d1b74fYabin Cui self.run_cmd(['python', os.path.join(saved_dir, 'app_profiler.py'), 441a4af357c7cf90cf810c7e5191a7ac7d300d1b74fYabin Cui '--app', self.package_name, '-r', '-e task-clock:u -g --duration 3']) 442a4af357c7cf90cf810c7e5191a7ac7d300d1b74fYabin Cui self.check_exist(file="perf.data") 443a4af357c7cf90cf810c7e5191a7ac7d300d1b74fYabin Cui self.run_cmd([inferno_script, "-sc"]) 444e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui os.chdir(saved_dir) 445e01b2b6c536e42fc95ab9c1da34536a11a84c23fYabin Cui remove(test_dir) 44669bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui 447706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui def test_report_html(self): 448706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui self.common_test_report_html() 449706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui 450bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 451d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExamplePureJavaRoot(TestExampleBase): 452bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 453bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def setUpClass(cls): 454bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.prepare("SimpleperfExamplePureJava", 455bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "com.example.simpleperf.simpleperfexamplepurejava", 456bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ".MainActivity", 457bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui adb_root=True) 458bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 459bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_app_profiler(self): 460bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_app_profiler() 461bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 462bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 463d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExamplePureJavaTraceOffCpu(TestExampleBase): 464d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui @classmethod 465d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def setUpClass(cls): 466d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui cls.prepare("SimpleperfExamplePureJava", 467d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "com.example.simpleperf.simpleperfexamplepurejava", 468d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ".SleepActivity") 469d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 470d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def test_smoke(self): 47145f61314ae070697a2ae15ad15198458880fcae8Yabin Cui self.run_app_profiler(record_arg="-g -f 1000 --duration 3 -e cpu-cycles:u --trace-offcpu") 472d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 473d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_strings_in_file("report.txt", 474d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ["com.example.simpleperf.simpleperfexamplepurejava.SleepActivity$1.run()", 475d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "long com.example.simpleperf.simpleperfexamplepurejava.SleepActivity$1.RunFunction()", 476d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "long com.example.simpleperf.simpleperfexamplepurejava.SleepActivity$1.SleepFunction(long)" 477d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ]) 47858d10880d69339f18faeb387de34619ec747749dYabin Cui remove("annotated_files") 479d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_cmd(["annotate.py", "-s", self.example_path]) 480d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_exist(dir="annotated_files") 481d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_file_under_dir("annotated_files", "SleepActivity.java") 482d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui summary_file = os.path.join("annotated_files", "summary") 483d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_annotation_summary(summary_file, 484d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui [("SleepActivity.java", 80, 20), 485d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("run", 80, 0), 486d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("RunFunction", 20, 20), 487d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("SleepFunction", 20, 0), 488d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("line 24", 20, 0), 489d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("line 32", 20, 0)]) 49069bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-sc"]) 491d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.check_inferno_report_html( 492d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui [('com.example.simpleperf.simpleperfexamplepurejava.SleepActivity$1.run() ', 80), 493d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui ('com.example.simpleperf.simpleperfexamplepurejava.SleepActivity$1.RunFunction()', 494d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui 20), 495d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui ('com.example.simpleperf.simpleperfexamplepurejava.SleepActivity$1.SleepFunction(long)', 496d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui 20)]) 497d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 498d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 499d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExampleWithNative(TestExampleBase): 500bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 501bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def setUpClass(cls): 502bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.prepare("SimpleperfExampleWithNative", 503bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "com.example.simpleperf.simpleperfexamplewithnative", 504bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ".MainActivity") 505bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 506bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_app_profiler(self): 507bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_app_profiler() 50858d10880d69339f18faeb387de34619ec747749dYabin Cui remove("binary_cache") 509bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler(native_lib_dir=self.example_path) 510bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 51188387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui def test_app_profiler_profile_from_launch(self): 51288387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.run_app_profiler(profile_from_launch=True, add_arch=True, build_binary_cache=False) 51388387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 51488387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.check_strings_in_file("report.txt", 51588387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui ["BusyLoopThread", 51688387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui "__start_thread"]) 51788387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui 518bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_report(self): 519bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_report() 520bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 521bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_strings_in_file("report.txt", 522bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["BusyLoopThread", 523bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "__start_thread"]) 524bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 525bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_annotate(self): 526bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_annotate() 527bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_file_under_dir("annotated_files", "native-lib.cpp") 528bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui summary_file = os.path.join("annotated_files", "summary") 529bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_annotation_summary(summary_file, 530bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui [("native-lib.cpp", 20, 0), 531bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ("BusyLoopThread", 20, 0), 532bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ("line 46", 20, 0)]) 533bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 534bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_report_sample(self): 535bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_report_sample( 536bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["BusyLoopThread", 537bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "__start_thread"]) 538bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 539bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_pprof_proto_generator(self): 540bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_pprof_proto_generator( 541bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui check_strings_with_lines= 542bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["native-lib.cpp", 543bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "BusyLoopThread"], 544bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui check_strings_without_lines= 545bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["BusyLoopThread"]) 546bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 54769bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui def test_inferno(self): 54869bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.common_test_inferno() 549d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.run_app_profiler() 550d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.run_cmd([inferno_script, "-sc"]) 551d66938df696cc035b6b7895055acbc8a519c8db2Yabin Cui self.check_inferno_report_html([('BusyLoopThread', 20)]) 55269bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui 553706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui def test_report_html(self): 554706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui self.common_test_report_html() 555706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui 556bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 557d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExampleWithNativeRoot(TestExampleBase): 558bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 559bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def setUpClass(cls): 560bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.prepare("SimpleperfExampleWithNative", 561bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "com.example.simpleperf.simpleperfexamplewithnative", 562bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ".MainActivity", 563bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui adb_root=True) 564bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 565bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_app_profiler(self): 566bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_app_profiler() 56758d10880d69339f18faeb387de34619ec747749dYabin Cui remove("binary_cache") 568bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_app_profiler(native_lib_dir=self.example_path) 569bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 570bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 571d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExampleWithNativeTraceOffCpu(TestExampleBase): 572d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui @classmethod 573d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def setUpClass(cls): 574d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui cls.prepare("SimpleperfExampleWithNative", 575d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "com.example.simpleperf.simpleperfexamplewithnative", 576d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ".SleepActivity") 577d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 578d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def test_smoke(self): 57945f61314ae070697a2ae15ad15198458880fcae8Yabin Cui self.run_app_profiler(record_arg="-g -f 1000 --duration 3 -e cpu-cycles:u --trace-offcpu") 580d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_cmd(["report.py", "-g", "--comms", "SleepThread", "-o", "report.txt"]) 581d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_strings_in_file("report.txt", 582d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ["SleepThread(void*)", 583d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "RunFunction()", 584d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "SleepFunction(unsigned long long)"]) 58558d10880d69339f18faeb387de34619ec747749dYabin Cui remove("annotated_files") 586d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_cmd(["annotate.py", "-s", self.example_path, "--comm", "SleepThread"]) 587d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_exist(dir="annotated_files") 588d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_file_under_dir("annotated_files", "native-lib.cpp") 589d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui summary_file = os.path.join("annotated_files", "summary") 590d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_annotation_summary(summary_file, 591d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui [("native-lib.cpp", 80, 20), 592d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("SleepThread", 80, 0), 593d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("RunFunction", 20, 20), 594d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("SleepFunction", 20, 0), 595d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("line 73", 20, 0), 596d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("line 83", 20, 0)]) 59769bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-sc"]) 598d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.check_inferno_report_html([('SleepThread', 80), 599d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui ('RunFunction', 20), 600d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui ('SleepFunction', 20)]) 601d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 602d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 603d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExampleWithNativeJniCall(TestExampleBase): 604d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui @classmethod 605d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def setUpClass(cls): 606d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui cls.prepare("SimpleperfExampleWithNative", 607d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "com.example.simpleperf.simpleperfexamplewithnative", 608d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ".MixActivity") 609d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 610d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def test_smoke(self): 611d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_app_profiler() 612d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_cmd(["report.py", "-g", "--comms", "BusyThread", "-o", "report.txt"]) 613d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_strings_in_file("report.txt", 614d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ["void com.example.simpleperf.simpleperfexamplewithnative.MixActivity$1.run()", 615d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "int com.example.simpleperf.simpleperfexamplewithnative.MixActivity.callFunction(int)", 616d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "Java_com_example_simpleperf_simpleperfexamplewithnative_MixActivity_callFunction"]) 61758d10880d69339f18faeb387de34619ec747749dYabin Cui remove("annotated_files") 618d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_cmd(["annotate.py", "-s", self.example_path, "--comm", "BusyThread"]) 619d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_exist(dir="annotated_files") 620d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_file_under_dir("annotated_files", "native-lib.cpp") 621d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_file_under_dir("annotated_files", "MixActivity.java") 622d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui summary_file = os.path.join("annotated_files", "summary") 623d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_annotation_summary(summary_file, 624d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui [("MixActivity.java", 80, 0), 625d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("run", 80, 0), 626d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("line 26", 20, 0), 62745f61314ae070697a2ae15ad15198458880fcae8Yabin Cui ("native-lib.cpp", 5, 0), 62845f61314ae070697a2ae15ad15198458880fcae8Yabin Cui ("line 40", 5, 0)]) 62969bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-sc"]) 630d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 631d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 632bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiclass TestExampleWithNativeForceArm(TestExampleWithNative): 633bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 634bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def setUpClass(cls): 635bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.prepare("SimpleperfExampleWithNative", 636bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "com.example.simpleperf.simpleperfexamplewithnative", 637bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ".MainActivity", 638bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui abi="armeabi-v7a") 639bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 640bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 641bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cuiclass TestExampleWithNativeForceArmRoot(TestExampleWithNativeRoot): 642bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 643bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def setUpClass(cls): 644bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.prepare("SimpleperfExampleWithNative", 645bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "com.example.simpleperf.simpleperfexamplewithnative", 646bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ".MainActivity", 647bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui abi="armeabi-v7a", 648bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui adb_root=False) 649bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 650bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 651d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExampleWithNativeTraceOffCpuForceArm(TestExampleWithNativeTraceOffCpu): 652d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui @classmethod 653d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def setUpClass(cls): 654d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui cls.prepare("SimpleperfExampleWithNative", 655d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "com.example.simpleperf.simpleperfexamplewithnative", 656d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ".SleepActivity", 657d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui abi="armeabi-v7a") 658d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 659d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 660d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExampleOfKotlin(TestExampleBase): 661bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 662bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def setUpClass(cls): 663bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.prepare("SimpleperfExampleOfKotlin", 664bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "com.example.simpleperf.simpleperfexampleofkotlin", 665bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ".MainActivity") 666bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 667bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_app_profiler(self): 668bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_app_profiler() 669bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 67088387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui def test_app_profiler_profile_from_launch(self): 67188387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.run_app_profiler(profile_from_launch=True, add_arch=True, build_binary_cache=False) 67288387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 67388387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui self.check_strings_in_file("report.txt", 67488387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui ["com.example.simpleperf.simpleperfexampleofkotlin.MainActivity$createBusyThread$1.run()", 67588387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui "__start_thread"]) 67688387691082a3b9afeacd92c7c28d537190ea8a5Yabin Cui 677bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_report(self): 678bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_report() 679bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 680bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_strings_in_file("report.txt", 681bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["com.example.simpleperf.simpleperfexampleofkotlin.MainActivity$createBusyThread$1.run()", 682bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "__start_thread"]) 683bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 684bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_annotate(self): 685bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_annotate() 686bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_file_under_dir("annotated_files", "MainActivity.kt") 687bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui summary_file = os.path.join("annotated_files", "summary") 688bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.check_annotation_summary(summary_file, 689bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui [("MainActivity.kt", 80, 80), 690bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ("run", 80, 0), 691bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ("callFunction", 0, 0), 692bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ("line 19", 80, 0), 693bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ("line 25", 0, 0)]) 694bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 695bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_report_sample(self): 696bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_report_sample( 697bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["com.example.simpleperf.simpleperfexampleofkotlin.MainActivity$createBusyThread$1.run()", 698bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "__start_thread"]) 699bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 700bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_pprof_proto_generator(self): 701bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_pprof_proto_generator( 702bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui check_strings_with_lines= 703bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["com/example/simpleperf/simpleperfexampleofkotlin/MainActivity.kt", 704bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "run"], 705bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui check_strings_without_lines= 706bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ["com.example.simpleperf.simpleperfexampleofkotlin.MainActivity$createBusyThread$1.run()"]) 707bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 70869bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui def test_inferno(self): 70969bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.common_test_inferno() 710d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.run_app_profiler() 711d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.run_cmd([inferno_script, "-sc"]) 712d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.check_inferno_report_html( 713d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui [('com.example.simpleperf.simpleperfexampleofkotlin.MainActivity$createBusyThread$1.run()', 714d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui 80)]) 71569bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui 716706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui def test_report_html(self): 717706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui self.common_test_report_html() 718706c3dfe4a7159c110cfc92823f978f2629a9b06Yabin Cui 719bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 720d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExampleOfKotlinRoot(TestExampleBase): 721bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui @classmethod 722bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def setUpClass(cls): 723bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui cls.prepare("SimpleperfExampleOfKotlin", 724bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui "com.example.simpleperf.simpleperfexampleofkotlin", 725bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui ".MainActivity", 726bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui adb_root=True) 727bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 728bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui def test_app_profiler(self): 729bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui self.common_test_app_profiler() 730bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 731bfe1a73b29661a79b3d58300bfe4ce539a5fee44Yabin Cui 732d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiclass TestExampleOfKotlinTraceOffCpu(TestExampleBase): 733d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui @classmethod 734d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def setUpClass(cls): 735d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui cls.prepare("SimpleperfExampleOfKotlin", 736d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "com.example.simpleperf.simpleperfexampleofkotlin", 737d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ".SleepActivity") 738d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 739d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui def test_smoke(self): 74045f61314ae070697a2ae15ad15198458880fcae8Yabin Cui self.run_app_profiler(record_arg="-g -f 1000 --duration 3 -e cpu-cycles:u --trace-offcpu") 741d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 742d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_strings_in_file("report.txt", 743d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ["void com.example.simpleperf.simpleperfexampleofkotlin.SleepActivity$createRunSleepThread$1.run()", 744d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "long com.example.simpleperf.simpleperfexampleofkotlin.SleepActivity$createRunSleepThread$1.RunFunction()", 745d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui "long com.example.simpleperf.simpleperfexampleofkotlin.SleepActivity$createRunSleepThread$1.SleepFunction(long)" 746d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ]) 74758d10880d69339f18faeb387de34619ec747749dYabin Cui remove("annotated_files") 748d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.run_cmd(["annotate.py", "-s", self.example_path]) 749d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_exist(dir="annotated_files") 750d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_file_under_dir("annotated_files", "SleepActivity.kt") 751d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui summary_file = os.path.join("annotated_files", "summary") 752d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui self.check_annotation_summary(summary_file, 753d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui [("SleepActivity.kt", 80, 20), 754d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("run", 80, 0), 755d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("RunFunction", 20, 20), 756d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("SleepFunction", 20, 0), 757d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("line 24", 20, 0), 758d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui ("line 32", 20, 0)]) 75969bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-sc"]) 760d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui self.check_inferno_report_html( 761d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui [('void com.example.simpleperf.simpleperfexampleofkotlin.SleepActivity$createRunSleepThread$1.run()', 762d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui 80), 763d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui ('long com.example.simpleperf.simpleperfexampleofkotlin.SleepActivity$createRunSleepThread$1.RunFunction()', 764d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui 20), 765d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui ('long com.example.simpleperf.simpleperfexampleofkotlin.SleepActivity$createRunSleepThread$1.SleepFunction(long)', 766d3c40e701e2638596bf8bd2d4f8da746e005e144Yabin Cui 20)]) 767d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 768d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 76958d10880d69339f18faeb387de34619ec747749dYabin Cuiclass TestProfilingNativeProgram(TestExampleBase): 77058d10880d69339f18faeb387de34619ec747749dYabin Cui def test_smoke(self): 77158d10880d69339f18faeb387de34619ec747749dYabin Cui if not AdbHelper().switch_to_root(): 77258d10880d69339f18faeb387de34619ec747749dYabin Cui log_info('skip TestProfilingNativeProgram on non-rooted devices.') 77358d10880d69339f18faeb387de34619ec747749dYabin Cui return 77458d10880d69339f18faeb387de34619ec747749dYabin Cui remove("perf.data") 77558d10880d69339f18faeb387de34619ec747749dYabin Cui self.run_cmd(["app_profiler.py", "-np", "surfaceflinger", 77645f61314ae070697a2ae15ad15198458880fcae8Yabin Cui "-r", "-g -f 1000 --duration 3 -e cpu-cycles:u"]) 77758d10880d69339f18faeb387de34619ec747749dYabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 77858d10880d69339f18faeb387de34619ec747749dYabin Cui 77958d10880d69339f18faeb387de34619ec747749dYabin Cui 78058d10880d69339f18faeb387de34619ec747749dYabin Cuiclass TestProfilingCmd(TestExampleBase): 78158d10880d69339f18faeb387de34619ec747749dYabin Cui def test_smoke(self): 78258d10880d69339f18faeb387de34619ec747749dYabin Cui remove("perf.data") 78358d10880d69339f18faeb387de34619ec747749dYabin Cui self.run_cmd(["app_profiler.py", "-cmd", "pm -l", "--disable_adb_root"]) 78458d10880d69339f18faeb387de34619ec747749dYabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 78558d10880d69339f18faeb387de34619ec747749dYabin Cui 78658d10880d69339f18faeb387de34619ec747749dYabin Cui def test_set_arch(self): 78758d10880d69339f18faeb387de34619ec747749dYabin Cui arch = AdbHelper().get_device_arch() 78858d10880d69339f18faeb387de34619ec747749dYabin Cui remove("perf.data") 78958d10880d69339f18faeb387de34619ec747749dYabin Cui self.run_cmd(["app_profiler.py", "-cmd", "pm -l", "--arch", arch]) 79058d10880d69339f18faeb387de34619ec747749dYabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 79158d10880d69339f18faeb387de34619ec747749dYabin Cui 79258d10880d69339f18faeb387de34619ec747749dYabin Cui 79369bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cuiclass TestProfilingNativeProgram(TestExampleBase): 79469bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui def test_smoke(self): 79569bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui adb = AdbHelper() 79669bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui if adb.switch_to_root(): 79769bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd(["app_profiler.py", "-np", "surfaceflinger"]) 79869bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd(["report.py", "-g", "-o", "report.txt"]) 79969bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-sc"]) 80069bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui self.run_cmd([inferno_script, "-np", "surfaceflinger"]) 80169bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui 80269bce02a4c7ae10974a2140c864739d660e9ecd3Yabin Cui 80333275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cuiclass TestReportLib(unittest.TestCase): 80433275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui def setUp(self): 80533275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.report_lib = ReportLib() 80633275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.report_lib.SetRecordFile(os.path.join('testdata', 'perf_with_symbols.data')) 80733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 80833275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui def tearDown(self): 80933275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.report_lib.Close() 81033275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 81133275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui def test_build_id(self): 81233275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui build_id = self.report_lib.GetBuildIdForPath('/data/t2') 81333275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(build_id, '0x70f1fe24500fc8b0d9eb477199ca1ca21acca4de') 81433275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 8152c79347a019a3885245cffb12893b368adc20211Yabin Cui def test_symbol(self): 81633275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui found_func2 = False 81733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui while self.report_lib.GetNextSample(): 81833275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui sample = self.report_lib.GetCurrentSample() 81933275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui symbol = self.report_lib.GetSymbolOfCurrentSample() 82033275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui if symbol.symbol_name == 'func2(int, int)': 82133275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui found_func2 = True 82233275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(symbol.symbol_addr, 0x4004ed) 8232c79347a019a3885245cffb12893b368adc20211Yabin Cui self.assertEqual(symbol.symbol_len, 0x14) 82433275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertTrue(found_func2) 82533275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 82633275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui def test_sample(self): 82733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui found_sample = False 82833275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui while self.report_lib.GetNextSample(): 82933275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui sample = self.report_lib.GetCurrentSample() 83033275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui if sample.ip == 0x4004ff and sample.time == 7637889424953: 83133275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui found_sample = True 83233275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(sample.pid, 15926) 83333275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(sample.tid, 15926) 83433275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(sample.thread_comm, 't2') 83533275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(sample.cpu, 5) 83633275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(sample.period, 694614) 83733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui event = self.report_lib.GetEventOfCurrentSample() 83833275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(event.name, 'cpu-cycles') 83933275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui callchain = self.report_lib.GetCallChainOfCurrentSample() 84033275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(callchain.nr, 0) 84133275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertTrue(found_sample) 84233275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 84333275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui def test_meta_info(self): 84433275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.report_lib.SetRecordFile(os.path.join('testdata', 'perf_with_trace_offcpu.data')) 84533275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui meta_info = self.report_lib.MetaInfo() 84680a1e12868bed96aaef78ce5d4abac42e56625baYabin Cui self.assertTrue("simpleperf_version" in meta_info) 84733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(meta_info["system_wide_collection"], "false") 84833275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(meta_info["trace_offcpu"], "true") 84933275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertEqual(meta_info["event_type_info"], "cpu-cycles,0,0\nsched:sched_switch,2,47") 85080a1e12868bed96aaef78ce5d4abac42e56625baYabin Cui self.assertTrue("product_props" in meta_info) 85133275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 85233275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui def test_event_name_from_meta_info(self): 853fd98e54a25cc5907f3f346e8744b85c0281181d4Yabin Cui self.report_lib.SetRecordFile(os.path.join('testdata', 'perf_with_tracepoint_event.data')) 85433275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui event_names = set() 85533275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui while self.report_lib.GetNextSample(): 85633275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui event_names.add(self.report_lib.GetEventOfCurrentSample().name) 85733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertTrue('sched:sched_switch' in event_names) 85833275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.assertTrue('cpu-cycles' in event_names) 85933275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 86080a1e12868bed96aaef78ce5d4abac42e56625baYabin Cui def test_record_cmd(self): 86180a1e12868bed96aaef78ce5d4abac42e56625baYabin Cui self.report_lib.SetRecordFile(os.path.join('testdata', 'perf_with_trace_offcpu.data')) 86280a1e12868bed96aaef78ce5d4abac42e56625baYabin Cui self.assertEqual(self.report_lib.GetRecordCmd(), 86380a1e12868bed96aaef78ce5d4abac42e56625baYabin Cui "/data/local/tmp/simpleperf record --trace-offcpu --duration 2 -g ./simpleperf_runtest_run_and_sleep64") 86480a1e12868bed96aaef78ce5d4abac42e56625baYabin Cui 86533275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui def test_offcpu(self): 86633275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui self.report_lib.SetRecordFile(os.path.join('testdata', 'perf_with_trace_offcpu.data')) 86733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui total_period = 0 86833275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui sleep_function_period = 0 86933275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui sleep_function_name = "SleepFunction(unsigned long long)" 87033275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui while self.report_lib.GetNextSample(): 87133275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui sample = self.report_lib.GetCurrentSample() 87233275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui total_period += sample.period 87333275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui if self.report_lib.GetSymbolOfCurrentSample().symbol_name == sleep_function_name: 87433275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui sleep_function_period += sample.period 87533275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui continue 87633275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui callchain = self.report_lib.GetCallChainOfCurrentSample() 87733275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui for i in range(callchain.nr): 87833275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui if callchain.entries[i].symbol.symbol_name == sleep_function_name: 87933275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui sleep_function_period += sample.period 88033275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui break 881bf1dd36838f4244e0934ca3c193889ae74a7c116Yabin Cui self.assertEqual(self.report_lib.GetEventOfCurrentSample().name, 'cpu-cycles') 88233275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui sleep_percentage = float(sleep_function_period) / total_period 88380a1e12868bed96aaef78ce5d4abac42e56625baYabin Cui self.assertGreater(sleep_percentage, 0.30) 88433275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 88533275782e8c0fe3f7116236c5353beb0914b4d30Yabin Cui 886c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cuiclass TestRunSimpleperfOnDevice(TestBase): 887c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui def test_smoke(self): 888c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui self.run_cmd(['run_simpleperf_on_device.py', 'list', '--show-features']) 889c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui 890c4dc4367daa0f25db7152ff51e8ba36263b2881cYabin Cui 891b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cuiclass TestTools(unittest.TestCase): 892a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui def test_addr2nearestline(self): 893b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui binary_cache_path = 'testdata' 894b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui test_map = { 895b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui '/simpleperf_runtest_two_functions_arm64': [ 896b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui { 897b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'func_addr': 0x668, 898b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'addr': 0x668, 899b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'source': 'system/extras/simpleperf/runtest/two_functions.cpp:20', 900b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui }, 901b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui { 902b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'func_addr': 0x668, 903b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'addr': 0x6a4, 904b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'source': """system/extras/simpleperf/runtest/two_functions.cpp:7 905b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui system/extras/simpleperf/runtest/two_functions.cpp:22""", 906b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui }, 907b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui ], 908b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui '/simpleperf_runtest_two_functions_arm': [ 909b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui { 910b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'func_addr': 0x784, 911b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'addr': 0x7b0, 912b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'source': """system/extras/simpleperf/runtest/two_functions.cpp:14 913b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui system/extras/simpleperf/runtest/two_functions.cpp:23""", 914b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui }, 915b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui { 916b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'func_addr': 0x784, 917b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'addr': 0x7d0, 918b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'source': """system/extras/simpleperf/runtest/two_functions.cpp:15 919b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui system/extras/simpleperf/runtest/two_functions.cpp:23""", 920b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui } 921b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui ], 922b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui '/simpleperf_runtest_two_functions_x86_64': [ 923b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui { 924b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'func_addr': 0x840, 925b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'addr': 0x840, 926b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'source': 'system/extras/simpleperf/runtest/two_functions.cpp:7', 927b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui }, 928b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui { 929b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'func_addr': 0x920, 930b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'addr': 0x94a, 931b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'source': """system/extras/simpleperf/runtest/two_functions.cpp:7 932b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui system/extras/simpleperf/runtest/two_functions.cpp:22""", 933b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui } 934b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui ], 935b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui '/simpleperf_runtest_two_functions_x86': [ 936b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui { 937b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'func_addr': 0x6d0, 938b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'addr': 0x6da, 939b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'source': 'system/extras/simpleperf/runtest/two_functions.cpp:14', 940b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui }, 941b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui { 942b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'func_addr': 0x710, 943b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'addr': 0x749, 944b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 'source': """system/extras/simpleperf/runtest/two_functions.cpp:8 945b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui system/extras/simpleperf/runtest/two_functions.cpp:22""", 946b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui } 947b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui ], 948b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui } 949b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui addr2line = Addr2Nearestline(None, binary_cache_path) 950b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui for dso_path in test_map: 951b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui test_addrs = test_map[dso_path] 952b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui for test_addr in test_addrs: 953b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui addr2line.add_addr(dso_path, test_addr['func_addr'], test_addr['addr']) 954b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui addr2line.convert_addrs_to_lines() 955b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui for dso_path in test_map: 956b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui dso = addr2line.get_dso(dso_path) 957b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui self.assertTrue(dso is not None) 958b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui test_addrs = test_map[dso_path] 959b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui for test_addr in test_addrs: 960b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui source_str = test_addr['source'] 961b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui expected_source = [] 962b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui for line in source_str.split('\n'): 963b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui items = line.split(':') 964b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui expected_source.append((items[0].strip(), int(items[1]))) 965fd98e54a25cc5907f3f346e8744b85c0281181d4Yabin Cui actual_source = addr2line.get_addr_source(dso, test_addr['addr']) 966b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui self.assertTrue(actual_source is not None) 967b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui self.assertEqual(len(actual_source), len(expected_source)) 968b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui for i in range(len(expected_source)): 969fd98e54a25cc5907f3f346e8744b85c0281181d4Yabin Cui actual_file_path, actual_line = actual_source[i] 970b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui self.assertEqual(actual_file_path, expected_source[i][0]) 971b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui self.assertEqual(actual_line, expected_source[i][1]) 972b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 973a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui def test_objdump(self): 974a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui binary_cache_path = 'testdata' 975a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui test_map = { 976a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui '/simpleperf_runtest_two_functions_arm64': { 977a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'start_addr': 0x668, 978a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'len': 116, 979a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'expected_items': [ 980a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ('main():', 0), 981a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ('system/extras/simpleperf/runtest/two_functions.cpp:20', 0), 982a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui (' 694: add x20, x20, #0x6de', 0x694), 983a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ], 984a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui }, 985a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui '/simpleperf_runtest_two_functions_arm': { 986a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'start_addr': 0x784, 987a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'len': 80, 988a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'expected_items': [ 989a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ('main():', 0), 990a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ('system/extras/simpleperf/runtest/two_functions.cpp:20', 0), 991a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui (' 7ae: bne.n 7a6 <main+0x22>', 0x7ae), 992a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ], 993a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui }, 994a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui '/simpleperf_runtest_two_functions_x86_64': { 995a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'start_addr': 0x920, 996a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'len': 201, 997a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'expected_items': [ 998a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ('main():', 0), 999a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ('system/extras/simpleperf/runtest/two_functions.cpp:20', 0), 1000a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui (' 96e: mov %edx,(%rbx,%rax,4)', 0x96e), 1001a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ], 1002a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui }, 1003a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui '/simpleperf_runtest_two_functions_x86': { 1004a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'start_addr': 0x710, 1005a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'len': 98, 1006a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 'expected_items': [ 1007a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ('main():', 0), 1008a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ('system/extras/simpleperf/runtest/two_functions.cpp:20', 0), 1009a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui (' 748: cmp $0x5f5e100,%ebp', 0x748), 1010a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui ], 1011a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui }, 1012a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui } 1013a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui objdump = Objdump(None, binary_cache_path) 1014a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui for dso_path in test_map: 1015a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui dso_info = test_map[dso_path] 1016a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui disassemble_code = objdump.disassemble_code(dso_path, dso_info['start_addr'], 1017a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui dso_info['len']) 1018a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui self.assertTrue(disassemble_code) 1019a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui for item in dso_info['expected_items']: 1020a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui self.assertTrue(item in disassemble_code) 1021a5d0dab6f8c840d1c0ed0a4bd177351d59689ef7Yabin Cui 1022b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui 1023d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuidef main(): 1024d66938df696cc035b6b7895055acbc8a519c8db2Yabin Cui os.chdir(get_script_dir()) 1025d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui build_testdata() 1026d66938df696cc035b6b7895055acbc8a519c8db2Yabin Cui if AdbHelper().get_android_version() < 7: 1027d66938df696cc035b6b7895055acbc8a519c8db2Yabin Cui log_info("Skip tests on Android version < N.") 1028d66938df696cc035b6b7895055acbc8a519c8db2Yabin Cui sys.exit(0) 10297cb6f297ae5d527b7e83472bf2e58b821be5b706Yabin Cui unittest.main(failfast=True) 1030d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cui 1031d97a532cb291aa8c5b5b1f000052c581faa50f29Yabin Cuiif __name__ == '__main__': 1032b35b0613db3b329b48e89de2315f0f5402c83101Yabin Cui main() 1033