]>
Commit | Line | Data |
---|---|---|
dc668ded SH |
1 | #!/bin/bash |
2 | # | |
3 | # Test NBD client unexpected disconnect | |
4 | # | |
5 | # Copyright Red Hat, Inc. 2014 | |
6 | # | |
7 | # This program is free software; you can redistribute it and/or modify | |
8 | # it under the terms of the GNU General Public License as published by | |
9 | # the Free Software Foundation; either version 2 of the License, or | |
10 | # (at your option) any later version. | |
11 | # | |
12 | # This program is distributed in the hope that it will be useful, | |
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | # GNU General Public License for more details. | |
16 | # | |
17 | # You should have received a copy of the GNU General Public License | |
18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | # | |
20 | ||
21 | # creator | |
22 | owner=stefanha@redhat.com | |
23 | ||
24 | seq=`basename $0` | |
25 | echo "QA output created by $seq" | |
26 | ||
27 | here=`pwd` | |
dc668ded SH |
28 | status=1 # failure is the default! |
29 | ||
02d2d860 SH |
30 | _cleanup() |
31 | { | |
32 | rm -f nbd.sock | |
33 | rm -f nbd-fault-injector.out | |
34 | rm -f nbd-fault-injector.conf | |
35 | } | |
36 | trap "_cleanup; exit \$status" 0 1 2 3 15 | |
37 | ||
dc668ded SH |
38 | # get standard environment, filters and checks |
39 | . ./common.rc | |
40 | . ./common.filter | |
41 | ||
42 | _supported_fmt generic | |
43 | _supported_proto nbd | |
44 | _supported_os Linux | |
45 | ||
02d2d860 SH |
46 | check_disconnect() { |
47 | local event export_name=foo extra_args nbd_addr nbd_url proto when | |
48 | ||
49 | while true; do | |
50 | case $1 in | |
51 | --classic-negotiation) | |
52 | shift | |
53 | extra_args=--classic-negotiation | |
54 | export_name= | |
55 | ;; | |
56 | --tcp) | |
57 | shift | |
58 | proto=tcp | |
59 | ;; | |
60 | --unix) | |
61 | shift | |
62 | proto=unix | |
63 | ;; | |
64 | *) | |
65 | break | |
66 | ;; | |
67 | esac | |
dc668ded | 68 | done |
dc668ded | 69 | |
dc668ded SH |
70 | event=$1 |
71 | when=$2 | |
dc668ded SH |
72 | echo "=== Check disconnect $when $event ===" |
73 | echo | |
74 | ||
dc668ded SH |
75 | cat > "$TEST_DIR/nbd-fault-injector.conf" <<EOF |
76 | [inject-error] | |
77 | event=$event | |
78 | when=$when | |
79 | EOF | |
80 | ||
02d2d860 SH |
81 | if [ "$proto" = "tcp" ]; then |
82 | nbd_addr="127.0.0.1:0" | |
dc668ded | 83 | else |
02d2d860 SH |
84 | nbd_addr="$TEST_DIR/nbd.sock" |
85 | fi | |
86 | ||
87 | rm -f "$TEST_DIR/nbd.sock" | |
88 | ||
ddc7093e | 89 | echo > "$TEST_DIR/nbd-fault-injector.out" |
02d2d860 SH |
90 | $PYTHON nbd-fault-injector.py $extra_args "$nbd_addr" "$TEST_DIR/nbd-fault-injector.conf" >"$TEST_DIR/nbd-fault-injector.out" 2>&1 & |
91 | ||
92 | # Wait for server to be ready | |
93 | while ! grep -q 'Listening on ' "$TEST_DIR/nbd-fault-injector.out"; do | |
94 | sleep 0.1 | |
95 | done | |
96 | ||
97 | # Extract the final address (port number has now been assigned in tcp case) | |
ddc7093e HR |
98 | nbd_addr=$(sed -n 's/^Listening on //p' \ |
99 | "$TEST_DIR/nbd-fault-injector.out") | |
02d2d860 SH |
100 | |
101 | if [ "$proto" = "tcp" ]; then | |
102 | nbd_url="nbd+tcp://$nbd_addr/$export_name" | |
103 | else | |
104 | nbd_url="nbd+unix:///$export_name?socket=$nbd_addr" | |
dc668ded SH |
105 | fi |
106 | ||
05d0fce4 | 107 | $QEMU_IO -c "read 0 512" "$nbd_url" 2>&1 | _filter_qemu_io | _filter_nbd |
dc668ded SH |
108 | |
109 | echo | |
110 | } | |
111 | ||
02d2d860 SH |
112 | for proto in tcp unix; do |
113 | for event in neg1 "export" neg2 request reply data; do | |
114 | for when in before after; do | |
115 | check_disconnect "--$proto" "$event" "$when" | |
dc668ded | 116 | done |
dc668ded | 117 | |
02d2d860 SH |
118 | # Also inject short replies from the NBD server |
119 | case "$event" in | |
120 | neg1) | |
121 | for when in 8 16; do | |
122 | check_disconnect "--$proto" "$event" "$when" | |
123 | done | |
124 | ;; | |
125 | "export") | |
126 | for when in 4 12 16; do | |
127 | check_disconnect "--$proto" "$event" "$when" | |
128 | done | |
129 | ;; | |
130 | neg2) | |
131 | for when in 8 10; do | |
132 | check_disconnect "--$proto" "$event" "$when" | |
133 | done | |
134 | ;; | |
135 | reply) | |
136 | for when in 4 8; do | |
137 | check_disconnect "--$proto" "$event" "$when" | |
138 | done | |
139 | ;; | |
140 | esac | |
141 | done | |
142 | ||
143 | # Also check classic negotiation without export information | |
144 | for when in before 8 16 24 28 after; do | |
145 | check_disconnect "--$proto" --classic-negotiation "neg-classic" "$when" | |
146 | done | |
dc668ded SH |
147 | done |
148 | ||
149 | # success, all done | |
150 | echo "*** done" | |
151 | rm -f $seq.full | |
152 | status=0 |