моделируйте ошибки сокета

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

6
задан ra170 14 January 2010 в 20:31
поделиться

3 ответа

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

6
ответ дан 17 December 2019 в 00:09
поделиться

У меня была точно та же проблема этим летом.

я имел пользовательское Сокет класс и хотел протестировать то, что произойдет, если будет читать или , запись выдала исключение. Я действительно хотел подражать рамкам насмешки Java, и я сделал это как это:

я наследовался Сокет класс в класс 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; 

Они являются все довольно прямыми. проверка проверки аргументы против текущего ожидания и если все согласно плану, продолжают выступать требование 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"));
1
ответ дан 17 December 2019 в 00:09
поделиться

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

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

0
ответ дан 17 December 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: