[devel] Пишем тесты под repocop. пример 1. проверка init скриптов.
Igor Vlasenko
=?iso-8859-1?q?vlasenko_=CE=C1_imath=2Ekiev=2Eua?=
Чт Фев 28 12:48:26 MSK 2008
Пример использования repocop для соблюдения полиси.
Денис (mithraen@) недавно писал, как хорошо было бы внедрить
LSB заголовки во все init- скрипты, Поскольку никто не возражал,
налицо консенсус :) но воз и ныне там. Почему?
Поскольку на продвижение LSB заголовков нужно тратить много
времени и усилий. Нужно писать в devel@, обьяснить на wiki,
мониторить ситуацию в сизифе (придется писать свои скрипты)
и тормошить майнтайнеров (писать лично или в багзиллу).
repocop позволяет автоматизировать последние две задачи,
тем самым разгрузив, в данном примере, Дениса.
что делаем: пишем тест под robocop, пакуем его в rpm пакет,
и если никто в devel@ не протестует против LSB заголовков
во всех init- скриптах, то ответственный за prometeus инсталлирует
этот тест на sisyphus.ru.
После этого на странице отчета по тесту можно посмотреть списки
пакетов с и без LSB заголовков в init- скриптах, а на страничке
каждого майнтайнера возле "плохого" пакета загорается желтый шарик -
знак того, что какой-то из юнит тестов выдает на пакет warning.
Если майнтайнеру интересно, он может пройти по ссылке на страничку
отчета repocop'а по пакету и увидеть содержательное сообщение,
написанное тестом, который ругался.
Если же майнтайнеру (глубоко) не интересно, то наличие warning, а
тем более fail, теста на пакет, как и наличие незакрытого бага в
багзилле, может быть формальным поводом для NMU,
Остается написать тест, и еще желательно страничку на wiki c FAQ :)
В принципе тест для примера я уже написал, он в дедале,
в пакете repocop-test-lsb-init.
В пакете сам тестовый скрипт нужно положить в
/usr/{share,%_lib}/repocop/pkgtests/<testname>/test
как он работает:
на входе в $REPOCOP_PKG_ROOT развернут какой-то rpm пакет,
тест проверяет, есть ли там init script. Если нет, выходим,
вызывая repocop-test-skip. Если есть, то проверяем, есть ли
LSB заголовок, и в зависимости от результата выходим через
repocop-test-ok или repocop-test-warn. Аргументом к этим командам
передаем осмысленное сообщение, чем именно тест не доволен.
Есть еще repocop-test-fail, но его нужно вызывать только в случае
явных багов (на sisyphus.ru пакет будет помечен красным)
Вот пример теста на shell:
#!/bin/sh
files_exist()
{
[ -e "$1" ]
}
files_exist $REPOCOP_PKG_ROOT/etc/rc.d/init.d/* ] || exec repocop-test-skip "init file not found."
STATUS=ok
MESSAGE=
for i in $REPOCOP_PKG_ROOT/etc/rc.d/init.d/*; do
filename=${i##$REPOCOP_PKG_ROOT}
if [ -x $i ]; then
HAS_INIT=`grep '# chkconfig:' $i`
HAS_LSB_INIT=`grep '### BEGIN INIT INFO' $i`
if [ -z "$HAS_LSB_INIT" ] && [ -n "$HAS_INIT" ]; then
STATUS=warn
MESSAGE="$MESSAGE$filename: lsb init header missing. "
fi
fi
done
repocop-test-$STATUS $MESSAGE
#----------------------------
Как видим, никакой мистики.
--
Dr. Igor Vlasenko
--------------------
Topology Department
Institute of Math
Kiev, Ukraine
Подробная информация о списке рассылки Devel