在PyDbus mocks中使用私有DBus连接



有一个服务(在第二个列表中给出了DBus"坐标")在Linux环境中运行,同时我在测试中运行了一个自定义的私有数据库总线,如下所示夹具:

def run_custom_daemon():
cmd = [
"dbus-daemon",
"--system",
"--nofork",
"--address=unix:path=<some_path>.sock"
]
proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=False)
os.environ['CUSTOM_DBUS_SYSTEM_BUS_ADDRESS'] = "<some_path>.sock"
time.sleep(0.5)
yield proc
proc.kill()

现在,我的组件使用服务com.foo.bar.Baz,并且在C++代码中我使用sdbus-c++,例如

m_prx = stdbus::createProxy(...)

现在,如果我按原样运行测试,似乎是因为";官方的";DBus在某种程度上是";屏蔽的";通过测试,我得到了ServiceNotKnown错误但是,如果我使用下面的代码模拟该服务,我得到了";该名称已经具有所有者"-错误类型。问题可能是,如何告诉mock使用上述";私下里";设置DBus?

from pydbus import SystemBus
from gi.repository import GLib
class MockSrv:
dbus = """
<node name="/com/foo/bar/Baz">
<interface name="com.foo.bar.Baz">
<method name="Buzz">
<arg type="s" direction="out"/>
</method>
</interface>
</node>
"""
mloop = GLib.MainLoop()
mbus = SystemBus()
srv = MockSrv()
mbus.publish("com.foo.bar.Baz",
("/com/foo/bar/Baz", srv)
)
mloop.run()

如果我理解正确,您希望使用Python模拟DBus服务,然后使用C++连接到该服务进行测试。

我发现最好的方法是创建一个本地会话总线(使用类似dbus-run-session的东西)来运行应用程序。这将正确设置环境变量以打开新的SESSION总线,然后在最后退出。

最新更新