| # Testing Web Apps on Android | |
| This document describes how to test Android Web Apps (WebAPKs and TWAs) manually | |
| and via automated tests. | |
| ## Manual Testing on Emulator | |
| To test manually using an emulator: | |
| ### 1. Setup a Test PWA | |
| You can use a public PWA (like `https://pokedex.org`) or serve one locally. | |
| - **Using a public PWA**: No server setup needed! Just use the URL | |
| `https://pokedex.org`. | |
| - **Serving locally**: | |
| 1. Use Python to serve a directory with a manifest: | |
| `python3 -m http.server 8000`. | |
| 2. Forward the port to the emulator: `adb reverse tcp:8000 tcp:8000`. | |
| ### 2. Disable Verification for Testing | |
| To trust a TWA or WebAPK during local testing with developer builds, you must | |
| bypass Chrome's security checks. | |
| #### For TWAs (Digital Asset Links) | |
| Chrome requires DAL verification to run a TWA in app mode. To bypass this for a | |
| test URL: | |
| - Pass the flag to Chrome: | |
| `--disable-digital-asset-link-verification-for-url="https://pokedex.org"` | |
| - Example using build wrapper: | |
| `out/Default/bin/chrome_public_apk launch --args="--disable-digital-asset-link-verification-for-url=https://pokedex.org"` | |
| - Example using adb command line (requires "Enable command line on non-rooted | |
| devices" in `chrome://flags`): | |
| `adb shell "echo '_ --disable-digital-asset-link-verification-for-url=https://pokedex.org' > /data/local/tmp/chrome-command-line"` | |
| #### For WebAPKs (Signature Verification) | |
| Chrome verifies that WebAPKs are signed by the trusted WebAPK minting server. | |
| Locally built debug WebAPKs will fail this check. To bypass this: | |
| - Pass the flag to Chrome: `--skip-webapk-verification` | |
| - Example using build wrapper: | |
| `out/Default/bin/chrome_public_apk launch --args="--skip-webapk-verification"` | |
| ### 3. Install a Test TWA (via Bubblewrap) | |
| You can use [Bubblewrap](https://github.com/GoogleChromeLabs/bubblewrap) to | |
| generate an APK for your test site and install it: | |
| `adb install path/to/generated.apk` | |
| ### 4. Install a Test WebAPK (via Chrome) | |
| To test WebAPK installation: | |
| 1. Open Chrome on the emulator. | |
| 2. Navigate to your test PWA URL (e.g., `https://pokedex.org`). | |
| 3. Wait for the install prompt or select "Install app" from the Chrome menu. | |
| 4. Verify that the app is installed and appears in the app drawer. | |
| ### 5. Verify in Chrome Site Settings | |
| 1. Open the installed TWA or WebAPK on the emulator. | |
| 2. Go to Chrome > Settings > Site Settings > All Sites. | |
| 3. Look for your test site and see if it shows that it is managed by an app or | |
| has delegated permissions. | |
| ## Automated Tests | |
| Chromium has several test suites that cover Web App functionality on Android. To | |
| keep this guide maintainable, tests are grouped by directory and feature area. | |
| ### 1. Instrumentation Tests (Java/JUnit4) | |
| These tests run on an emulator or physical device to test UI, integration, and | |
| lifecycle. Unlike host-side JUnit tests below, instrumentation tests cannot run | |
| without an active device. | |
| #### Emulator Prerequisite | |
| To start the recommended local development emulator (x64 image, emulator window, | |
| and networking enabled): | |
| ```bash | |
| tools/android/avd/avd.py start -v \ | |
| --avd-config tools/android/avd/proto/android_google_apis_x64_local.textpb \ | |
| --emulator-window --no-read-only --enable-network | |
| ``` | |
| For more options and configuration details, see: | |
| - [Using an Android Emulator](/docs/android_emulator.md) | |
| - [Clank Noogler Guide: Step 5 - Start an emulator](http://go/clank-noogler/get_the_code_and_build_it.md#step-5-start-an-emulator) | |
| (Google internal) | |
| - [Clank Android Emulator Tips](http://go/clank-emulator) (Google internal) | |
| - **TWA and General Webapp UI/Lifecycle**: | |
| - **Directory**: | |
| [`chrome/android/javatests/src/org/chromium/chrome/browser/webapps/`](../../../chrome/android/javatests/src/org/chromium/chrome/browser/webapps/) | |
| - **Features**: WebAPK launch/update integration, splash screens, display | |
| modes, display cutout, and default offline behavior. | |
| - **Trusted Web Activities (TWA) & Permission Delegation**: | |
| - **Directory**: | |
| [`chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/`](../../../chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/) | |
| (and subdirectories like `permissiondelegation/`) | |
| - **Features**: TWA client verification, digital asset links, permission | |
| delegation (location, notifications, contacts), and post-launch | |
| verification. | |
| **How to Run**: Use `tools/autotest.py` to automatically compile and execute a | |
| test file: | |
| ```bash | |
| tools/autotest.py -C out/Android chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTest.java | |
| ``` | |
| Or build and run all tests in a directory via the test runner script: | |
| ```bash | |
| autoninja -C out/Android chrome_public_test_apk | |
| out/Android/bin/run_chrome_public_test_apk -f "org.chromium.chrome.browser.webapps.*" | |
| out/Android/bin/run_chrome_public_test_apk -f "org.chromium.chrome.browser.browserservices.*" | |
| ``` | |
| ### 2. Host-Side JUnit Tests (Java) | |
| These unit tests run on the development host JVM and test business logic, | |
| storage, and utility classes without requiring an emulator or device. | |
| - **Registration, Storage, and Lifecycle Logic**: | |
| - **Directories**: | |
| - [`chrome/android/junit/src/org/chromium/chrome/browser/webapps/`](../../../chrome/android/junit/src/org/chromium/chrome/browser/webapps/) | |
| - [`chrome/android/junit/src/org/chromium/chrome/browser/browserservices/`](../../../chrome/android/junit/src/org/chromium/chrome/browser/browserservices/) | |
| (including `permissiondelegation/` and `ui/`) | |
| - **Features**: `InstalledWebappRegistrar`, `InstalledWebappDataRegister`, and | |
| `WebappDataStorage`. | |
| **How to Run**: Use `tools/autotest.py`: | |
| ```bash | |
| tools/autotest.py -C out/Android chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappAuthenticatorTest.java | |
| ``` | |
| Or build and run via the test runner script: | |
| ```bash | |
| autoninja -C out/Android chrome_junit_tests | |
| out/Android/bin/run_chrome_junit_tests -f "org.chromium.chrome.browser.webapps.*" | |
| out/Android/bin/run_chrome_junit_tests -f "org.chromium.chrome.browser.browserservices.*" | |
| ``` | |
| ### 3. WebAPK Shell & Client Library Tests | |
| These tests focus on the WebAPK client-side library and the shell APK code. | |
| - **Directories**: | |
| - [`chrome/android/webapk/libs/client/junit/`](../../../chrome/android/webapk/libs/client/junit/) | |
| (Host-side JUnit) | |
| - [`chrome/android/webapk/libs/runtime_library/javatests/`](../../../chrome/android/webapk/libs/runtime_library/javatests/) | |
| (Instrumentation) | |
| - [`chrome/android/webapk/shell_apk/junit/`](../../../chrome/android/webapk/shell_apk/junit/) | |
| (Host-side JUnit) | |
| - [`chrome/android/webapk/shell_apk/javatests/`](../../../chrome/android/webapk/shell_apk/javatests/) | |
| (Instrumentation) | |
| - **Features**: WebAPK connection management, identity service, shell APK launch | |
| flows, and splash screens. | |
| **How to Run**: Check | |
| [`chrome/android/webapk/README.md`](../../../chrome/android/webapk/README.md) | |
| for instructions on running these specialized tests. | |
| ### 4. C++ Unit Tests (Android-specific) | |
| These tests cover the shared native code integration. | |
| - **Directories**: | |
| - [`components/webapps/browser/android/`](../browser/android/) | |
| - [`components/webapps/browser/banners/`](../browser/banners/) (Shared, but | |
| relevant to Android promotion) | |
| - [`components/webapps/browser/installable/`](../browser/installable/) | |
| (Shared, but relevant to Android installability) | |
| - **Features**: `Add-to-homescreen` data fetching, WebAPK proto building, icon | |
| hashing, and install prompt settings. | |
| **How to Run**: Build and run `components_unittests` on Android: | |
| `autoninja -C out/Default components_unittests` | |
| `out/Default/bin/run_components_unittests --gtest_filter="*AddToHomescreen*"` |