симулировать ошибки сокета - PullRequest
6 голосов
/ 14 января 2010

Как смоделировать ошибки сокета? (иногда сервер или клиент отключается из-за некоторой ошибки сокета, и невозможно воспроизвести.) Я искал инструмент для этого, но не могу его найти. Кто-нибудь знает какой-либо инструмент или пример кода, как это сделать? (C # или C / C ++)

Ответы [ 3 ]

6 голосов
/ 14 января 2010

Добавьте слой-оболочку для API, которые вы используете для доступа к сокетам, и сделайте так, чтобы они не выполнялись rand ()% 100> x процентов времени.

1 голос
/ 15 января 2010

Этим летом у меня была точно такая же проблема.

У меня был пользовательский класс Socket, и я хотел проверить, что произойдет, если read или write сгенерируют исключение. Я действительно хотел имитировать фреймворки 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"));
0 голосов
/ 15 января 2010

Мои модульные тесты кода сокета, вероятно, лучше описать как интеграционные тесты, поскольку я запускаю тестируемый код для подключения к «фиктивному» удаленному узлу. Поскольку удаленный одноранговый узел находится под контролем теста (это просто простой клиент или сервер), я могу заставить тест заставить удаленный одноранговый узел разорвать соединение различными способами, а затем убедиться, что тестируемый код реагирует должным образом. Для настройки требуется небольшая работа, но как только вы соберете все компоненты, тестирование в большинстве ситуаций станет тривиальным.

Итак, я предполагаю, что я предлагаю, чтобы вместо того, чтобы пытаться симулировать ситуации, с которыми вы сталкиваетесь, вы должны понимать их, а затем надежно генерировать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...