lin*_*lof 9 c c++ sockets unit-testing stub
我编写了客户端代码,它应该通过套接字发送一些数据并从远程服务器读回答案.
我想对该代码进行单元测试.函数的签名是这样的:
double call_remote(double[] args, int fd);
Run Code Online (Sandbox Code Playgroud)
其中fd
是远程服务器的套接字的文件描述符.
现在,该call_remote
函数将在发送数据后阻止从服务器读取答案.如何对这样的远程服务器进行存根以对代码进行单元测试?
理想情况下,我想要像:
int main() {
int stub = /* initialize stub */
double expected = 42.0;
assert(expected == call_remote(/* args */, stub);
return 0;
}
double stub_behavior(double[] args) {
return 42.0;
}
Run Code Online (Sandbox Code Playgroud)
我希望stub_behavior
被调用并将42.0
值发送到存根文件描述符.
我能做到的任何简单方法吗?
如果这是 POSIX 系统,您可以使用fork()
and socketpair()
:
#define N_DOUBLES_EXPECTED 10
double stub_behaviour(double []);
int initialize_stub(void)
{
int sock[2];
double data[N_DOUBLES_EXPECTED];
socketpair(AF_UNIX, SOCK_STREAM, 0, sock);
if (fork()) {
/* Parent process */
close(sock[0]);
return sock[1];
}
/* Child process */
close(sock[1]);
/* read N_DOUBLES_EXPECTED in */
read(sock[0], data, sizeof data);
/* execute stub */
data[0] = stub_behaviour(data);
/* write one double back */
write(sock[0], data, sizeof data[0]);
close(sock[0]);
_exit(0);
}
int main()
{
int stub = initialize_stub();
double expected = 42.0;
assert(expected == call_remote(/* args */, stub);
return 0;
}
double stub_behavior(double args[])
{
return 42.0;
}
Run Code Online (Sandbox Code Playgroud)
...当然,您可能想要添加一些错误检查,并更改读取请求的逻辑。
创建的文件描述符socketpair()
是一个普通的套接字,因此像send()
和 这样的套接字调用recv()
将在其上正常工作。
归档时间: |
|
查看次数: |
2443 次 |
最近记录: |