blob: c3f7a58401d19a51b67bc6cdf081b38af7f2d505 [file] [log] [blame]
Perf profiling Test Framework
HOW DO I RUN THE TEST
To run the test it is simple you can run
ALL:
"bazel test //tools/base/profiler/tests/perf-test/..."
INDIVIDUAL:
"bazel test //tools/base/profiler/tests/perf-test:HttpTest"
"bazel test //tools/base/profiler/tests/perf-test:MemoryTest"
OPTIONAL ARGS:
"bazel test --test_output=all --nocache_test_results \
//tools/base/profiler/tests/..."
WHAT ARE THE COMPONENTS
APP-LAUNCHER
The app launcher is a simple program that acts as the android OS. The
launchers job is to act as the middle man between the test, and the
application we want to test. The app-launcher is loaded by art then
immediately sets up a web server as its communication channel. The test
framework can then issue commands to the app-launcher via http using
query parameters to do a number of things.
- attach-agent: This options is called by perfd when attaching an
agent via JVMTI.
- set-property: This option is called by the test framework to set
a system property in the framework. The current usecase for this
is to set the communication port for perfa to connect to perfd.
The format of this argument is set-property=property.name,property.value.
- load-dex: This expects a path accessible to the art runtime
(full file path to a dex file in the bazel sandbox) to load. The
dex will be loaded using any previous dex's loaded as the parent
class loader.
- launch-activity: This tells the app-launcher to find an activity
with the specified name and initialize the activity adding it to
the ActivityThread emulating what happens during activity launch
with an actual device.
PERF-TEST
The perf test module is the module that contains all source for
the test and test helper classes. A basic test launches art with
the app-launcher dex and a perfd instance. The test can then communicate
with these processes as Studio does by using grpc calls.
TEST-APP
The test app is our mock android application. This app can and should
use android apis that we are known to capture from our instrumentation.
We should be modifying the app, or adding additional test apps or
activities to emulate the behavior we want to simulate from our test.
HOW DO I ADD NEW TEST
NEW TEST CASE
To add a new test case it can be added to any test class (class ending
in Test) it will be executed when the rest of the junit test are.
NEW TEST APP
To add a new test app, first consider if what you are doing needs to
be a new app, or just a new activity in the app that is already being
loaded. In the case of a new activity the test just needs to call
launch-activity with your new activity name inplace of the default.
In the case of a new app, we need to generate a few new dex's of app.
One of these dex's will be used for JVMTI, to generate this dex it is
a simple build of the module. The other dex is to test the instrumented
APIs, with this we need to call a genrule that will run the instrumented
APIs over the jar then output a dex file.
NEW TEST SERIES
To add a new test series, a new test file should be created ending with
Test.java. New test series that dont extend PerfTestBase will be
responsible for setting up the PerfA process, PerfD process, and
setting all the proper config variables to ensure the processes are
pointing to the proper dex files, and AgentConfig.
CAN I MANUALLY LAUNCH THE TEST ENVIRONMENT
Yes, To do this you first should build "//tools/base/profiler/...".
In the output you can launch "perfd --config_file=[path to config]".
Followed by launching art with the following options
"art --64 --verbose -Dservice.address=[IP]:[port] \
-Dapp.communication.port=[port] \
-Djava.library.path=[path to agent folder]:[path to perfa dir] \
-cp [path to app-launcher.dex] \
-Xbootclasspath:[path to android-mock dex]:[path to framework jars]:\
-Xcompiler-option --debuggable \
-Ximage: [path to core-core-libart-hostdex.art] \
com.android.tools.profiler.AppMain"
You will need to create 2 files, 1 is an agentconfig proto, the other
is a device_properties.info file used to determine the device version.
After all is configured you will be able to interact with art via
http://127.0.0.1:[port]?...
You will be able to communicate with perfd via GRPC. Launching the
processes manually can be useful when trying to debug changes.