Package com.dianping.cat.message.io

Source Code of com.dianping.cat.message.io.TcpSocketSenderTest$MockDecoder

package com.dianping.cat.message.io;

import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.frame.FrameDecoder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.unidal.lookup.ComponentTestCase;

import com.dianping.cat.message.spi.internal.DefaultMessageTree;

@RunWith(JUnit4.class)
public class TcpSocketSenderTest extends ComponentTestCase {
  @Test
  public void test() throws Exception {
    TcpSocketSender sender = (TcpSocketSender) lookup(MessageSender.class, TcpSocketSender.ID);
    List<InetSocketAddress> addresses = getServerAddresses();
    StringBuilder result = new StringBuilder();
    ServerBootstrap bootstrap = createServerBootstrap(result);
    List<Channel> channels = new ArrayList<Channel>();

    for (InetSocketAddress address : addresses) {
      Channel channel = bootstrap.bind(address);

      channels.add(channel);
    }

    sender.setServerAddresses(addresses);
    sender.initialize();

    sender.send(new DefaultMessageTree());

    Thread.sleep(10 * 1000);
  }

  private ServerBootstrap createServerBootstrap(final StringBuilder result) {
    ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),
          Executors.newCachedThreadPool());
    ServerBootstrap bootstrap = new ServerBootstrap(factory);

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
      @Override
      public ChannelPipeline getPipeline() {
        return Channels.pipeline(new MockDecoder(result));
      }
    });

    bootstrap.setOption("child.tcpNoDelay", true);
    bootstrap.setOption("child.keepAlive", true);

    return bootstrap;
  }

  private List<InetSocketAddress> getServerAddresses() {
    List<InetSocketAddress> list = new ArrayList<InetSocketAddress>();

    for (int i = 0; i < 10; i++) {
      list.add(new InetSocketAddress("localhost", 3000 + i));
    }

    return list;
  }

  static class MockDecoder extends FrameDecoder {
    private StringBuilder m_result;

    public MockDecoder(StringBuilder result) {
      m_result = result;
    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) {
      if (buffer.readableBytes() < 4) {
        return null;
      }

      buffer.markReaderIndex();

      int length = buffer.readInt();

      if (buffer.readableBytes() < length) {
        buffer.resetReaderIndex();
        return null;
      }

      m_result.append('.');
      return buffer.readBytes(length);
    }
  }

}
TOP

Related Classes of com.dianping.cat.message.io.TcpSocketSenderTest$MockDecoder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.