在 PyDbus 模拟中使用私有 DBus 连接
Posted
技术标签:
【中文标题】在 PyDbus 模拟中使用私有 DBus 连接【英文标题】:Using private DBus connection in PyDbus mocks 【发布时间】:2021-10-20 01:10:06 【问题描述】:有一个服务(在第二个列表中给出了 DBus“坐标”) 在 Linux 环境中运行,同时 我在测试中正在运行一个自定义私有 DBus,如下所示 夹具:
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
错误。但是,如果我使用下面的代码模拟服务,
我得到“名称已经拥有所有者”类型的错误。
问题可能是如何告诉模拟使用
上述“私人”设置的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()
【问题讨论】:
【参考方案1】:如果我的理解正确,您想使用 Python 模拟 DBus 服务,然后使用 C++ 连接到该服务进行测试。
我发现最好的方法是创建一个本地会话总线(使用类似dbus-run-session)来运行应用程序。这将正确设置环境变量以打开新的 SESSION 总线,然后在最后退出。
【讨论】:
以上是关于在 PyDbus 模拟中使用私有 DBus 连接的主要内容,如果未能解决你的问题,请参考以下文章