#!/usr/bin/env bats load test_helper host_distro() { if [ -r /etc/os-release ]; then . /etc/os-release printf '%s %s' "$ID" "$VERSION_ID" | tr '[:upper:]' '[:lower:]' else printf '%s %s' "$(lsb_release -si)" "$(lsb_release -sr)" | tr '[:upper:]' '[:lower:]' fi } use_manifest() { local plugin="${BATS_TEST_TMPDIR}/plugin" mkdir -p "$plugin/libexec" "$plugin/share/pyenv-binary/versions" cp "${BATS_TEST_DIRNAME}/../libexec/pyenv-binary-install" "$plugin/libexec/" PATH="$plugin/libexec:$PATH" printf 'source_version\tentry\tos\tarch\tdistro\tsha256\n' > "$plugin/share/pyenv-binary/versions/3.14" definition_sha="4c4ed1afbfdaa1e4c3bf7bbb82d730cecb7e384da91eea4f3cc093fd545524d6" } stub_downloads() { create_stub curl <<'STUB' output="" while [ "$#" -gt 0 ]; do case "$1" in -o ) output="$2"; shift ;; http* ) url="$1" ;; esac shift done case "$url" in */3.14.7-ubuntu-24.04-x86_64 | */3.14.7-macos-15-arm64 | */3.14.10-ubuntu-24.04-x86_64 ) printf definition > "$output" ;; * ) exit 1 ;; esac STUB } @test "rejects a modified published definition" { create_stub lsb_release 'case "$1" in -si) echo Ubuntu;; -sr) echo 24.04;; esac' use_manifest printf '3.14.7\t3.14.7-ubuntu-24.04-x86_64\tLinux\tx86_64\t%s\t%064d\n' \ "$(host_distro)" 0 >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" stub_downloads create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac' create_stub pyenv-install '[ "$1" = --list ] && exit; echo installed' run pyenv-binary-install 3.14.7 assert_failure [[ "$output" == *'checksum mismatch'* ]] } @test "completion does not offer source-only versions" { create_stub pyenv-install 'echo 3.14.7' run pyenv-binary-install --complete assert_success "" } @test "a plugin definition overrides a published binary without its checksum" { create_stub lsb_release 'case "$1" in -si) echo Ubuntu;; -sr) echo 24.04;; esac' use_manifest export TMPDIR="$BATS_TEST_TMPDIR/temp" mkdir -p "$TMPDIR" local entry="3.14.7-ubuntu-24.04-x86_64" printf '3.14.7\t%s\tLinux\tx86_64\t%s\t%s\n' "$entry" \ "$(host_distro)" "" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac' create_stub curl 'touch "$BATS_TEST_TMPDIR/downloaded"; exit 1' PATH="${BATS_TEST_DIRNAME}/../../python-build/bin:$PATH" mkdir -p "$PYENV_ROOT/plugins/first/share/python-build" "$PYENV_ROOT/plugins/second/share/python-build" printf '%s\n' 'mkdir -p "$PREFIX_PATH"; echo first > "$PREFIX_PATH/marker"' \ > "$PYENV_ROOT/plugins/first/share/python-build/$entry" echo 'exit 1' > "$PYENV_ROOT/plugins/second/share/python-build/$entry" run pyenv-binary-install 3.14 assert_success "" assert_equal first "$(cat "$PYENV_ROOT/versions/3.14.7/marker")" [ ! -e "$BATS_TEST_TMPDIR/downloaded" ] assert_equal "" "$(find "$TMPDIR" -mindepth 1 -maxdepth 1 -type d)" } @test "an explicit definition path takes precedence over a plugin definition" { create_stub lsb_release 'case "$1" in -si) echo Ubuntu;; -sr) echo 24.04;; esac' use_manifest local entry="3.14.7-ubuntu-24.04-x86_64" printf '3.14.7\t%s\tLinux\tx86_64\t%s\t%s\n' "$entry" \ "$(host_distro)" "$definition_sha" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac' create_stub curl 'touch "$BATS_TEST_TMPDIR/downloaded"; exit 1' PATH="${BATS_TEST_DIRNAME}/../../python-build/bin:$PATH" export PYTHON_BUILD_DEFINITIONS="$BATS_TEST_TMPDIR/custom definitions" mkdir -p "$PYTHON_BUILD_DEFINITIONS" "$PYENV_ROOT/plugins/custom/share/python-build" printf '%s\n' 'mkdir -p "$PREFIX_PATH"; echo custom > "$PREFIX_PATH/marker"' \ > "$PYTHON_BUILD_DEFINITIONS/$entry" echo 'exit 1' > "$PYENV_ROOT/plugins/custom/share/python-build/$entry" run pyenv-binary-install 3.14.7 assert_success "" assert_equal custom "$(cat "$PYENV_ROOT/versions/3.14.7/marker")" [ ! -e "$BATS_TEST_TMPDIR/downloaded" ] } @test "rejects an invalid published checksum when definition lookup fails" { create_stub lsb_release 'case "$1" in -si) echo Ubuntu;; -sr) echo 24.04;; esac' use_manifest printf '3.14.7\t3.14.7-ubuntu-24.04-x86_64\tLinux\tx86_64\t%s\tinvalid\n' \ "$(host_distro)" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac' create_stub pyenv-install 'exit 1' create_stub curl 'touch "$BATS_TEST_TMPDIR/downloaded"; exit 1' run pyenv-binary-install 3.14.7 assert_failure "pyenv-binary: invalid checksum for 3.14.7-ubuntu-24.04-x86_64" [ ! -e "$BATS_TEST_TMPDIR/downloaded" ] } @test "installs a matching published binary with an uppercase checksum" { create_stub lsb_release 'case "$1" in -si) echo Ubuntu;; -sr) echo 24.04;; esac' use_manifest local uppercase_sha="$(printf '%s' "$definition_sha" | tr '[:lower:]' '[:upper:]')" printf '3.14.7\t3.14.7-macos-15-arm64\tDarwin\tarm64\tmacos 15.7.9\t%s\n' \ "$definition_sha" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" printf '3.14.7\t3.14.7-ubuntu-24.04-x86_64\tLinux\tx86_64\t%s\t%s\n' \ "$(host_distro | tr '[:lower:]' '[:upper:]')" "$uppercase_sha" \ >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" stub_downloads create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac' create_stub pyenv-install <<'STUB' [ "$1" = --list ] && exit definition="${1%:*}" printf '%s:%s\n' "${definition##*/}" "${1##*:}" cat "$definition" STUB run pyenv-binary-install 3.14 assert_success "3.14.7-ubuntu-24.04-x86_64:3.14.7 definition" } @test "a version prefix selects the latest published binary" { create_stub lsb_release 'case "$1" in -si) echo Ubuntu;; -sr) echo 24.04;; esac' use_manifest printf '3.14.10\t3.14.10-ubuntu-24.04-x86_64\tLinux\tx86_64\t%s\t%s\n' \ "$(host_distro)" "$definition_sha" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" printf '3.14.7\t3.14.7-ubuntu-24.04-x86_64\tLinux\tx86_64\t%s\t%s\n' \ "$(host_distro)" "$definition_sha" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" stub_downloads create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac' create_stub pyenv-install '[ "$1" = --list ] && exit; echo "${1##*:}"' run pyenv-binary-install 3.14 assert_success "3.14.10" } @test "fails when no published binary matches the host" { use_manifest printf '3.14.7\t3.14.7-macos-15-arm64\tDarwin\tarm64\tmacos 15.7.9\t%s\n' \ "$definition_sha" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac' run pyenv-binary-install 3.14.7 assert_failure "pyenv-binary: no binary available for 3.14.7 on Linux/x86_64" } @test "does not select a package for another Linux release" { create_stub lsb_release 'case "$1" in -si) echo Ubuntu;; -sr) echo 22.04;; esac' use_manifest local other_release="ubuntu 24.04" [ "$(host_distro)" = "$other_release" ] && other_release="ubuntu 22.04" printf '3.14.7\t3.14.7-ubuntu-24.04-x86_64\tLinux\tx86_64\t%s\t%s\n' \ "$other_release" "$definition_sha" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac' run pyenv-binary-install 3.14.7 assert_failure "pyenv-binary: no binary available for 3.14.7 on Linux/x86_64" } @test "uses a macOS binary built on an older release" { use_manifest printf '3.14.7\t3.14.7-macos-15-arm64\tDarwin\tarm64\tmacos 15.7.9\t%s\n' \ "$definition_sha" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" stub_downloads create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac' create_stub sw_vers 'echo 26.6.2' create_stub pyenv-install '[ "$1" = --list ] && exit; echo "${1##*:}"' run pyenv-binary-install 3.14.7 assert_success "3.14.7" } @test "rejects a macOS binary built on a newer patch release" { use_manifest printf '3.14.7\t3.14.7-macos-15-arm64\tDarwin\tarm64\tmacos 15.7.9\t%s\n' \ "$definition_sha" >> "$BATS_TEST_TMPDIR/plugin/share/pyenv-binary/versions/3.14" create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac' create_stub sw_vers 'echo 15.7.8' create_stub pyenv-install '[ "$1" = --list ] && exit; echo installed' run pyenv-binary-install 3.14.7 assert_failure "pyenv-binary: no binary available for 3.14.7 on Darwin/arm64" }