ipfs-test-lib.sh 2.67 KB
Newer Older
1 2
# Generic test functions for go-ipfs

3 4 5 6
ansi_strip() {
    sed 's/\x1b\[[0-9;]*m//g'
}

7 8 9 10 11 12 13 14 15 16 17 18 19
# Quote arguments for sh eval
shellquote() {
	_space=''
	for _arg
	do
		# On Mac OS, 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'
}

20 21 22 23
# Echo the args, run the cmd, and then also fail,
# making sure a test case fails.
test_fsh() {
    echo "> $@"
24
    eval $(shellquote "$@")
25 26 27 28 29 30 31 32 33 34 35
    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 "$@"
}

36 37 38 39 40 41
# 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"
}
42

43 44 45 46 47 48 49 50
# 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"
}

51 52
# Docker

Lars Gierth's avatar
Lars Gierth committed
53
# This takes a Dockerfile, and a build context directory
54
docker_build() {
55
    docker build --rm -f "$1" "$2" | ansi_strip
56 57 58 59
}

# This takes an image as argument and writes a docker ID on stdout
docker_run() {
Lars Gierth's avatar
Lars Gierth committed
60
    docker run -d "$1"
61 62 63 64 65 66 67 68
}

# This takes a docker ID and a command as arguments
docker_exec() {
    if test "$CIRCLE" = 1
    then
        sudo lxc-attach -n "$(docker inspect --format '{{.Id}}' $1)" -- /bin/bash -c "$2"
    else
Lars Gierth's avatar
Lars Gierth committed
69
	docker exec -t "$1" /bin/bash -c "$2"
70 71 72 73 74 75 76
    fi
}

# This takes a docker ID as argument
docker_stop() {
    docker stop "$1"
}
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

# 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
}
112 113

b64decode() {
114 115 116 117 118 119 120
    case `uname` in
        Linux|FreeBSD) base64 -d ;;
        Darwin) base64 -D ;;
        *)
            echo "no compatible base64 command found" >&2
            return 1
    esac
121
}