1234set -eu56SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)78. "$SCRIPT_DIR/kepr-build-helpers.sh"910TEMP_ROOT=$(mktemp -d "${TMPDIR:-/tmp}/peach-kepr-helper-tests.XXXXXX")11trap 'trash "$TEMP_ROOT"' EXIT HUP INT TERM1213fail() {14 printf 'FAIL: %s\n' "$1" >&215 exit 116}1718expect_failure() {19 if "$@"; then20 fail "expected failure: $*"21 fi22}2324touch_tools() {25 mkdir -p "$TEMP_ROOT/sdk/build-tools/$1"26 : > "$TEMP_ROOT/sdk/build-tools/$1/aapt2"27 chmod +x "$TEMP_ROOT/sdk/build-tools/$1/aapt2"28}2930touch_tools 34.0.031touch_tools 35.0.032touch_tools 35.1.0-preview33touch_tools 36.0.0-rc134touch_tools latest35touch_tools arbitrary3637selected=$(find_stable_build_tools_dir "$TEMP_ROOT/sdk")38[ "$selected" = "$TEMP_ROOT/sdk/build-tools/35.0.0" ] ||39 fail "stable build-tools selection chose '$selected'"40for rejected in latest 35.1.0-preview 36.0.0-rc1 arbitrary 35 35.0; do41 expect_failure is_stable_build_tools_basename "$rejected"42done4344printf '2.8.4\n' > "$TEMP_ROOT/VERSION"45[ "$(read_root_semver "$TEMP_ROOT/VERSION")" = "2.8.4" ] || fail "valid VERSION was rejected"46printf '2.8.4\n2.8.5\n' > "$TEMP_ROOT/VERSION.ambiguous"47expect_failure read_root_semver "$TEMP_ROOT/VERSION.ambiguous"48printf '2.8\n' > "$TEMP_ROOT/VERSION.malformed"49expect_failure read_root_semver "$TEMP_ROOT/VERSION.malformed"5051cat > "$TEMP_ROOT/metadata.json" <<'JSON'52{53 "applicationId": "com.peachpasswords",54 "elements": [55 {"versionCode": 240146, "versionName": "2.8.4", "outputFile": "app-arm64-v8a-release.apk"},56 {"versionCode": 240146, "versionName": "2.8.4", "outputFile": "app-x86_64-release.apk"}57 ]58}59JSON60printf "package: name='com.peachpasswords' versionCode='240146' versionName='2.8.4'\nnative-code: 'arm64-v8a'\n" > "$TEMP_ROOT/badging"61validate_release_metadata "$TEMP_ROOT/metadata.json" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a6263printf '{"applicationId":"com.peachpasswords",' > "$TEMP_ROOT/metadata.malformed"64expect_failure validate_release_metadata "$TEMP_ROOT/metadata.malformed" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a65cat > "$TEMP_ROOT/metadata.duplicate.json" <<'JSON'66{"applicationId":"com.peachpasswords","applicationId":"com.peachpasswords","elements":[{"versionCode":240146,"versionName":"2.8.4"}]}67JSON68expect_failure validate_release_metadata "$TEMP_ROOT/metadata.duplicate.json" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a69cat > "$TEMP_ROOT/metadata.ambiguous.json" <<'JSON'70{"applicationId":"com.peachpasswords","elements":[{"versionCode":240146,"versionName":"2.8.4"},{"versionCode":240147,"versionName":"2.8.4"}]}71JSON72expect_failure validate_release_metadata "$TEMP_ROOT/metadata.ambiguous.json" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-release.apk arm64-v8a73expect_failure validate_release_metadata "$TEMP_ROOT/metadata.json" "$TEMP_ROOT/badging" 2.8.5 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a74printf "package: name='com.peachpasswords' versionCode='240146' versionName='2.8.5'\n" > "$TEMP_ROOT/badging.mismatch"75printf "native-code: 'arm64-v8a'\n" >> "$TEMP_ROOT/badging.mismatch"76expect_failure validate_release_metadata "$TEMP_ROOT/metadata.json" "$TEMP_ROOT/badging.mismatch" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk arm64-v8a77expect_failure validate_release_metadata "$TEMP_ROOT/metadata.json" "$TEMP_ROOT/badging" 2.8.4 com.peachpasswords app-arm64-v8a-release.apk x86_647879printf 'PASS: stable tool selection, malformed/ambiguous metadata, and semantic-version mismatch gates\n'