C++ 测试C++;轮询套接字函数

C++ 测试C++;轮询套接字函数,c++,unit-testing,sockets,C++,Unit Testing,Sockets,我正在为一个函数编写一系列测试,我们必须检查套接字是否准备好读取。我们正在使用函数poll 我们面临的问题是模拟一些套接字状态,如等待超时、套接字错误等 我们有一个非常简单的函数,定义如下 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

我正在为一个函数编写一系列测试,我们必须检查套接字是否准备好读取。我们正在使用函数poll

我们面临的问题是模拟一些套接字状态,如等待超时、套接字错误等

我们有一个非常简单的函数,定义如下

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;
}
问题是调用poll,它总是返回大于0的值。我们正在尝试测试获取0的情况,这是一个超时,而获取负的情况是一个错误。我们已经尝试过模拟它,但是我们不能,因为它不在一个类中,无法继承并创建一个模拟或使用GMock框架。仅为此方法创建类是过分的。我们能以任何方式模拟这些不同的套接字状态吗

谢谢

轮询在libc中被标记为弱符号,因此您可以定义自己的存根轮询,在动态链接之后,您的应用程序将使用存根

大概是这样的:

  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));
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;
    }
}

工作得很有魅力。非常感谢你!