2017-09-28 2 views
1

J'écris un tas de tests pour une fonction que nous devons vérifier si une socket est prête à lire. Nous utilisons le sondage de fonction http://man7.org/linux/man-pages/man2/poll.2.html.Test de la fonction de socket d'interrogation C++

Le problème auquel nous sommes confrontés est l'émulation de certains états de socket, comme l'attente d'un timeout, une erreur de socket, etc.

Nous avons une fonction très simple définie comme celui-ci

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; 
} 

Nous créons dans notre fonction de test d'une prise comme celle-ci:

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)); 

Le problème appelle sondage qui retourne toujours une valeur> 0 Nous essayons de tester le cas 0, qui est un délai, et le cas négatif, qui est une erreur. Nous avons essayé de nous moquer de cela, mais nous ne pouvons pas, car ce n'est pas dans une classe d'en hériter et de créer un simulacre ou d'utiliser le framework GMock. Créer une classe uniquement pour cette méthode est excessif. Pouvons-nous émuler ces différents états de sockets de quelque façon que ce soit?

Merci!

Répondre

1

sondage est marqué comme faible symbole dans libc afin que vous puissiez définir votre propre sondage stub'ed et après la liaison dynamique votre application utilisera le talon.

Quelque chose comme ceci:

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

Travailler comme un charme. Merci beaucoup! – acostela