From 9c5397a941bb80e9adb66b2be410247349df1d57 Mon Sep 17 00:00:00 2001 From: Craig Small Date: Tue, 26 Apr 2022 22:04:05 +1000 Subject: [PATCH] testsuite: Add check for shared memory Created a test process test_shm that allocates a shared memory segment and prints the segment ID. pmap testsuite runs pmap to check that the segment is found. The value returned by shmget() is the same value that is printed in the fifth column /proc//maps Signed-off-by: Craig Small --- Makefile.am | 5 ++- lib/.gitignore | 1 + lib/test_shm.c | 69 ++++++++++++++++++++++++++++++++++++ testsuite/config/unix.exp | 21 +++++++++++ testsuite/pmap.test/pmap.exp | 5 +++ 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 lib/test_shm.c diff --git a/Makefile.am b/Makefile.am index 4059e130..862a990a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -326,7 +326,8 @@ check_PROGRAMS = \ lib/test_strutils \ lib/test_fileutils \ lib/test_process \ - lib/test_strtod_nol + lib/test_strtod_nol \ + lib/test_shm lib_test_strutils_SOURCES = lib/test_strutils.c lib/strutils.c lib_test_strutils_LDADD = $(CYGWINFLAGS) @@ -336,6 +337,8 @@ lib_test_process_SOURCES = lib/test_process.c lib_test_process_LDADD = $(CYGWINFLAGS) lib_test_strtod_nol_SOURCES = lib/test_strtod_nol.c lib/strutils.c lib_test_strtod_nol_LDADD = $(CYGWINFLAGS) +lib_test_shm_SOURCES = lib/test_shm.c lib/strutils.c +lib_test_shm_LDADD = $(CYGWINFLAGS) check_PROGRAMS += \ proc/test_Itemtables \ diff --git a/lib/.gitignore b/lib/.gitignore index 7eb5747e..8d6947f1 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -3,5 +3,6 @@ test_fileutils test_nsutils test_process +test_shm test_strutils test_strtod_nol diff --git a/lib/test_shm.c b/lib/test_shm.c new file mode 100644 index 00000000..7643f7fe --- /dev/null +++ b/lib/test_shm.c @@ -0,0 +1,69 @@ +/* + * test_shm -- program to create a shared memory segment for testing + * + * Copyright 2022 Craig Small + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include +#include +#include +#include +#include "c.h" + +#define DEFAULT_SLEEPTIME 300 +#define SHM_SIZE 50 + +static void usage(void) +{ + fprintf(stderr, " %s [options]\n", program_invocation_short_name); + fprintf(stderr, " -s \n"); + exit(EXIT_FAILURE); +} + +int main(int argc, char *argv[]) +{ + int sleep_time, opt; + int shm_id; + void *shm_addr; + + sleep_time = DEFAULT_SLEEPTIME; + while ((opt = getopt(argc, argv, "s:")) != -1) + { + switch(opt) + { + case 's': + sleep_time = atoi(optarg); + if (sleep_time < 1) + { + fprintf(stderr, "sleep time must be 1 second or more\n"); + usage(); + } + break; + default: + usage(); + } + } + + /* get some shared memory */ + if ( (shm_id = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666)) < 0) + xerr(EXIT_FAILURE, "Unable to shmget()"); + if ( (shm_addr = shmat(shm_id, NULL, SHM_RDONLY)) < 0) + xerr(EXIT_FAILURE, "Unable to shmat()"); + printf("SHMID: %llx\n", shm_id); + sleep(sleep_time); + return EXIT_SUCCESS; +} + diff --git a/testsuite/config/unix.exp b/testsuite/config/unix.exp index 08c446f3..a43dbaeb 100644 --- a/testsuite/config/unix.exp +++ b/testsuite/config/unix.exp @@ -186,6 +186,27 @@ proc make_testproc { } { set testproc2_pid [ exec $testproc_path & ] } +proc make_testshm_proc { } { + global testshmproc_pid testshm_spawnid topdir shmid + + set testshm_realpath "${topdir}/lib/test_shm" + + set testshmproc_pid [ spawn $testshm_realpath ] + set testshmproc_spawnid $spawn_id + expect { + -i $testshmproc_spawnid + -re "^SHMID: (\\d+)" { set shmid $expect_out(1,string) } + default { fail "spawning testshm" } + } + +} + +proc kill_testshm_proc { } { + global testshmproc_pid + + kill_process $testshmproc_pid +} + proc kill_testproc { } { global testproc_path testproc1_pid testproc2_pid diff --git a/testsuite/pmap.test/pmap.exp b/testsuite/pmap.test/pmap.exp index 5a9e603c..3b7e50ef 100644 --- a/testsuite/pmap.test/pmap.exp +++ b/testsuite/pmap.test/pmap.exp @@ -66,3 +66,8 @@ set test "pmap XX with unreachable process" spawn $pmap -XX 1 expect_pass $test "$pmap_initname\$" +set test "pmap finding shm" +make_testshm_proc +spawn $pmap $testshmproc_pid +expect_pass $test "\[ shmid=0x$shmid \]" +kill_testshm_proc -- 2.40.0