@Test
  public void testReconnection() throws Exception {
    // start mock fluentd
    int port = MockFluentd.randomPort();
    String host = "localhost";
    final List<Event> elist1 = new ArrayList<Event>();

    FixedThreadManager threadManager = new FixedThreadManager(2);

    MockFluentd fluentd1 =
        new MockFluentd(
            port,
            new MockFluentd.MockProcess() {
              public void process(MessagePack msgpack, Socket socket) throws IOException {
                BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
                try {
                  Unpacker unpacker = msgpack.createUnpacker(in);
                  while (true) {
                    Event e = unpacker.read(Event.class);
                    elist1.add(e);

                    if (elist1.size() >= 1) break;
                  }
                  socket.close();
                } catch (EOFException e) {
                  // ignore
                }
              }
            });
    threadManager.submit(fluentd1);

    // start loggers
    FluentLogger logger = FluentLogger.getLogger("testtag", host, port);
    {
      Map<String, Object> data = new HashMap<String, Object>();
      data.put("k1", "v1");
      data.put("k2", "v2");
      logger.log("test01", data);
    }

    TimeUnit.MILLISECONDS.sleep(500);
    _logger.info("Closing the current fluentd instance");
    fluentd1.closeClientSockets();
    fluentd1.close();

    TimeUnit.MILLISECONDS.sleep(500);

    {
      Map<String, Object> data = new HashMap<String, Object>();
      data.put("k3", "v3");
      data.put("k4", "v4");
      logger.log("test01", data);
    }

    final List<Event> elist2 = new ArrayList<Event>();
    MockFluentd fluentd2 =
        new MockFluentd(
            port,
            new MockFluentd.MockProcess() {
              public void process(MessagePack msgpack, Socket socket) throws IOException {
                BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
                try {
                  Unpacker unpacker = msgpack.createUnpacker(in);
                  while (true) {
                    Event e = unpacker.read(Event.class);
                    elist2.add(e);
                  }
                  // socket.close();
                } catch (EOFException e) {
                  // ignore
                }
              }
            });
    threadManager.submit(fluentd2);

    TimeUnit.MILLISECONDS.sleep(500);

    {
      Map<String, Object> data = new HashMap<String, Object>();
      data.put("k5", "v5");
      data.put("k6", "v6");
      logger.log("test01", data);
    }

    // close loggers
    FluentLogger.closeAll();
    Thread.sleep(2000);

    fluentd2.close();

    // wait for unpacking event data on fluentd
    TimeUnit.MILLISECONDS.sleep(2000);
    threadManager.join();

    // check data
    assertEquals(1, elist1.size());
    assertEquals("testtag.test01", elist1.get(0).tag);

    assertEquals(2, elist2.size());
    assertEquals("testtag.test01", elist2.get(0).tag);
    assertEquals("testtag.test01", elist2.get(1).tag);
  }