summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.base
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/systemtap.base')
-rw-r--r--testsuite/systemtap.base/utrace_p4.exp97
1 files changed, 97 insertions, 0 deletions
diff --git a/testsuite/systemtap.base/utrace_p4.exp b/testsuite/systemtap.base/utrace_p4.exp
new file mode 100644
index 00000000..35a3ba15
--- /dev/null
+++ b/testsuite/systemtap.base/utrace_p4.exp
@@ -0,0 +1,97 @@
+# Utrace compile (pass 4) tests. We can't run these as
+# testsuite/buildok tests, since if the current kernel has no utrace
+# support, those will fail - but not because of a problem with
+# systemtap's utrace probes (but because of the lack of utrace). So,
+# this test script checks for the existence of utrace in the kernel.
+# If utrace exists in the kernel, it tries some compile tests. If
+# utrace doesn't exist in the kernel, marks the tests as 'untested'.
+
+# stap_compile TEST_NAME flags script args
+# - TEST_NAME is the name of the current test
+# - compile indicates whether the script is supposed to compile
+# - script is the script to compile
+# Additional arguments are passed to stap as-is.
+proc stap_compile { TEST_NAME compile script args } {
+ set cmd [concat {stap -v -p4 -e} $script $args]
+
+ verbose -log "running $cmd"
+ eval spawn $cmd
+ set compile_errors 0
+ expect {
+ -re {^Pass\ [1234]:[^\r]*\ in\ .*\ ms.\r\n} {exp_continue}
+ -re {^Pass\ [34]: using cached [^\r\n]+\r\n} {exp_continue}
+ # pass-4 output
+ -re {^/[^\r\n]+.ko\r\n} {exp_continue}
+ -re "parse error" { incr compile_errors 1; exp_continue}
+ -re "compilation failed" {incr compile_errors 1; exp_continue}
+ -re "semantic error:" {incr compile_errors 1; exp_continue}
+ }
+ catch close
+ wait
+
+ # If we've got compile errors and the script was supposed to
+ # compile, fail.
+ if {$compile_errors > 0} {
+ if {$compile == 1} {
+ fail "$TEST_NAME compilation failed"
+ } else {
+ pass "$TEST_NAME compilation failed correctly"
+ }
+ } else {
+ if {$compile == 1} {
+ pass "$TEST_NAME compilation succeeded"
+ } else {
+ fail "$TEST_NAME compilation succeeded unexpectedly"
+ }
+ }
+}
+
+# Initialize variables
+set utrace_support_found 0
+
+set clone_script {"probe process(\"/bin/ls\").clone { print(\"ls clone\") }"}
+set death_script {"probe process(\"/bin/ls\").death { print(\"ls death\") }"}
+set syscall_script {"probe process(\"/bin/ls\").syscall { printf(\"|%d\", \$syscall) }"}
+set syscall_return_script {"probe process(\"/bin/ls\").syscall.return { printf(\"|%d\", \$syscall) }"}
+
+# Try to find utrace_attach symbol in /proc/kallsyms
+set path "/proc/kallsyms"
+if {! [catch {exec grep -q utrace_attach $path} dummy]} {
+ set utrace_support_found 1
+}
+
+#
+# Do some utrace compile tests.
+#
+
+set TEST_NAME "UTRACE_P4_01"
+if {$utrace_support_found == 0} {
+ untested "$TEST_NAME : no kernel utrace support found"
+} else {
+ # Try compiling a clone script
+ stap_compile $TEST_NAME 1 $clone_script
+}
+
+set TEST_NAME "UTRACE_P4_02"
+if {$utrace_support_found == 0} {
+ untested "$TEST_NAME : no kernel utrace support found"
+} else {
+ # Try compiling a death script
+ stap_compile $TEST_NAME 1 $death_script
+}
+
+set TEST_NAME "UTRACE_P4_03"
+if {$utrace_support_found == 0} {
+ untested "$TEST_NAME : no kernel utrace support found"
+} else {
+ # Try compiling a syscall script
+ stap_compile $TEST_NAME 1 $syscall_script
+}
+
+set TEST_NAME "UTRACE_P4_04"
+if {$utrace_support_found == 0} {
+ untested "$TEST_NAME : no kernel utrace support found"
+} else {
+ # Try compiling a syscall return script
+ stap_compile $TEST_NAME 1 $syscall_return_script
+}