Files
shorebird-workspace/scripts/verify_ios_interpreter_route_validator.sh

122 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/ios-route-validator.XXXXXX")"
trap 'rm -rf "$TMP_DIR"' EXIT
IOS_ENGINE_DIR="$TMP_DIR/ios_release"
HOST_ENGINE_DIR="$TMP_DIR/host_release_arm64"
mkdir -p "$IOS_ENGINE_DIR" "$HOST_ENGINE_DIR"
cat > "$IOS_ENGINE_DIR/args.gn" <<'EOF'
target_os = "android"
target_os = "ios"
dart_dynamic_modules = false
dart_enable_aot_patching = false
dart_enable_aot_patching = true
dart_enable_shorebird_interpreter = false
dart_enable_shorebird_interpreter = true
shorebird_use_interpreter = false
shorebird_use_interpreter = true
shorebird_enable_aot_patching = true
shorebird_enable_aot_patching = false
flutter_prebuilt_dart_sdk = false
EOF
cat > "$HOST_ENGINE_DIR/args.gn" <<'EOF'
target_os = "linux"
target_os = "mac"
dart_dynamic_modules = false
dart_enable_aot_patching = false
dart_enable_aot_patching = true
dart_enable_shorebird_interpreter = false
dart_enable_shorebird_interpreter = true
shorebird_use_interpreter = false
shorebird_use_interpreter = true
flutter_prebuilt_dart_sdk = false
EOF
write_artifact() {
local path="$1"
local runtime_mode="$2"
local target_os="${3:-ios}"
cat > "$path" <<EOF
{
"format": "open-aot-vmcode-encrypted-v1",
"metadata": {
"app_id": "app.test",
"app_build_id": "1",
"flavor_id": "pro",
"license_type": "pro",
"sdk_hash": "sdk",
"base_snapshot_hash": "0000000000000000000000000000000000000000000000000000000000000000",
"patch_snapshot_hash": "1111111111111111111111111111111111111111111111111111111111111111",
"target_os": "$target_os",
"target_arch": "arm64",
"runtime_mode": "$runtime_mode"
},
"payload_kind": "full-snapshot",
"reconstructed_size": 4,
"payload_sha256": "2222222222222222222222222222222222222222222222222222222222222222",
"encrypted_payload_base64": "AQIDBA==",
"encryption": {
"algorithm": "AES-256-GCM",
"key_id": "test-key",
"nonce_base64": "AQIDBAUGBwgJCgsM",
"tag_base64": "AQIDBAUGBwgJCgsMDQ4PEA==",
"aad_sha256": "3333333333333333333333333333333333333333333333333333333333333333"
}
}
EOF
}
valid_artifact="$TMP_DIR/valid.vmcode"
write_artifact "$valid_artifact" "dart-bytecode-interpreter"
IOS_ENGINE_DIR="$IOS_ENGINE_DIR" \
HOST_ENGINE_DIR="$HOST_ENGINE_DIR" \
IOS_PATCH_ARTIFACT="$valid_artifact" \
"$ROOT/scripts/verify_ios_interpreter_route.sh" >/dev/null
bad_runtime="$TMP_DIR/bad-runtime.vmcode"
write_artifact "$bad_runtime" "dart-dynamic-modules"
if IOS_ENGINE_DIR="$IOS_ENGINE_DIR" \
HOST_ENGINE_DIR="$HOST_ENGINE_DIR" \
IOS_PATCH_ARTIFACT="$bad_runtime" \
"$ROOT/scripts/verify_ios_interpreter_route.sh" >/dev/null 2>&1; then
echo "iOS route validator unexpectedly accepted DART_DYNAMIC_MODULES metadata" >&2
exit 70
fi
bad_target="$TMP_DIR/bad-target.vmcode"
write_artifact "$bad_target" "dart-bytecode-interpreter" "android"
if IOS_ENGINE_DIR="$IOS_ENGINE_DIR" \
HOST_ENGINE_DIR="$HOST_ENGINE_DIR" \
IOS_PATCH_ARTIFACT="$bad_target" \
"$ROOT/scripts/verify_ios_interpreter_route.sh" >/dev/null 2>&1; then
echo "iOS route validator unexpectedly accepted a non-iOS patch artifact" >&2
exit 70
fi
bad_json="$TMP_DIR/bad-json.vmcode"
printf '{"format":"open-aot-vmcode-encrypted-v1"\n' > "$bad_json"
if IOS_ENGINE_DIR="$IOS_ENGINE_DIR" \
HOST_ENGINE_DIR="$HOST_ENGINE_DIR" \
IOS_PATCH_ARTIFACT="$bad_json" \
"$ROOT/scripts/verify_ios_interpreter_route.sh" >/dev/null 2>&1; then
echo "iOS route validator unexpectedly accepted malformed JSON" >&2
exit 70
fi
bad_native="$TMP_DIR/bad-native.vmcode"
printf '\xcf\xfa\xed\xfe' > "$bad_native"
if IOS_ENGINE_DIR="$IOS_ENGINE_DIR" \
HOST_ENGINE_DIR="$HOST_ENGINE_DIR" \
IOS_PATCH_ARTIFACT="$bad_native" \
"$ROOT/scripts/verify_ios_interpreter_route.sh" >/dev/null 2>&1; then
echo "iOS route validator unexpectedly accepted a Mach-O patch artifact" >&2
exit 70
fi
echo "iOS interpreter route validator smoke test passed"