android-reverse-engineering.../plugins/clone-app/tests/test-download-apk.sh

60 lines
2.0 KiB
Bash

#!/usr/bin/env bash
set -uo pipefail
SCRIPT="$(dirname "$0")/../skills/clone-app/scripts/download-apk.sh"
fail=0
check() { [[ "$2" == "$3" ]] && echo "PASS: $1" || { echo "FAIL: $1 — expected '$2' got '$3'"; fail=1; }; }
tmp="$(mktemp -d)"
# Stub apkeep modelling the real CLI:
# apkeep -a <package> -d <source> <out_dir>
# parse out the package and the out_dir (last arg), then drop an artifact there.
# CLONE_APP_FAKE_EXT picks which extension the stub produces; "fail" makes it
# exit non-zero without writing anything.
cat > "$tmp/fakeapkeep.sh" <<'EOF'
#!/usr/bin/env bash
pkg=""; outdir=""; prev=""
for a in "$@"; do
[[ "$prev" == "-a" || "$prev" == "--app" ]] && pkg="$a"
outdir="$a" # last positional wins; apkeep takes OUTPATH last
prev="$a"
done
case "$CLONE_APP_FAKE_EXT" in
fail) exit 1 ;;
xapk)
workdir="$(mktemp -d)"
echo '{}' > "$workdir/manifest.json"
echo 'a' > "$workdir/base.apk"; echo 'b' > "$workdir/config.apk"
( cd "$workdir" && zip -q -r "$outdir/$pkg.xapk" . ) ;;
*) echo 'apk-bytes' > "$outdir/$pkg.apk" ;;
esac
exit 0
EOF
chmod +x "$tmp/fakeapkeep.sh"
# XAPK case
path="$(CLONE_APP_APKEEP="$tmp/fakeapkeep.sh" CLONE_APP_FAKE_EXT=xapk \
bash "$SCRIPT" com.example.app "$tmp/out" 2>/dev/null)"; rc=$?
check "xapk exit 0" "0" "$rc"
check "xapk extension" "xapk" "${path##*.}"
check "xapk renamed to app.*" "app.xapk" "$(basename "$path")"
# APK case
path2="$(CLONE_APP_APKEEP="$tmp/fakeapkeep.sh" CLONE_APP_FAKE_EXT=apk \
bash "$SCRIPT" com.example.app "$tmp/out-apk" 2>/dev/null)"; rc2=$?
check "apk exit 0" "0" "$rc2"
check "apk extension" "apk" "${path2##*.}"
# apkeep failure -> exit 1
out3="$(CLONE_APP_APKEEP="$tmp/fakeapkeep.sh" CLONE_APP_FAKE_EXT=fail \
bash "$SCRIPT" com.example.app "$tmp/out3" 2>/dev/null)"; rc3=$?
check "fail exit 1" "1" "$rc3"
# apkeep binary missing -> exit 1
out4="$(CLONE_APP_APKEEP="$tmp/does-not-exist-apkeep" \
bash "$SCRIPT" com.example.app "$tmp/out4" 2>/dev/null)"; rc4=$?
check "missing-binary exit 1" "1" "$rc4"
rm -rf "$tmp"
exit $fail