You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
431 lines
11 KiB
431 lines
11 KiB
#!/usr/bin/env bash
|
|
# Copyright 2022 Gentoo Authors
|
|
# Distributed under the terms of the GNU General Public License v2
|
|
|
|
EAPI=8
|
|
|
|
source tests-common.sh || exit
|
|
|
|
inherit unpacker
|
|
|
|
# silence the output
|
|
unpack_banner() { :; }
|
|
|
|
TESTFILE=test.in
|
|
TESTDIR=$(mktemp -d || die)
|
|
trap 'cd - >/dev/null && rm -r "${TESTDIR}"' EXIT
|
|
|
|
# prepare some test data
|
|
# NB: we need something "compressible", as compress(1) will return
|
|
# an error if the file "is larger than before compression"
|
|
cp ../unpacker.eclass "${TESTDIR}/${TESTFILE}" || die
|
|
cd "${TESTDIR}" || die
|
|
|
|
test_unpack() {
|
|
local archive=${1}
|
|
local unpacked=${2}
|
|
local deps=${3}
|
|
local packcmd=${4}
|
|
|
|
local x
|
|
for x in ${deps}; do
|
|
if ! type "${x}" &>/dev/null; then
|
|
ewarn "Skipping ${archive}, tool ${x} not found"
|
|
return
|
|
fi
|
|
done
|
|
|
|
rm -rf testdir || die
|
|
mkdir -p testdir || die
|
|
|
|
tbegin "unpacking ${archive}"
|
|
eval "${packcmd}"
|
|
assert "packing ${archive} failed"
|
|
cd testdir || die
|
|
|
|
# create a symlink to flush out compressor issues and resemble distdir more
|
|
# https://bugs.gentoo.org/873352
|
|
ln -s "../${archive}" "${archive}" || die
|
|
|
|
local out
|
|
out=$(
|
|
_unpacker "${archive}" 2>&1
|
|
)
|
|
ret=$?
|
|
if [[ ${ret} -eq 0 ]]; then
|
|
if [[ ! -f ${unpacked} ]]; then
|
|
eerror "${unpacked} not found after unpacking"
|
|
ret=1
|
|
elif ! diff -u "${unpacked}" "../${TESTFILE}"; then
|
|
eerror "${unpacked} different than input"
|
|
ret=1
|
|
fi
|
|
fi
|
|
[[ ${ret} -ne 0 ]] && echo "${out}" >&2
|
|
tend ${ret}
|
|
|
|
cd .. || die
|
|
rm -f "${archive}" || die
|
|
}
|
|
|
|
test_compressed_file() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
|
|
test_unpack "test${suffix}" test "${tool}" \
|
|
"${tool} -c \${TESTFILE} > \${archive}"
|
|
}
|
|
|
|
test_compressed_file_multistream() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
|
|
test_unpack "test+multistream${suffix}" "test+multistream" "${tool}" \
|
|
"head -n 300 \${TESTFILE} | ${tool} -c > \${archive} &&
|
|
tail -n +301 \${TESTFILE} | ${tool} -c >> \${archive}"
|
|
}
|
|
|
|
test_compressed_file_with_junk() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
local flag=${3}
|
|
|
|
test_unpack "test+junk${suffix}" "test+junk" "${tool}" \
|
|
"${tool} -c \${TESTFILE} > \${archive} && cat test.in >> \${archive}"
|
|
}
|
|
|
|
test_compressed_tar() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
|
|
test_unpack "test${suffix}" test.in "tar ${tool}" \
|
|
"tar -c \${TESTFILE} | ${tool} -c > \${archive}"
|
|
}
|
|
|
|
test_compressed_cpio() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
|
|
test_unpack "test${suffix}" test.in "cpio ${tool}" \
|
|
"cpio -o --quiet <<<\${TESTFILE} | ${tool} -c > \${archive}"
|
|
}
|
|
|
|
create_deb() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
local archive=${3}
|
|
local infile=${4}
|
|
|
|
echo 2.0 > debian-binary || die
|
|
: > control || die
|
|
tar -cf control.tar control || die
|
|
tar -c "${infile}" | ${tool} > "data.tar${suffix}"
|
|
assert "packing data.tar${suffix} failed"
|
|
ar r "${archive}" debian-binary control.tar "data.tar${suffix}" \
|
|
2>/dev/null || die
|
|
rm -f control control.tar "data.tar${suffix}" debian-binary || die
|
|
}
|
|
|
|
test_deb() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
local tool_cmd
|
|
|
|
if [[ -n ${tool} ]]; then
|
|
tool_cmd="${tool} -c"
|
|
else
|
|
tool_cmd=cat
|
|
fi
|
|
|
|
test_unpack "test-${tool}_1.2.3_noarch.deb" test.in "ar tar ${tool}" \
|
|
"create_deb '${suffix}' '${tool_cmd}' \${archive} \${TESTFILE}"
|
|
# also test with the handwoven implementation used on Prefix
|
|
EPREFIX=/foo \
|
|
test_unpack "test_pfx-${tool}_1.2.3_noarch.deb" test.in "ar tar ${tool}" \
|
|
"create_deb '${suffix}' '${tool_cmd}' \${archive} \${TESTFILE}"
|
|
}
|
|
|
|
create_gpkg() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
local archive=${3}
|
|
local infile=${4}
|
|
local gpkg_dir=${archive%.gpkg.tar}
|
|
|
|
mkdir image metadata "${gpkg_dir}" || die
|
|
cp "${infile}" image/ || die
|
|
tar -c metadata | ${tool} > "${gpkg_dir}/metadata.tar${suffix}"
|
|
assert "packing metadata.tar${suffix} failed"
|
|
: > "${gpkg_dir}/metadata.tar${suffix}.sig" || die
|
|
tar -c image | ${tool} > "${gpkg_dir}/image.tar${suffix}"
|
|
assert "packing image.tar${suffix} failed"
|
|
: > "${gpkg_dir}/image.tar${suffix}.sig" || die
|
|
: > "${gpkg_dir}"/gpkg-1 || die
|
|
tar -cf "${archive}" --format=ustar \
|
|
"${gpkg_dir}"/{gpkg-1,{metadata,image}.tar"${suffix}"} || die
|
|
rm -r image metadata "${gpkg_dir}" || die
|
|
}
|
|
|
|
test_gpkg() {
|
|
local suffix=${1}
|
|
local tool=${2}
|
|
local tool_cmd
|
|
|
|
if [[ -n ${tool} ]]; then
|
|
tool_cmd="${tool} -c"
|
|
else
|
|
tool_cmd=cat
|
|
fi
|
|
|
|
test_unpack "test-${tool}-1.2.3-1.gpkg.tar" \
|
|
"test-${tool}-1.2.3-1/image/test.in" "tar ${tool}" \
|
|
"create_gpkg '${suffix}' '${tool_cmd}' \${archive} \${TESTFILE}"
|
|
}
|
|
|
|
create_makeself() {
|
|
local comp_opt=${1}
|
|
local archive=${2}
|
|
local infile=${3}
|
|
|
|
mkdir test || die
|
|
cp "${infile}" test/ || die
|
|
makeself --quiet "${comp_opt}" test "${archive}" test : || die
|
|
rm -rf test || die
|
|
}
|
|
|
|
test_makeself() {
|
|
local comp_opt=${1}
|
|
local tool=${2}
|
|
|
|
test_unpack "makeself-${tool}.sh" test.in "makeself ${tool}" \
|
|
"create_makeself '${comp_opt}' \${archive} \${TESTFILE}"
|
|
}
|
|
|
|
test_reject_junk() {
|
|
local suffix=${1}
|
|
local archive=test${1}
|
|
|
|
rm -rf testdir || die
|
|
mkdir -p testdir || die
|
|
|
|
tbegin "rejecting junk named ${archive}"
|
|
cat test.in >> "${archive}" || die
|
|
cd testdir || die
|
|
(
|
|
# some decompressors (e.g. cpio) are very verbose about junk
|
|
_unpacker "../${archive}" &>/dev/null
|
|
)
|
|
[[ $? -ne 0 ]]
|
|
ret=$?
|
|
tend ${ret}
|
|
|
|
cd .. || die
|
|
rm -f "${archive}" || die
|
|
}
|
|
|
|
test_online() {
|
|
local url=${1}
|
|
local b2sum=${2}
|
|
local unpacked=${3}
|
|
local unp_b2sum=${4}
|
|
|
|
local filename=${url##*/}
|
|
local archive=${DISTDIR}/${filename}
|
|
|
|
if [[ ! -f ${archive} ]]; then
|
|
if [[ ${UNPACKER_TESTS_ONLINE} != 1 ]]; then
|
|
ewarn "Skipping ${filename} test, distfile not found"
|
|
return
|
|
fi
|
|
|
|
if ! wget -O "${archive}" "${url}"; then
|
|
die "Fetching ${archive} failed"
|
|
fi
|
|
fi
|
|
|
|
local real_sum=$(b2sum "${archive}" | cut -d' ' -f1)
|
|
if [[ ${real_sum} != ${b2sum} ]]; then
|
|
eerror "Incorrect b2sum on ${filename}"
|
|
eerror " expected: ${b2sum}"
|
|
eerror " found: ${real_sum}"
|
|
die "Incorrect b2sum on ${filename}"
|
|
fi
|
|
|
|
rm -rf testdir || die
|
|
mkdir -p testdir || die
|
|
|
|
tbegin "unpacking ${filename}"
|
|
cd testdir || die
|
|
|
|
ln -s "${archive}" "${filename}" || die
|
|
|
|
local out
|
|
out=$(
|
|
_unpacker "${archive}" 2>&1
|
|
)
|
|
ret=$?
|
|
if [[ ${ret} -eq 0 ]]; then
|
|
if [[ ! -f ${unpacked} ]]; then
|
|
eerror "${unpacked} not found after unpacking"
|
|
ret=1
|
|
else
|
|
real_sum=$(b2sum "${unpacked}" | cut -d' ' -f1)
|
|
if [[ ${real_sum} != ${unp_b2sum} ]]; then
|
|
eerror "Incorrect b2sum on unpacked file ${unpacked}"
|
|
eerror " expected: ${unp_b2sum}"
|
|
eerror " found: ${real_sum}"
|
|
ret=1
|
|
fi
|
|
fi
|
|
fi
|
|
[[ ${ret} -ne 0 ]] && echo "${out}" >&2
|
|
tend ${ret}
|
|
|
|
cd .. || die
|
|
}
|
|
|
|
test_compressed_file .bz2 bzip2
|
|
test_compressed_file .Z compress
|
|
test_compressed_file .gz gzip
|
|
test_compressed_file .lzma lzma
|
|
test_compressed_file .xz xz
|
|
test_compressed_file .lz lzip
|
|
test_compressed_file .zst zstd
|
|
test_compressed_file .lz4 lz4
|
|
test_compressed_file .lzo lzop
|
|
|
|
test_compressed_file_multistream .bz2 bzip2
|
|
test_compressed_file_multistream .gz gzip
|
|
test_compressed_file_multistream .xz xz
|
|
test_compressed_file_multistream .lz lzip
|
|
test_compressed_file_multistream .zst zstd
|
|
|
|
test_compressed_file_with_junk .bz2 bzip2
|
|
test_compressed_file_with_junk .lz lzip
|
|
|
|
test_unpack test.tar test.in tar 'tar -cf ${archive} ${TESTFILE}'
|
|
test_compressed_tar .tar.bz2 bzip2
|
|
test_compressed_tar .tbz bzip2
|
|
test_compressed_tar .tbz2 bzip2
|
|
test_compressed_tar .tar.Z compress
|
|
test_compressed_tar .tar.gz gzip
|
|
test_compressed_tar .tgz gzip
|
|
test_compressed_tar .tar.lzma lzma
|
|
test_compressed_tar .tar.xz xz
|
|
test_compressed_tar .txz xz
|
|
test_compressed_tar .tar.lz lzip
|
|
test_compressed_tar .tar.zst zstd
|
|
test_compressed_tar .tar.lz4 lz4
|
|
test_compressed_tar .tar.lzo lzop
|
|
|
|
test_unpack test.cpio test.in cpio 'cpio -o --quiet <<<${TESTFILE} > ${archive}'
|
|
test_compressed_cpio .cpio.bz2 bzip2
|
|
test_compressed_cpio .cpio.Z compress
|
|
test_compressed_cpio .cpio.gz gzip
|
|
test_compressed_cpio .cpio.lzma lzma
|
|
test_compressed_cpio .cpio.xz xz
|
|
test_compressed_cpio .cpio.lz lzip
|
|
test_compressed_cpio .cpio.zst zstd
|
|
test_compressed_cpio .cpio.lz4 lz4
|
|
test_compressed_cpio .cpio.lzo lzop
|
|
|
|
test_deb
|
|
test_deb .gz gzip
|
|
test_deb .xz xz
|
|
test_deb .bz2 bzip2
|
|
test_deb .lzma lzma
|
|
|
|
test_gpkg
|
|
test_gpkg .gz gzip
|
|
test_gpkg .bz2 bzip2
|
|
test_gpkg .lz4 lz4
|
|
test_gpkg .lz lzip
|
|
test_gpkg .lzma lzma
|
|
test_gpkg .lzo lzop
|
|
test_gpkg .xz xz
|
|
test_gpkg .zst zstd
|
|
|
|
test_makeself --gzip gzip
|
|
test_makeself --zstd zstd
|
|
test_makeself --bzip2 bzip2
|
|
test_makeself --xz xz
|
|
test_makeself --lzo lzop
|
|
test_makeself --lz4 lz4
|
|
test_makeself --compress compress
|
|
test_makeself --base64 base64
|
|
test_makeself --nocomp tar
|
|
|
|
test_unpack test.zip test.in zip 'zip -q ${archive} ${TESTFILE}'
|
|
# test handling non-adjusted zip with junk prepended
|
|
test_unpack test.zip test.in zip \
|
|
'zip -q testdir/tmp.zip ${TESTFILE} && cat test.in testdir/tmp.zip > ${archive}'
|
|
test_unpack test.7z test.in 7z '7z -bso0 a ${archive} ${TESTFILE}'
|
|
test_unpack test.lha test.in lha 'lha a -q ${archive} ${TESTFILE}'
|
|
test_unpack test.lzh test.in lha 'lha a -q ${archive} ${TESTFILE}'
|
|
test_unpack test.rar test.in rar 'rar -idq a ${archive} ${TESTFILE}'
|
|
|
|
# TODO: .run/.sh/.bin
|
|
|
|
test_reject_junk .bz2
|
|
test_reject_junk .Z
|
|
test_reject_junk .gz
|
|
test_reject_junk .lzma
|
|
test_reject_junk .xz
|
|
test_reject_junk .lz
|
|
test_reject_junk .zst
|
|
test_reject_junk .tar
|
|
test_reject_junk .cpio
|
|
test_reject_junk .gpkg.tar
|
|
test_reject_junk .deb
|
|
test_reject_junk .zip
|
|
test_reject_junk .7z
|
|
test_reject_junk .rar
|
|
test_reject_junk .lha
|
|
test_reject_junk .lzh
|
|
|
|
DISTDIR=$(portageq envvar DISTDIR)
|
|
if [[ -n ${DISTDIR} ]]; then
|
|
einfo "Using DISTDIR: ${DISTDIR}"
|
|
if [[ ${UNPACKER_TESTS_ONLINE} != 1 ]]; then
|
|
ewarn "Online tests will be skipped if distfiles are not found already."
|
|
ewarn "Set UNPACKER_TESTS_ONLINE=1 to enable fetching."
|
|
fi
|
|
|
|
# NB: a good idea to list the last file in the archive (to avoid
|
|
# passing on partial unpack)
|
|
|
|
# TODO: find test cases for makeself 2.0/2.0.1, 2.1.1, 2.1.2, 2.1.3
|
|
|
|
# makeself 1.5.4, gzip
|
|
test_online \
|
|
http://updates.lokigames.com/sof/sof-1.06a-cdrom-x86.run \
|
|
f76f605af08a19b77548455c0101e03aca7cae69462914e47911da2fadd6d4f3b766e1069556ead0d06c757b179ae2e8105e76ea37852f17796b47b4712aec87 \
|
|
update.sh \
|
|
ba7a3f8fa79bbed8ca3a34ead957aeaa308c6e6d6aedd603098aa9867ca745983ff98c83d65572e507f2c3c4e0778ae4984f8b69d2b8279741b06064253c5788
|
|
|
|
# makeself 1.6.0-nv*, xz
|
|
test_online \
|
|
https://download.nvidia.com/XFree86/Linux-x86/390.154/NVIDIA-Linux-x86-390.154.run \
|
|
083d9dd234a37ec39a703ef7e0eb6ec165c24d2fcb5e92ca987c33df643d0604319eb65ef152c861acacd5a41858ab6b82c45c2c8ff270efc62b07727666daae \
|
|
libEGL_nvidia.so.390.154 \
|
|
6665804947e71fb583dc7d5cc3a6f4514f612503000b0a9dbd8da5c362d3c2dcb2895d8cbbf5700a6f0e24cca9b0dd9c2cf5763d6fbb037f55257ac5af7d6084
|
|
|
|
# makeself 2.3.0, gzip
|
|
test_online \
|
|
http://www.sdrplay.com/software/SDRplay_RSP_API-Linux-3.07.1.run \
|
|
059d9a5fbd14c0e7ecb969cd3e5afe8e3f42896175b443bdaa9f9108302a1c9ef5ad9769e62f824465611d74f67191fff71cc6dbe297e399e5b2f6824c650112 \
|
|
i686/sdrplay_apiService \
|
|
806393c310d7e60dca7b8afee225bcc50c0d5771bdd04c3fa575eda2e687dc5c888279a7404316438b633fb91565a49899cf634194d43981151a12c6c284a162
|
|
|
|
# makeself 2.4.0, gzip
|
|
test_online \
|
|
http://www.sdrplay.com/software/SDRplay_RSP_API-Linux-2.13.1.run \
|
|
7eff1aa35190db1ead5b1d96994d24ae2301e3a765d6701756c6304a1719aa32125fedacf6a6859d89b89db5dd6956ec0e8c7e814dbd6242db5614a53e89efb3 \
|
|
sdrplay_license.txt \
|
|
041edb26ffb75b6b59e7a3514c6f81b05b06e0efe61cc56117d24f59733a6a6b1bca73a57dd11e0774ec443740ca55e6938cf6594a032ab4f14b23f2e732a3f2
|
|
else
|
|
ewarn "Unable to obtain DISTDIR from portageq, skipping online tests"
|
|
fi
|
|
|
|
texit
|