测试C 轮询插座功能

Test C++ poll socket function

本文关键字:插座 功能 测试      更新时间:2023-10-16

我正在为一个函数编写一堆测试,我们必须检查插座是否准备好阅读。我们正在使用函数poll 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));

问题是调用民意调查,该轮询总是返回一个值>0。我们正在尝试测试获取0情况,这是超时,而负面的情况是错误。我们试图模拟这一点,但是我们不能因为它不在班级中以继承并创建模拟或使用Gmock框架。仅针对此方法创建类是过多的。我们可以以任何方式模仿这些不同的插座状态吗?

谢谢!

民意调查在libc中标记为符号,因此您可以定义自己的存根民意调查,在动态链接后,您的应用程序将使用固执。

类似的东西:

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