首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
拉钩
V2EX  ›  Java

如何编写 Netty 的集成测试?

  •  
  •   zjp · 6 天前 · 563 次点击

    Netty 里 UniqueIpFilter 的代码

    public class UniqueIpFilter extends AbstractRemoteAddressFilter<InetSocketAddress> {
    
        private final Set<InetAddress> connected = new ConcurrentSet<InetAddress>();
    
        @Override
        protected boolean accept(ChannelHandlerContext ctx, InetSocketAddress remoteAddress) throws Exception {
            final InetAddress remoteIp = remoteAddress.getAddress();
            if (connected.contains(remoteIp)) {
                return false;
            } else {
                connected.add(remoteIp);
                ctx.channel().closeFuture().addListener(new ChannelFutureListener() {
                    @Override
                    public void operationComplete(ChannelFuture future) throws Exception {
                        connected.remove(remoteIp);
                    }
                });
                return true;
            }
        }
    }
    

    逻辑很简单,就是每次连接建立时判断 set 里是否已经有新连接的远程地址。但多线程下同一个 IP 的两个请求在执行connected.contains(remoteIp)时可能出现同时为false的情况。似乎是个典型的 Test and Set 问题...

    但我现在问题是不知道怎么写测试,搞了大半天了,官方也没有对这个类的测试...不管从客户端还是服务端入手,都找不到合适的时间点验证存在两个相同 IP 的连接

    7 回复  |  直到 2018-12-07 14:25:36 +08:00
        1
    zjp   6 天前
        2
    mm163   6 天前
    ConcurrentSet 虽然时线程安全的,但是
    if (connected.contains(remoteIp)) {
    return false;
    } else {
    connected.add(remoteIp);
    这几行没有原子化,有可能造成同一个 IP 的两个请求同时 false。
        3
    BBCCBB   6 天前   ♥ 1
    netty 一般是用 EmbeddedChannel 做测试, 你这个不知道用哪个
        4
    zjp   6 天前
    @BBCCBB EmbeddedChannel 只表征一条通道,这里需要一个服务器下的两个连接

    @mm163 是的,但是测试代码 我就只会不断同时建立两个连接,过一段时间看两个是不是都没有被 UniqueIpFilter 掐掉连接...这样测试可能永远结束不了......
        5
    q263397478   6 天前
    不是,accept 处理是单线程的啊,不用担心线程安全问题
        6
    zjp   6 天前
    @BBCCBB 重新看了下 EmbeddedChannel,确实可以用


    @q263397478 UniqueIpFilter 是在 Channel 中共享的
        7
    BBCCBB   6 天前
    我猜开多线程用多个 EmbeddedChannel 就可以, 只是这个 uniqueIpFilter 得用同一个
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3641 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 16ms · UTC 08:40 · PVG 16:40 · LAX 00:40 · JFK 03:40
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1