git: c4705d66d1b0 - main - Uses/dbus-testing.mk: Introduce new USES

From: Gleb Popov <arrowd_at_FreeBSD.org>
Date: Sun, 28 Dec 2025 15:44:33 UTC
The branch main has been updated by arrowd:

URL: https://cgit.FreeBSD.org/ports/commit/?id=c4705d66d1b0a9ef2a48a439ae63992783532423

commit c4705d66d1b0a9ef2a48a439ae63992783532423
Author:     Gleb Popov <arrowd@FreeBSD.org>
AuthorDate: 2024-09-11 17:58:00 +0000
Commit:     Gleb Popov <arrowd@FreeBSD.org>
CommitDate: 2025-12-28 15:44:29 +0000

    Uses/dbus-testing.mk: Introduce new USES
    
    This USES starts a system- and session-level D-Bus daemons before the
    test stage and stops them after, much like Uses/display.mk provides an
    X11 display.
    
    It is intended to be used with ports whose testing require a running dbus daemon.
    
    Approved by:    portmgr (bapt)
    Sponsored by:   Future Crew, LLC
    Differential Revision: https://reviews.freebsd.org/D53464
---
 Mk/Uses/dbus-testing.mk                  | 55 ++++++++++++++++++++++++++++++++
 Templates/dbus-testing-system-local.conf |  9 ++++++
 2 files changed, 64 insertions(+)

diff --git a/Mk/Uses/dbus-testing.mk b/Mk/Uses/dbus-testing.mk
new file mode 100644
index 000000000000..1c0046897d43
--- /dev/null
+++ b/Mk/Uses/dbus-testing.mk
@@ -0,0 +1,55 @@
+# sets dbus daemon up for testing
+#
+# Feature:	dbus-testing
+# Usage:	USES=dbus-testing
+#
+# MAINTAINER:	arrowd@FreeBSD.org
+
+.if !defined(_INCLUDE_USES_DBUS_TESTINGS_MK)
+_INCLUDE_USES_DBUS_TESTINGS_MK=yes
+
+TEST_DEPENDS+=	dbus-launch:devel/dbus
+TEST_ENV+=	DBUS_SESSION_BUS_ADDRESS=unix:path=${_SESSION_BUS_SOCKET}
+
+_DBUS_LAUNCH?=	${LOCALBASE}/bin/dbus-launch
+
+_DBUS_LOCAL_CONF_SRC=	${PORTSDIR}/Templates/dbus-testing-system-local.conf
+_DBUS_LOCAL_CONF_DST=	${LOCALBASE}/etc/dbus-1/system-local.conf
+
+_ALREADY_STARTED_COOKIE=${WRKDIR}/.dbus-testing-was-already-running
+_SESSION_BUS_SOCKET=	${WRKDIR}/.dbus-session-bus-socket
+_SESSION_BUS_PIDFILE=	${WRKDIR}/.dbus-session-bus-pid
+
+_USES_test=	299:dbus-testing-pre-test \
+		801:dbus-testing-post-test
+
+dbus-testing-pre-test:
+.  if defined(PACKAGE_BUILDING) && ${UID} == 0
+# When running in Poudriere we can afford installing a permissive config
+# that allows anyone to own any D-Bus name. This is useful for running tests
+# without prior "make install".
+	${INSTALL_DATA} ${_DBUS_LOCAL_CONF_SRC} ${_DBUS_LOCAL_CONF_DST}
+.  endif
+# Start the system bus via rc script
+	(/usr/sbin/service dbus onestatus && \
+		${TOUCH} ${_ALREADY_STARTED_COOKIE}) || ${TRUE}
+	/usr/sbin/service dbus onestart || ${TRUE}
+# Now start an isolated session bus. This is complicated because 'make test'
+# wraps everything into ${SETENVI}, so we can't easily pass the bus address via
+# environment. Instead we put the bus' socket under a well-known path
+# ${_SESSION_BUS_SOCKET} and pass it to make via usual ${TEST_ENV}.
+# Typical value for DBUS_SESSION_BUS_ADDRESS looks like
+# unix:path=/tmp/dbus-xZF47bxeMf,guid=227e19aaa3a87a1bbdb96cd56901b7e0
+	session_bus_env=$$(${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${_DBUS_LAUNCH} | ${XARGS}) ; \
+	session_bus_sock=$$(echo $$session_bus_env | grep -o 'path=.*' | sed -e 's|path=||' -e 's|,.*||') ; \
+	${LN} -fs $$session_bus_sock ${_SESSION_BUS_SOCKET} ;\
+	${SETENVI} $$session_bus_env ${SH} -c 'echo $$DBUS_SESSION_BUS_PID' > ${_SESSION_BUS_PIDFILE}
+
+dbus-testing-post-test:
+	(${CAT} ${_SESSION_BUS_PIDFILE} | ${XARGS} kill) || ${TRUE}
+	${RM} ${_SESSION_BUS_SOCKET} ${_SESSION_BUS_PIDFILE}
+	[ ! -f ${_ALREADY_STARTED_COOKIE} ] && \
+		/usr/sbin/service dbus onestop || ${TRUE}
+	${RM} ${_ALREADY_STARTED_COOKIE}
+
+.endif
diff --git a/Templates/dbus-testing-system-local.conf b/Templates/dbus-testing-system-local.conf
new file mode 100644
index 000000000000..54ea728029c6
--- /dev/null
+++ b/Templates/dbus-testing-system-local.conf
@@ -0,0 +1,9 @@
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
+  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+  <policy context="default">
+    <allow send_destination="*" eavesdrop="true"/>
+    <allow eavesdrop="true"/>
+    <allow own="*"/>
+  </policy>
+</busconfig>