[DTrace-devel] [PATCH 1/2] test: Add support for interpreter files

eugene.loh at oracle.com eugene.loh at oracle.com
Sat Mar 4 22:36:37 UTC 2023


From: Eugene Loh <eugene.loh at oracle.com>

A D script foo.d can be run with "dtrace -s foo.d".

Alternatively, it can be made an executable interpreter file by adding
a "#!dtrace -s" initial line (using the correct path to dtrace) and then
"chmod +x foo.d".  At that point, it can be run "./foo.d".

A few tests have the #! initial line and therefore seem to intend to use
the second, interpreter invocation style.  In particular, this is how some
scripting tests are implemented.

But if a test has a .d extension, runtest.sh invokes it using "dtrace -s foo.d".
This means we ignore the initial #! line:  both the specific path to dtrace
as well as any dtrace options that are specified on the initial #! line.

There are some *.sh tests that get around this problem by setting up their
own .d files and invoking them, but this means that some minor infrastructure
is being replicated from file to file.

Add support in runtest.sh for *.d executable interpreter files.  In such
a file, the initial #! line should start #!dtrace, since runtest.sh will
replace the "dtrace" with the absolute path to the dtrace being tested.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 runtest.sh | 37 ++++++++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/runtest.sh b/runtest.sh
index 261db3b8..bc7e6c1a 100755
--- a/runtest.sh
+++ b/runtest.sh
@@ -195,6 +195,23 @@ extract_options()
     done
 }
 
+# is_interpreter_file FILE
+
+is_interpreter_file()
+{
+    if [[ ! -e $1 ]]; then
+        return 1
+    fi
+    if [[ $(awk '{print $1; exit}' $1) != "#!dtrace" ]]; then
+        return 1
+    fi
+
+    # At this point, perhaps we can also check that the file is executable.
+    # But we will copy it anyhow.  So do not bother.
+
+    return 0
+}
+
 DEFAULT_TIMEOUT=41
 
 usage()
@@ -874,7 +891,7 @@ for dt in $dtrace; do
         #
         # The full list of suffxes is as follows:
         #
-        # .d: The D program itself. Either this, or .sh, are mandatory.
+        # .d: The D program itself.
         #
         # .sh: If executable, a shell script that is run instead of dtrace with
         #      a single argument, the path to dtrace.  All other features are still
@@ -1126,7 +1143,15 @@ for dt in $dtrace; do
 
         progtype=d
         run=$dt
-        if [[ -x $base.sh ]]; then
+        interpreter_file=""
+        if is_interpreter_file $base.d; then
+            interpreter_file=$tmpdir/test.interpreter.$RANDOM.d
+            rm -f $interpreter_file
+            sed 's:^#!dtrace :#!'$dt' :' $base.d > $interpreter_file
+            chmod +x $interpreter_file
+            progtype=shell
+            run="$interpreter_file $raw_dt_flags"
+        elif [[ -x $base.sh ]]; then
             progtype=shell
             run="$base.sh $dt"
             if [[ -z $trigger ]]; then
@@ -1147,7 +1172,7 @@ for dt in $dtrace; do
         # even in the presence of a hanging test. stdout and stderr go into
         # different files, and any debugging output is split into a third.)
 
-	rm -f core
+        rm -f core
         fail=
         this_noexec=$NOEXEC
         testmsg=
@@ -1265,6 +1290,12 @@ for dt in $dtrace; do
                 unset _pid
             fi
 
+            # Translate $interpreter_file back into name of test file.
+            if [[ -n $interpreter_file ]]; then
+                sed -i 's:'$interpreter_file':'$base.d':' $testout
+                sed -i 's:'$interpreter_file':'$base.d':' $testerr
+            fi
+
             # Split debugging info out of the test output.
             grep -E '^[a-z_]+ DEBUG [0-9]+: ' $testerr > $testdebug
             grep -vE '^[a-z_]+ DEBUG [0-9]+: ' $testerr > $testerr.tmp
-- 
2.18.4




More information about the DTrace-devel mailing list