@Test
  public void testHighLoadEventSendingToServer() throws IOException, InterruptedException {

    StreamDefinition streamDefinition =
        new StreamDefinition()
            .id("analyticsStats")
            .attribute("meta_ipAdd", Attribute.Type.STRING)
            .attribute("meta_index", Attribute.Type.LONG)
            .attribute("meta_timestamp", Attribute.Type.LONG)
            .attribute("meta_nanoTime", Attribute.Type.LONG)
            .attribute("userID", Attribute.Type.STRING)
            .attribute("searchTerms", Attribute.Type.STRING);

    TestStreamCallback streamCallback = new TestStreamCallback();
    TCPEventServer TCPEventServer =
        new TCPEventServer(new TCPEventServerConfig("0.0.0.0", 7612), streamCallback, null);
    TCPEventServer.addStreamDefinition(streamDefinition);
    TCPEventServer.start();
    Thread.sleep(1000);
    for (int i = 0; i < TOTAL_CLIENTS; i++) {
      threadPool.submit(
          new ClientThread(
              streamDefinition, new AnalyticStatDataProvider(), EVENTS_PER_CLIENT, false, 0));
    }
    while (streamCallback.getEventCount() < TOTAL_CLIENTS * EVENTS_PER_CLIENT) {
      Thread.sleep(5000);
    }
    Assert.assertEquals(TOTAL_CLIENTS * EVENTS_PER_CLIENT, streamCallback.getEventCount());
    log.info("Shutting down server...");
    TCPEventServer.shutdown();
  }
  @Test
  public void testEventSendingToServer() throws InterruptedException, IOException {

    StreamDefinition streamDefinition =
        new StreamDefinition()
            .id("TestStream")
            .attribute("att1", Attribute.Type.INT)
            .attribute("att2", Attribute.Type.FLOAT)
            .attribute("att3", Attribute.Type.STRING)
            .attribute("att4", Attribute.Type.INT);

    TestStreamCallback streamCallback = new TestStreamCallback();
    TCPEventServer TCPEventServer =
        new TCPEventServer(new TCPEventServerConfig("0.0.0.0", 7612), streamCallback, null);
    TCPEventServer.addStreamDefinition(streamDefinition);
    TCPEventServer.start();
    Thread.sleep(1000);
    threadPool.submit(new ClientThread(streamDefinition, new SimpleDataProvider(), 100, false, 0));
    Thread.sleep(5000);
    Assert.assertEquals(100, streamCallback.getEventCount());
    log.info("Shutting down server...");
    TCPEventServer.shutdown();
  }
  @Test
  public void testAddressAlreadyExisted() throws Exception {

    StreamDefinition streamDefinition =
        new StreamDefinition()
            .id("TestStream")
            .attribute("att1", Attribute.Type.INT)
            .attribute("att2", Attribute.Type.FLOAT)
            .attribute("att3", Attribute.Type.STRING)
            .attribute("att4", Attribute.Type.INT);

    TestStreamCallback streamCallback = new TestStreamCallback();

    TCPEventServer tcpEventServer =
        new TCPEventServer(new TCPEventServerConfig("0.0.0.0", 7612), streamCallback, null);
    TCPEventServer tcpEventServer1 =
        new TCPEventServer(new TCPEventServerConfig("0.0.0.0", 7612), streamCallback, null);
    boolean errorOccurred = false;
    try {
      tcpEventServer.addStreamDefinition(streamDefinition);
      tcpEventServer.start();
      Thread.sleep(1000);

      try {
        tcpEventServer1.addStreamDefinition(streamDefinition);
        tcpEventServer1.start();
        Thread.sleep(1000);
      } catch (BindException e) {
        log.error("Address already exist", e);
        errorOccurred = true;
      } catch (IOException e) {
        throw new Exception(e);
      }
    } finally {
      log.info("Shutting down server 1...");
      tcpEventServer.shutdown();
      log.info("Shutting down server 2...");
      tcpEventServer1.shutdown();
      Assert.assertEquals(true, errorOccurred);
    }
  }