Saturday 5 May 2012

Mockowanie funkcji języka C bez użycia C++

Joł!

Jeśli ktoś kiedyś przeczyta mój poprzedni wpis, być może zastanowi się, czy nie można by przenieść mechanizmu nadpisywania funkcji z HippoMocks tak, żeby wykorzystywać go w zwykłym C.

Dobra wiadomość jest taka, że jest to możliwe i że mechanizm nadpisywania funkcji z hippo mocks bardzo łatwo jest wydzielić, natomiast zła wiadomość jest taka, że przeniesienie samego mechanizmu nadpisywania nie daje żadnej specjalnej zalety w porównaniu do np. słabych funkcji gcc.

W każdym razie, dla odważnych - jeśli zajrzycie sobie do źródeł ostatniego wydania HippoMocks (w moim poprzednim wpisie jest adres), na pewno zauważycie klasę Replace. To właśnie ta klasa służy do podmiany funkcji. Zademonstruję teraz na krótkim przykładzie jej działanie:

#include <stdio.h>
#include "hippomocks.h"

void fooA()
{
  printf("fooA\n");
}

void fooB()
{
  printf("fooB\n");
}

int main()
{
  HippoMocks::Replace replaceInThisScope(fooA, fooB);
  fooA(); // => "fooB"
  return 0;
}

Obiekty klasy Replace są dosyć sprytne, gdyż działają na zasadzie RAII (zdobywanie zasobów jest inicjalizacją), czyli w konstruktorze dokonują podmiany, natomiast w destruktorze przywracają stan domyślny. Oznacza to, że podmiana trwa tak długo, jak długo dany obiekt klasy Replace jest w zakresie.

Tak czy inaczej, nic nie stoi na przeszkodzie, żeby wyrwać tę klasę (i kilka jej zależności:  klasę Unprotect, typ e9ptrsize_t oraz funkcję horrible_cast (sic!)) i przerobić ten kodna kod C, korzystając z funkcji i makr (przynajmniej pod systemami linuksowymi powinno to zadziałać, nie próbowałem przerabiać wersji windowsowej, chociaż w nagłówku hippomocks.h również takowa jest.

No comments: