模拟套接字错误

时间:2010-01-14 20:31:26

标签: c++ sockets

如何模拟套接字错误? (有时服务器或客户端由于某些套接字错误而断开连接,因此无法重现。) 我正在寻找一个工具来做到这一点,但我找不到一个。 有没有人知道一个工具或有一个如何做到这一点的代码示例? (C#或C / C ++)

3 个答案:

答案 0 :(得分:6)

为您用来访问套接字的API添加一个包装器层,让它们失败rand()%100> x%的时间。

答案 1 :(得分:1)

今年夏天我遇到了同样的问题。

我有一个自定义Socket课程,想要测试readwrite引发异常会发生什么。我真的想模仿Java模拟框架,我这样做了:

我将Socket类继承到FakeSocket类,并创建了一个名为SocketExpectation的东西。然后,在单元测试中,我创建了假套接字,设置了期望值,然后将假套接字传递给我想要测试的代码。

FakeSocket有这些方法(删除不需要的细节):

uint32_t write(buffer, length); // calls check
uint32_t read(buffer, length); // calls check 
bool matches();
void expect(expectation); 
uint32_t check(CallType, buffer, length) const; 

他们都很直接。 check根据当前期望检查参数,如果一切都按计划进行,则继续执行SocketExpectation要求。

SocketExpectation有这个大纲(也被删除):

typedef enum   { write, read } CallType;

SocketExpectation(CallType type);
SocketExpectation &with_arguments(void *a1, uint32_t a2); // expects these args
SocketExpectation &will_return(uint32_t value); 
SocketExpectation &will_throw(const char * e); // test error handling
bool matches(); 

我在需要时添加了更多方法。我会像这样创建它,然后将假套接字传递给相关方法:

fake_socket = FakeSocket();
fake_socket.expect(SocketExpectation(write).with_arguments(....).will_return(...));
fake_socket.expect(SocketExpectation(read).with_arguments(...).will_throw("something"));

答案 2 :(得分:0)

我的套接字代码单元测试可能更好地描述为集成测试,因为我驱动测试代码以连接到“模拟”远程对等体。由于远程对等体在测试的控制之下(它只是一个简单的客户端或服务器),我可以通过测试使远程对等体以各种方式中断连接,然后确保被测代码按预期做出反应。设置需要一些工作,但是一旦你掌握了所有部分,就可以测试大多数情况。

所以,我想,我的建议是,不要试图模拟你遇到的情况,而应该理解它们,然后可靠地生成它们。

相关问题