diff options
Diffstat (limited to 'tests/qemu-iotests/083')
-rwxr-xr-x | tests/qemu-iotests/083 | 136 |
1 files changed, 84 insertions, 52 deletions
diff --git a/tests/qemu-iotests/083 b/tests/qemu-iotests/083 index bff9360..0306f11 100755 --- a/tests/qemu-iotests/083 +++ b/tests/qemu-iotests/083 @@ -27,6 +27,14 @@ echo "QA output created by $seq" here=`pwd` status=1 # failure is the default! +_cleanup() +{ + rm -f 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 @@ -35,81 +43,105 @@ _supported_fmt generic _supported_proto nbd _supported_os Linux -# Pick a TCP port based on our pid. This way multiple instances of this test -# can run in parallel without conflicting. -choose_tcp_port() { - echo $((($$ % 31744) + 1024)) # 1024 <= port < 32768 -} - -wait_for_tcp_port() { - while ! (netstat --tcp --listening --numeric | \ - grep "$1.*0\\.0\\.0\\.0:\\*.*LISTEN") >/dev/null 2>&1; do - sleep 0.1 +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 -} -check_disconnect() { event=$1 when=$2 - negotiation=$3 echo "=== Check disconnect $when $event ===" echo - port=$(choose_tcp_port) - cat > "$TEST_DIR/nbd-fault-injector.conf" <<EOF [inject-error] event=$event when=$when EOF - if [ "$negotiation" = "--classic-negotiation" ]; then - extra_args=--classic-negotiation - nbd_url="nbd:127.0.0.1:$port" + if [ "$proto" = "tcp" ]; then + nbd_addr="127.0.0.1:0" else - nbd_url="nbd:127.0.0.1:$port:exportname=foo" + nbd_addr="$TEST_DIR/nbd.sock" + fi + + rm -f "$TEST_DIR/nbd.sock" + + $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 's/Listening on \(.*\)$/\1/' "$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 - $PYTHON nbd-fault-injector.py $extra_args "127.0.0.1:$port" "$TEST_DIR/nbd-fault-injector.conf" >/dev/null 2>&1 & - wait_for_tcp_port "127\\.0\\.0\\.1:$port" $QEMU_IO -c "read 0 512" "$nbd_url" 2>&1 | _filter_qemu_io | _filter_nbd echo } -for event in neg1 "export" neg2 request reply data; do - for when in before after; do - check_disconnect "$event" "$when" - done - - # Also inject short replies from the NBD server - case "$event" in - neg1) - for when in 8 16; do - check_disconnect "$event" "$when" - done - ;; - "export") - for when in 4 12 16; do - check_disconnect "$event" "$when" +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 - ;; - neg2) - for when in 8 10; do - check_disconnect "$event" "$when" - done - ;; - reply) - for when in 4 8; do - check_disconnect "$event" "$when" - done - ;; - esac -done -# Also check classic negotiation without export information -for when in before 8 16 24 28 after; do - check_disconnect "neg-classic" "$when" --classic-negotiation + # 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 |