Open zrlw opened 3 years ago
testServerHeartbeat方法挂起不动弹这个现象可以手工重现: 修改HeartbeatHandlerTest测试类,把testServerHeartbeat方法复制一下搞两个测试方法,代码完全相同(改不改端口号,结果都是如此),将其中一个方法名改掉,比如改成testServerHeartbeatClone,然后把这个测试类的其他测试方法注释掉,然后执行HeartbeatHandlerTest测试,这两个方法,谁在后面运行谁就会hang住,跟踪了一下发现是处理connected事件时,并没有去调用HeartbeatHandler的connected方法,channel对象的ReadTimestamp和WriteTimestamp属性一直都是null,CloseTimerTask每次执行doTask任务时lastRead和lastWrite方法都是返回null,导致无法判断空闲时间是否超时。
更新:
如果执行两遍testServerHeartbeat, 需要在@AfterEach
调用FakeChannelHandlers.resetChannelHandlers()复位ChannelHandlers类的INSTANCE。testServerHeartbeat方法中间调用了FakeChannelHandlers.setTestingChannelHandlers()把ChannelHandlers类的INSTANCE给改掉之后没有复原,之后构造NettyServer对象时都会受影响。
有些单元测试github构建失败时只在log4j日志输出了错误信息,console上没有任何提示,无法定位问题,比如HeartbeatHandlerTest的testServerHeartbeat方法,这些问题本地单元测试多次也没能重现: