aboutsummaryrefslogtreecommitdiff
path: root/tests/qemu-iotests/083
blob: 10fdfc8ebb61f0296b7bf87b7225ee5561afc9a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/env bash
#
# Test NBD client unexpected disconnect
#
# Copyright Red Hat, Inc. 2014
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

# creator
owner=stefanha@redhat.com

seq=`basename $0`
echo "QA output created by $seq"

status=1	# failure is the default!

_cleanup()
{
	rm -f "$SOCK_DIR/nbd.sock"
	rm -f nbd-fault-injector.out
	rm -f nbd-fault-injector.conf
}
trap "_cleanup; exit \$status" 0 1 2 3 15

# get standard environment, filters and checks
. ./common.rc
. ./common.filter

_supported_fmt raw
_supported_proto nbd
_supported_os Linux

check_disconnect() {
	local event export_name=foo extra_args nbd_addr nbd_url proto when

	while true; do
		case $1 in
		--classic-negotiation)
			shift
			extra_args=--classic-negotiation
			export_name=
			;;
		--tcp)
			shift
			proto=tcp
			;;
		--unix)
			shift
			proto=unix
			;;
		*)
			break
			;;
		esac
	done

	event=$1
	when=$2
	echo "=== Check disconnect $when $event ==="
	echo

	cat > "$TEST_DIR/nbd-fault-injector.conf" <<EOF
[inject-error]
event=$event
when=$when
EOF

	if [ "$proto" = "tcp" ]; then
		nbd_addr="127.0.0.1:0"
	else
		nbd_addr="$SOCK_DIR/nbd.sock"
	fi

	rm -f "$SOCK_DIR/nbd.sock"

        echo > "$TEST_DIR/nbd-fault-injector.out"
	$PYTHON nbd-fault-injector.py $extra_args "$nbd_addr" "$TEST_DIR/nbd-fault-injector.conf" >"$TEST_DIR/nbd-fault-injector.out" 2>&1 &

	# Wait for server to be ready
	while ! grep -q 'Listening on ' "$TEST_DIR/nbd-fault-injector.out"; do
		sleep 0.1
	done

	# Extract the final address (port number has now been assigned in tcp case)
        nbd_addr=$(sed -n 's/^Listening on //p' \
                       "$TEST_DIR/nbd-fault-injector.out")

	if [ "$proto" = "tcp" ]; then
		nbd_url="nbd+tcp://$nbd_addr/$export_name"
	else
		nbd_url="nbd+unix:///$export_name?socket=$nbd_addr"
	fi

	$QEMU_IO -c "read 0 512" "$nbd_url" 2>&1 | _filter_qemu_io | _filter_nbd

	echo
}

for proto in tcp unix; do
	for event in neg1 "export" neg2 request reply data; do
		for when in before after; do
			check_disconnect "--$proto" "$event" "$when"
		done

		# Also inject short replies from the NBD server
		case "$event" in
		neg1)
			for when in 8 16; do
				check_disconnect "--$proto" "$event" "$when"
			done
			;;
		"export")
			for when in 4 12 16; do
				check_disconnect "--$proto" "$event" "$when"
			done
			;;
		neg2)
			for when in 8 10; do
				check_disconnect "--$proto" "$event" "$when"
			done
			;;
		reply)
			for when in 4 8; do
				check_disconnect "--$proto" "$event" "$when"
			done
			;;
		esac
	done

	# Also check classic negotiation without export information
	for when in before 8 16 24 28 after; do
		check_disconnect "--$proto" --classic-negotiation "neg-classic" "$when"
	done
done

# success, all done
echo "*** done"
rm -f $seq.full
status=0