[DTrace-devel] [PATCH v5 11/11] test: Add a test for the PCP ManagedDTraceScript interface

Alan Maguire alan.maguire at oracle.com
Fri Aug 21 16:10:59 UTC 2026


Since tests cannot rely on a full PCP configuration, do
limited testing of a ManagedDTraceScript, ensuring that
we can create it, start it and that it collects data.

Signed-off-by: Alan Maguire <alan.maguire at oracle.com>
---
 test/unittest/python/tst.pcp.sh | 69 +++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)
 create mode 100755 test/unittest/python/tst.pcp.sh

diff --git a/test/unittest/python/tst.pcp.sh b/test/unittest/python/tst.pcp.sh
new file mode 100755
index 00000000..acc68854
--- /dev/null
+++ b/test/unittest/python/tst.pcp.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2026, 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.
+#
+# Test the PCP ManagedDTraceScript with a real DTrace session.
+# @@timeout: 60
+
+if [ $# -ne 1 ]; then
+    echo "usage: $0 <dtrace>" >&2
+    exit 2
+fi
+
+if ! "$DTRACE_PYTHON" -c 'import dtrace, cpmapi, cpmda, pcp.pmapi, pcp.pmda' \
+    >/dev/null 2>&1; then
+    echo "DTrace or PCP Python bindings are unavailable"
+    exit 2
+fi
+
+tmpdir=$(mktemp -d)
+cleanup() { rm -rf "$tmpdir"; }
+trap cleanup EXIT
+
+cat >"$tmpdir/test.py" <<'EOF'
+#!/usr/bin/env python3
+import importlib.machinery
+import importlib.util
+import time
+
+loader = importlib.machinery.SourceFileLoader("pmdadtrace", "pcp/pmdadtrace.python")
+spec = importlib.util.spec_from_loader("pmdadtrace", loader)
+pmdadtrace = importlib.util.module_from_spec(spec)
+spec.loader.exec_module(pmdadtrace)
+
+created = []
+script = pmdadtrace.ManagedDTraceScript(
+    "tick_test", "profile:::tick-1s /$1 == 1/ { @ticks = count(); }", False,
+    {"quiet": True}, ".", None, None, [], ["1"], 0,
+    print,
+)
+script._data_callbacks = {
+    "create_metric": lambda entry: created.append(("metric", entry.metric)),
+    "create_instance": lambda entry: created.append(
+        ("instance", entry.metric, entry.instance)
+    ),
+    "update_instance": lambda entry: None,
+    "remove_instance": lambda entry: None,
+    "refresh_metrics": lambda: None,
+}
+
+ok, error = script.start()
+if not ok:
+    raise SystemExit(f"unable to start ManagedDTraceScript: {error}")
+time.sleep(15)
+script.stop()
+
+entries = script.latest_aggregations()
+if script.state() == "error":
+    raise SystemExit(f"ManagedDTraceScript failed: {script.last_error()}")
+if not any(entry.metric.endswith(".ticks") for entry in entries.values()):
+    raise SystemExit(f"tick aggregation was not published: {entries}")
+if not any(item[0] == "instance" for item in created):
+    raise SystemExit(f"tick metric instance was not created: {created}")
+EOF
+
+chmod +x "$tmpdir/test.py"
+timeout 60 "$DTRACE_PYTHON" "$tmpdir/test.py"
-- 
2.43.5




More information about the DTrace-devel mailing list