Модульное тестирование кода обработки сокетов UDP - PullRequest
1 голос
/ 22 мая 2010

Существуют ли "хорошие" способы заставить поток, ожидающий вызова recvfrom (), разблокироваться и вернуться с ошибкой?

Мотивация для этого заключается в написании модульных тестов для системы, которая включает в себя модуль, который читает дейтаграммы UDP. Одна из ветвей обрабатывает ошибки в самом вызове recvfrom. Код не обязан различать различные типы ошибок, он просто должен установить флаг.

Я думал о том, чтобы закрыть сокет из другого потока или сделать остановку на нем, чтобы заставить recvfrom возвращаться с ошибкой, но это кажется немного тяжелым. Я видел упоминание в другом месте, что отправка пакета большого размера могла бы сделать это, и поэтому организовал эксперимент, в котором буфер 16 КБ отправлялся в recvfrom с ожиданием всего 4 КБ, но это не привело к ошибке. Recvfrom просто возвращает 4096, чтобы указать, что он получил столько байтов.

Ответы [ 5 ]

2 голосов
/ 23 мая 2010

Если класс, который вы тестируете, хорошо изолирован от остальной части вашего приложения, возможно, вы можете купить #include исходный файл .c из вашего модульного теста. Затем вы можете использовать макрос для #define recvfrom(...) для вашей собственной частной функции только в рамках теста.

Обратите внимание, что это подвергнет вашу частную реализацию модульному тесту; вы все равно должны протестировать публичный интерфейс и сделать вид, что не видите смелости. Это довольно странно, но, по крайней мере, содержит в себе все уродство вашего модульного теста, не нарушая поставляемый код.

1 голос
/ 22 мая 2010

Вы можете создать класс вокруг сетевой библиотеки, а иногда и потерпеть неудачу, основываясь на некоторых критериях.Например, у вас может произойти сбой этого сетевого уровня на основе определенных уровней производительности сети, когда вы эмулируете ошибки на определенных частотах.

В прошлом я задавал аналогичный вопрос , который также может помочь,

0 голосов
/ 22 мая 2010

Я никогда не делал этого в C, но в C # / Java я создаю классы-оболочки для Sockets, TCPClient и т. Д. Каждый класс-оболочка реализует интерфейс, который я создаю, который представляет методы, которые я заинтересован в использовании. Это позволяет мне использовать шаблон внедрения зависимостей для внедрения Mocked или заглушки Sockets. Может быть, этот шаблон может помочь, хотя вам придется переводить на ваш язык.

0 голосов
/ 22 мая 2010

Самым простым, вероятно, будет отправка сигнала, хотя это зависит от того, установлены ли в исходном коде обработчики.

0 голосов
/ 22 мая 2010

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

Вы пытались использовать ioctl(sock, FIONBIO, для переключения сокета в неблокирующий режим?

...