From f4fe0e37e89ae1687ddd7303a19349ebdff2920c Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Thu, 6 Feb 2020 12:11:12 +0000 Subject: [PATCH 1/7] tests: Run IPC with use-filesystem-sockets active Provide an LD_PRELOAD library that simulates the presence of /etc/libqb/use-filesystem-sockets so that we can test that functionality without actually having the file on the system and affecting everything else running on the box. --- tests/Makefile.am | 11 ++++++++--- tests/ipc_sock.test | 19 +++++++++++++++++++ tests/libstat_wrapper.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100755 tests/ipc_sock.test create mode 100644 tests/libstat_wrapper.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 7fc40b3df..093bd1e50 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -114,11 +114,16 @@ endif bench_log_SOURCES = bench-log.c bench_log_LDADD = $(top_builddir)/lib/libqb.la +lib_LTLIBRARIES = libstat_wrapper.la +libstat_wrapper_la_SOURCES = libstat_wrapper.c +libstat_wrapper_la_LIBADD = -ldl +libdir= $(TESTDIR) + if HAVE_CHECK -EXTRA_DIST += start.test resources.test +EXTRA_DIST += start.test resources.test ipc_sock.test EXTRA_DIST += blackbox-segfault.sh -TESTS = start.test array.test map.test rb.test list.test log.test blackbox-segfault.sh loop.test ipc.test resources.test +TESTS = start.test array.test map.test rb.test list.test log.test blackbox-segfault.sh loop.test ipc.test ipc_sock.test resources.test TESTS_ENVIRONMENT = export PATH=.:../tools:$$PATH; resources.log: rb.log log.log ipc.log @@ -127,7 +132,7 @@ check_LTLIBRARIES = check_PROGRAMS = array.test ipc.test list.test log.test loop.test \ map.test rb.test util.test tlist.test \ crash_test_dummy file_change_bytes -dist_check_SCRIPTS = start.test resources.test blackbox-segfault.sh +dist_check_SCRIPTS = start.test resources.test blackbox-segfault.sh ipc_sock.test if HAVE_SLOW_TESTS TESTS += util.test diff --git a/tests/ipc_sock.test b/tests/ipc_sock.test new file mode 100755 index 000000000..39b5c0748 --- /dev/null +++ b/tests/ipc_sock.test @@ -0,0 +1,19 @@ +#!/bin/sh +# +# Run the IPC tests under the stat wrapper, +# this simulates /etc/libqb/use-filesystem-sockets existing +# so we can test both options without breaking other things +# that might be running on this system +# +if [ "`uname -s`" = "Linux" ] +then + if [ -f `pwd`/.libs/libstatwrapper.so ] + then + export LD_PRELOAD=`pwd`/.libs/libstat_wrapper.so + else + export LD_PRELOAD=`pwd`/libstat_wrapper.so + fi + ./ipc.test +else + exit 0 +fi diff --git a/tests/libstat_wrapper.c b/tests/libstat_wrapper.c new file mode 100644 index 000000000..09fba969a --- /dev/null +++ b/tests/libstat_wrapper.c @@ -0,0 +1,35 @@ +/* + * Simulate FORCESOCKETSFILE existing for the IPC tests + */ + +#include +#include +#include +#include +#include "../include/config.h" +#if defined(QB_LINUX) || defined(QB_CYGWIN) +#include +#endif + +int __xstat(int __ver, const char *__filename, struct stat *__stat_buf) +{ +#if defined(QB_LINUX) || defined(QB_CYGWIN) + static int opened = 0; + static void *dlhandle; + static int (*real_xstat)(int __ver, const char *__filename, void *__stat_buf); + + if (!opened) { + dlhandle = dlopen(LIBC_SO, RTLD_NOW); + real_xstat = dlsym(dlhandle, "__xstat"); + opened = 1; + } + + if (strcmp(__filename, FORCESOCKETSFILE) == 0) { + return 0; /* it exists! */ + } + + return real_xstat(__ver, __filename, __stat_buf); +#else + return -1; /* Error in the unlikely event we get called on *BSD* */ +#endif +} From 15e3e1b45620efc2b30d92a386e4a0ca4ba80148 Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Thu, 13 Jan 2022 14:48:59 +0000 Subject: [PATCH 2/7] Check for the right number of leftovers --- tests/resources.test | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/tests/resources.test b/tests/resources.test index 252c71a53..d3f8e0f1e 100755 --- a/tests/resources.test +++ b/tests/resources.test @@ -1,23 +1,33 @@ #!/bin/sh RETURN=0 SOCKS_PER_PROCESS=3 +EXPECTED_DLOCK=6 +EXPECTED_LEFTOVER=2 + +# Linux also runs filesystem socket tests +if [ "$(uname -s)" = "Linux" ] +then + EXPECTED_DLOCK=12 + EXPECTED_LEFTOVER=4 +fi tidy_qb_dirs() { for dd in "$@"; do rm $dd - rmdir `dirname $dd` 2> /dev/null + rmdir $(dirname $dd) 2> /dev/null done } -IPC_NAME=`cat ipc-test-name 2>/dev/null` +IPC_NAME=$(cat ipc-test-name 2>/dev/null) for d in /dev/shm /var/run $SOCKETDIR; do # Tidy up the deadlock checker sockets first dlocks=$(find $d -name "qb-*-test_*dlock*${IPC_NAME}*" -size +0c 2>/dev/null) - if [ "`echo $dlocks|wc -w`" -eq $(($SOCKS_PER_PROCESS * 6)) ]; then - tidy_qb_dirs $dlocks + if [ "$(echo $dlocks|wc -w)" -eq $(($SOCKS_PER_PROCESS * $EXPECTED_DLOCK)) ]; then + tidy_qb_dirs $dlocks + rm $dlocks elif [ -n "${dlocks}" ]; then echo echo "Error: dlock shared memory segments not closed/unlinked" @@ -34,7 +44,7 @@ for d in /dev/shm /var/run $SOCKETDIR; do RETURN=1 fi leftovers="$(find $d -name "qb-*-test_*${IPC_NAME}*" -size 0c 2>/dev/null)" - if [ "$(printf '%s\n' "${leftovers}" | wc -l)" -eq $(($SOCKS_PER_PROCESS * 2)) ]; then + if [ "$(printf '%s\n' "${leftovers}" | wc -l)" -eq $(($SOCKS_PER_PROCESS * $EXPECTED_LEFTOVER)) ]; then echo echo "There were some empty leftovers (expected), removing them" echo "${leftovers}" From 76828228ee81eedb91296b526d85c923a7e9786e Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Mon, 24 Jan 2022 13:03:41 +0000 Subject: [PATCH 3/7] Catch stat() as well as __xstat() F35 and Centos9 seem to have reverted back to an actual stat() call rather than a wrapper around __xstat(), so trap both just in case. Other small fixes --- tests/ipc_sock.test | 2 +- tests/libstat_wrapper.c | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/tests/ipc_sock.test b/tests/ipc_sock.test index 39b5c0748..ac6d69be2 100755 --- a/tests/ipc_sock.test +++ b/tests/ipc_sock.test @@ -7,7 +7,7 @@ # if [ "`uname -s`" = "Linux" ] then - if [ -f `pwd`/.libs/libstatwrapper.so ] + if [ -f `pwd`/.libs/libstat_wrapper.so ] then export LD_PRELOAD=`pwd`/.libs/libstat_wrapper.so else diff --git a/tests/libstat_wrapper.c b/tests/libstat_wrapper.c index 09fba969a..a76488a63 100644 --- a/tests/libstat_wrapper.c +++ b/tests/libstat_wrapper.c @@ -11,6 +11,7 @@ #include #endif +// __xstat for ealier libc int __xstat(int __ver, const char *__filename, struct stat *__stat_buf) { #if defined(QB_LINUX) || defined(QB_CYGWIN) @@ -25,6 +26,7 @@ int __xstat(int __ver, const char *__filename, struct stat *__stat_buf) } if (strcmp(__filename, FORCESOCKETSFILE) == 0) { + fprintf(stderr, "__xstat called for %s\n", __filename); return 0; /* it exists! */ } @@ -33,3 +35,28 @@ int __xstat(int __ver, const char *__filename, struct stat *__stat_buf) return -1; /* Error in the unlikely event we get called on *BSD* */ #endif } + +// Stat for F35 and later +int stat(const char *__filename, struct stat *__stat_buf) +{ +#if defined(QB_LINUX) || defined(QB_CYGWIN) + static int opened = 0; + static void *dlhandle; + static int (*real_stat)(const char *__filename, void *__stat_buf); + + if (!opened) { + dlhandle = dlopen(LIBC_SO, RTLD_NOW); + real_stat = dlsym(dlhandle, "stat"); + opened = 1; + } + + if (strcmp(__filename, FORCESOCKETSFILE) == 0) { + fprintf(stderr, "stat called for %s\n", __filename); + return 0; /* it exists! */ + } + + return real_stat(__filename, __stat_buf); +#else + return -1; /* Error in the unlikely event we get called on *BSD* */ +#endif +} From 865e004cd0a030372d6916796617bc3b20ba5650 Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Thu, 17 Mar 2022 11:09:08 +0000 Subject: [PATCH 4/7] Use RTLD_NEXT --- tests/libstat_wrapper.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tests/libstat_wrapper.c b/tests/libstat_wrapper.c index a76488a63..37f51e6e5 100644 --- a/tests/libstat_wrapper.c +++ b/tests/libstat_wrapper.c @@ -1,7 +1,7 @@ /* * Simulate FORCESOCKETSFILE existing for the IPC tests */ - +#define _GNU_SOURCE #include #include #include @@ -11,17 +11,15 @@ #include #endif -// __xstat for ealier libc +// __xstat for earlier libc int __xstat(int __ver, const char *__filename, struct stat *__stat_buf) { #if defined(QB_LINUX) || defined(QB_CYGWIN) static int opened = 0; - static void *dlhandle; static int (*real_xstat)(int __ver, const char *__filename, void *__stat_buf); if (!opened) { - dlhandle = dlopen(LIBC_SO, RTLD_NOW); - real_xstat = dlsym(dlhandle, "__xstat"); + real_xstat = dlsym(RTLD_NEXT, "__xstat"); opened = 1; } @@ -36,17 +34,15 @@ int __xstat(int __ver, const char *__filename, struct stat *__stat_buf) #endif } -// Stat for F35 and later +// stat for F35 and later int stat(const char *__filename, struct stat *__stat_buf) { #if defined(QB_LINUX) || defined(QB_CYGWIN) static int opened = 0; - static void *dlhandle; static int (*real_stat)(const char *__filename, void *__stat_buf); if (!opened) { - dlhandle = dlopen(LIBC_SO, RTLD_NOW); - real_stat = dlsym(dlhandle, "stat"); + real_stat = dlsym(RTLD_NEXT, "stat"); opened = 1; } From 88126626897a2c9928053179d83d96b7125765a0 Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Fri, 18 Mar 2022 10:10:47 +0000 Subject: [PATCH 5/7] use $() rather than `` --- tests/ipc_sock.test | 8 ++++---- tests/start.test | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/ipc_sock.test b/tests/ipc_sock.test index ac6d69be2..c7bad7f0e 100755 --- a/tests/ipc_sock.test +++ b/tests/ipc_sock.test @@ -5,13 +5,13 @@ # so we can test both options without breaking other things # that might be running on this system # -if [ "`uname -s`" = "Linux" ] +if [ "$(uname -s)" = "Linux" ] then - if [ -f `pwd`/.libs/libstat_wrapper.so ] + if [ -f $(pwd)/.libs/libstat_wrapper.so ] then - export LD_PRELOAD=`pwd`/.libs/libstat_wrapper.so + export LD_PRELOAD=$(pwd)/.libs/libstat_wrapper.so else - export LD_PRELOAD=`pwd`/libstat_wrapper.so + export LD_PRELOAD=$(pwd)/libstat_wrapper.so fi ./ipc.test else diff --git a/tests/start.test b/tests/start.test index 91d1734f0..7f6354037 100755 --- a/tests/start.test +++ b/tests/start.test @@ -7,7 +7,7 @@ # The test programs all add "qb-test--" to the front of this. # -NAME="$$-`date +%s`" +NAME="$$-$(date +%s)" printf "$NAME" > ipc-test-name mkdir -p $SOCKETDIR From dde80a4974cf0e50f10c4ced4f5769ad2e461760 Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Fri, 18 Mar 2022 13:18:36 +0000 Subject: [PATCH 6/7] Cope with spaces in directory names --- configure.ac | 2 +- tests/ipc_sock.test | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index b03f99f5f..8e38f61ac 100644 --- a/configure.ac +++ b/configure.ac @@ -176,7 +176,7 @@ PKG_CHECK_MODULES([libxml], [libxml-2.0]) # don´t build the man pages if test "x$cross_compiling" = "xno"; then AM_CONDITIONAL([BUILD_MAN], [true]) - DOXYGEN2MAN="\$(abs_builddir)/../doxygen2man/doxygen2man" + DOXYGEN2MAN="\"\$(abs_builddir)/../doxygen2man/doxygen2man\"" else AC_CHECK_PROGS([DOXYGEN2MAN], [doxygen2man]) if test "x$DOXYGEN2MAN" = "x"; then diff --git a/tests/ipc_sock.test b/tests/ipc_sock.test index c7bad7f0e..0bcebe251 100755 --- a/tests/ipc_sock.test +++ b/tests/ipc_sock.test @@ -7,11 +7,11 @@ # if [ "$(uname -s)" = "Linux" ] then - if [ -f $(pwd)/.libs/libstat_wrapper.so ] + if [ -f "$(pwd)/.libs/libstat_wrapper.so" ] then - export LD_PRELOAD=$(pwd)/.libs/libstat_wrapper.so + export "LD_PRELOAD=$(pwd)/.libs/libstat_wrapper.so" else - export LD_PRELOAD=$(pwd)/libstat_wrapper.so + export "LD_PRELOAD=$(pwd)/libstat_wrapper.so" fi ./ipc.test else From 8ebd848be33d945edb654eb54fbd041fd516cd33 Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Mon, 21 Mar 2022 08:05:29 +0000 Subject: [PATCH 7/7] Docs: quote DOXYGEN2MAN in Makefile.am rather than configure.ac --- configure.ac | 2 +- docs/Makefile.am | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/configure.ac b/configure.ac index 8e38f61ac..b03f99f5f 100644 --- a/configure.ac +++ b/configure.ac @@ -176,7 +176,7 @@ PKG_CHECK_MODULES([libxml], [libxml-2.0]) # don´t build the man pages if test "x$cross_compiling" = "xno"; then AM_CONDITIONAL([BUILD_MAN], [true]) - DOXYGEN2MAN="\"\$(abs_builddir)/../doxygen2man/doxygen2man\"" + DOXYGEN2MAN="\$(abs_builddir)/../doxygen2man/doxygen2man" else AC_CHECK_PROGS([DOXYGEN2MAN], [doxygen2man]) if test "x$DOXYGEN2MAN" = "x"; then diff --git a/docs/Makefile.am b/docs/Makefile.am index fa1bac6b4..ab58a463d 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -236,19 +236,19 @@ txt-man: man.dox xml-man: txt-man mkdir -p man3 - $(DOXYGEN2MAN) $(doxygen2man_flags) qbarray_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbatomic_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbdefs_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbhdb_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbipcc_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbipc__common_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbipcs_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qblist_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qblog_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbloop_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbmap_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbrb_8h.xml - $(DOXYGEN2MAN) $(doxygen2man_flags) qbutil_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbarray_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbatomic_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbdefs_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbhdb_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbipcc_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbipc__common_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbipcs_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qblist_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qblog_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbloop_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbmap_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbrb_8h.xml + "$(DOXYGEN2MAN)" $(doxygen2man_flags) qbutil_8h.xml all: $(man3_MANS) xml-man