c++ - 测试 C++ 轮询套接字功能

标签 c++ unit-testing sockets

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

问题是调用 poll,它总是返回一个 > 0 的值。我们正在尝试测试获得 0 的情况,这是超时,而负的情况是错误。我们试图模拟它,但我们不能,因为它不在继承和创建模拟或使用 GMock 框架的类中。只为这个方法创建一个类是多余的。我们能否以任何方式模拟这些不同的套接字状态?

谢谢!

最佳答案

poll 在 libc 中被标记为 weak 符号,因此您可以定义自己的 stub 投票,并且在动态链接之后您的应用程序将使用 stub 。

像这样:

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

关于c++ - 测试 C++ 轮询套接字功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46467583/

相关文章:

c++ - 使用递归计算数组中元素出现的次数

java - Java Junit/Mockito 中的单元测试 void 方法

c - TFTP 客户端(基于 ENET)无法连接到远程 TFTP 服务器

c++ - C++ 中的单元测试客户端/服务器应用程序

java - java中通过socket发送序列化文件

ruby - 使用 Ruby 创建二进制数据?

c++ - 在 C++ 中捕获段错误

c++ - 系统调用在 rsync 完成之前返回

c++ - 使用 Boost.Spirit 解析标记化的自由形式语法

c# - 使用 Moq 模拟 Fluent 界面