Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests: Run IPC with use-filesystem-sockets active #455

Merged
merged 7 commits into from
Mar 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions docs/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
11 changes: 8 additions & 3 deletions tests/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
19 changes: 19 additions & 0 deletions tests/ipc_sock.test
Original file line number Diff line number Diff line change
@@ -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/libstat_wrapper.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
58 changes: 58 additions & 0 deletions tests/libstat_wrapper.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* Simulate FORCESOCKETSFILE existing for the IPC tests
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
#include <string.h>
#include <sys/stat.h>
#include "../include/config.h"
#if defined(QB_LINUX) || defined(QB_CYGWIN)
#include <gnu/lib-names.h>
#endif

// __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 int (*real_xstat)(int __ver, const char *__filename, void *__stat_buf);

if (!opened) {
real_xstat = dlsym(RTLD_NEXT, "__xstat");
opened = 1;
}

if (strcmp(__filename, FORCESOCKETSFILE) == 0) {
Copy link

@wenningerk wenningerk Mar 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

__xstat seems to return -1 with errno==EFAULT in case the filename points to invalid memory instead of segfaulting.
Don't know if we need it that generic here but we might get called by unexpected callers and get confusing results.
Simple approach might be doing the original in any case and just compare and possibly fake result if return -1 and errno!=EFAULT.

fprintf(stderr, "__xstat called for %s\n", __filename);
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
}

// 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 int (*real_stat)(const char *__filename, void *__stat_buf);

if (!opened) {
real_stat = dlsym(RTLD_NEXT, "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
}
20 changes: 15 additions & 5 deletions tests/resources.test
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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}"
Expand Down
2 changes: 1 addition & 1 deletion tests/start.test
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# The test programs all add "qb-test-<name>-" to the front of this.
#

NAME="$$-`date +%s`"
NAME="$$-$(date +%s)"

printf "$NAME" > ipc-test-name
mkdir -p $SOCKETDIR