mirror of
https://gitlab.alpinelinux.org/alpine/abuild.git
synced 2024-12-24 16:02:23 +00:00
dee82f764c
the sleep(0) trick does not appear to work on s390x. which is okish as worst case we end up with lock file leftovers. skip the test
141 lines
3.5 KiB
Bash
141 lines
3.5 KiB
Bash
setup() {
|
|
export ABUILD_FETCH="$PWD/../abuild-fetch"
|
|
|
|
tmpdir="$BATS_TMPDIR"/abuild-fetch
|
|
bindir="$tmpdir"/bin
|
|
mkdir -p "$bindir"
|
|
export PATH="$bindir:$PATH"
|
|
|
|
# fake curl
|
|
cat > "$bindir"/curl <<-EOF
|
|
#!/bin/sh
|
|
|
|
touch \${STAMP:-"$tmpdir"/curl-invoked}
|
|
echo "[\$\$] Fake curl invoked with: \$@"
|
|
if [ -n "\$FIFO" ]; then
|
|
echo "[\$\$] waiting for fifo \$FIFO"
|
|
cat "\$FIFO"
|
|
fi
|
|
exit \${CURL_EXITCODE:-0}
|
|
EOF
|
|
chmod +x "$bindir"/curl
|
|
|
|
# fake wget
|
|
cat > "$bindir"/wget <<-EOF
|
|
#!/bin/sh
|
|
|
|
PATH=/usr/local/bin:/usr/bin:/bin
|
|
touch "$tmpdir"/wget-invoked
|
|
echo "Fake wget invoked with: \$@"
|
|
exit \${WGET_EXITCODE:-0}
|
|
EOF
|
|
chmod +x "$bindir"/wget
|
|
|
|
}
|
|
|
|
teardown() {
|
|
rm -rf "$tmpdir"
|
|
}
|
|
|
|
@test "abuild-fetch: help text" {
|
|
$ABUILD_FETCH -h
|
|
}
|
|
|
|
@test "abuild-fetch: test curl invocation" {
|
|
$ABUILD_FETCH -d "$tmpdir" https://example.com/non-existing
|
|
[ -f "$tmpdir"/curl-invoked ]
|
|
}
|
|
|
|
@test "abuild-fetch: test curl failure" {
|
|
run CURL_EXITCODE=1 $ABUILD_FETCH -d "$tmpdir" https://example.com/non-existing
|
|
[ $status -ne 0 ]
|
|
}
|
|
|
|
@test "abuild-fetch: that --insecure is passed for http://" {
|
|
$ABUILD_FETCH -d "$tmpdir" http://example.com/non-existing | grep insecure
|
|
}
|
|
|
|
@test "abuild-fetch: test wget fallback" {
|
|
rm "$bindir"/curl
|
|
PATH="$bindir" $ABUILD_FETCH -d "$tmpdir" https://example.com/non-existing
|
|
[ -f "$tmpdir"/wget-invoked ]
|
|
}
|
|
|
|
@test "abuild-fetch: test wget fallback failure" {
|
|
rm "$bindir"/curl
|
|
run PATH="$bindir" WGET_EXITCODE=1 $ABUILD_FETCH -d "$tmpdir" https://example.com/non-existing
|
|
[ $status -ne 0 ]
|
|
}
|
|
|
|
@test "abuild-fetch: test that --no-check-certificate is passed to wget fallback with http://" {
|
|
rm "$bindir"/curl
|
|
PATH="$bindir" $ABUILD_FETCH -d "$tmpdir" http://example.com/non-existing | grep no-check-certificate
|
|
}
|
|
|
|
@test "abuild-fetch: test locking" {
|
|
fifo1="$tmpdir"/fifo1
|
|
fifo2="$tmpdir"/fifo2
|
|
mkfifo $fifo1 $fifo2
|
|
|
|
# make sure to unblock the fake curl in case test failure so we dont block bats
|
|
teardown() {
|
|
if [ -d /proc/$pid1 ]; then
|
|
echo "done fifo1" > "$tmpdir"/fifo1
|
|
fi
|
|
if [ -d /proc/$pid2 ]; then
|
|
echo "done fifo2" > "$tmpdir"/fifo2
|
|
fi
|
|
rm -rf "$tmpdir"
|
|
}
|
|
|
|
CURL_EXITCODE=1 STAMP="$tmpdir"/stamp1 FIFO="$tmpdir"/fifo1 $ABUILD_FETCH -d "$tmpdir" https://example.com/foo &
|
|
pid1=$!
|
|
|
|
# wait til curl is called
|
|
while ! [ -f "$tmpdir"/stamp1 ]; do
|
|
sleep 0.1
|
|
done
|
|
|
|
# try a second fetch, while the first one is still running
|
|
STAMP="$tmpdir"/stamp2 FIFO="$tmpdir"/fifo2 $ABUILD_FETCH -d "$tmpdir" https://example.com/foo &
|
|
pid2=$!
|
|
ls -la "$tmpdir"
|
|
# second stamp should not exist til after first abuild-fetch completes
|
|
[ ! -f "$tmpdir"/stamp2 ]
|
|
|
|
# tell curl to similuate download complete of first
|
|
echo "done fifo1" > "$tmpdir"/fifo1
|
|
run wait $pid1
|
|
[ $status -ne 0 ]
|
|
|
|
# wait til second instance gets lock to simulate download start
|
|
while ! [ -f "$tmpdir"/stamp2 ]; do
|
|
sleep 0.1
|
|
done
|
|
|
|
# first instance is done. lets retry download. second instance should block us
|
|
rm "$tmpdir"/stamp1
|
|
STAMP="$tmpdir"/stamp1 FIFO="$tmpdir"/fifo1 $ABUILD_FETCH -d "$tmpdir" https://example.com/foo &
|
|
pid1=$!
|
|
|
|
sleep 0.2
|
|
# the first stamp should not exist, second instance should block the retry
|
|
# skip this test on s390x, due to sleep(0) not working there
|
|
if [ "$(uname -m)" != "s390x" ]; then
|
|
[ ! -f "$tmpdir"/stamp1 ]
|
|
fi
|
|
|
|
# simulate second download finished
|
|
echo "done fifo2" > "$tmpdir"/fifo2
|
|
wait $pid2
|
|
|
|
# first should get unblocked
|
|
echo "done fifo1" > "$tmpdir"/fifo1
|
|
wait $pid1
|
|
|
|
# verify that first actually called curl
|
|
[ -f "$tmpdir"/stamp1 ]
|
|
|
|
ls -la "$tmpdir"
|
|
}
|