2012-07-25 62 views
0

我在爲函數pkg_getclient()寫一個測試單元。 它基本上是一個爲客戶端不定時監聽的函數。
這裏是實現:http://slexy.org/view/s21RBuOUOu(貼有保留的問題文本大小合理)C中用於服務器監聽功能的測試單元。避免監聽阻止呼叫

這裏是一個客戶端的一個例子 - 服務器測試:http://slexy.org/view/s2fS5hBkgI

這是我的單元測試的當前狀態:

int test_pkg_getclient (char* portname) { 
int netfd; 
struct pkg_conn *result; 
netfd = pkg_permserver(portname, "tcp", 0, 0); 

/* validate_port(port); */ 
printf("TESTING PKG_GETCLIENT...\n"); 

result = pkg_getclient(netfd,callbacks, NULL, 0); 

printf("TESTING VALID FILE DESCRIPTOR\n"); 
if (result == PKC_ERROR) {printf ("\t[ FAILED ]\n"); 
} else { printf ("\t[ PASSED ]\n"); 
} 
return 0; 
} 

int main (int argc, char* argv[]) { 
test_pkg_getclient(argv[1]); 
printf("%d",argc); 
return 0; 
} 

我需要打破pkg_getclient()阻塞調用。它不僅需要可移植到Windows,而且還需要基於Unix的系統。 我無法修改pkg_getclient()函數。 getclient()中的阻止函數是

有沒有辦法使用信號處理來打破阻塞呼叫? 或者還有其他解決方法嗎?

回答

0

首先,您可能要呼叫fork(2)之前呼叫pkg_getclient(假設pkg_getclient阻止)。其次,我不會使用阻塞調用,而是使用非阻塞套接字或select(2)。至於可移植性,fork()和pthread在大多數unices中都是可移植的。至於Windows,有pthreads的實現,但只能模擬fork()(例如Cygwin實現這一點)。

+0

我不能/不應該改變我測試的結構,所以我不能使用非阻塞套接字。我可能會看看選擇 – pAndrei 2012-07-25 08:45:05

+0

仍然沒有找到解決呼叫阻塞的解決方案 – pAndrei 2012-08-03 09:04:07

+0

@pAndrei:您可以做的最好的方法是使用警報(2)設置超時併爲SIGALRM安裝信號處理程序。這將(當計時器觸發時)調用信號處理程序,中斷阻塞系統調用。這將允許您的測試代碼再次獲得控制權,這是一種策略,可能僅用於使您的單元測試在超過時間限制時失敗(儘管SquareRootOfTwentyThree表示這太大而無法稱爲單元測試)。 – Giel 2012-08-03 20:38:07

1

老實說,我不認爲這真的符合單元測試,因爲你也涉及整個網絡棧。

我會建議一個不同的測試策略:更改您的代碼,以便它允許Dependency Injection。也就是說,應該可以在運行時將參考傳遞到要使用的網絡堆棧。對於生產代碼,當然可以使用真實的代碼,但爲了進行單元測試,您可以使用模擬堆棧來實現所需的最小行爲,以涵蓋要測試的內容。

如果你想擁有你的測試也伸展到真正的網絡堆棧(在這種情況下,我說,我們應對集成而非單元測試),我個人覺得它簡單創建的小程序,並讓他們通過更高級別的腳本(bash,python等)粘在一起。