test-lib.sh 5.1 KB
Newer Older
1 2 3 4 5 6 7 8
# Test framework for go-ipfs
#
# Copyright (c) 2014 Christian Couder
# MIT Licensed; see the LICENSE file in this repository.
#
# We are using sharness (https://github.com/mlafeldt/sharness)
# which was extracted from the Git test framework.

9 10 11
# use the ipfs tool to test against

# add current directory to path, for ipfs tool.
12
PATH=$(pwd)/bin:${PATH}
13

14 15 16 17 18
# set sharness verbosity. we set the env var directly as
# it's too late to pass in --verbose, and --verbose is harder
# to pass through in some cases.
test "$TEST_VERBOSE" = 1 && verbose=t

19
# assert the `ipfs` we're using is the right one.
20
if test `which ipfs` != $(pwd)/bin/ipfs; then
21 22 23 24 25
	echo >&2 "Cannot find the tests' local ipfs tool."
	echo >&2 "Please check test and ipfs tool installation."
	exit 1
fi

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
26 27 28 29 30

# source the common hashes first.
. lib/test-lib-hashes.sh


31
SHARNESS_LIB="lib/sharness/sharness.sh"
32

33 34 35 36 37 38
. "$SHARNESS_LIB" || {
	echo >&2 "Cannot source: $SHARNESS_LIB"
	echo >&2 "Please check Sharness installation."
	exit 1
}

39 40 41 42 43 44 45
# overriding testcmp to make it use fsh (to see it better in output)
# have to do it twice so the first diff output doesnt show unless it's
# broken.
test_cmp() {
	diff -q "$@" >/dev/null || fsh diff -u "$@"
}

46 47
# Please put go-ipfs specific shell functions below

48
# grab + output options
49
test "$TEST_NO_FUSE" != 1 && test_set_prereq FUSE
50
test "$TEST_EXPENSIVE" = 1 && test_set_prereq EXPENSIVE
51

52 53 54 55 56 57
if test "$TEST_VERBOSE" = 1; then
	echo '# TEST_VERBOSE='"$TEST_VERBOSE"
	echo '# TEST_NO_FUSE='"$TEST_NO_FUSE"
	echo '# TEST_EXPENSIVE='"$TEST_EXPENSIVE"
fi

58 59 60
test_cmp_repeat_10_sec() {
	for i in 1 2 3 4 5 6 7 8 9 10
	do
61
		test_cmp "$1" "$2" >/dev/null && return
62 63 64 65 66
		sleep 1
	done
	test_cmp "$1" "$2"
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
67 68 69 70 71 72 73 74 75
test_run_repeat_10_sec() {
	for i in 1 2 3 4 5 6 7 8 9 10
	do
		(test_eval_ "$1") && return
		sleep 1
	done
	return 1 # failed
}

76
test_wait_output_n_lines_60_sec() {
77
	for i in 1 2 3 4 5 6
78
	do
79 80 81 82 83
		for i in 1 2 3 4 5 6 7 8 9 10
		do
			test $(cat "$1" | wc -l | tr -d " ") -ge $2 && return
			sleep 1
		done
84
	done
85 86
	actual=$(cat "$1" | wc -l | tr -d " ")
	fsh "expected $2 lines of output. got $actual"
87 88
}

89 90
test_wait_open_tcp_port_10_sec() {
	for i in 1 2 3 4 5 6 7 8 9 10; do
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
91 92 93 94 95
		# this is not a perfect check, but it's portable.
		# cant count on ss. not installed everywhere.
		# cant count on netstat using : or . as port delim. differ across platforms.
		echo $(netstat -aln | egrep "^tcp.*LISTEN" | egrep "[.:]$1" | wc -l) -gt 0
		if [ $(netstat -aln | egrep "^tcp.*LISTEN" | egrep "[.:]$1" | wc -l) -gt 0 ]; then
96 97 98 99 100 101 102
			return 0
		fi
		sleep 1
	done
	return 1
}

103
test_init_ipfs() {
104 105

	test_expect_success "ipfs init succeeds" '
106
		export IPFS_PATH="$(pwd)/.go-ipfs" &&
107
		ipfs init -b=1024 > /dev/null
108 109 110 111
	'

	test_expect_success "prepare config" '
		mkdir mountdir ipfs ipns &&
112
		ipfs config Mounts.IPFS "$(pwd)/ipfs" &&
113 114
		ipfs config Mounts.IPNS "$(pwd)/ipns" &&
		ipfs bootstrap rm --all
115 116
	'

117 118
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
119 120
test_config_ipfs_gateway_readonly() {
	test_expect_success "prepare config -- gateway readonly" '
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
121
	  ipfs config "Addresses.Gateway" "/ip4/0.0.0.0/tcp/5002"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
122 123 124 125 126
	'
}

test_config_ipfs_gateway_writable() {
	test_expect_success "prepare config -- gateway writable" '
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
127 128
	  ipfs config "Addresses.Gateway" "/ip4/0.0.0.0/tcp/5002" &&
	  ipfs config -bool "Gateway.Writable" true
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
129 130 131
	'
}

132 133
test_launch_ipfs_daemon() {

134 135 136 137 138 139 140
	ADDR_API="/ip4/127.0.0.1/tcp/5001"
	ADDR_GWAY=`ipfs config Addresses.Gateway`
	NLINES="2"
	if test "$ADDR_GWAY" != ""; then
		NLINES="3"
	fi

141
	test_expect_success "'ipfs daemon' succeeds" '
142
		ipfs daemon >actual_daemon 2>daemon_err &
143 144
	'

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
145 146 147
	# we say the daemon is ready when the API server is ready.
	# and we make sure there are no errors
	test_expect_success "'ipfs daemon' is ready" '
148
		IPFS_PID=$! &&
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
149
		test_wait_output_n_lines_60_sec actual_daemon $NLINES ||
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
150 151 152 153 154 155
		fsh cat actual_daemon || fsh cat daemon_err
	'

	test_expect_success "'ipfs daemon' output includes API address" '
		cat actual_daemon | grep "API server listening on $ADDR_API" ||
		fsh cat actual_daemon ||
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
156 157
		fsh "cat actual_daemon | grep \"API server listening on $ADDR_API\"" ||
		fsh cat daemon_err
158
	'
159

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
160 161 162 163
	if test "$ADDR_GWAY" != ""; then
		test_expect_success "'ipfs daemon' output includes Gateway address" '
			cat actual_daemon | grep "Gateway server listening on $ADDR_GWAY" ||
			fsh cat actual_daemon ||
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
164 165
			fsh "cat actual_daemon | grep \"Gateway server listening on $ADDR_GWAY\"" ||
			fsh cat daemon_err
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
166 167
		'
	fi
168 169 170
}

test_mount_ipfs() {
171

172
	# make sure stuff is unmounted first.
173
	test_expect_success FUSE "'ipfs mount' succeeds" '
174 175
		umount $(pwd)/ipfs || true &&
		umount $(pwd)/ipns || true &&
176 177 178 179 180 181 182 183
		ipfs mount >actual
	'

	test_expect_success FUSE "'ipfs mount' output looks good" '
		echo "IPFS mounted at: $(pwd)/ipfs" >expected &&
		echo "IPNS mounted at: $(pwd)/ipns" >>expected &&
		test_cmp expected actual
	'
184 185 186 187 188 189 190 191 192

}

test_launch_ipfs_daemon_and_mount() {

	test_init_ipfs
	test_launch_ipfs_daemon
	test_mount_ipfs

193 194 195 196 197 198 199 200 201 202
}

test_kill_repeat_10_sec() {
	for i in 1 2 3 4 5 6 7 8 9 10
	do
		kill $1
		sleep 1
		! kill -0 $1 2>/dev/null && return
	done
	! kill -0 $1 2>/dev/null
203 204
}

205
test_kill_ipfs_daemon() {
206

207
	test_expect_success "'ipfs daemon' is still running" '
208 209 210
		kill -0 $IPFS_PID
	'

211
	test_expect_success "'ipfs daemon' can be killed" '
212
		test_kill_repeat_10_sec $IPFS_PID
213 214
	'
}