From: Dmitry V. Levin Date: Wed, 7 Jan 2015 20:14:19 +0000 (+0000) Subject: tests: fix race condition in net-accept-connect based tests X-Git-Tag: v4.10~263 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c9cc4cbc50acb47f5042cbba011c4d81114eabca;p=strace tests: fix race condition in net-accept-connect based tests Change all net-accept-connect based tests to use different unix domain socket addresses, so that these tests could be safely run in parallel. * tests/net-accept-connect.c: Parametrize unix domain socket address. * tests/net-fd.test: Pass socket address to net-accept-connect. * tests/net.test: Likewise. * tests/unix-yy.test: Likewise. * tests/unix-yy-accept.awk: Update regexps. * tests/unix-yy-connect.awk: Likewise. --- diff --git a/tests/net-accept-connect.c b/tests/net-accept-connect.c index 5af7d81b..f33d48f3 100644 --- a/tests/net-accept-connect.c +++ b/tests/net-accept-connect.c @@ -6,16 +6,21 @@ #include #include -#define SUN_PATH "local-stream" -int main(void) +int main(int ac, const char **av) { struct sockaddr_un addr = { .sun_family = AF_UNIX, - .sun_path = SUN_PATH }; - socklen_t len = offsetof(struct sockaddr_un, sun_path) + sizeof SUN_PATH; + socklen_t len; - unlink(SUN_PATH); + assert(ac == 2); + assert(strlen(av[1]) > 0); + assert(strlen(av[1]) < sizeof(addr.sun_path)); + + strcpy(addr.sun_path, av[1]); + len = offsetof(struct sockaddr_un, sun_path) + strlen(av[1]) + 1; + + unlink(av[1]); close(0); close(1); @@ -44,6 +49,6 @@ int main(void) return 0; } - unlink(SUN_PATH); + unlink(av[1]); return 0; } diff --git a/tests/net-fd.test b/tests/net-fd.test index 0f0eb5cc..8bbf7e73 100755 --- a/tests/net-fd.test +++ b/tests/net-fd.test @@ -12,13 +12,14 @@ check_prog grep rm -f $LOG.* -./net-accept-connect || +addr=net-fd-local-stream +./net-accept-connect $addr || fail_ 'net-accept-connect failed' # using -y to test socket descriptors 'paths' decoding -args="-tt -ff -y -o $LOG -enetwork ./net-accept-connect" -$STRACE $args || - fail_ "strace $args failed" +args="-tt -ff -y -enetwork ./net-accept-connect $addr" +$STRACE -o "$LOG" $args || + fail_ "$STRACE $args failed" "$srcdir"/../strace-log-merge $LOG > $LOG || { cat $LOG @@ -37,10 +38,10 @@ grep_log() fail_ "strace -enetwork failed to trace \"$syscall\" properly" } } -grep_log bind '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, 15\) += 0' +grep_log bind '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="'$addr'"\}, 22\) += 0' grep_log listen '\(0, 5\) += 0' -grep_log getsockname '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, \[15\]\) += 0' +grep_log getsockname '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="'$addr'"\}, \[22\]\) += 0' grep_log accept '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), NULL\}, \[2\]\) += 1' -grep_log connect '\(1, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, 15\) += 0' +grep_log connect '\(1, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="'$addr'"\}, 22\) += 0' exit 0 diff --git a/tests/net.test b/tests/net.test index f0eff0c1..a7944663 100755 --- a/tests/net.test +++ b/tests/net.test @@ -8,12 +8,13 @@ check_prog grep rm -f $LOG.* -./net-accept-connect || +addr=net-local-stream +./net-accept-connect $addr || fail_ 'net-accept-connect failed' -args="-tt -ff -o $LOG -enetwork ./net-accept-connect" -$STRACE $args || - fail_ "strace $args failed" +args="-tt -ff -enetwork ./net-accept-connect $addr" +$STRACE -o "$LOG" $args || + fail_ "$STRACE $args failed" "$srcdir"/../strace-log-merge $LOG > $LOG || { cat $LOG @@ -35,10 +36,10 @@ grep_log() grep_log socket '\(PF_(LOCAL|UNIX|FILE), SOCK_STREAM, 0\) += 0' grep_log socket '\(PF_(LOCAL|UNIX|FILE), SOCK_STREAM, 0\) += 1' -grep_log bind '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, 15\) += 0' +grep_log bind '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="'$addr'"\}, 19\) += 0' grep_log listen '\(0, 5\) += 0' -grep_log getsockname '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, \[15\]\) += 0' +grep_log getsockname '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="'$addr'"\}, \[19\]\) += 0' grep_log accept '\(0, \{sa_family=AF_(LOCAL|UNIX|FILE), NULL\}, \[2\]\) += 1' -grep_log connect '\(1, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, 15\) += 0' +grep_log connect '\(1, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="'$addr'"\}, 19\) += 0' exit 0 diff --git a/tests/unix-yy-accept.awk b/tests/unix-yy-accept.awk index bafee898..7f0a9cb8 100644 --- a/tests/unix-yy-accept.awk +++ b/tests/unix-yy-accept.awk @@ -2,8 +2,9 @@ BEGIN { lines = 8 fail = 0 + addrlen = length(addr) + 3 r_i = "[1-9][0-9]*" - r_bind = "^bind\\(0, {sa_family=AF_(LOCAL|UNIX|FILE), sun_path=\"local-stream\"}, 15\\) += 0$" + r_bind = "^bind\\(0, {sa_family=AF_(LOCAL|UNIX|FILE), sun_path=\"" addr "\"}, " addrlen "\\) += 0$" } NR == 1 && /^socket\(PF_(LOCAL|UNIX|FILE), SOCK_STREAM, 0\) += 0$/ {next} @@ -11,9 +12,9 @@ NR == 1 && /^socket\(PF_(LOCAL|UNIX|FILE), SOCK_STREAM, 0\) += 0$/ {next} NR == 2 { if (match($0, r_bind, a)) { inode_listen = a[1] - r_listen = "^listen\\(0, 5\\) += 0$" - r_getsockname = "^getsockname\\(0, {sa_family=AF_(LOCAL|UNIX|FILE), sun_path=\"local-stream\"}, \\[15\\]\\) += 0$" - r_accept = "^accept\\(0, {sa_family=AF_(LOCAL|UNIX|FILE), NULL}, \\[2\\]\\) += 1(" r_i "),\"local-stream\"\\]>" + r_listen = "^listen\\(0, 5\\) += 0$" + r_getsockname = "^getsockname\\(0, {sa_family=AF_(LOCAL|UNIX|FILE), sun_path=\"" addr "\"}, \\[" addrlen "\\]\\) += 0$" + r_accept = "^accept\\(0, {sa_family=AF_(LOCAL|UNIX|FILE), NULL}, \\[2\\]\\) += 1(" r_i "),\"" addr "\"\\]>" next } } @@ -26,8 +27,8 @@ NR == 5 { if (r_accept != "" && match($0, r_accept, a)) { inode_accepted = a[2] inode_peer = a[3] - r_close_listen = "^close\\(0\\) += 0$" - r_close_accepted = "^close\\(1\\) += 0$" + r_close_listen = "^close\\(0\\) += 0$" + r_close_accepted = "^close\\(1\\) += 0$" next } } diff --git a/tests/unix-yy-connect.awk b/tests/unix-yy-connect.awk index 173d7211..5610192c 100644 --- a/tests/unix-yy-connect.awk +++ b/tests/unix-yy-connect.awk @@ -1,10 +1,11 @@ BEGIN { lines = 5 fail = 0 + addrlen = length(addr) + 3 r_i = "[1-9][0-9]*" - r_close_listen = "^close\\(0\\) += 0$" - r_connect = "^connect\\(1, {sa_family=AF_(LOCAL|UNIX|FILE), sun_path=\"local-stream\"}, 15\\) += 0$" + r_close_listen = "^close\\(0\\) += 0$" + r_connect = "^connect\\(1, {sa_family=AF_(LOCAL|UNIX|FILE), sun_path=\"" addr "\"}, " addrlen "\\) += 0$" } NR == 1 && /^socket\(PF_(LOCAL|UNIX|FILE), SOCK_STREAM, 0\) += 1$/ {next} diff --git a/tests/unix-yy.test b/tests/unix-yy.test index 1114e17d..4a9b889d 100755 --- a/tests/unix-yy.test +++ b/tests/unix-yy.test @@ -14,7 +14,8 @@ check_prog sed rm -f $LOG.* $LOG-* -./net-accept-connect || +addr=unix-yy-local-stream +./net-accept-connect $addr || fail_ 'net-accept-connect failed' ./netlink_unix_diag || { @@ -25,9 +26,9 @@ rm -f $LOG.* $LOG-* fi } -args="-tt -ff -yy -o $LOG -eclose,network ./net-accept-connect" -$STRACE $args || - fail_ "strace $args failed" +args="-tt -ff -yy -eclose,network ./net-accept-connect $addr" +$STRACE -o "$LOG" $args || + fail_ "$STRACE $args failed" "$srcdir"/../strace-log-merge $LOG > $LOG || { cat $LOG @@ -47,12 +48,12 @@ sed -rn "/^$child"' /d; /SIGCHLD/d; / socket\(/,$ s/^[0-9]+ +[^ ]+ (.+)/\1/p' $L fail_ 'failed to separate logs' } -awk -f "$srcdir"/unix-yy-connect.awk $LOG-connect || { +awk -f "$srcdir"/unix-yy-connect.awk -v addr=$addr $LOG-connect || { cat $LOG-connect fail_ "strace $args failed to decode socket descriptors properly" } -awk -f "$srcdir"/unix-yy-accept.awk $LOG-accept || { +awk -f "$srcdir"/unix-yy-accept.awk -v addr=$addr $LOG-accept || { cat $LOG-accept fail_ "strace $args failed to decode socket descriptors properly" }