blob: 8f6541270821fa0b1a1ac465c225364073f511a7 [file] [log] [blame]
#!/bin/bash -eu
#
# Copyright 2015 The Bazel Authors. All rights reserved.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# Integration tests for ijar zipper/unzipper
DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
## Inputs
ZIPPER=${PWD}/$1
shift
UNZIP=$1
shift
ZIP=$1
shift
## Test framework
source ${DIR}/testenv.sh || { echo "testenv.sh not found!" >&2; exit 1; }
# Assertion
function assert_unzip_same_as_zipper() {
local folder1=$(mktemp -d ${TEST_TMPDIR}/output.XXXXXXXX)
local folder2=$(mktemp -d ${TEST_TMPDIR}/output.XXXXXXXX)
local zipfile=$1
shift
(cd $folder1 && $UNZIP -q $zipfile $@ || true) # ignore CRC32 errors
(cd $folder2 && $ZIPPER x $zipfile $@)
diff -r $folder1 $folder2 &> $TEST_log \
|| fail "Unzip and Zipper resulted in different output"
}
function assert_zipper_same_after_unzip() {
local dir="$1"
shift
local zipfile=${TEST_TMPDIR}/output.zip
(cd "${dir}" && $ZIPPER c ${zipfile} "$@")
local folder=$(mktemp -d ${TEST_TMPDIR}/output.XXXXXXXX)
(cd $folder && $UNZIP -q ${zipfile} || true) # ignore CRC32 errors
diff -r "${dir}" $folder &> $TEST_log \
|| fail "Unzip after zipper output differ"
# Retry with compression
(cd "${dir}" && $ZIPPER cC ${zipfile} "$@")
local folder=$(mktemp -d ${TEST_TMPDIR}/output.XXXXXXXX)
(cd $folder && $UNZIP -q ${zipfile} || true) # ignore CRC32 errors
diff -r "${dir}" $folder &> $TEST_log \
|| fail "Unzip after zipper output differ"
}
#### Tests
function test_zipper() {
mkdir -p ${TEST_TMPDIR}/test/path/to/some
mkdir -p ${TEST_TMPDIR}/test/some/other/path
touch ${TEST_TMPDIR}/test/path/to/some/empty_file
echo "toto" > ${TEST_TMPDIR}/test/path/to/some/file
echo "titi" > ${TEST_TMPDIR}/test/path/to/some/other_file
chmod +x ${TEST_TMPDIR}/test/path/to/some/other_file
echo "tata" > ${TEST_TMPDIR}/test/file
filelist="$(cd ${TEST_TMPDIR}/test && find . | sed 's|^./||' | grep -v '^.$')"
assert_zipper_same_after_unzip ${TEST_TMPDIR}/test ${filelist}
assert_unzip_same_as_zipper ${TEST_TMPDIR}/output.zip
# Test @filelist format
echo "${filelist}" >${TEST_TMPDIR}/test.content
assert_zipper_same_after_unzip ${TEST_TMPDIR}/test @${TEST_TMPDIR}/test.content
assert_unzip_same_as_zipper ${TEST_TMPDIR}/output.zip
# Test flatten option
(cd ${TEST_TMPDIR}/test && $ZIPPER cf ${TEST_TMPDIR}/output.zip ${filelist})
$ZIPPER v ${TEST_TMPDIR}/output.zip >$TEST_log
expect_log "^f .* file$"
expect_log "^f .* other_file$"
expect_not_log "path"
expect_not_log "/"
# Test adding leading garbage at the begining of the file (for
# self-extractable binary).
echo "abcdefghi" >${TEST_TMPDIR}/test.zip
cat ${TEST_TMPDIR}/output.zip >>${TEST_TMPDIR}/test.zip
$ZIPPER v ${TEST_TMPDIR}/test.zip >$TEST_log
expect_log "^f .* file$"
expect_log "^f .* other_file$"
expect_not_log "path"
}
function test_zipper_junk_paths() {
mkdir -p ${TEST_TMPDIR}/test/path/to/some
mkdir -p ${TEST_TMPDIR}/test/some/other/path
touch ${TEST_TMPDIR}/test/path/to/some/empty_file
echo "toto" > ${TEST_TMPDIR}/test/path/to/some/file
echo "titi" > ${TEST_TMPDIR}/test/path/to/some/other_file
chmod +x ${TEST_TMPDIR}/test/path/to/some/other_file
echo "tata" > ${TEST_TMPDIR}/test/file
filelist="$(cd ${TEST_TMPDIR}/test && find . | sed 's|^./||' | grep -v '^.$')"
# Test extract + flatten option
(cd ${TEST_TMPDIR}/test && $ZIPPER c ${TEST_TMPDIR}/output.zip ${filelist})
$ZIPPER vf ${TEST_TMPDIR}/output.zip >$TEST_log
echo $TEST_log
expect_log "^f .* file$"
expect_log "^f .* other_file$"
expect_not_log "path"
expect_not_log "/"
}
function test_zipper_unzip_selective_files() {
mkdir -p ${TEST_TMPDIR}/test/path/to/some
mkdir -p ${TEST_TMPDIR}/test/some/other/path
touch ${TEST_TMPDIR}/test/path/to/some/empty_file
echo "toto" > ${TEST_TMPDIR}/test/path/to/some/file
echo "titi" > ${TEST_TMPDIR}/test/path/to/some/other_file
chmod +x ${TEST_TMPDIR}/test/path/to/some/other_file
echo "tata" > ${TEST_TMPDIR}/test/file
filelist="$(cd ${TEST_TMPDIR}/test && find . | sed 's|^./||' | grep -v '^.$')"
assert_zipper_same_after_unzip ${TEST_TMPDIR}/test ${filelist}
assert_unzip_same_as_zipper ${TEST_TMPDIR}/output.zip \
path/to/some/empty_file path/to/some/other_file
}
function test_zipper_unzip_to_optional_dir() {
mkdir -p ${TEST_TMPDIR}/test/path/to/some
mkdir -p ${TEST_TMPDIR}/test/some/other/path
touch ${TEST_TMPDIR}/test/path/to/some/empty_file
echo "toto" > ${TEST_TMPDIR}/test/path/to/some/file
echo "titi" > ${TEST_TMPDIR}/test/path/to/some/other_file
chmod +x ${TEST_TMPDIR}/test/path/to/some/other_file
echo "tata" > ${TEST_TMPDIR}/test/file
filelist="$(cd ${TEST_TMPDIR}/test && find . | sed 's|^./||' | grep -v '^.$')"
assert_zipper_same_after_unzip ${TEST_TMPDIR}/test ${filelist}
assert_unzip_same_as_zipper ${TEST_TMPDIR}/output.zip -d output_dir2 \
path/to/some/empty_file path/to/some/other_file
}
function test_zipper_compression() {
echo -n > ${TEST_TMPDIR}/a
for i in $(seq 1 1000); do
echo -n "a" >> ${TEST_TMPDIR}/a
done
$ZIPPER cCf ${TEST_TMPDIR}/output.zip ${TEST_TMPDIR}/a
local out_size=$(cat ${TEST_TMPDIR}/output.zip | wc -c | xargs)
local in_size=$(cat ${TEST_TMPDIR}/a | wc -c | xargs)
check_gt "${in_size}" "${out_size}" "Output size is greater than input size"
rm -fr ${TEST_TMPDIR}/out
mkdir -p ${TEST_TMPDIR}/out
(cd ${TEST_TMPDIR}/out && $ZIPPER x ${TEST_TMPDIR}/output.zip)
diff ${TEST_TMPDIR}/a ${TEST_TMPDIR}/out/a &> $TEST_log \
|| fail "Unzip using zipper after zipper output differ"
rm -fr ${TEST_TMPDIR}/out
mkdir -p ${TEST_TMPDIR}/out
(cd ${TEST_TMPDIR}/out && $UNZIP -q ${TEST_TMPDIR}/output.zip)
diff ${TEST_TMPDIR}/a ${TEST_TMPDIR}/out/a &> $TEST_log \
|| fail "Unzip after zipper output differ"
}
function test_zipper_specify_path() {
mkdir -p ${TEST_TMPDIR}/files
echo "toto" > ${TEST_TMPDIR}/files/a.txt
echo "titi" > ${TEST_TMPDIR}/files/b.txt
rm -fr ${TEST_TMPDIR}/expect/foo/bar
mkdir -p ${TEST_TMPDIR}/expect/foo/bar
touch ${TEST_TMPDIR}/expect/empty.txt
echo "toto" > ${TEST_TMPDIR}/expect/foo/a.txt
echo "titi" > ${TEST_TMPDIR}/expect/foo/bar/b.txt
rm -fr ${TEST_TMPDIR}/out
mkdir -p ${TEST_TMPDIR}/out
${ZIPPER} cC ${TEST_TMPDIR}/output.zip empty.txt= \
foo/a.txt=${TEST_TMPDIR}/files/a.txt \
foo/bar/b.txt=${TEST_TMPDIR}/files/b.txt
(cd ${TEST_TMPDIR}/out && $UNZIP -q ${TEST_TMPDIR}/output.zip)
diff -r ${TEST_TMPDIR}/expect ${TEST_TMPDIR}/out &> $TEST_log \
|| fail "Unzip after zipper output is not expected"
}
function test_zipper_permissions() {
local -r LOCAL_TEST_DIR="${TEST_TMPDIR}/${FUNCNAME[0]}"
mkdir -p ${LOCAL_TEST_DIR}/files
printf "#!/bin/sh\nexit 0\n" > ${LOCAL_TEST_DIR}/files/executable
printf "#!/bin/sh\nexit 0\n" > ${LOCAL_TEST_DIR}/files/non_executable
chmod +x ${LOCAL_TEST_DIR}/files/executable
chmod -x ${LOCAL_TEST_DIR}/files/non_executable
${ZIPPER} cC ${LOCAL_TEST_DIR}/output.zip \
executable=${LOCAL_TEST_DIR}/files/executable \
non_executable=${LOCAL_TEST_DIR}/files/non_executable
mkdir -p ${LOCAL_TEST_DIR}/out
cd ${LOCAL_TEST_DIR}/out && $UNZIP -q ${LOCAL_TEST_DIR}/output.zip
if ! test -x ${LOCAL_TEST_DIR}/out/executable; then
fail "out/executable should have been executable"
fi
if test -x ${LOCAL_TEST_DIR}/out/non_executable; then
fail "out/non_executable should not have been executable"
fi
}
function test_unzipper_zip64_archive() {
local -r test_dir="${TEST_TMPDIR}/${FUNCNAME[0]}"
mkdir -p "${test_dir}"
cd "${test_dir}"
mkdir source
# That creates a file which need extensions for {,un}compressed_size, followed
# by one which needs them for the offset.
local -r mb=$((2 ** 20))
/bin/dd if=/dev/zero of=source/file1 bs="${mb}" count=4097 conv=sparse \
>& "${TEST_log}"
echo "hello" > source/file2
filelist=(file1 file2)
pushd source > /dev/null
"${ZIP}" -q0X ../zip.zip file1 file2
popd > /dev/null
echo ${PWD}/zip.zip
"${ZIPPER}" x zip.zip -d unzipped
diff -r unzipped source
}
run_suite "zipper tests"