Skip to content

Android: unit tests for package install codepaths #218

Android: unit tests for package install codepaths

Android: unit tests for package install codepaths #218

Workflow file for this run

name: CI Tests
on:
pull_request:
workflow_dispatch:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: jdx/mise-action@v4
- name: Install dependencies
run: npm install
- name: Lint and type-check
run: npm run build:tests
- name: Check public API compatibility
run: npm run check:api-compat
android-unit-test:
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: jdx/mise-action@v4
- name: Cache npm packages
uses: actions/cache@v6
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json', 'test/test.ts') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Install dependencies
run: npm install
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Run Android unit tests
working-directory: android
run: ./gradlew :app:test
android-test:
needs: [lint, android-unit-test]
runs-on: bitrise-react-native-code-push-linux-runner
strategy:
matrix:
variant: [bare, expo]
include:
- variant: bare
test-command: test:android
- variant: expo
test-command: test:expo:android
steps:
- uses: actions/checkout@v7
- uses: jdx/mise-action@v4
- name: Cache npm packages
uses: actions/cache@v6
with:
path: ~/.npm
# Note about test.ts: some NPM package versions are hardcoded here and installed during the test run.
key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json', 'test/test.ts') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Install dependencies
run: npm install
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
with:
# This job's Gradle build lives in a test app generated at runtime by the test harness,
# not a project checked into this repo, so there's nothing meaningful for it to
# contribute back to the cache. Read-only avoids each matrix variant (bare/expo) writing
# its own redundant entry; it still reuses whatever android-unit-test wrote, since
# setup-gradle shares its cache across jobs in the same workflow run.
cache-read-only: true
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Add Android tools to PATH
run: |
echo "/usr/local/lib/android/sdk/emulator" >> $GITHUB_PATH
echo "/usr/local/lib/android/sdk/platform-tools" >> $GITHUB_PATH
- name: Run Android Tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 27
target: google_apis
arch: x86
disable-animations: true
# connectedAndroidTest is included here (rather than a separate job or step) to reuse
# this job's already-booted emulator, even though it means it runs once per matrix
# variant. The android-emulator-runner action has no post-cleanup step, so a second
# step would boot and tear down a second emulator; ::group:: markers keep the two
# test runs visually separated in the Actions log instead.
script: |
echo "::group::Instrumented tests"
(cd android && ./gradlew :app:connectedAndroidTest)
echo "::endgroup::"
echo "::group::E2E tests"
npm run ${{ matrix.test-command }}
echo "::endgroup::"
ios-test:
needs: lint
runs-on: bitrise-react-native-code-push-macos-runner
strategy:
matrix:
variant: [bare, expo]
include:
- variant: bare
test-command: test:ios
- variant: expo
test-command: test:expo:ios
steps:
- uses: actions/checkout@v7
- uses: jdx/mise-action@v4
- name: Cache npm packages
uses: actions/cache@v6
with:
path: ~/.npm
# Note about test.ts: some NPM package versions are hardcoded here and installed during the test run.
key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json', 'test/test.ts') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Run iOS Tests
run: |
npm install
npm run ${{ matrix.test-command }}
- name: Upload iOS Simulator crash reports
if: failure()
uses: actions/upload-artifact@v4
with:
name: ios-crash-logs-${{ matrix.variant }}
path: test/crash-logs/
if-no-files-found: ignore