1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-12-19 01:30:17 +08:00
Files
kubo/test/ipfs-test-lib.sh
Gus Eggert 3a15a0fc55 test: fix Docker tests in GH Actions (#9812)
GH Actions recently changed their Docker build implementation and it
has a different output than previously, causing the tests that parse
its output to fail.

This switches the test to not parse Docker build output. The parsing
was used to extract the image ID while still showing logs. A better
way to show logs and still know the image ID is to tag it, which is
what this now does.

This also renames the Docker tests so that they run earlier. This
takes better advantage of the fact that the sharness tests are run in
parallel. Since the Docker test are quite long, and are at the end of
the list, the test runner is not running other tests in parallel while
the Docker tests are running.
2023-04-12 09:03:11 +02:00

127 lines
2.8 KiB
Bash

# Generic test functions for go-ipfs
ansi_strip() {
sed 's/\x1b\[[0-9;]*m//g'
}
# Quote arguments for sh eval
shellquote() {
_space=''
for _arg
do
# On macOS, sed adds a newline character.
# With a printf wrapper the extra newline is removed.
printf "$_space'%s'" "$(printf "%s" "$_arg" | sed -e "s/'/'\\\\''/g;")"
_space=' '
done
printf '\n'
}
# Echo the args, run the cmd, and then also fail,
# making sure a test case fails.
test_fsh() {
echo "> $@"
eval $(shellquote "$@")
echo ""
false
}
# Same as sharness' test_cmp but using test_fsh (to see the output).
# We have to do it twice, so the first diff output doesn't show unless it's
# broken.
test_cmp() {
diff -q "$@" >/dev/null || test_fsh diff -u "$@"
}
# Same as test_cmp above, but we sort files before comparing them.
test_sort_cmp() {
sort "$1" >"$1_sorted" &&
sort "$2" >"$2_sorted" &&
test_cmp "$1_sorted" "$2_sorted"
}
# Same as test_cmp above, but we standardize directory
# separators before comparing the files.
test_path_cmp() {
sed -e "s/\\\\/\//g" "$1" >"$1_std" &&
sed -e "s/\\\\/\//g" "$2" >"$2_std" &&
test_cmp "$1_std" "$2_std"
}
# Docker
# This takes a Dockerfile, a tag name, and a build context directory
docker_build() {
docker build --rm --tag "$1" --file "$2" "$3" | ansi_strip
}
# This takes an image as argument and writes a docker ID on stdout
docker_run() {
docker run --detach "$1"
}
# This takes a docker ID and a command as arguments
docker_exec() {
docker exec --tty "$1" /bin/sh -c "$2"
}
# This takes a docker ID as argument
docker_stop() {
docker stop "$1"
}
# This takes a docker ID as argument
docker_rm() {
docker rm --force --volumes "$1" > /dev/null
}
# This takes a docker image name as argument
docker_rmi() {
docker rmi --force "$1" > /dev/null
}
# Test whether all the expected lines are included in a file. The file
# can have extra lines.
#
# $1 - Path to file with expected lines.
# $2 - Path to file with actual output.
#
# Examples
#
# test_expect_success 'foo says hello' '
# echo hello >expected &&
# foo >actual &&
# test_cmp expected actual
# '
#
# Returns the exit code of the command set by TEST_CMP.
test_includes_lines() {
sort "$1" >"$1_sorted" &&
sort "$2" >"$2_sorted" &&
comm -2 -3 "$1_sorted" "$2_sorted" >"$2_missing" &&
[ ! -s "$2_missing" ] || test_fsh comm -2 -3 "$1_sorted" "$2_sorted"
}
# Depending on GNU seq availability is not nice.
# Git also has test_seq but it uses Perl.
test_seq() {
test "$1" -le "$2" || return
i="$1"
j="$2"
while test "$i" -le "$j"
do
echo "$i"
i=$(expr "$i" + 1)
done
}
b64decode() {
case `uname` in
Linux|FreeBSD) base64 -d ;;
Darwin) base64 -D ;;
*)
echo "no compatible base64 command found" >&2
return 1
esac
}