我正在为一个函数编写一堆测试,我们必须检查套接字是否已准备好读取。我们使用的是民意调查http://man7.org/linux/man-pages/man2/poll.2.html。
我们面临的问题是模拟一些套接字状态,比如等待超时,套接字错误等等。
我们有一个像这样定义的非常简单的函数
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));
问题是调用poll,它总是返回一个值&gt;我们试图测试得到0的情况,这是一个超时,而负的是一个错误。我们试图模仿这个,但我们不能因为它不在类中继承并创建模拟或使用GMock框架。仅为此方法创建类过多。我们能以任何方式模拟这些不同的套接字状态吗?
谢谢!
答案 0 :(得分:1)
poll在libc中标记为 weak 符号,因此您可以定义自己的存根查询,在动态链接后,您的应用程序将使用存根。
这样的事情:
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;
}
}