Do takich rzeczy najlepiej zrobić sobie MOCKi. W C najprościej zrobić to
pisząc sobie osobną libkę np libmockread.so, i w kodzie libki zdefiniować
sobie symbol read() (z takimi samymi argumentami jak read(2)) i potem
wziąć wskaźnik na swojego stuba read() oraz wrapera z glibc read(2).
Np. coś takiego
void *g_real_function = dlsym(RTLD_NEXT, read);
/* mock funkcji read - przykryje ona read(2) z glibc */
ssize_t read(int a0, void *a1, size_t a2) {
if (g_no_error) {
ssize_t (*real)(int, void *, size_t);
real = g_real_function;
return real(a0, a1, a2);
}
errno = EINTR;
return (ssize_t)-1;
}
Potem skompilować libkę
gcc -shared -fPIC -Wl,-soname,readmock.1 -o libreadmock.so readmock.c -lc -ldl
i zrobić preload na końcu
LD_PRELOAD=./libreadmock.so ./unit-tests
W unit testach można sobie potem ustawiać g_no_error na 1 albo 0 w zależności
czy chcemy aby następny read(2) wywalił błąd.
<shameless-plug>
Też kiedyś stałem przed takim problemem aż w końcu napisałem sobie generator
co mi tworzy odpowiedni plik C z potrzebnymi mockami oraz prostym API
do konfigurowania kiedy i jaki błąd ma wystąpić (np EINTR dokładnie po 4
wywołaniu read(2)). A co najważniejsze, przy takim podejściu mozna testować
nie robiąć jakichkolwiek zmian w kodzie produkcyjnym
Program/libkę znajdziesz tutaj:
https://libfo.bofc.pl/index.html
https://git.bofc.pl/libfo/
</shameless-plug>
--
.-----------------.-------------------.---------------------.------------------.
| Michal Lyszczek | Embedded C, Linux | Company Address | .-. open source |
|
+48 727 564 419 | Software Engineer | Leszczynskiego 4/29 | oo| supporter |
|
https://bofc.pl `----.--------------: 50-078 Wroclaw, Pol | /`'\ & |
| GPG FF1EBFE7E3A974B1 | Bits of Code | NIP: 813 349 58 78 |(\_;/) programer |
`----------------------^--------------^---------------------^------------------'