From 997f49f19094a90442103719f7e73ebeab1a02d4 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Tue, 6 Dec 2016 01:54:13 +0000 Subject: [PATCH] tests: robustify attach-f-p.test against race conditions Introduce a synchronization mechanism between attach-f-p and strace. * tests/attach-f-p-cmd.c: New file. * tests/Makefile.am (check_PROGRAMS): Add attach-f-p-cmd. * tests/attach-f-p.c: Include . (main): Write to stdout instead of descriptor 3. Wait for the peer writing to stdout. * tests/attach-f-p.test: Assume that ./attach-f-p-cmd works. Use $OUT for expected output. Use attach-f-p-cmd for unlocking $OUT. --- tests/Makefile.am | 1 + tests/attach-f-p-cmd.c | 46 ++++++++++++++++++++++++++++++++++++++++++ tests/attach-f-p.c | 18 +++++++++++++---- tests/attach-f-p.test | 13 ++++++------ 4 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 tests/attach-f-p-cmd.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 0cc94e92..42f77a73 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -77,6 +77,7 @@ check_PROGRAMS = \ alarm \ answer \ attach-f-p \ + attach-f-p-cmd \ attach-p-cmd-cmd \ attach-p-cmd-p \ bpf \ diff --git a/tests/attach-f-p-cmd.c b/tests/attach-f-p-cmd.c new file mode 100644 index 00000000..77594beb --- /dev/null +++ b/tests/attach-f-p-cmd.c @@ -0,0 +1,46 @@ +/* + * This file is part of attach-f-p strace test. + * + * Copyright (c) 2016 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "tests.h" +#include +#include + +int +main(void) +{ + static const char dir[] = "attach-f-p.test cmd"; + pid_t pid = getpid(); + int rc = chdir(dir); + + printf("%-5d chdir(\"%s\") = %s\n" + "%-5d +++ exited with 0 +++\n", + pid, dir, sprintrc(rc), pid); + + return 0; +} diff --git a/tests/attach-f-p.c b/tests/attach-f-p.c index c75deb6f..3f9a7e3e 100644 --- a/tests/attach-f-p.c +++ b/tests/attach-f-p.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -71,7 +72,7 @@ main(void) pthread_t t[N]; unsigned int i; - if (write(3, "", 0) != 0) + if (write(1, "", 0) != 0) perror_msg_and_fail("write"); for (i = 0; i < N; ++i) { @@ -83,9 +84,18 @@ main(void) perror_msg_and_fail("pthread_create"); } - if (write(3, "\n", 1) != 1) + if (write(1, "\n", 1) != 1) perror_msg_and_fail("write"); + /* wait for the peer to write to stdout */ + struct stat st; + for (;;) { + if (fstat(1, &st)) + perror_msg_and_fail("fstat"); + if (st.st_size >= 103) + break; + } + for (i = 0; i < N; ++i) { /* sleep a bit to let the tracer catch up */ sleep(1); @@ -96,9 +106,9 @@ main(void) if (errno) perror_msg_and_fail("pthread_join"); errno = ENOENT; - printf("%-5d chdir(\"%s\") = -1 ENOENT (%m)\n" + printf("%-5d chdir(\"%s\") = %s\n" "%-5d +++ exited with 0 +++\n", - retval.pid, child[i], retval.pid); + retval.pid, child[i], sprintrc(-1), retval.pid); } /* sleep a bit more to let the tracer catch up */ diff --git a/tests/attach-f-p.test b/tests/attach-f-p.test index 030659a2..f4170740 100755 --- a/tests/attach-f-p.test +++ b/tests/attach-f-p.test @@ -34,16 +34,17 @@ framework_skip_ '/proc/self/task/ is not available' run_prog_skip_if_failed \ kill -0 $$ -run_prog ./attach-f-p > /dev/null 3>&1 +run_prog ./attach-f-p-cmd > /dev/null -./set_ptracer_any sh -c "exec ./attach-f-p > $EXP 3> $OUT" > /dev/null & +rm -f "$OUT" +./set_ptracer_any sh -c "exec ./attach-f-p >> $OUT" > /dev/null & tracee_pid=$! while ! [ -s "$OUT" ]; do kill -0 $tracee_pid 2> /dev/null || - fail_ 'set_ptracer_any sleep failed' + fail_ 'set_ptracer_any sh failed' done -run_strace -a32 -f -echdir -p $tracee_pid -match_diff "$LOG" "$EXP" -rm -f "$EXP" "$OUT" +run_strace -a32 -f -echdir -p $tracee_pid ./attach-f-p-cmd > "$OUT" +match_diff "$LOG" "$OUT" +rm -f "$OUT" -- 2.40.0