blob: 71131ab94cef017d7137a9fdcc8f7d7f7dc5c828 [file] [log] [blame] [view]
andybons3322f762015-08-24 21:37:091# Android Test Instructions
2
3Device Setup Tests are runnable on physical devices or emulators. See the
4instructions below for setting up either a physical device or an emulator.
5
6[TOC]
7
8## Physical Device Setup **ADB Debugging**
9
10In order to allow the ADB to connect to the device, you must enable USB
11debugging:
andybons22afb312015-08-31 02:24:5112
13* Before Android 4.1 (Jelly Bean):
14 * Go to "System Settings"
15 * Go to "Developer options"
16 * Check "USB debugging".
17 * Un-check "Verify apps over USB".
18* On Jelly Bean, developer options are hidden by default. To unhide them:
19 * Go to "About phone"
20 * Tap 10 times on "Build number"
21 * The "Developer options" menu will now be available.
22 * Check "USB debugging".
23 * Un-check "Verify apps over USB".
andybons3322f762015-08-24 21:37:0924
25### Screen
26
27You MUST ensure that the screen stays on while testing: `adb shell svc power
28stayon usb` Or do this manually on the device: Settings -> Developer options
29-> Stay Awake.
30
31If this option is greyed out, stay awake is probably disabled by policy. In that
32case, get another device or log in with a normal, unmanaged account (because the
33tests will break in exciting ways if stay awake is off).
34
35### Enable Asserts!
36
andybons22afb312015-08-31 02:24:5137 adb shell setprop debug.assert 1
andybons3322f762015-08-24 21:37:0938
39### Disable Verify Apps
40
41You may see a dialog like
42[this one](http://www.samsungmobileusa.com/simulators/ATT_GalaxyMega/mobile/screens/06-02_12.jpg),
43which states, _Google may regularly check installed apps for potentially harmful
44behavior._ This can interfere with the test runner. To disable this dialog, run:
45`adb shell settings put global package_verifier_enable 0`
46
47## Emulator Setup
48
49### Option 1:
50
51Use an emulator (i.e. Android Virtual Device, AVD): Enabling Intel's
52Virtualizaton support provides the fastest, most reliable emulator configuration
53available (i.e. x86 emulator with GPU acceleration and KVM support).
thestigf51ad752015-11-11 18:08:4954Remember to build with `target_arch=ia32` for x86. Otherwise installing the APKs
55will fail with `INSTALL_FAILED_NO_MATCHING_ABIS`.
andybons3322f762015-08-24 21:37:0956
571. Enable Intel Virtualization support in the BIOS.
58
592. Set up your environment:
60
61 ```shell
62 . build/android/envsetup.sh
63 ```
64
653. Install emulator deps:
66
67 ```shell
thestigf51ad752015-11-11 18:08:4968 build/android/install_emulator_deps.py --api-level=23
andybons3322f762015-08-24 21:37:0969 ```
70
71 This script will download Android SDK and place it a directory called
72 android\_tools in the same parent directory as your chromium checkout. It
73 will also download the system-images for the emulators (i.e. arm and x86).
74 Note that this is a different SDK download than the Android SDK in the
75 chromium source checkout (i.e. src/third\_party/android\_emulator\_sdk).
76
774. Run the avd.py script. To start up _num_ emulators use -n. For non-x86 use
78 --abi.
79
80 ```shell
thestigf51ad752015-11-11 18:08:4981 build/android/avd.py --api-level=23
andybons3322f762015-08-24 21:37:0982 ```
83
84 This script will attempt to use GPU emulation, so you must be running the
85 emulators in an environment with hardware rendering available. See
86 `avd.py --help` for more details.
87
88### Option 2:
89
90Alternatively, you can create an run your own emulator using the tools provided
91by the Android SDK. When doing so, be sure to enable GPU emulation in hardware
92settings, since Chromium requires it to render.
93
94## Building Tests
95
96It may not be immediately obvious where your test code gets compiled to, so here
97are some general rules:
98
ruudab93325b2015-11-05 17:17:3399* If your test code lives under /base, it will be built as part of the
100 base_unittests_apk.
andybons3322f762015-08-24 21:37:09101* If your test code lives under /content, it will probably be built as part of
andybons22afb312015-08-31 02:24:51102 the content_shell_test_apk
103* If your test code lives under /chrome (or higher), it will probably be built
104 as part of the chrome_public_test_apk
105* (Please fill in more details here if you know them).
andybons3322f762015-08-24 21:37:09106
andybons22afb312015-08-31 02:24:51107 NB: We used to call the chrome_public_test_apk the
108 chromium_shell_test_apk. There may still be references to this kicking
109 around, but wherever you see chromium_shell_test you should replace with
110 chrome_public_test.
andybons3322f762015-08-24 21:37:09111
112Once you know what to build, just do it like you normally would build anything
newt17e4d242015-08-27 09:07:26113else, e.g.: `ninja -C out/Release chrome_public_test_apk`
andybons3322f762015-08-24 21:37:09114
115## Running Tests
116
jbudorick9472f112016-01-27 16:21:56117All functional tests are run using `build/android/test_runner.py`, either
118directly or via a generated wrapper script in `<output directory>/bin/`.
andybons3322f762015-08-24 21:37:09119Tests are sharded across all attached devices. In order to run tests, call:
120`build/android/test_runner.py <test_type> [options]`
jbudorick9472f112016-01-27 16:21:56121(or `<generated wrapper script> [options]`).
andybons3322f762015-08-24 21:37:09122For a list of valid test types, see `test_runner.py --help`. For
123help on a specific test type, run `test_runner.py <test_type> --help`.
124
125The commands used by the buildbots are printed in the logs. Look at
126http://build.chromium.org/ to duplicate the same test command as a particular
127builder.
128
129If you build in an output directory other than "out", you may have to tell
130test\_runner.py where you place it. Say you build your android code in
131out\_android, then do `export CHROMIUM_OUT_DIR=out_android` before running the
rouslanedd69102015-09-21 23:54:54132command below. You have to do this even if your "out" directory is a symlink
mlamouri0fbd6cd2015-10-26 12:08:11133pointing to "out_android". You can also use `--output-directory` to point to the
134path of your output directory, for example,
jbudorick9472f112016-01-27 16:21:56135`--output-directory=out_android/Debug`. (The generated wrapper scripts handle
136this automatically.)
andybons3322f762015-08-24 21:37:09137
138## INSTALL\_FAILED\_CONTAINER\_ERROR or INSTALL\_FAILED\_INSUFFICIENT\_STORAGE
139
140If you see this error when test\_runner.py is attempting to deploy the test
141binaries to the AVD emulator, you may need to resize your userdata partition
142with the following commands:
143
144```shell
davve7ae32cd2015-09-22 06:54:09145# Resize userdata partition to be 1G
thestigf51ad752015-11-11 18:08:49146resize2fs android_emulator_sdk/sdk/system-images/android-23/x86/userdata.img 1G
andybons3322f762015-08-24 21:37:09147
148# Set filesystem parameter to continue on errors; Android doesn't like some
149# things e2fsprogs does.
thestigf51ad752015-11-11 18:08:49150tune2fs -e continue android_emulator_sdk/sdk/system-images/android-23/x86/userdata.img
andybons3322f762015-08-24 21:37:09151```
152
153## Symbolizing Crashes
154
155Crash stacks are logged and can be viewed using adb logcat. To symbolize the
jyasskinc1c76ff2015-12-18 21:39:52156traces, define `CHROMIUM_OUTPUT_DIR=$OUTDIR` where `$OUTDIR` is the argument you
157pass to `ninja -C`, and pipe the output through
158`third_party/android_platform/development/scripts/stack`. If
159`$CHROMIUM_OUTPUT_DIR` is unset, the script will search `out/Debug` and
160`out/Release`. For example:
161
162```shell
163# If you build with
164ninja -C out/Debug chrome_public_test_apk
165# You can run:
166adb logcat -d | third_party/android_platform/development/scripts/stack
167
168# If you build with
169ninja -C out/android chrome_public_test_apk
170# You can run:
171adb logcat -d | CHROMIUM_OUTPUT_DIR=out/android third_party/android_platform/development/scripts/stack
172# or
173export CHROMIUM_OUTPUT_DIR=out/android
174adb logcat -d | third_party/android_platform/development/scripts/stack
175```
andybons3322f762015-08-24 21:37:09176
mlamouri0fbd6cd2015-10-26 12:08:11177## JUnit tests
178
179JUnit tests are Java unittests running on the host instead of the target device.
180They are faster to run and therefore are recommended over instrumentation tests
181when possible.
182
183The JUnits tests are usually following the pattern of *target*\_junit\_tests,
184for example, `content_junit_tests` and `chrome_junit_tests`.
185
186When adding a new JUnit test, the associated `BUILD.gn` file must be updated.
187For example, adding a test to `chrome_junit_tests` requires to update
188`chrome/android/BUILD.gn`. If you are a GYP user, you will not need to do that
189step in order to run the test locally but it is still required for GN users to
190run the test.
191
192```shell
193# Build the test suite.
194ninja -C out/Release chrome_junit_tests
195
196# Run the test suite.
197build/android/test_runner.py junit -s chrome_junit_tests --release -vvv
198
199# Run a subset of tests. You might need to pass the package name for some tests.
200build/android/test_runner.py junit -s chrome_junit_tests --release -vvv
201-f "org.chromium.chrome.browser.media.*"
202```
203
andybons3322f762015-08-24 21:37:09204## Gtests
205
206```shell
207# Build a test suite
208ninja -C out/Release content_unittests_apk
209
210# Run a test suite
jbudorick9472f112016-01-27 16:21:56211out/Release/bin/run_content_unittests [-vv]
andybons3322f762015-08-24 21:37:09212
213# Run a subset of tests
jbudorick9472f112016-01-27 16:21:56214out/Release/bin/run_content_unittests [-vv] --gtest-filter ByteStreamTest.*
andybons3322f762015-08-24 21:37:09215```
216
217## Instrumentation Tests
218
219In order to run instrumentation tests, you must leave your device screen ON and
220UNLOCKED. Otherwise, the test will timeout trying to launch an intent.
221Optionally you can disable screen lock under Settings -> Security -> Screen Lock
222-> None.
223
jbudorick9472f112016-01-27 16:21:56224Next, you need to build the app, build your tests, and then run your tests
225(which will install the APK under test and the test APK automatically).
andybons3322f762015-08-24 21:37:09226
227Examples:
228
229ContentShell tests:
230
231```shell
232# Build the code under test
233ninja -C out/Release content_shell_apk
234
235# Build the tests themselves
236ninja -C out/Release content_shell_test_apk
237
jbudorick9472f112016-01-27 16:21:56238# Run the test (will automagically install the APK under test and the test APK)
239out/Release/bin/run_content_shell_test_apk [-vv]
andybons3322f762015-08-24 21:37:09240```
241
newt17e4d242015-08-27 09:07:26242ChromePublic tests:
andybons3322f762015-08-24 21:37:09243
244```shell
245# Build the code under test
newt17e4d242015-08-27 09:07:26246ninja -C out/Release chrome_public_apk
andybons3322f762015-08-24 21:37:09247
248# Build the tests themselves
newt17e4d242015-08-27 09:07:26249ninja -C out/Release chrome_public_test_apk
andybons3322f762015-08-24 21:37:09250
jbudorick9472f112016-01-27 16:21:56251# Run the test (will automagically install the APK under test and the test APK)
252out/Release/bin/run_chrome_public_test_apk [-vv]
andybons3322f762015-08-24 21:37:09253```
254
255AndroidWebView tests:
256
257```shell
258ninja -C out/Release android_webview_apk
259ninja -C out/Release android_webview_test_apk
jbudorick9472f112016-01-27 16:21:56260out/Release/bin/run_android_webview_test_apk [-vv]
andybons3322f762015-08-24 21:37:09261```
262
jbudorick9472f112016-01-27 16:21:56263In order to run a subset of tests, use -f to filter based on test
andybons3322f762015-08-24 21:37:09264class/method or -A/-E to filter using annotations.
265
266Filtering examples:
267
268```shell
269# Run a test suite
jbudorick9472f112016-01-27 16:21:56270out/Debug/bin/run_content_shell_test_apk
andybons3322f762015-08-24 21:37:09271
272# Run a specific test class
jbudorick9472f112016-01-27 16:21:56273out/Debug/bin/run_content_shell_test_apk -f AddressDetectionTest.*
andybons3322f762015-08-24 21:37:09274
275# Run a specific test method
jbudorick9472f112016-01-27 16:21:56276out/Debug/bin/run_content_shell_test_apk -f \
andybons3322f762015-08-24 21:37:09277AddressDetectionTest#testAddressLimits
278
279# Run a subset of tests by size (Smoke, SmallTest, MediumTest, LargeTest,
280# EnormousTest)
jbudorick9472f112016-01-27 16:21:56281out/Debug/bin/run_content_shell_test_apk -A Smoke
andybons3322f762015-08-24 21:37:09282
283# Run a subset of tests by annotation, such as filtering by Feature
jbudorick9472f112016-01-27 16:21:56284out/Debug/bin/run_content_shell_test_apk -A Feature=Navigation
andybons3322f762015-08-24 21:37:09285```
286
287You might want to add stars `*` to each as a regular expression, e.g.
288`*`AddressDetectionTest`*`
289
290## Running Blink Layout Tests
291
292See
293https://sites.google.com/a/chromium.org/dev/developers/testing/webkit-layout-tests
294
295## Running GPU tests
296
297(e.g. the "Android Debug (Nexus 7)" bot on the chromium.gpu waterfall)
298
299See http://www.chromium.org/developers/testing/gpu-testing for details. Use
300--browser=android-content-shell. Examine the stdio from the test invocation on
301the bots to see arguments to pass to src/content/test/gpu/run\_gpu\_test.py.