ネットワークpub/sub通信スイートを開発しました。それは多くの異なるアプリケーションとドメイン、特に国際宇宙ステーション(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システムに送信されるため、テストを実行したいと思っています。これにより、開発システムでテストを実行するよりもはるかに優れたテストカバレッジが提供されます。
確かに、fakerootで実行すると混乱するテストスイートがいくつかあります。 debian/rules
のようなものでfakerootを無効にすることができます:
override_dh_auto_test:
env -u LD_PRELOAD dh_auto_test
これは、テストスイートが単に「チェック」であり、適度に最新のパッケージを使用している場合に適しています。要点は、$LD_PRELOAD
の設定を解除することです。
ただし、パッケージのビルド中に実行されているシステムD-BUSに依存できることに注意してくださいnot。 initスクリプトなどは、policy-rc.d
を使用するビルド環境では通常無効になっているため、テストでシステムバスが必要な場合は、自分で開始する必要があります(dbus-launch、およびexport DBUS_SYSTEM_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS
)。