运行单元测试似乎会无限期地阻塞io_service
Running unit tests seems to block io_service indefinitely
我有一个类,使用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的单元测试呢?
io_service
具有实际执行完成处理程序的run
, run_one
, poll
和poll_one
方法。Boost asio可能有自己的线程,但这些线程的状态可能不正确,无法调用处理程序。因此,即使在单元测试中,您也必须确定哪个线程将调用完成处理程序。
其次,run
运行完成,然后返回。根据您的描述(第一次测试成功,第二次失败),听起来您确实调用了run
,但没有调用reset
和re- run
io_service
。
问题似乎与我在tcp::解析器的输出中迭代的方式有关。
相关文章:
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- Agora.io 虚幻引擎插件构建错误
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 通过 Tor 服务C++ socket.io 客户端
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何读取 google::p rotobuf::io::CodedOutputStream::WriteVarint32
- Conan.io 在编译步骤中或已经在签出时
- C++中真正的异步文件 IO
- 在C++中返回 IO 对象的目的是什么?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- C++网络 IO、文件处理和网络故障
- Xcode OSX上的C++构建失败,出现多个错误文件IO..不可用:在macOS 10.15中引入
- Android Studio-在现有的旧项目中启用本机C++调试(card.io Android Source)
- 如何检测函数是否执行IO操作
- 如何键入用于const对象的自定义io操纵器
- libevent是否允许在不同的线程中运行timer/io的回调
- IO服务重新启动后,Boost最后期限计时器持续触发