如何在C中模拟套接字

Def*_*ult 6 c sockets testing networking mocking

我有一个使用套接字的功能,我会嘲笑它,但我找不到怎么做.

有没有办法在C中模拟套接字?

谢谢

dbu*_*ush 7

大多数系统/库函数都是弱符号.这意味着您可以创建自己的实现,以覆盖现有版本.然后,您可以在单元测试时使用这些功能.

假设您要测试以下函数:

src.c:

int get_socket()
{
    int s;

    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s == -1) {
        perror("socket failed");
    } else {
        printf("socket success\n");
        close(s);
    }
    return s;
}
Run Code Online (Sandbox Code Playgroud)

然后,您将在单独的源文件中创建模拟函数(以及任何控制变量):

mock_socket.c:

int sock_rval;

int socket(int domain, int type, int protocol)
{
    printf("calling mock socket\n");
    return sock_rval;
}
Run Code Online (Sandbox Code Playgroud)

然后在另一个文件中进行测试:

test_socket.c:

extern int sock_rval;
int get_socket();

int main()
{
    sock_rval = -1;
    int rval = get_socket();
    assert(rval == -1);
    sock_rval = 3;
    int rval = get_socket();
    assert(rval == 3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后,您将编译这三个模块并将它们链接在一起.然后get_socket将调用socketmock_socket.c中的函数而不是库函数.

这种技术不仅适用于套接字函数,而且适用于一般的系统/库函数.