[PATCHv4 2/2] tests: add a test for decoding the address of unix socket
Masatake YAMATO
yamato at redhat.com
Wed Dec 24 11:59:32 UTC 2014
* tests/Makefile.am: Add unix-yy.test to TESTS.
Add unix-yy-accept.awk and unix-yy-connect.awk to EXTRA_DIST.
* tests/unix-yy-accept.awk: New file.
* tests/unix-yy-connect.awk: New file.
* tests/unix-yy.test: New file.
Signed-off-by: Masatake YAMATO <yamato at redhat.com>
---
tests/Makefile.am | 5 +++-
tests/unix-yy-accept.awk | 65 +++++++++++++++++++++++++++++++++++++++++++++++
tests/unix-yy-connect.awk | 41 ++++++++++++++++++++++++++++++
tests/unix-yy.test | 59 ++++++++++++++++++++++++++++++++++++++++++
4 files changed, 169 insertions(+), 1 deletion(-)
create mode 100644 tests/unix-yy-accept.awk
create mode 100644 tests/unix-yy-connect.awk
create mode 100755 tests/unix-yy.test
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 560648b..e7e4918 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -45,7 +45,8 @@ TESTS = \
detach-sleeping.test \
detach-stopped.test \
detach-running.test \
- strace-k.test
+ strace-k.test \
+ unix-yy.test
net-fd.log: net.log
@@ -59,6 +60,8 @@ EXTRA_DIST = init.sh run.sh \
net-yy-connect.awk \
sigaction.awk \
uid.awk \
+ unix-yy-accept.awk \
+ unix-yy-connect.awk \
$(TESTS)
CLEANFILES = $(TESTS:=.tmp)
diff --git a/tests/unix-yy-accept.awk b/tests/unix-yy-accept.awk
new file mode 100644
index 0000000..ad1d39e
--- /dev/null
+++ b/tests/unix-yy-accept.awk
@@ -0,0 +1,65 @@
+BEGIN {
+ lines = 8
+ fail = 0
+
+ inode_listen = "?"
+ inode_accepted = "?"
+ inode_peer = "?"
+
+ r_i = "[1-9][0-9]*"
+ r_bind = "^bind\\(0<UNIX:\\[(" r_i ")\\]>, {sa_family=AF_LOCAL, sun_path=\"local-stream\"}, " r_i "\\) += 0$"
+ r_listen = "^/$"
+ r_getsockname = "^/$"
+ r_accept = "^/$"
+ r_close0 = "^/$"
+ r_close1 = "^/$"
+}
+
+NR == 1 && /^socket\(PF_LOCAL, SOCK_STREAM, 0\) += 0$/ {next}
+
+NR == 2 {
+ if (match($0, r_bind, a)) {
+ inode_listen = a[1]
+ r_listen = "^listen\\(0<UNIX:\\[" inode_listen ",\"local-stream\"\\]>, 5\\) += 0$"
+ r_getsockname = "^getsockname\\(0<UNIX:\\[" inode_listen ",\"local-stream\"\\]>, {sa_family=AF_LOCAL, sun_path=\"local-stream\"}, \\[" r_i "\\]\\) += 0$"
+ r_accept = "^accept\\(0<UNIX:\\[" inode_listen ",\"local-stream\"\\]>, {sa_family=AF_LOCAL, NULL}, \\[" r_i "\\]\\) += 1<UNIX:\\[(" r_i ")->(" r_i "),\"local-stream\"\\]>"
+ next
+ }
+}
+
+NR == 3 {if (match($0, r_listen)) next}
+
+NR == 4 {if (match($0, r_getsockname)) next}
+
+NR == 5 {
+ if (match($0, r_accept, a)) {
+ inode_accepted = a[1]
+ inode_peer = a[2]
+ print inode_accepted
+ r_close0 = "^close\\(0<UNIX:\\[" inode_listen ",\"local-stream\"\\]>\\) += 0$"
+ r_close1 = "^close\\(1<UNIX:\\[" inode_accepted ",\"local-stream\"\\]>\\) += 0$"
+ next
+ }
+}
+
+NR == 6 {if (match($0, r_close0)) next}
+NR == 7 {if (match($0, r_close1)) next}
+
+NR == lines && /^\+\+\+ exited with 0 \+\+\+$/ {next}
+
+{
+ print "Line " NR " does not match: " $0
+ fail=1
+}
+
+END {
+ if (NR != lines) {
+ print "Expected " lines " lines, found " NR " line(s)."
+ print ""
+ exit 1
+ }
+ if (fail) {
+ print ""
+ exit 1
+ }
+}
diff --git a/tests/unix-yy-connect.awk b/tests/unix-yy-connect.awk
new file mode 100644
index 0000000..1b41315
--- /dev/null
+++ b/tests/unix-yy-connect.awk
@@ -0,0 +1,41 @@
+BEGIN {
+ lines = 5
+ fail = 0
+
+ inode = "?"
+
+ r_i = "[1-9][0-9]*"
+ r_close0 = "^close\\(0<UNIX:[" r_i ",\"local-stream\"]>\\) += 0$"
+ r_connect = "^connect\\(1<UNIX:\\[(" r_i ")\\]>, {sa_family=AF_LOCAL, sun_path=\"local-stream\"}, " r_i "\\) += 0$"
+ r_close1 = "^/$"
+}
+
+NR == 1 && /^socket\(PF_LOCAL, SOCK_STREAM, 0\) += 1$/ {next}
+NR == 2 {if (match($0, r_close0)) next}
+NR == 3 {
+ if (match($0, r_connect, a)) {
+ inode = a[1]
+ r_close1 = "^close\\(1<UNIX:\\[(" r_i ")->" r_i "\\]>\\) += 0$"
+ next
+ }
+}
+NR == 4 {if (match($0, r_close1, a) && a[1] == inode) {next}}
+
+NR == lines && /^\+\+\+ exited with 0 \+\+\+$/ {next}
+
+{
+ print "Line " NR " does not match: " $0
+ fail=1
+}
+
+END {
+ if (NR != lines) {
+ print "Expected " lines " lines, found " NR " line(s)."
+ print ""
+ exit 1
+ }
+ if (fail) {
+ print ""
+ exit 1
+ }
+}
diff --git a/tests/unix-yy.test b/tests/unix-yy.test
new file mode 100755
index 0000000..d910932
--- /dev/null
+++ b/tests/unix-yy.test
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+# Check decoding of address information ([path,]inode[->peer]) associated with unix socket descriptors
+
+. "${srcdir=.}/init.sh"
+
+# strace -yy is implemented using /proc/self/fd
+[ -d /proc/self/fd/ ] ||
+ framework_skip_ '/proc/self/fd/ is not available'
+
+check_prog awk
+check_prog sed
+
+rm -f $LOG.* $LOG-*
+
+./net-accept-connect ||
+ fail_ 'net-accept-connect failed'
+
+./netlink_inet_diag || {
+ if [ $? -eq 77 ]; then
+ framework_skip_ 'NETLINK_INET_DIAG is not available'
+ else
+ fail_ 'netlink_inet_diag failed'
+ fi
+}
+
+args="-tt -ff -yy -o $LOG -eclose,network ./net-accept-connect"
+$STRACE $args ||
+ fail_ "strace $args failed"
+
+"$srcdir"/../strace-log-merge $LOG > $LOG || {
+ cat $LOG
+ fail_ 'strace-log-merge failed'
+}
+rm -f $LOG.*
+
+child="$(sed -rn '/SIGCHLD/ s/^.*, si_pid=([1-9][0-9]*), .*/\1/p' $LOG)"
+[ -n "$child" ] || {
+ cat $LOG
+ fail_ 'failed to find pid of child process'
+}
+
+sed -rn "/^$child"' /!d; / socket\(/,$ s/^[0-9]+ +[^ ]+ (.+)/\1/p' $LOG > $LOG-connect &&
+sed -rn "/^$child"' /d; /SIGCHLD/d; / socket\(/,$ s/^[0-9]+ +[^ ]+ (.+)/\1/p' $LOG > $LOG-accept || {
+ cat $LOG
+ fail_ 'failed to separate logs'
+}
+
+awk -f "$srcdir"/unix-yy-connect.awk $LOG-connect || {
+ cat $LOG-connect
+ fail_ "strace $args failed to decode socket descriptors properly"
+}
+
+awk -f "$srcdir"/unix-yy-accept.awk $LOG-accept || {
+ cat $LOG-accept
+ fail_ "strace $args failed to decode socket descriptors properly"
+}
+
+exit 0
--
1.9.3
More information about the Strace-devel
mailing list