#!/bin/sh # Hermetic negative-path tests for the sourceable Kepr release-gate helpers. # No Android SDK, Gradle project, signing key, network, or APK is required. set -eu SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) # shellcheck source=scripts/kepr-build-helpers.sh . "$SCRIPT_DIR/kepr-build-helpers.sh" TEMP_ROOT=$(mktemp -d "${TMPDIR:-/tmp}/peach-kepr-helper-tests.XXXXXX") trap 'trash "$TEMP_ROOT"' EXIT HUP INT TERM fail() { printf 'FAIL: %s\n' "$1" >&2 exit 1 } expect_failure() { if "$@"; then fail "expected failure: $*" fi } touch_tools() { mkdir -p "$TEMP_ROOT/sdk/build-tools/$1" : > "$TEMP_ROOT/sdk/build-tools/$1/apksigner" : > "$TEMP_ROOT/sdk/build-tools/$1/aapt2" chmod +x "$TEMP_ROOT/sdk/build-tools/$1/apksigner" "$TEMP_ROOT/sdk/build-tools/$1/aapt2" } touch_tools 34.0.0 touch_tools 35.0.0 touch_tools 35.1.0-preview touch_tools 36.0.0-rc1 touch_tools latest touch_tools arbitrary selected=$(find_stable_build_tools_dir "$TEMP_ROOT/sdk") [ "$selected" = "$TEMP_ROOT/sdk/build-tools/35.0.0" ] || fail "stable build-tools selection chose '$selected'" for rejected in latest 35.1.0-preview 36.0.0-rc1 arbitrary 35 35.0; do expect_failure is_stable_build_tools_basename "$rejected" done printf '2.8.4\n' > "$TEMP_ROOT/VERSION" [ "$(read_root_semver "$TEMP_ROOT/VERSION")" = "2.8.4" ] || fail "valid VERSION was rejected" printf '2.8.4\n2.8.5\n' > "$TEMP_ROOT/VERSION.ambiguous" expect_failure read_root_semver "$TEMP_ROOT/VERSION.ambiguous" printf '2.8\n' > "$TEMP_ROOT/VERSION.malformed" expect_failure read_root_semver "$TEMP_ROOT/VERSION.malformed" cat > "$TEMP_ROOT/metadata.json" <<'JSON' { "applicationId": "com.peachpasswords", "elements": [ {"versionCode": 240146, "versionName": "2.8.4", "outputFile": "app-arm64-v8a-release.apk"}, {"versionCode": 240146, "versionName": "2.8.4", "outputFile": "app-x86_64-release.apk"} ] } JSON printf "package: name='com.peachpasswords' versionCode='240146' versionName='2.8.4'\nnative-code: 'arm64-v8a'\n" > "$TEMP_ROOT/badging" validate_release_metadata "$TEMP_ROOT/metadata.json" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a printf '{"applicationId":"com.peachpasswords",' > "$TEMP_ROOT/metadata.malformed" expect_failure validate_release_metadata "$TEMP_ROOT/metadata.malformed" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a cat > "$TEMP_ROOT/metadata.duplicate.json" <<'JSON' {"applicationId":"com.peachpasswords","applicationId":"com.peachpasswords","elements":[{"versionCode":240146,"versionName":"2.8.4"}]} JSON expect_failure validate_release_metadata "$TEMP_ROOT/metadata.duplicate.json" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a cat > "$TEMP_ROOT/metadata.ambiguous.json" <<'JSON' {"applicationId":"com.peachpasswords","elements":[{"versionCode":240146,"versionName":"2.8.4"},{"versionCode":240147,"versionName":"2.8.4"}]} JSON expect_failure validate_release_metadata "$TEMP_ROOT/metadata.ambiguous.json" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-release.apk arm64-v8a expect_failure validate_release_metadata "$TEMP_ROOT/metadata.json" "$TEMP_ROOT/badging" 2.8.5 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a printf "package: name='com.peachpasswords' versionCode='240146' versionName='2.8.5'\n" > "$TEMP_ROOT/badging.mismatch" printf "native-code: 'arm64-v8a'\n" >> "$TEMP_ROOT/badging.mismatch" expect_failure validate_release_metadata "$TEMP_ROOT/metadata.json" "$TEMP_ROOT/badging.mismatch" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a expect_failure validate_release_metadata "$TEMP_ROOT/metadata.json" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk x86_64 printf 'PASS: stable tool selection, malformed/ambiguous metadata, and semantic-version mismatch gates\n'