From d924fceee5f0c371615ed00d976e192502ba7f02 Mon Sep 17 00:00:00 2001 From: Sam Stephenson Date: Mon, 19 Nov 2012 23:45:00 -0600 Subject: [PATCH] Test package cache --- bin/ruby-build | 10 ++--- test/cache.bats | 89 +++++++++++++++++++++++++++++++++++++++++++ test/test_helper.bash | 1 + 3 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 test/cache.bats diff --git a/bin/ruby-build b/bin/ruby-build index 8c540044..c04f0f10 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -147,9 +147,9 @@ verify_checksum() { # If there's no MD5 support, return success [ -n "$HAS_MD5_SUPPORT" ] || return 0 - # If the specified filename doesn't exist, return failure + # If the specified filename doesn't exist, return success local filename="$1" - [ -e "$filename" ] || return 1 + [ -e "$filename" ] || return 0 # If there's no expected checksum, return success local expected_checksum="$2" @@ -236,9 +236,9 @@ symlink_tarball_from_cache() { local cached_package_filename="${RUBY_BUILD_CACHE_PATH}/$package_filename" local checksum="$2" - { verify_checksum "$cached_package_filename" "$checksum" - ln -s "$cached_package_filename" "$package_filename" - } >&4 2>&1 || return 1 + [ -e "$cached_package_filename" ] || return 1 + verify_checksum "$cached_package_filename" "$checksum" >&4 2>&1 || return 1 + ln -s "$cached_package_filename" "$package_filename" >&4 2>&1 || return 1 } download_tarball() { diff --git a/test/cache.bats b/test/cache.bats new file mode 100644 index 00000000..e377d4d7 --- /dev/null +++ b/test/cache.bats @@ -0,0 +1,89 @@ +#!/usr/bin/env bats + +load test_helper +export RUBY_BUILD_SKIP_MIRROR=1 +export RUBY_BUILD_CACHE_PATH="$TMP/cache" + +setup() { + mkdir "$RUBY_BUILD_CACHE_PATH" +} + + +@test "packages are saved to download cache" { + stub md5 true + stub curl "-*S* : cat package-1.0.0.tar.gz" + + install_fixture definitions/without-checksum + [ "$status" -eq 0 ] + [ -e "${RUBY_BUILD_CACHE_PATH}/package-1.0.0.tar.gz" ] + + unstub curl + unstub md5 +} + + +@test "cached package without checksum" { + stub md5 true + stub curl + + cp "${FIXTURE_ROOT}/package-1.0.0.tar.gz" "$RUBY_BUILD_CACHE_PATH" + + install_fixture definitions/without-checksum + [ "$status" -eq 0 ] + [ -e "${RUBY_BUILD_CACHE_PATH}/package-1.0.0.tar.gz" ] + + unstub curl + unstub md5 +} + + +@test "cached package with valid checksum" { + stub md5 true "echo 83e6d7725e20166024a1eb74cde80677" + stub curl + + cp "${FIXTURE_ROOT}/package-1.0.0.tar.gz" "$RUBY_BUILD_CACHE_PATH" + + install_fixture definitions/with-checksum + [ "$status" -eq 0 ] + [ -x "${INSTALL_ROOT}/bin/package" ] + [ -e "${RUBY_BUILD_CACHE_PATH}/package-1.0.0.tar.gz" ] + + unstub curl + unstub md5 +} + + +@test "cached package with invalid checksum falls back to mirror and updates cache" { + export RUBY_BUILD_SKIP_MIRROR= + local checksum="83e6d7725e20166024a1eb74cde80677" + + stub md5 true "echo invalid" "echo $checksum" + stub curl "-*I* : true" "-*S* http://?*/$checksum : cat package-1.0.0.tar.gz" + + touch "${RUBY_BUILD_CACHE_PATH}/package-1.0.0.tar.gz" + + install_fixture definitions/with-checksum + [ "$status" -eq 0 ] + [ -x "${INSTALL_ROOT}/bin/package" ] + [ -e "${RUBY_BUILD_CACHE_PATH}/package-1.0.0.tar.gz" ] + diff -q "${RUBY_BUILD_CACHE_PATH}/package-1.0.0.tar.gz" "${FIXTURE_ROOT}/package-1.0.0.tar.gz" + + unstub curl + unstub md5 +} + + +@test "nonexistent cache directory is ignored" { + stub md5 true + stub curl "-*S* : cat package-1.0.0.tar.gz" + + export RUBY_BUILD_CACHE_PATH="${TMP}/nonexistent" + + install_fixture definitions/without-checksum + [ "$status" -eq 0 ] + [ -x "${INSTALL_ROOT}/bin/package" ] + [ ! -d "$RUBY_BUILD_CACHE_PATH" ] + + unstub curl + unstub md5 +} diff --git a/test/test_helper.bash b/test/test_helper.bash index 96ab8bdb..a0383815 100644 --- a/test/test_helper.bash +++ b/test/test_helper.bash @@ -20,6 +20,7 @@ stub() { export PATH="${BATS_TEST_DIRNAME}/stubs/${program}:$PATH" rm -f "${TMP}/${program}-stub-plan" "${TMP}/${program}-stub-run" + touch "${TMP}/${program}-stub-plan" for arg in "$@"; do printf "%s\n" "$arg" >> "${TMP}/${program}-stub-plan"; done }