2016-11-04 2 views
-2

У меня есть класс, который использует asio::generic::stream_protocol::socket для подключения к домену (asio::local::stream_protocol::endpoint) и сокетам TCP (asio::ip::tcp::endpoint).Выполнение модульных тестов, по-видимому, блокирует io_service неопределенно

Для проверки этого класса у меня есть серия модульных тестов в одном файле с использованием рамки Catch.

У меня внезапно возникла проблема: при выполнении тестов они застрянут. Проходя -DASIO_ENABLE_HANDLER_TRACKING к флагам компилятора, я вижу, что он застревает на async_connect. Этого не происходит, если я прокомментирую все тесты, кроме одного, независимо от того, что. Если у меня есть два теста, независимо от того, подключены ли они к сокетам домена или tcp, или по одному из них, я получаю блокировку.

Выход изменений ASIO, но это пример:

$ tests/unit_tests 
@asio|1478248907.3|0*1|[email protected]_wait 
@asio|1478248907.301276|0*2|[email protected]_resolve 
@asio|1478248907.301322|>1|ec=system:0 
@asio|1478248907.301328|<1| 
@asio|1478248907.302052|>2|ec=system:0,... 
@asio|1478248907.302186|2*3|[email protected]_connect 
@asio|1478248907.302302|<2| 
@asio|1478248907.302468|>3|ec=system:0 
@asio|1478248907.302481|<3| 
@asio|1478248907.302551|0*4|[email protected]_send 
@asio|1478248907.302611|>4|ec=system:0,bytes_transferred=23 
@asio|1478248907.302617|<4| 
@asio|1478248907.302621|0*5|[email protected]_receive(null_buffers) 
@asio|1478248907.356478|>5|ec=system:0,bytes_transferred=0 
@asio|1478248907.356547|<5| 
@asio|1478248907.356622|0|[email protected] 
@asio|1478248907.372967|0|[email protected] 
@asio|1478248907.372981|0|[email protected] 
@asio|1478248907.373509|0*6|[email protected]_wait 
@asio|1478248907.373526|0*7|[email protected]_resolve 
@asio|1478248907.374910|>7|ec=system:0,... 
@asio|1478248907.374946|7*8|[email protected]_connect 
@asio|1478248907.375014|<7| 
@asio|1478248907.375127|>8|ec=system:0 
@asio|1478248907.375135|<8| 

Мой вопрос: в чем проблема с запуском модульных тестов, что открывать и закрывать соединение? Если это не-нет, как вы пишете модульные тесты, в которых используется async_open?

+2

Можете ли вы предоставить [mcve]? Выход отслеживания обработчика показывает две операции 'async_connect' как завершающиеся с успехом. Если прикрепить отладчик, какова трассировка для заблокированного потока? Является ли 'async_open' пользовательской операцией более высокого уровня? –

ответ

0

Проблема, по-видимому, связана с тем, как я повторял вывод tcp :: resolver.

0

io_service имеет run, run_one, poll и poll_one методы, которые на самом деле выполнить обработчики завершения. У Boost asio могут быть свои собственные потоки, но состояние потоков этих файлов может быть неверным для вызова ваших обработчиков. Следовательно, даже в модульном тесте вы должны выяснить, какой поток будет вызывать обработчики завершения.

Во-вторых, run заканчивается, а затем возвращается. Из вашего описания (первый тест преуспевает, второй сбой), похоже, вы звонили run, но не reset и повторно runio_service.

+0

Тест не подводит, он просто замерзает. И могут ли разные экземпляры одних и тех же потоков потоков? Существует ли единое государство для всех видов использования Asio? – ruipacheco

+0

@ruipacheco: могут ли ваши объекты обмениваться потоками, мы не можем сказать. Boost asio имеет свое состояние в 'io_service', и снова вы решаете, используете ли вы один объект или используете несколько экземпляров. 'io_service.run()' можно вызывать из нескольких потоков. – MSalters

Смежные вопросы