2017-09-28 77 views
1

我正在爲一個函數寫一堆測試,我們必須檢查套接字是否準備好讀取。我們正在使用功能輪詢http://man7.org/linux/man-pages/man2/poll.2.html測試C++輪詢套接字函數

我們面臨的問題是模擬一些套接字狀態,如等待超時,套接字錯誤等。

我們有這樣

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

我們在我們的測試函數來創建這樣一個插座定義一個很簡單的功能:

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

問題呼籲調查總是返回一個值> 0我們試圖測試得到0的情況,這是一個超時,而負的情況是一個錯誤。我們試圖嘲笑這一點,但我們不能這樣做,因爲它不在類內部繼承並創建模擬或使用GMock框架。僅爲此方法創建類是過度的。我們可以以任何方式模擬這些不同的套接字狀態嗎?

謝謝!

回答

1

民意調查被標記爲在libc中的符號,所以你可以定義你自己的存根輪詢和動態鏈接後,你的應用程序將使用存根。

事情是這樣的:

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

工作就像一個魅力。非常感謝你! – acostela