2017-09-28 4 views
1

Ich schreibe eine Reihe von Tests für eine Funktion, die wir prüfen müssen, ob ein Socket zum Lesen bereit ist. Wir verwenden die Funktion poll http://man7.org/linux/man-pages/man2/poll.2.html.Test C++ Poll-Socket-Funktion

Das Problem, dem wir gegenüberstehen, emuliert einige Sockets-Zustände, wie Warten auf ein Timeout, Socket-Fehler und so weiter.

Wir haben eine sehr einfache Funktion wie diese

definiert
bool wait_for_socket_data(int fd, int timeout_millisecs) { 
    if (fd < 0 or timeout_millisecs < 0) 
    return false; 

    struct pollfd fds[1]; 

    fds[0].fd = fd; 
    fds[0].events = POLLIN; 

    const int poll_response = poll(fds, sizeof(fds)/sizeof(struct pollfd), timeout_millisecs); 

    std::cout << poll_response; 

    if (poll_response <= 0) 
    return false; 

//here we will check different values in event inside struct 
    return true; 
} 

Wir in unserem Test Funktion wie diese eine Fassung zu erstellen:

const int fd = socket(AF_INET6, SOCK_STREAM, 0); 

    memset(&addr, 0, sizeof(addr)); 
    addr.sin6_family = AF_INET6; 
    memcpy(&addr.sin6_addr, &in6addr_any, sizeof(in6addr_any)); 
    addr.sin6_port = htons(server_port); 

    const int rc = bind(fd, (struct sockaddr *)&addr, sizeof(addr)); 

Das Problem Umfrage ruft die immer einen Wert zurückgibt> 0 Wir versuchen zu testen, ob wir den 0-Fall erhalten, der ein Timeout ist, und den negativen, der ein Fehler ist. Wir haben versucht, dies zu verspotten, aber wir können es nicht, da es nicht in einer Klasse ist, um von einem GMock-Framework zu übernehmen und es zu erstellen oder ein Mock zu verwenden. Das Erstellen einer Klasse nur für diese Methode ist übermäßig. Können wir diese verschiedenen Socket-Zustände in irgendeiner Weise nachbilden?

Danke!

Antwort

1

Umfrage ist markiert als schwach Symbol in libc, so dass Sie Ihre eigenen Stub'ed Umfrage definieren und nach der dynamischen Verknüpfung Ihrer Anwendung wird der Stub verwenden.

Etwas wie folgt aus:

TestState g_test = TestState::Uninitialized; 
void test2() { 
    .... 
    g_test = TestState::TestTimeout; 
    .... 
    poll(); 
} 
int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout) { 
    switch (g_test) { 
     case TestState::TestTimeout: 
      return 0; 
     break; 
    } 
} 
+1

wie ein Zauber funktioniert. Vielen Dank! – acostela