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