Мы разработали сетевой паб / суб-коммуникационный пакет. Он используется в различных приложениях и доменах, особенно в наших полезных нагрузках на борту Международной космической станции (МКС). Ubuntu - наша основная система разработки и развертывания. Весь наш код хорошо упакован. В процессе сборки пакетов я хотел бы запустить наборы тестов, включенные в каждую кодовую базу. Однако ...
Наш протокол связи использует 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 просто использует ASCII-код строкового представления UID для пользователя. При нормальной работе UID равен 1000, «1» - 31, «0» - 30; следовательно, токен аутентификации для UID 1000 - 31303030. В fakeroot программа считает, что ее UID равен 0, и отправляет токен 30. Это отклонено, и весь беспорядок завершается неудачей.
Это соединение с системным DBus, а не сессионным DBus, поэтому я не могу просто запустить новый экземпляр внутри fakeroot. Я просмотрел наш код, код Avahi и код DBus и не вижу способа обойти это.
Итак, наконец, вопрос - есть ли способ запустить тесты во время сборки пакета без оболочки fakeroot? Я действительно хочу, чтобы тесты запускались, поскольку код передается в систему buildbot, которая имеет широкий спектр дистрибутивов и версий Linux. Это обеспечивает гораздо лучший охват тестами, чем просто запуск тестов в моей системе разработки.
Действительно, есть несколько тестовых наборов, которые запутываются, когда вы запускаете их под fakeroot. Вы можете отключить fakeroot для тех, у кого что-то подобное в debian/rules
:
override_dh_auto_test:
env -u LD_PRELOAD dh_auto_test
Это правильно, если ваш набор тестов просто «делает проверку» и вы используете достаточно современную упаковку. Суть состоит в том, чтобы раскрыть $LD_PRELOAD
.
Однако, обратите внимание, что вы не можете полагаться на систему D-BUS, работающую во время сборки пакета. Сценарии init и т. П. Обычно отключаются в средах сборки с использованием policy-rc.d
, поэтому, если ваши тесты нуждаются в системной шине, они должны сами запустить ее (dbus-launch и export DBUS_SYSTEM_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS
).