运行单元测试似乎无限期地阻止了io_service

时间:2016-11-04 08:43:23

标签: c++ sockets c++11 tcp boost-asio

我有一个使用asio::generic::stream_protocol::socket连接到域(asio::local::stream_protocol::endpoint)和TCP套接字(asio::ip::tcp::endpoint)的类。

要测试该类,我使用Catch框架在单个文件中进行了一系列单元测试。

我突然遇到一个问题:运行测试时会遇到问题。将-DASIO_ENABLE_HANDLER_TRACKING传递给编译器标志我可以看到它卡在async_connect上。如果我评论所有测试而不是一个测试,则不会发生这种情况。如果我有两个测试,无论是连接到域还是tcp套接字,或者每个都连接一个,我都会遇到阻塞。

Asio的输出发生了变化,但这只是一个例子:

$ tests/unit_tests
@asio|1478248907.301230|0*1|deadline_timer@0x7f96f1c07ad8.async_wait
@asio|1478248907.301276|0*2|resolver@0x7f96f1c07ac0.async_resolve
@asio|1478248907.301322|>1|ec=system:0
@asio|1478248907.301328|<1|
@asio|1478248907.302052|>2|ec=system:0,...
@asio|1478248907.302186|2*3|socket@0x7f96f1c07a20.async_connect
@asio|1478248907.302302|<2|
@asio|1478248907.302468|>3|ec=system:0
@asio|1478248907.302481|<3|
@asio|1478248907.302551|0*4|socket@0x7f96f1c07a20.async_send
@asio|1478248907.302611|>4|ec=system:0,bytes_transferred=23
@asio|1478248907.302617|<4|
@asio|1478248907.302621|0*5|socket@0x7f96f1c07a20.async_receive(null_buffers)
@asio|1478248907.356478|>5|ec=system:0,bytes_transferred=0
@asio|1478248907.356547|<5|
@asio|1478248907.356622|0|socket@0x7f96f1c07a20.close
@asio|1478248907.372967|0|deadline_timer@0x7f96f1c07ad8.cancel
@asio|1478248907.372981|0|resolver@0x7f96f1c07ac0.cancel
@asio|1478248907.373509|0*6|deadline_timer@0x7f96f1d00468.async_wait
@asio|1478248907.373526|0*7|resolver@0x7f96f1d00450.async_resolve
@asio|1478248907.374910|>7|ec=system:0,...
@asio|1478248907.374946|7*8|socket@0x7f96f1d003b0.async_connect
@asio|1478248907.375014|<7|
@asio|1478248907.375127|>8|ec=system:0
@asio|1478248907.375135|<8|

我的问题是:运行打开和关闭连接的单元测试有什么问题?如果这是禁止,你如何编写使用async_open的单元测试?

2 个答案:

答案 0 :(得分:0)

io_service包含实际执行完成处理程序的runrun_onepollpoll_one方法。 Boost asio可能有自己的线程,但调用处理程序的线程状态可能不正确。因此,即使在单元测试中,您也必须确定哪个线程将调用完成处理程序。

其次,run运行完成,然后返回。根据您的描述(第一次测试成功,第二次测试失败),听起来好像您曾致电run但没有reset而是重新run io_service

答案 1 :(得分:0)

这个问题似乎与我迭代tcp :: resolver输出的方式有关。