2012-07-25 65 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等)粘在一起。