henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2011-09-27 09:56 pm
Entry tags:

После разнообразия и гибкости газилиона тестовых фрей

После разнообразия и гибкости газилиона тестовых фреймвоков для руби, glib'овский смотрится довольно убого.

Например, у меня есть функция, которая, если все плохо, плюется на stderr и возвращает NULL. Хочется из юнит теста почитать отот stderr.

Как это сделать на C? Можно создать пайп, позакрывать в чайлде и паренте концы для записи/чтения, сделать dup2 на нужных дескрипторах и пр. Все это делает g_test_trap_fork(), которая даже сама зовет waitpid. То есть, конечный результат в юнит тесте будет такой:

if (g_test_trap_fork(0, G_TEST_TRAP_SILENCE_STDERR)) {
g_assert_cmpstr(NULL, ==, feed_parse(NULL, -1));
exit(0); // successful test run
}
g_test_trap_assert_passed();
g_test_trap_assert_stderr("*libmrss: No correct paramenter in the function*");

Гоогл, гадюка, где pre-formatted text? g_test_trap_assert_stderr() собственно делает match. Возможность посмотреть, что именно выплюнула feed_parse(), glib не дает--переменная в его потрохах, хранящяя содержимое stderr, помечена static. Нахуя так сделано, никто не помнит. Подозреваю, что на самом деле, виновато идиотское GPL, в том смысле что в коммерческом продукте glib особенно не попользуешь, а кому для внутренней кухни, так на тесты всем наплевать: а чего они? ето шо мало меня пиэм ебал своим тидиди на прошлом проекте, так я еще буду их тут писать?

Допустим, надо вызвать feed_parse() с разными параметрами over 9000 раз. Писать одно и тоже if (g_test... blah-blah не хочется. И тут на помощь нам приходит всеми любимый язычок C. Когда я вижу формат получившегося объявления указателя на функцию, мне хочется стрелять.

void
mytest_trap_stderr_match(const gchar v1, void (*func)(void*, void*),
void *fa1, void *fa2,
const char *msg)
{
if (g_test_trap_fork(0, G_TEST_TRAP_SILENCE_STDERR)) {
// child
g_assert_cmpstr(v1, ==, (*func)(fa1, fa2));
exit(0); // successful test run
}
g_test_trap_assert_passed();
g_test_trap_assert_stderr(msg);
}

А когда я вижу вызов получившегося helper'а, то плакать:

mytest_trap_stderr_match(NULL, (void* (*)(void*, void*))feed_parse, NULL, (void*)-1, "*libmrss: No correct paramenter in the function*");

Сколько блядь еще сотен лет, мы будет храбро бороться с одним и тем же в этом пaкостном C?

Permalink: https://plus.google.com/115290581164606462017/posts/6bzGfX2Qu4N