[Ltrace-devel] [PATCH 1/2] Make test suite work with non-standard installations

Zachary T Welch zwelch at codesourcery.com
Thu Dec 16 23:18:23 UTC 2010


Augment LD_LIBRARY_PATH with alternate locations of libelf and libunwind
in ltrace_runtest.  Also adds support for passing extra arguments, so
all tests can be rewritten to use that API calls.  This patch makes the
test suite work (without any hacking) on systems that do not have those
libraries installed in standard locations.

Signed-off-by: Zachary T Welch <zwelch at codesourcery.com>
---
 configure.ac                           |    4 +++
 testsuite/Makefile.am                  |    7 +++++
 testsuite/lib/ltrace.exp               |   39 ++++++++++++++++++++++++++++++-
 testsuite/ltrace.minor/trace-clone.exp |   14 +---------
 testsuite/ltrace.minor/trace-exec.exp  |   25 ++++++--------------
 testsuite/ltrace.minor/trace-fork.exp  |   25 +++++--------------
 6 files changed, 65 insertions(+), 49 deletions(-)

diff --git a/configure.ac b/configure.ac
index e675b38..4bf7a85 100644
--- a/configure.ac
+++ b/configure.ac
@@ -45,6 +45,7 @@ AC_ARG_WITH([libelf],
   (*)
     AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
     AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
+    libelf_LD_LIBRARY_PATH="${withval}/lib"
     ;;
 esac],[])
 
@@ -89,6 +90,7 @@ AC_ARG_WITH(libunwind,
   (*) enable_libunwind=yes
     AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
     AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
+    libunwind_LD_LIBRARY_PATH="${withval}/lib"
     ;;
 esac],[enable_libunwind=maybe])
 
@@ -245,6 +247,8 @@ fi
 AC_SUBST(AM_CPPFLAGS)
 AC_SUBST(AM_CFLAGS)
 AC_SUBST(AM_LDFLAGS)
+AC_SUBST(libelf_LD_LIBRARY_PATH)
+AC_SUBST(libunwind_LD_LIBRARY_PATH)
 
 AC_CONFIG_FILES([
 	Makefile
diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am
index 4802ed9..6c95a16 100644
--- a/testsuite/Makefile.am
+++ b/testsuite/Makefile.am
@@ -29,6 +29,13 @@ EXTRA_DIST = \
 	lib/ltrace.exp \
 	run-my-tests.sh
 
+BUILT_SOURCES = env.exp
+
+env.exp: Makefile
+	rm -f env.exp
+	echo set libelf_LD_LIBRARY_PATH '"$(libelf_LD_LIBRARY_PATH)"' >> $@
+	echo set libunwind_LD_LIBRARY_PATH '"$(libunwind_LD_LIBRARY_PATH)"' >> $@
+
 CLEANFILES = *.o *.so *.log *.sum *.ltrace site.bak setval.tmp site.exp
 
 MAINTAINERCLEANFILES = Makefile.in
diff --git a/testsuite/lib/ltrace.exp b/testsuite/lib/ltrace.exp
index eb7c960..db602ff 100644
--- a/testsuite/lib/ltrace.exp
+++ b/testsuite/lib/ltrace.exp
@@ -4,6 +4,7 @@
 # need to be modified for any target, it can be done with a variable
 # or by passing arguments.
 
+source $objdir/env.exp
 
 global LTRACE
 if [info exists TOOL_EXECUTABLE] {
@@ -14,6 +15,8 @@ if [info exists TOOL_EXECUTABLE] {
 
 global LTRACE_OPTIONS
 set LTRACE_OPTIONS "";
+global LTRACE_ARGS
+set LTRACE_ARGS "";
 
 # ltrace_compile SOURCE DEST TYPE OPTIONS 
 #
@@ -196,6 +199,37 @@ proc ltrace_options { args } {
 }
 
 #
+# ltrace_args ARGS_LIST
+# Pass ltrace'd program its own commandline options.
+#
+proc ltrace_args { args } {
+
+	global LTRACE_ARGS
+	set LTRACE_ARGS $args
+}
+
+#
+# handle run-time library paths
+#
+proc ld_library_path { args } {
+
+	set ALL_LIBRARY_PATHS { }
+	if [info exists LD_LIBRARY_PATH] {
+		lappend ALL_LIBRARY_PATHS $LD_LIBRARY_PATH
+	}
+	global libelf_LD_LIBRARY_PATH
+	if {[string length $libelf_LD_LIBRARY_PATH] > 0} {
+		lappend ALL_LIBRARY_PATHS $libelf_LD_LIBRARY_PATH
+	}
+	global libunwind_LD_LIBRARY_PATH
+	if {[string length $libunwind_LD_LIBRARY_PATH] > 0} {
+		lappend ALL_LIBRARY_PATHS $libunwind_LD_LIBRARY_PATH
+	}
+	lappend ALL_LIBRARY_PATHS $args
+	join $ALL_LIBRARY_PATHS ":"
+}
+
+#
 # ltrace_runtest LD_LIBRARY_PATH BIN FILE
 # Trace the execution of BIN and return result.
 #
@@ -208,10 +242,11 @@ proc ltrace_runtest { args } {
 
 	global LTRACE
 	global LTRACE_OPTIONS
+	global LTRACE_ARGS
 
 	verbose "LTRACE = $LTRACE"
 	
-	set LD_LIBRARY_PATH_ [lindex $args 0]
+	set LD_LIBRARY_PATH_ [ld_library_path [lindex $args 0]]
 	set BIN [lindex $args 1]
 
 	# specify the output file, the default one is $BIN.ltrace
@@ -225,7 +260,7 @@ proc ltrace_runtest { args } {
 	lappend LTRACE_OPTIONS "$file"
 	verbose "LTRACE_OPTIONS = $LTRACE_OPTIONS"
 	#ltrace the PUT.
-	catch "exec sh -c {export LD_LIBRARY_PATH=$LD_LIBRARY_PATH_; $LTRACE $LTRACE_OPTIONS $BIN;exit}" output
+	catch "exec sh -c {export LD_LIBRARY_PATH=$LD_LIBRARY_PATH_; $LTRACE $LTRACE_OPTIONS $BIN $LTRACE_ARGS;exit}" output
 	
 	# return output from ltrace.
 	return $output
diff --git a/testsuite/ltrace.minor/trace-clone.exp b/testsuite/ltrace.minor/trace-clone.exp
index 749cc49..3d0c8fe 100644
--- a/testsuite/ltrace.minor/trace-clone.exp
+++ b/testsuite/ltrace.minor/trace-clone.exp
@@ -10,19 +10,9 @@ verbose "compiling source file now....."
 if  { [ ltrace_compile "${srcdir}/${subdir}/${testfile}.c" "${objdir}/${subdir}/${binfile}" executable {debug} ] != "" } {
      send_user "Testcase compile failed, so all tests in this file will automatically fail.\n"
 }
-global LTRACE
 
-#Run PUT for ltrace.
-spawn $LTRACE -f $objdir/$subdir/$binfile
-set timeout 4
-expect timeout  {
-        fail "Time out! Maybe caused by ltrace segment fault or improper timeout value here!"
-        return
-}
-
-catch "exec $LTRACE -f $objdir/$subdir/$binfile" exec_output
-# Save the output
-ltrace_saveoutput "${exec_output}" ${objdir}/${subdir}/${testfile}.ltrace
+ltrace_options "-f"
+set exec_output [ltrace_runtest $objdir/$subdir $objdir/$subdir/$binfile]
 
 #check the output of this program.
 verbose "ltrace runtest output: $exec_output\n"
diff --git a/testsuite/ltrace.minor/trace-exec.exp b/testsuite/ltrace.minor/trace-exec.exp
index 99145f5..9751c58 100644
--- a/testsuite/ltrace.minor/trace-exec.exp
+++ b/testsuite/ltrace.minor/trace-exec.exp
@@ -12,18 +12,8 @@ if  { [ ltrace_compile "${srcdir}/${subdir}/${testfile}1.c" "${objdir}/${subdir}
      send_user "Testcase compile failed, so all tests in this file will automatically fail.\n"
 }
 
-global LTRACE
-set exec_output ""
-
-#Run PUT for ltrace.
-spawn $LTRACE $objdir/$subdir/$testfile $objdir/$subdir/${testfile}1
-set timeout 4
-expect timeout  {
-	fail "Time out! Maybe caused by ltrace segment fault or improper timeout value here!"
-	return
-}
-
-catch "exec $LTRACE $objdir/$subdir/$testfile $objdir/$subdir/${testfile}1" exec_output
+ltrace_args "$objdir/$subdir/${testfile}1"
+set exec_output [ltrace_runtest $objdir/$subdir $objdir/$subdir/$testfile]
 
 #check the output of this program.
 verbose "ltrace runtest output: $exec_output\n"
@@ -35,11 +25,12 @@ if [regexp {ELF from incompatible architecture} $exec_output] {
 	return
 }
 
-ltrace_saveoutput "${exec_output}" ${objdir}/${subdir}/${testfile}.ltrace
-
 # execl from first binary
-ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace {"^execl"} 1
+set pattern {^[0-9]* execl}
+ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
 # puts from second binary
-ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace {"^puts"} 1
+set pattern {^[0-9]* puts}
+ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
 # assume glibc and see we really trace both binaries
-ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace {"^__libc_start_main"} 2
+set pattern {^[0-9]* __libc_start_main}
+ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 2
diff --git a/testsuite/ltrace.minor/trace-fork.exp b/testsuite/ltrace.minor/trace-fork.exp
index 29a7cff..70815f5 100644
--- a/testsuite/ltrace.minor/trace-fork.exp
+++ b/testsuite/ltrace.minor/trace-fork.exp
@@ -10,18 +10,9 @@ verbose "compiling source file now....."
 if  { [ ltrace_compile "${srcdir}/${subdir}/${testfile}.c" "${objdir}/${subdir}/${binfile}" executable {debug} ] != "" } {
      send_user "Testcase compile failed, so all tests in this file will automatically fail.\n"
 }
-global LTRACE
-set exec_output ""
-
-#Run PUT for ltrace.
-spawn $LTRACE -f $objdir/$subdir/$binfile
-set timeout 4
-expect timeout  {
-	fail "Time out! Maybe caused by ltrace segment fault or improper timeout value here!"
-	return
-}
 
-catch "exec $LTRACE -f $objdir/$subdir/$binfile" exec_output
+ltrace_options "-f"
+set exec_output [ltrace_runtest $objdir/$subdir $objdir/$subdir/$binfile]
 
 #check the output of this program.
 verbose "ltrace runtest output: $exec_output\n"
@@ -33,24 +24,22 @@ if [regexp {ELF from incompatible architecture} $exec_output] {
 	return
 }
 
-ltrace_saveoutput "${exec_output}" ${objdir}/${subdir}/${testfile}.ltrace
-
 if [ regexp {Cannot attach} $exec_output ] {
 	fail "Couldn't attach to forked process!"
 	return
 }
 
-set pattern {^\[pid [0-9]*\] fork}
+set pattern {^[0-9]* fork}
 ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
 
-set pattern {^\[pid [0-9]*\] printf}
+set pattern {^[0-9]* printf}
 ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
 
-set pattern {^\[pid [0-9]*\] puts}
+set pattern {^[0-9]* puts}
 ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
 
-set pattern {^\[pid [0-9]*\] wait}
+set pattern {^[0-9]* wait}
 ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
 
-set pattern {^\[pid [0-9]*\] sleep}
+set pattern {^[0-9]* sleep}
 ltrace_verify_output ${objdir}/${subdir}/${testfile}.ltrace $pattern 1
-- 
1.7.2.2




More information about the Ltrace-devel mailing list