#!/bin/bash -ex # This script tests the patching functionality of Shorebird. # It creates a new empty, flutter project, initializes Shorebird, # creates a new release, patches the release, and then ensures # that the patch was applied correctly. # # Pre-requisites: # - Flutter must be installed. # - Android SDK must be installed. # - ADB must be installed and be part of PATH. # - Android emulator must be running. # - Shorebird must be installed. # # Usage: ./patch_e2e.sh FLUTTER_VERSION=$1 # Intentionally including a space in the path. TEMP_DIR=$(mktemp -d -t 'shorebird workspace-XXXXX') cd "$TEMP_DIR" # Create a new empty flutter project flutter create e2e_test --empty --platforms android cd e2e_test # Replace the contents of "lib/main.dart" with a single print statement. echo "void main() { print('hello world'); }" >lib/main.dart # Initialize Shorebird shorebird init --force -v # Point to the development environment echo "base_url: https://api-dev.shorebird.dev" >> shorebird.yaml # Extract the app_id from the "shorebird.yaml" APP_ID=$(cat shorebird.yaml | grep 'app_id:' | awk '{print $2}') # Create a new release on Android shorebird release android --flutter-version=$FLUTTER_VERSION -v # Run the app on Android and ensure that the print statement is printed. while IFS= read line; do if [[ "$line" == *"I flutter : hello world"* ]]; then adb kill-server echo "✅ 'hello world' was printed" break fi done < <(shorebird preview --release-version 0.1.0+1 --app-id $APP_ID --platform android) # Replace lib/main.dart "hello world" to "hello shorebird" sed -i 's/hello world/hello shorebird/g' lib/main.dart echo "lib/main.dart is now:" cat lib/main.dart # Create a patch shorebird patch android -v # Run the app on Android and ensure that the original print statement is printed. while IFS= read line; do if [[ "$line" == *"Patch 1 successfully"* ]]; then # Kill the app so we can boot the patch adb shell am force-stop com.example.e2e_test echo "✅ Patch 1 successfully installed" break fi done < <(shorebird preview --release-version 0.1.0+1 --app-id $APP_ID --platform android) # Re-run the app, *not* using shorebird preview, as that installs the base release. adb shell monkey -p com.example.e2e_test -c android.intent.category.LAUNCHER 1 # Re-run the app on Android and ensure that the new print statement is printed, # tailing adb logs and printing the last 10 seconds of logs in case the # "hello shorebird" statement was printed before entering the loop. while IFS= read line; do if [[ "$line" == *"I flutter : hello shorebird"* ]]; then adb kill-server echo "✅ 'hello shorebird' was printed" break fi done < <(adb logcat -T '10.0') echo "✅ All tests passed!" exit 0