@Test(timeout = 90000)
  public void testServerSuccess() throws Exception {
    m_server =
        new SimpleServer() {

          @Override
          public void onInit() {
            setBanner("* OK THIS IS A BANNER FOR IMAP");
            addResponseHandler(contains("LOGOUT"), shutdownServer("* BYE\r\nONMSCAPSD OK"));
          }
        };

    m_server.init();
    m_server.startServer();

    Thread.sleep(100); // make sure the server is really started

    try {
      m_detector.setPort(m_server.getLocalPort());
      m_detector.setIdleTime(1000);

      // assertTrue(m_detector.isServiceDetected(m_server.getInetAddress()));
      DetectFuture future = m_detector.isServiceDetected(m_server.getInetAddress());
      assertNotNull(future);

      future.awaitForUninterruptibly();

      assertTrue(future.isServiceDetected());
    } finally {
      m_server.stopServer();
    }
  }
  @Test(timeout = 90000)
  public void testDetectorFailUnexpectedLogoutResponse() throws Exception {
    m_server =
        new SimpleServer() {

          @Override
          public void onInit() {
            setBanner("* NOT OK THIS IS A BANNER FOR IMAP");
            addResponseHandler(contains("LOGOUT"), singleLineRequest("* NOT OK"));
          }
        };

    m_server.init();
    m_server.startServer();

    try {
      m_detector.setPort(m_server.getLocalPort());

      // assertFalse(m_detector.isServiceDetected(m_server.getInetAddress()));

      DetectFuture future = m_detector.isServiceDetected(m_server.getInetAddress());
      assertNotNull(future);

      future.awaitForUninterruptibly();

      assertFalse(future.isServiceDetected());
    } finally {
      m_server.stopServer();
    }
  }
  /**
   * @param serviceDetected
   * @return
   * @throws InterruptedException
   */
  private boolean doCheck(DetectFuture serviceDetected) throws InterruptedException {
    DetectFuture future = serviceDetected;
    future.awaitFor();

    return future.isServiceDetected();
  }