blob: a663f5f351df3d08f87c3f2d5b0aeee60df3af62 [file] [view]
# 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.
- **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**: Build the test APK:
`autoninja -C out/Default chrome_public_test_apk`
Run all tests in a directory:
`out/Default/bin/run_chrome_public_test_apk -f "org.chromium.chrome.browser.webapps.*"`
`out/Default/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 a 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`,
`WebappDataStorage`, and `WebApkSyncService`.
**How to Run**:
`out/Default/bin/run_chrome_junit_tests -f "org.chromium.chrome.browser.webapps.*"`
`out/Default/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*"`