[DTrace-devel] [PATCH 2/2] test: Add print() tests

Eugene Loh eugene.loh at oracle.com
Fri Nov 17 19:40:43 UTC 2023


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
though perhaps I'm no longer eligible as a reviewer since my name is on 
there now!

All that said:

1)  I still don't understand why these tests aren't squashed into the 
patch that introduces the features being tested.  In particular, how can 
that other patch introduce a new feature that isn't being tested 
(admittedly only until the very next patch)?

2)  It might still be nice to have some err.* tests to check the arg 
checking for print().  I'm attaching some examples.  I suppose there 
should also be a test for size-zero errors???

3)  It would also be good to have a reg-leak test, given that there 
might be a reg leak.  E.g., take one of your simple tests and replicate 
the "print(t)" 20 times or so.  Presumably that test will fail.  Then 
fix the reg leak and run the test again.  This would show the test's 
value for checking reg leaks.  (Another reason for tests like this is 
that we run up against limitations of the BPF verifier.  It's nice to 
know that new functionality isn't pushing up against those limits.  The 
limits I'm talking about are usually due to conditionalized code.  Not a 
real risk here.  Main motivation is to check for reg leaks.)

On 11/17/23 06:48, Alan Maguire wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
>
> use local type declaration + alloca() to create custom types for
> testing.  Verify
>
> - various types are printed correctly
> - zeroed values are skipped
> - we truncate display at offset <value> with -x printsize=<value>
>
> Also verify that we can print kernel-defined type correctly.
>
> Thanks to Eugene for reworking the tests to use the much
> cleaner .d/.r format.
>
> Co-developed-by: Eugene Loh <eugene.loh at oracle.com>
> Signed-off-by: Alan Maguire <alan.maguire at oracle.com>
> ---
>   test/unittest/print/tst.print.local.d        | 45 +++++++++++++++++++
>   test/unittest/print/tst.print.local.r        | 21 +++++++++
>   test/unittest/print/tst.print.local.trunc.d  | 46 ++++++++++++++++++++
>   test/unittest/print/tst.print.local.trunc.r  | 12 +++++
>   test/unittest/print/tst.print.local.zeroed.d | 46 ++++++++++++++++++++
>   test/unittest/print/tst.print.local.zeroed.r |  8 ++++
>   test/unittest/print/tst.print.skb.d          | 19 ++++++++
>   test/unittest/print/tst.print.skb.r          | 14 ++++++
>   8 files changed, 211 insertions(+)
>   create mode 100644 test/unittest/print/tst.print.local.d
>   create mode 100644 test/unittest/print/tst.print.local.r
>   create mode 100644 test/unittest/print/tst.print.local.trunc.d
>   create mode 100644 test/unittest/print/tst.print.local.trunc.r
>   create mode 100644 test/unittest/print/tst.print.local.zeroed.d
>   create mode 100644 test/unittest/print/tst.print.local.zeroed.r
>   create mode 100644 test/unittest/print/tst.print.skb.d
>   create mode 100644 test/unittest/print/tst.print.skb.r
>
> diff --git a/test/unittest/print/tst.print.local.d b/test/unittest/print/tst.print.local.d
> new file mode 100644
> index 00000000..ba37be7a
> --- /dev/null
> +++ b/test/unittest/print/tst.print.local.d
> @@ -0,0 +1,45 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +/* @@nosort */
> +
> +#pragma D option quiet
> +
> +enum eh { FIRSTVAL = 0, SECONDVAL = 1, THIRDVAL = 3 };
> +
> +/* DTrace will not parse nested anonymous structs/unions; also bitfields are not supported. */
> +struct test_struct {
> +	int     a;
> +	char    b[5];
> +	union {
> +		__u8 c;
> +		__u64 d;
> +	} u;
> +	struct {
> +		void *e;
> +		uint64_t f;
> +	} s;
> +	bool g;
> +	enum eh h;
> +};
> +
> +BEGIN
> +{
> +	t = (struct test_struct *)alloca(sizeof (struct test_struct));
> +	t->a = 1;
> +	t->b[0] = 't';
> +	t->b[1] = 'e';
> +	t->b[2] = 's';
> +	t->b[3] = 't';
> +	t->b[4] = '\0';
> +	t->u.d = 123456789;
> +	t->s.e = (void *)0xffff9b7aca7e0000,
> +	t->s.f = 987654321;
> +	t->g = 1;
> +	t->h = SECONDVAL;
> +	print(t);
> +	exit(0);
> +}
> diff --git a/test/unittest/print/tst.print.local.r b/test/unittest/print/tst.print.local.r
> new file mode 100644
> index 00000000..e634bbea
> --- /dev/null
> +++ b/test/unittest/print/tst.print.local.r
> @@ -0,0 +1,21 @@
> +{ptr} = *
> +                                            (struct test_struct) {
> +                                             .a = (int)1,
> +                                             .b = (char [5]) [
> +                                              (char)'t',
> +                                              (char)'e',
> +                                              (char)'s',
> +                                              (char)'t',
> +                                             ],
> +                                             .u = (union) {
> +                                              .c = (__u8)21,
> +                                              .d = (__u64)123456789,
> +                                             },
> +                                             .s = (struct) {
> +                                              .e = (void *){ptr},
> +                                              .f = (uint64_t)987654321,
> +                                             },
> +                                             .g = (bool)1,
> +                                             .h = (enum eh)SECONDVAL,
> +                                            }
> +
> diff --git a/test/unittest/print/tst.print.local.trunc.d b/test/unittest/print/tst.print.local.trunc.d
> new file mode 100644
> index 00000000..2e7beeee
> --- /dev/null
> +++ b/test/unittest/print/tst.print.local.trunc.d
> @@ -0,0 +1,46 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +/* @@nosort */
> +
> +#pragma D option quiet
> +#pragma D option printsize=8
> +
> +enum eh { FIRSTVAL = 1, SECONDVAL = 2, THIRDVAL= 3 };
> +
> +/* DTrace will not parse nested anonymous structs/unions; also bitfields are not supported. */
> +struct test_struct {
> +	int	a;
> +	char	b[5];
> +	union {
> +		__u8 c;
> +		__u64 d;
> +	} u;
> +	struct {
> +		void *e;
> +		uint64_t f;
> +	} s;
> +	bool g;
> +	enum eh h;
> +};
> +
> +BEGIN
> +{
> +	t = (struct test_struct *)alloca(sizeof (struct test_struct));
> +	t->a = 1;
> +	t->b[0] = 't';
> +	t->b[1] = 'e';
> +	t->b[2] = 's';
> +	t->b[3] = 't';
> +	t->b[4] = '\0';
> +	t->u.d = 12345678,
> +	t->s.e = (void *)0xfeedfacefeedface;
> +	t->s.f = 100,
> +	t->g = 1;
> +	t->h = FIRSTVAL;
> +	print(t);
> +	exit(0);
> +}
> diff --git a/test/unittest/print/tst.print.local.trunc.r b/test/unittest/print/tst.print.local.trunc.r
> new file mode 100644
> index 00000000..5b30b661
> --- /dev/null
> +++ b/test/unittest/print/tst.print.local.trunc.r
> @@ -0,0 +1,12 @@
> +{ptr} = *
> +                                            (struct test_struct) {
> +                                             .a = (int)1,
> +                                             .b = (char [5]) [
> +                                              (char)'t',
> +                                              (char)'e',
> +                                              (char)'s',
> +                                              (char)'t',
> +                                             ],
> +                                             ...
> +                                            }
> +
> diff --git a/test/unittest/print/tst.print.local.zeroed.d b/test/unittest/print/tst.print.local.zeroed.d
> new file mode 100644
> index 00000000..0372f581
> --- /dev/null
> +++ b/test/unittest/print/tst.print.local.zeroed.d
> @@ -0,0 +1,46 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +/* @@nosort */
> +
> +#pragma D option quiet
> +
> +enum eh { FIRSTVAL = 1, SECONDVAL = 2, THIRDVAL= 3 };
> +
> +/* DTrace will not parse nested anonymous structs/unions; also bitfields are not supported. */
> +struct test_struct {
> +	int	a;
> +	char	b[5];
> +	union {
> +		__u8 c;
> +		__u64 d;
> +	} u;
> +	struct {
> +		void *e;
> +		uint64_t f;
> +	} s;
> +	bool g;
> +	enum eh h;
> +};
> +
> +BEGIN
> +{
> +	t = (struct test_struct *)alloca(sizeof (struct test_struct));
> +	t->a = 0;
> +	/* initial null should prevent displaying rest of char array */
> +	t->b[0] = '\0';
> +	t->b[1] = 'e';
> +	t->b[2] = 's';
> +	t->b[3] = 't';
> +	t->b[4] = '\0';
> +	t->u.d = 0,
> +	t->s.e = (void *)NULL,
> +	t->s.f = 0,
> +	t->g = 1;
> +	t->h = FIRSTVAL;
> +	print(t);
> +	exit(0);
> +}
> diff --git a/test/unittest/print/tst.print.local.zeroed.r b/test/unittest/print/tst.print.local.zeroed.r
> new file mode 100644
> index 00000000..c4e87680
> --- /dev/null
> +++ b/test/unittest/print/tst.print.local.zeroed.r
> @@ -0,0 +1,8 @@
> +{ptr} = *
> +                                            (struct test_struct) {
> +                                             .b = (char [5]) [
> +                                             ],
> +                                             .g = (bool)1,
> +                                             .h = (enum eh)FIRSTVAL,
> +                                            }
> +
> diff --git a/test/unittest/print/tst.print.skb.d b/test/unittest/print/tst.print.skb.d
> new file mode 100644
> index 00000000..f09686e8
> --- /dev/null
> +++ b/test/unittest/print/tst.print.skb.d
> @@ -0,0 +1,19 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +/* @@nosort */
> +
> +#pragma D option quiet
> +
> +BEGIN
> +{
> +        skb = (struct sk_buff *)alloca(sizeof (struct sk_buff));
> +        skb->len = 123;
> +        skb->network_header = 32;
> +        skb->data = (unsigned char *)0xfeedfacefeedface;
> +        print(skb);
> +        exit(0);
> +}
> diff --git a/test/unittest/print/tst.print.skb.r b/test/unittest/print/tst.print.skb.r
> new file mode 100644
> index 00000000..f389bc4f
> --- /dev/null
> +++ b/test/unittest/print/tst.print.skb.r
> @@ -0,0 +1,14 @@
> +{ptr} = *
> +                                            (struct sk_buff) {
> +                                             .len = (unsigned int)123,
> +                                             (struct) {
> +                                              (struct) {
> +                                               .network_header = (__u16)32,
> +                                              },
> +                                              .headers = (struct) {
> +                                               .network_header = (__u16)32,
> +                                              },
> +                                             },
> +                                             .data = (unsigned char *){ptr},
> +                                            }
> +
-------------- next part --------------
From ae79c75d55d14a77547465fb850458aa45b60035 Mon Sep 17 00:00:00 2001
From: Eugene Loh <eugene.loh at oracle.com>
Date: Fri, 17 Nov 2023 14:33:57 -0500
Subject: [PATCH] Example err.* tests

---
 test/unittest/print/err.D_PROTO_ARG.arg.d     | 12 ++++++++++++
 test/unittest/print/err.D_PROTO_ARG.arg.r     |  4 ++++
 test/unittest/print/err.D_PROTO_LEN.toofew.d  | 12 ++++++++++++
 test/unittest/print/err.D_PROTO_LEN.toofew.r  |  2 ++
 test/unittest/print/err.D_PROTO_LEN.toomany.d | 13 +++++++++++++
 test/unittest/print/err.D_PROTO_LEN.toomany.r |  2 ++
 6 files changed, 45 insertions(+)
 create mode 100644 test/unittest/print/err.D_PROTO_ARG.arg.d
 create mode 100644 test/unittest/print/err.D_PROTO_ARG.arg.r
 create mode 100644 test/unittest/print/err.D_PROTO_LEN.toofew.d
 create mode 100644 test/unittest/print/err.D_PROTO_LEN.toofew.r
 create mode 100644 test/unittest/print/err.D_PROTO_LEN.toomany.d
 create mode 100644 test/unittest/print/err.D_PROTO_LEN.toomany.r

diff --git a/test/unittest/print/err.D_PROTO_ARG.arg.d b/test/unittest/print/err.D_PROTO_ARG.arg.d
new file mode 100644
index 00000000..7a32dd13
--- /dev/null
+++ b/test/unittest/print/err.D_PROTO_ARG.arg.d
@@ -0,0 +1,12 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+BEGIN
+{
+	print(1);
+	exit(1);
+}
diff --git a/test/unittest/print/err.D_PROTO_ARG.arg.r b/test/unittest/print/err.D_PROTO_ARG.arg.r
new file mode 100644
index 00000000..cbac2cdb
--- /dev/null
+++ b/test/unittest/print/err.D_PROTO_ARG.arg.r
@@ -0,0 +1,4 @@
+-- @@stderr --
+dtrace: failed to compile script test/unittest/print/err.D_PROTO_ARG.arg.d: [D_PROTO_ARG] line 10: print( ) argument #1 is incompatible with prototype:
+	prototype: void *
+	 argument: int
diff --git a/test/unittest/print/err.D_PROTO_LEN.toofew.d b/test/unittest/print/err.D_PROTO_LEN.toofew.d
new file mode 100644
index 00000000..0785ed52
--- /dev/null
+++ b/test/unittest/print/err.D_PROTO_LEN.toofew.d
@@ -0,0 +1,12 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+BEGIN
+{
+	print();
+	exit(1);
+}
diff --git a/test/unittest/print/err.D_PROTO_LEN.toofew.r b/test/unittest/print/err.D_PROTO_LEN.toofew.r
new file mode 100644
index 00000000..d01a3194
--- /dev/null
+++ b/test/unittest/print/err.D_PROTO_LEN.toofew.r
@@ -0,0 +1,2 @@
+-- @@stderr --
+dtrace: failed to compile script test/unittest/print/err.D_PROTO_LEN.toofew.d: [D_PROTO_LEN] line 10: print( ) prototype mismatch: 0 args passed, 1 expected
diff --git a/test/unittest/print/err.D_PROTO_LEN.toomany.d b/test/unittest/print/err.D_PROTO_LEN.toomany.d
new file mode 100644
index 00000000..81d600bc
--- /dev/null
+++ b/test/unittest/print/err.D_PROTO_LEN.toomany.d
@@ -0,0 +1,13 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+BEGIN
+{
+	x = 1;
+	print(x, x);
+	exit(1);
+}
diff --git a/test/unittest/print/err.D_PROTO_LEN.toomany.r b/test/unittest/print/err.D_PROTO_LEN.toomany.r
new file mode 100644
index 00000000..a618f20f
--- /dev/null
+++ b/test/unittest/print/err.D_PROTO_LEN.toomany.r
@@ -0,0 +1,2 @@
+-- @@stderr --
+dtrace: failed to compile script test/unittest/print/err.D_PROTO_LEN.toomany.d: [D_PROTO_LEN] line 11: print( ) prototype mismatch: 2 args passed, 1 expected
-- 
2.18.4



More information about the DTrace-devel mailing list