如何在C中存根套接字?

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值发送到存根文件描述符.

我能做到的任何简单方法吗?

caf*_*caf 3

如果这是 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()将在其上正常工作。