#!/bin/sh cleanup () { NVM_DIR="$SAVE_NVM_DIR" if [ -n "${TEST_DIR-}" ]; then rm -rf "${TEST_DIR}" fi unset SAVE_NVM_DIR TEST_DIR OUTPUT EXIT_CODE FILE unset -f die cleanup nvm_download install_nvm_as_script } die () { echo "$@" ; cleanup ; exit 1; } SAVE_NVM_DIR="$NVM_DIR" NVM_ENV=testing \. ../../install.sh type install_nvm_as_script > /dev/null 2>&1 || die 'install_nvm_as_script is not available' TEST_DIR="$(mktemp -d)" NVM_DIR="${TEST_DIR}/nvm" mkdir -p "${NVM_DIR}" echo 'working nvm.sh' > "${NVM_DIR}/nvm.sh" # like curl, write part of the file and then fail, as when the connection drops part-way through nvm.sh nvm_download() { case "${2}" in */nvm.sh) echo 'partial' > "${4}" return 56 ;; esac echo "${2}" > "${4}" } ## install_nvm_as_script: a failed download fails, and leaves the existing install untouched OUTPUT="$(install_nvm_as_script 2>&1)" EXIT_CODE=$? [ "${EXIT_CODE}" != '0' ] || die "install_nvm_as_script should fail when a download fails, got ${EXIT_CODE}" echo "${OUTPUT}" | grep -q "Failed to download" || die "install_nvm_as_script should print the download error, got: ${OUTPUT}" [ "$(cat "${NVM_DIR}/nvm.sh")" = 'working nvm.sh' ] || die "a failed download replaced the working nvm.sh with: $(cat "${NVM_DIR}/nvm.sh")" [ ! -e "${NVM_DIR}/nvm-exec" ] || die 'nvm-exec was installed although the nvm.sh download failed' [ ! -e "${NVM_DIR}/bash_completion" ] || die 'bash_completion was installed although the nvm.sh download failed' for FILE in nvm.sh nvm-exec bash_completion; do [ ! -e "${NVM_DIR}/${FILE}.download" ] || die "a failed download left '${FILE}.download' behind" done ## install_nvm_as_script: when every download succeeds, all three files are installed nvm_download() { echo "${2}" > "${4}" } OUTPUT="$(install_nvm_as_script 2>&1)" EXIT_CODE=$? [ "${EXIT_CODE}" = '0' ] || die "install_nvm_as_script should succeed when every download succeeds, got ${EXIT_CODE}: ${OUTPUT}" [ "$(cat "${NVM_DIR}/nvm.sh")" = "$(nvm_source script)" ] || die "nvm.sh was not updated, got: $(cat "${NVM_DIR}/nvm.sh")" [ "$(cat "${NVM_DIR}/nvm-exec")" = "$(nvm_source script-nvm-exec)" ] || die "nvm-exec was not installed, got: $(cat "${NVM_DIR}/nvm-exec")" [ "$(cat "${NVM_DIR}/bash_completion")" = "$(nvm_source script-nvm-bash-completion)" ] || die "bash_completion was not installed, got: $(cat "${NVM_DIR}/bash_completion")" [ -x "${NVM_DIR}/nvm-exec" ] || die 'nvm-exec was not marked executable' for FILE in nvm.sh nvm-exec bash_completion; do [ ! -e "${NVM_DIR}/${FILE}.download" ] || die "a successful download left '${FILE}.download' behind" done ## nvm_do_install: a failed script install exits non-zero, before touching the profile or sourcing nvm.sh install_nvm_as_script() { return 2 } OUTPUT="$(METHOD=script PROFILE=/dev/null nvm_do_install 2>&1)" EXIT_CODE=$? [ "${EXIT_CODE}" = '2' ] || die "nvm_do_install should exit 2 when install_nvm_as_script fails, got ${EXIT_CODE}: ${OUTPUT}" ! echo "${OUTPUT}" | grep -q 'Close and reopen your terminal' || die "nvm_do_install reported success although install_nvm_as_script failed: ${OUTPUT}" cleanup