我在爲函數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()中的阻止函數是。
有沒有辦法使用信號處理來打破阻塞呼叫? 或者還有其他解決方法嗎?
我不能/不應該改變我測試的結構,所以我不能使用非阻塞套接字。我可能會看看選擇 – pAndrei 2012-07-25 08:45:05
仍然沒有找到解決呼叫阻塞的解決方案 – pAndrei 2012-08-03 09:04:07
@pAndrei:您可以做的最好的方法是使用警報(2)設置超時併爲SIGALRM安裝信號處理程序。這將(當計時器觸發時)調用信號處理程序,中斷阻塞系統調用。這將允許您的測試代碼再次獲得控制權,這是一種策略,可能僅用於使您的單元測試在超過時間限制時失敗(儘管SquareRootOfTwentyThree表示這太大而無法稱爲單元測試)。 – Giel 2012-08-03 20:38:07