我们开发了网络发布/订阅通信套件。它在许多不同的应用程序和领域中使用,最显著的是国际空间站 (ISS) 上的有效载荷。Ubuntu 是我们的主要开发和部署系统。我们所有的代码都打包得很好。在构建软件包的过程中,我想运行每个代码库中包含的测试套件。然而...
我们的通信协议使用 Avahi,而 Avahi 又使用 DBus。因此我们的测试使用 DBus。在构建包时,会调用“fakeroot”来解决许多问题。但是,它引入了一个我无法解决的问题。当我们的测试在没有 fakeroot 的情况下运行时,我们会看到类似以下内容:
[pid 3286] sendto(12, "AUTH EXTERNAL 31303030\r\n", 24, MSG_NOSIGNAL, NULL, 0) = 24
[pid 3286] read(12, "OK 38b4600ae82865f9eba81cb700000"..., 2048) = 37
当使用 fakeroot 运行相同的测试时,我们会看到如下内容:
[pid 3280] sendto(12, "AUTH EXTERNAL 30\r\n", 18, MSG_NOSIGNAL, NULL, 0) = 18
[pid 3280] read(12, "REJECTED EXTERNAL DBUS_COOKIE_SH"..., 2048) = 46
事实证明,DBus 身份验证只是使用用户 UID 的字符串表示的 ASCII 码。正常运行时,UID 为 1000,“1”为 31,“0”为 30;因此 UID 1000 的身份验证令牌为 31303030。在 fakeroot 下,程序认为其 UID 为 0 并发送令牌 30。这被拒绝,整个混乱失败。
这是连接到系统 DBus 而不是会话 DBus,所以我不能在 fakeroot 中启动一个新实例。我查看了我们的代码、Avahi 代码和 DBus 代码,没有找到任何方法可以解决这个问题。
所以最后的问题是 - 有没有办法在不使用 fakeroot 包装器的情况下在软件包构建过程中运行测试?我真的希望测试能够运行,因为代码被提交给具有各种 Linux 发行版和版本的 buildbot 系统。这比仅在我的开发系统上运行测试提供了更好的测试覆盖率。
答案1
确实有一些测试套件在 fakeroot 下运行时会出现混乱。你可以禁用 fakeroot,如下所示debian/rules
:
override_dh_auto_test:
env -u LD_PRELOAD dh_auto_test
如果您的测试套件只是“make check”,并且您使用了相当现代的包装,那么这是正确的。要点是 unset $LD_PRELOAD
。
但请注意,您可以不是依赖于在软件包构建期间运行的系统 D-BUS。在使用 的构建环境中,初始化脚本等通常被禁用policy-rc.d
,因此如果您的测试需要系统总线,则它们需要自行启动一个(dbus-launch 和export DBUS_SYSTEM_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS
)。