#!/usr/bin/env bash set -uo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" SCRIPT="$HERE/../skills/clone-app/scripts/detect-unity.sh" TMP="$(mktemp -d)" trap 'rm -rf "$TMP"' EXIT fail=0 check() { local desc="$1" expected="$2" actual="$3" if [[ "$expected" == "$actual" ]]; then echo "PASS: $desc" else echo "FAIL: $desc — expected '$expected' got '$actual'"; fail=1; fi } # Build three fixture zips with python's zipfile (portable, no `zip` needed). mkzip() { python3 - "$1" "${@:2}" <<'PY' import sys, zipfile out = sys.argv[1] with zipfile.ZipFile(out, "w") as z: for entry in sys.argv[2:]: z.writestr(entry, "x") PY } mkzip "$TMP/il2cpp.apk" "lib/arm64-v8a/libil2cpp.so" "assets/bin/Data/Managed/Metadata/global-metadata.dat" mkzip "$TMP/mono.apk" "assets/bin/Data/Managed/Assembly-CSharp.dll" mkzip "$TMP/plain.apk" "classes.dex" "AndroidManifest.xml" # Build XAPK fixture: inner Unity il2cpp base.apk wrapped in an xapk mkzip "$TMP/base.apk" "lib/arm64-v8a/libil2cpp.so" "assets/bin/Data/Managed/Metadata/global-metadata.dat" python3 - "$TMP/unity.xapk" "$TMP/base.apk" <<'PY' import sys, zipfile, os out, inner = sys.argv[1], sys.argv[2] with zipfile.ZipFile(out, "w") as z: z.write(inner, arcname="base.apk") z.writestr("manifest.json", "{}") PY check "il2cpp" "il2cpp" "$(bash "$SCRIPT" "$TMP/il2cpp.apk")" check "mono" "mono" "$(bash "$SCRIPT" "$TMP/mono.apk")" check "none" "none" "$(bash "$SCRIPT" "$TMP/plain.apk")" check "xapk il2cpp" "il2cpp" "$(bash "$SCRIPT" "$TMP/unity.xapk")" bash "$SCRIPT" >/dev/null 2>&1; rc=$? check "usage exit 2" "2" "$rc" exit $fail