Skip to content

Commit

Permalink
ci: run flutter test integration_test across platforms
Browse files Browse the repository at this point in the history
  • Loading branch information
phlip9 committed Jun 1, 2024
1 parent 1891e70 commit 76566fe
Show file tree
Hide file tree
Showing 3 changed files with 189 additions and 36 deletions.
190 changes: 169 additions & 21 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,28 +53,32 @@ jobs:
os: macos
- target: linux
os: ubuntu
- target: windows
os: windows

# Windows build failing
# - target: windows
# os: windows
steps:
- uses: actions/checkout@v4
with:
submodules: recursive

# (Android-only) Setup java
- uses: actions/[email protected]
- name: (iOS/macOS-only) Copy zxing src to ios/macos flutter build dir
if: matrix.target == 'ios' || matrix.target == 'macos'
run: ./scripts/update_ios_macos_src.sh

- name: (Android-only) Setup Java
uses: actions/setup-java@v4
if: matrix.target == 'android'
with:
java-version: 11
distribution: temurin

# (Linux-only) Install required Flutter dependencies
- name: 'Setup Linux'
- name: (Linux-only) Install Flutter apt dependencies
if: matrix.target == 'linux' && matrix.os == 'ubuntu'
run: |
sudo apt update
sudo apt install -y cmake dbus libblkid-dev libgtk-3-dev liblzma-dev ninja-build pkg-config xvfb
sudo apt install -y network-manager upower
if: matrix.target == 'linux'
sudo apt install -y \
cmake dbus libblkid-dev libgtk-3-dev liblzma-dev ninja-build \
pkg-config xvfb network-manager upower
# Setup flutter
- uses: subosito/flutter-action@v2
Expand All @@ -90,27 +94,171 @@ jobs:

- name: 'Build example ${{ matrix.target }}'
run: |
flutter config --enable-windows-desktop
flutter config --enable-macos-desktop
flutter config --enable-linux-desktop
cd example
TARGET=${{ matrix.target }}
case $TARGET in
ios)
flutter build ios --no-codesign
flutter build ios --debug --no-codesign
;;
macos)
flutter build macos
flutter build macos --debug
;;
android)
flutter build appbundle
flutter build appbundle --debug
;;
linux)
flutter build linux
;;
windows)
flutter build windows
flutter build linux --debug
;;
# Windows build failing
# windows)
# flutter build windows --debug
# ;;
esac
# Run `cd ./example && flutter test integration_test` across supported
# platforms, (except android, which has its own flow below).
test-example:
name: 'test-example (${{ matrix.target }}, ${{ matrix.os }})'
runs-on: ${{ matrix.os }}-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
- target: ios
os: macos
device: iphone

- target: macos
os: macos
device: macos

- target: linux
os: ubuntu
device: linux

# Windows build failing
# - target: windows
# os: windows
# device: windows
steps:
- uses: actions/checkout@v4
with:
submodules: recursive

- name: (iOS/macOS-only) Copy zxing src to ios/macos flutter build dir
if: matrix.target == 'ios' || matrix.target == 'macos'
run: ./scripts/update_ios_macos_src.sh

# Setup flutter
- uses: subosito/flutter-action@v2
with:
channel: "stable"
cache: true

# Setup melos
- uses: bluefireteam/melos-action@v3
with:
run-bootstrap: true
enforce-lockfile: true

- name: (Linux-only) Install Flutter apt dependencies
if: matrix.target == 'linux' && matrix.os == 'ubuntu'
run: |
sudo apt update
sudo apt install -y \
cmake dbus libblkid-dev libgtk-3-dev liblzma-dev ninja-build \
pkg-config xvfb network-manager upower
- name: (iOS-only) Launch iOS simulator
if: matrix.target == 'ios'
run: |
# # List available iOS simulator devices and runtimes
# xcrun simctl list devices available --json
simulator_id=$(xcrun simctl create iphone-zxing \
com.apple.CoreSimulator.SimDeviceType.iPhone-15 \
com.apple.CoreSimulator.SimRuntime.iOS-17-5)
xcrun simctl boot ${simulator_id}
- run: flutter devices

- if: matrix.target != 'linux'
run: cd ./example && flutter test integration_test -d "${{ matrix.device }}" --verbose
- if: matrix.target == 'linux'
run: cd ./example && xvfb-run flutter test integration_test -d "${{ matrix.device }}" --verbose

# Run `cd ./example && flutter test integration_test` on an Android emulator.
# Android has a lot of extra steps, so it has its own section.
test-example-android:
name: 'test-example (android v${{ matrix.api-level}}, ubuntu)'
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
api-level: [21]

steps:
- uses: actions/checkout@v4
with:
submodules: recursive

- name: Setup Java
uses: actions/setup-java@v4
with:
java-version: 11
distribution: temurin

# Setup flutter
- uses: subosito/flutter-action@v2
with:
channel: "stable"
cache: true

# Setup melos
- uses: bluefireteam/melos-action@v3
with:
run-bootstrap: true
enforce-lockfile: true

# Enable nested virtualization so we can run an Android emulator VM
- 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
# Gradle cache
- uses: gradle/actions/setup-gradle@v3

- name: Setup AVD actions/cache
uses: actions/cache@v4
id: avd-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: avd-${{ matrix.api-level }}

- name: Create and cache AVD snapshot
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-level }}
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: false
script: echo "Generated AVD snapshot for caching."

# Run tests on the android emulator
- name: flutter test integration_test
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-level }}
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
script: |
flutter devices
cd ./example && flutter test integration_test --verbose
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Flutter ZXing supports the following platforms:
- iOS (minimum iOS 11.0)
- MacOS (minimum osx 10.15) (beta)
- Linux (working, but [no camera support](https://pub.dev/packages/camera)) (alpha)
- Windows (working, but [no camera support](https://pub.dev/packages/camera)) (alpha)
- Windows (not working yet)
- Web (not working yet)

Note that flutter_zxing relies on the Dart FFI (Foreign Function Interface) feature, which is currently only available for the mobile and desktop platforms. As a result, the plugin is not currently supported on the web platform.
Expand Down Expand Up @@ -84,8 +84,7 @@ melos bootstrap
To allow the building on iOS and MacOS, you need to run the following command:

```bash
cd scripts
sh update_ios_macos_src.sh
./scripts/update_ios_macos_src.sh
```

To run the integration tests:
Expand Down
30 changes: 18 additions & 12 deletions scripts/update_ios_macos_src.sh
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@
#!/usr/bin/env bash

set -euxo pipefail

# This script copies the source files from the src directory to the ios and macos directories.
# Should be run every time the src directory files are updated.

srcPath="../src"
zxingPath="$srcPath/zxing/core/src"
iosSrcPath="../ios/Classes/src"
macosSrcPath="../macos/Classes/src"
REPO_DIR="$(git rev-parse --show-toplevel)"

SRC_DIR="$REPO_DIR/src"
ZXING_SRC_DIR="$REPO_DIR/src/zxing/core/src"
IOS_SRC_DIR="$REPO_DIR/ios/Classes/src"
MACOS_SRC_PATH="$REPO_DIR/macos/Classes/src"

# Remove the source files if they exist
rm -rf $iosSrcPath
rm -rf $macosSrcPath
rm -rf "$IOS_SRC_DIR"
rm -rf "$MACOS_SRC_PATH"

# create the source directories
mkdir -p $iosSrcPath
mkdir -p $macosSrcPath
mkdir -p "$IOS_SRC_DIR"
mkdir -p "$MACOS_SRC_PATH"

# Copy the source files
rsync -av --exclude '*.txt' --exclude "zxing/" "$srcPath/" "$iosSrcPath/"
rsync -av "$zxingPath/" "$iosSrcPath/zxing/"
rsync -av --exclude '*.txt' --exclude "zxing/" "$SRC_DIR/" "$IOS_SRC_DIR/"
rsync -av "$ZXING_SRC_DIR/" "$IOS_SRC_DIR/zxing/"

rsync -av --exclude '*.txt' --exclude "zxing/" "$srcPath/" "$macosSrcPath/"
rsync -av "$zxingPath/" "$macosSrcPath/zxing/"
rsync -av --exclude '*.txt' --exclude "zxing/" "$SRC_DIR/" "$MACOS_SRC_PATH/"
rsync -av "$ZXING_SRC_DIR/" "$MACOS_SRC_PATH/zxing/"

0 comments on commit 76566fe

Please sign in to comment.