[DTrace-devel] [PATCH v2] test: Make tests more resilient to different prid widths
Kris Van Hees
kris.van.hees at oracle.com
Wed Mar 19 17:46:02 UTC 2025
On Wed, Mar 19, 2025 at 01:15:25PM -0400, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
>
> Various tests convert run-dependent values -- like PIDs and probe IDs
> -- to run-independent strings before checking against their .r results
> files. But the conversions could be remarkably sensitive to the width
> of probe IDs. E.g., some conversions assumed probe IDs were flush with
> the beginning of the line, but if they were narrower they were preceded
> by white space and were not detected. E.g., this happened in recent fbt
> work, where probe IDs for fbt probes became much smaller in value.
>
> Also, these conversions were being carried out by a hodgepodge of scripts
> -- sed, awk, and grep; some using run-independent strings like "NNN" or
> "XXXX" instead of more informative "PID" and "PRID" strings; some
> incorrectly using "PID" for PRIDs, etc.
>
> Replace these .r.p postprocessing scripts with a single script that is
> more resilient to PRID widths and is commented.
>
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> ---
> test/unittest/usdt/convert_PID_and_PRID.awk | 20 +++++++++++++++++
> test/unittest/usdt/err.argmap-null.r | 2 +-
> test/unittest/usdt/err.argmap-null.r.p | 3 +--
> test/unittest/usdt/tst.dlclose1.r | 8 +++----
> test/unittest/usdt/tst.dlclose1.r.p | 13 +----------
> test/unittest/usdt/tst.enable_pid.r | 22 +++++++++----------
> test/unittest/usdt/tst.enable_pid.r.p | 8 +------
> test/unittest/usdt/tst.exec-dof-replacement.r | 2 +-
> .../usdt/tst.exec-dof-replacement.r.p | 3 +--
> .../usdt/tst.multiprov-dupprobe-fire.r.p | 3 +--
> test/unittest/usdt/tst.multiprov-dupprobe.r.p | 6 +----
> test/unittest/usdt/tst.multiprovider-fire.r.p | 3 +--
> test/unittest/usdt/tst.multiprovider.r.p | 6 +----
> 13 files changed, 44 insertions(+), 55 deletions(-)
> create mode 100755 test/unittest/usdt/convert_PID_and_PRID.awk
> mode change 100755 => 120000 test/unittest/usdt/err.argmap-null.r.p
> mode change 100755 => 120000 test/unittest/usdt/tst.dlclose1.r.p
> mode change 100755 => 120000 test/unittest/usdt/tst.enable_pid.r.p
> mode change 100755 => 120000 test/unittest/usdt/tst.exec-dof-replacement.r.p
> mode change 100755 => 120000 test/unittest/usdt/tst.multiprov-dupprobe-fire.r.p
> mode change 100755 => 120000 test/unittest/usdt/tst.multiprov-dupprobe.r.p
> mode change 100755 => 120000 test/unittest/usdt/tst.multiprovider-fire.r.p
> mode change 100755 => 120000 test/unittest/usdt/tst.multiprovider.r.p
>
> diff --git a/test/unittest/usdt/convert_PID_and_PRID.awk b/test/unittest/usdt/convert_PID_and_PRID.awk
> new file mode 100755
> index 000000000..1dbb31301
> --- /dev/null
> +++ b/test/unittest/usdt/convert_PID_and_PRID.awk
> @@ -0,0 +1,20 @@
> +#!/usr/bin/gawk -f
> +
> +# ignore the banner
> +/^ *ID *PROVIDER *MODULE *FUNCTION *NAME *$/ { next; }
I think that using / +/ for the whitespace instances might be better,
or perhaps even /[ \t]+/ if we want to guard against future use of tabs.
But at a minimum / +/ seems most prudent.
> +
> +# process other lines
> +{
> + # convert run-dependent PID values to "PID"
> + $0 = gensub("prov([abc]?)[0-9]+", "prov\\1PID", "g");
> + sub("pid [0-9]+", "pid PID");
First arg of each function is a regexp, so should be specified as /.../ rather
than "...".
> +
> + # convert run-dependent probe ID values to "PRID"
> + sub("^ *[0-9]+", "PRID");
Same.
> +
> + # squash blanks
> + gsub(" +", " ");
Same.
> +
> + # print
> + print;
> +}
> diff --git a/test/unittest/usdt/err.argmap-null.r b/test/unittest/usdt/err.argmap-null.r
> index 215475e39..97b1850de 100644
> --- a/test/unittest/usdt/err.argmap-null.r
> +++ b/test/unittest/usdt/err.argmap-null.r
> @@ -1,2 +1,2 @@
> -- @@stderr --
> -dtrace: failed to compile script test/unittest/usdt/err.argmap-null.d: line 24: index 0 is out of range for test_provXXXX:::place4 args[ ]
> +dtrace: failed to compile script test/unittest/usdt/err.argmap-null.d: line 24: index 0 is out of range for test_provPID:::place4 args[ ]
> diff --git a/test/unittest/usdt/err.argmap-null.r.p b/test/unittest/usdt/err.argmap-null.r.p
> deleted file mode 100755
> index c575983ad..000000000
> --- a/test/unittest/usdt/err.argmap-null.r.p
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -#!/bin/sed -rf
> -s,test_prov[0-9]*,test_provXXXX,g; s,^ *[0-9]+, XX,g;
> diff --git a/test/unittest/usdt/err.argmap-null.r.p b/test/unittest/usdt/err.argmap-null.r.p
> new file mode 120000
> index 000000000..11a06e058
> --- /dev/null
> +++ b/test/unittest/usdt/err.argmap-null.r.p
> @@ -0,0 +1 @@
> +convert_PID_and_PRID.awk
> \ No newline at end of file
> diff --git a/test/unittest/usdt/tst.dlclose1.r b/test/unittest/usdt/tst.dlclose1.r
> index 7873cb51f..70bb50d76 100644
> --- a/test/unittest/usdt/tst.dlclose1.r
> +++ b/test/unittest/usdt/tst.dlclose1.r
> @@ -1,6 +1,4 @@
> -started pid NNN
> - ID PROVIDER MODULE FUNCTION NAME
> -NNN test_provNNN livelib.so go go
> - ID PROVIDER MODULE FUNCTION NAME
> +started pid PID
> +PRID test_provPID livelib.so go go
> -- @@stderr --
> -dtrace: failed to match test_provNNN:::: No probe matches description
> +dtrace: failed to match test_provPID:::: No probe matches description
> diff --git a/test/unittest/usdt/tst.dlclose1.r.p b/test/unittest/usdt/tst.dlclose1.r.p
> deleted file mode 100755
> index 85725f3bb..000000000
> --- a/test/unittest/usdt/tst.dlclose1.r.p
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#!/usr/bin/gawk -f
> -{
> - # ignore the specific probe ID or process ID
> - # (the script ensures the process ID is consistent)
> - gsub(/[0-9]+/, "NNN");
> -
> - # ignore the numbers of spaces for alignment
> - # (they depend on the ID widths)
> - gsub(/ +/, " ");
> -
> - print;
> -}
> diff --git a/test/unittest/usdt/tst.dlclose1.r.p b/test/unittest/usdt/tst.dlclose1.r.p
> new file mode 120000
> index 000000000..11a06e058
> --- /dev/null
> +++ b/test/unittest/usdt/tst.dlclose1.r.p
> @@ -0,0 +1 @@
> +convert_PID_and_PRID.awk
> \ No newline at end of file
> diff --git a/test/unittest/usdt/tst.enable_pid.r b/test/unittest/usdt/tst.enable_pid.r
> index 675fcdd6f..9241202d7 100644
> --- a/test/unittest/usdt/tst.enable_pid.r
> +++ b/test/unittest/usdt/tst.enable_pid.r
> @@ -1,14 +1,14 @@
> - FUNCTION:NAME
> - :tick-1s
> + FUNCTION:NAME
> + :tick-1s
>
> - FUNCTION:NAME
> - :tick-1s
> + FUNCTION:NAME
> + :tick-1s
>
> - FUNCTION:NAME
> - :tick-1s
> + FUNCTION:NAME
> + :tick-1s
>
> - FUNCTION:NAME
> - :tick-1s
> + FUNCTION:NAME
> + :tick-1s
>
> done
> ========== out 1
> @@ -39,7 +39,7 @@ is not enabled
> === epoch ===
> success
> -- @@stderr --
> -dtrace: description 'test_provNNN:::go ' matched 1 probe
> -dtrace: description 'test_provNNN:::go ' matched 2 probes
> -dtrace: description 'test_provNNN:::go ' matched 2 probes
> +dtrace: description 'test_provPID:::go ' matched 1 probe
> +dtrace: description 'test_provPID:::go ' matched 2 probes
> +dtrace: description 'test_provPID:::go ' matched 2 probes
> dtrace: description 'test_prov*:::go ' matched 3 probes
> diff --git a/test/unittest/usdt/tst.enable_pid.r.p b/test/unittest/usdt/tst.enable_pid.r.p
> deleted file mode 100755
> index baf9d2a90..000000000
> --- a/test/unittest/usdt/tst.enable_pid.r.p
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#!/usr/bin/awk -f
> -{
> - # ignore the specific process ID
> - gsub(/test_prov[0-9]+/, "test_provNNN");
> -
> - print;
> -}
> diff --git a/test/unittest/usdt/tst.enable_pid.r.p b/test/unittest/usdt/tst.enable_pid.r.p
> new file mode 120000
> index 000000000..11a06e058
> --- /dev/null
> +++ b/test/unittest/usdt/tst.enable_pid.r.p
> @@ -0,0 +1 @@
> +convert_PID_and_PRID.awk
> \ No newline at end of file
> diff --git a/test/unittest/usdt/tst.exec-dof-replacement.r b/test/unittest/usdt/tst.exec-dof-replacement.r
> index 7547f85e5..226ab7c8a 100644
> --- a/test/unittest/usdt/tst.exec-dof-replacement.r
> +++ b/test/unittest/usdt/tst.exec-dof-replacement.r
> @@ -1 +1 @@
> -PID test_prov test2 main succeeded
> +PRID test_provPID test2 main succeeded
> diff --git a/test/unittest/usdt/tst.exec-dof-replacement.r.p b/test/unittest/usdt/tst.exec-dof-replacement.r.p
> deleted file mode 100755
> index 1a5871f73..000000000
> --- a/test/unittest/usdt/tst.exec-dof-replacement.r.p
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -#!/bin/sh
> -grep -v '^ *ID' | sed 's,^[0-9]*,PID,; s,prov[0-9]*,prov,g; s, *, ,g'
> diff --git a/test/unittest/usdt/tst.exec-dof-replacement.r.p b/test/unittest/usdt/tst.exec-dof-replacement.r.p
> new file mode 120000
> index 000000000..11a06e058
> --- /dev/null
> +++ b/test/unittest/usdt/tst.exec-dof-replacement.r.p
> @@ -0,0 +1 @@
> +convert_PID_and_PRID.awk
> \ No newline at end of file
> diff --git a/test/unittest/usdt/tst.multiprov-dupprobe-fire.r.p b/test/unittest/usdt/tst.multiprov-dupprobe-fire.r.p
> deleted file mode 100755
> index bdbce0189..000000000
> --- a/test/unittest/usdt/tst.multiprov-dupprobe-fire.r.p
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -#!/bin/sh
> -sed 's,prov\(.\)[0-9]*,prov\1PID,; s, *, ,g'
> diff --git a/test/unittest/usdt/tst.multiprov-dupprobe-fire.r.p b/test/unittest/usdt/tst.multiprov-dupprobe-fire.r.p
> new file mode 120000
> index 000000000..11a06e058
> --- /dev/null
> +++ b/test/unittest/usdt/tst.multiprov-dupprobe-fire.r.p
> @@ -0,0 +1 @@
> +convert_PID_and_PRID.awk
> \ No newline at end of file
> diff --git a/test/unittest/usdt/tst.multiprov-dupprobe.r.p b/test/unittest/usdt/tst.multiprov-dupprobe.r.p
> deleted file mode 100755
> index 5d11db2d4..000000000
> --- a/test/unittest/usdt/tst.multiprov-dupprobe.r.p
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#!/bin/sh
> -
> -# Remove banner.
> -# Replace numerical values with generic PRID and PID labels.
> -grep -v '^ *ID' | sed 's,^[0-9][0-9]*,PRID,; s,prov\(.\)[0-9]*,prov\1PID,; s, *, ,g'
> diff --git a/test/unittest/usdt/tst.multiprov-dupprobe.r.p b/test/unittest/usdt/tst.multiprov-dupprobe.r.p
> new file mode 120000
> index 000000000..11a06e058
> --- /dev/null
> +++ b/test/unittest/usdt/tst.multiprov-dupprobe.r.p
> @@ -0,0 +1 @@
> +convert_PID_and_PRID.awk
> \ No newline at end of file
> diff --git a/test/unittest/usdt/tst.multiprovider-fire.r.p b/test/unittest/usdt/tst.multiprovider-fire.r.p
> deleted file mode 100755
> index bdbce0189..000000000
> --- a/test/unittest/usdt/tst.multiprovider-fire.r.p
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -#!/bin/sh
> -sed 's,prov\(.\)[0-9]*,prov\1PID,; s, *, ,g'
> diff --git a/test/unittest/usdt/tst.multiprovider-fire.r.p b/test/unittest/usdt/tst.multiprovider-fire.r.p
> new file mode 120000
> index 000000000..11a06e058
> --- /dev/null
> +++ b/test/unittest/usdt/tst.multiprovider-fire.r.p
> @@ -0,0 +1 @@
> +convert_PID_and_PRID.awk
> \ No newline at end of file
> diff --git a/test/unittest/usdt/tst.multiprovider.r.p b/test/unittest/usdt/tst.multiprovider.r.p
> deleted file mode 100755
> index 5d11db2d4..000000000
> --- a/test/unittest/usdt/tst.multiprovider.r.p
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#!/bin/sh
> -
> -# Remove banner.
> -# Replace numerical values with generic PRID and PID labels.
> -grep -v '^ *ID' | sed 's,^[0-9][0-9]*,PRID,; s,prov\(.\)[0-9]*,prov\1PID,; s, *, ,g'
> diff --git a/test/unittest/usdt/tst.multiprovider.r.p b/test/unittest/usdt/tst.multiprovider.r.p
> new file mode 120000
> index 000000000..11a06e058
> --- /dev/null
> +++ b/test/unittest/usdt/tst.multiprovider.r.p
> @@ -0,0 +1 @@
> +convert_PID_and_PRID.awk
> \ No newline at end of file
> --
> 2.43.5
>
More information about the DTrace-devel
mailing list