[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