@Test(groups = {"ueber", "performance"})
  public void threadSafeTest() throws Exception {
    final MessageSenderManager msm = new MessageSenderManager();
    msm.setSenderPoolSize(SENDER_COUNT);
    msm.setSenderClass(SENDER_CLASS_NAME);
    msm.init();

    final Map<Runnable, Throwable> threads = new HashMap<Runnable, Throwable>();
    final ExecutorService es = Executors.newFixedThreadPool(THREAD_COUNT);

    for (int i = 0; i < SENDER_TASK_COUNT; i++) {
      final Runnable senderTask = new SenderTask(msm, threads);
      threads.put(senderTask, null);
      es.submit(senderTask);
    }
    es.shutdown();
    es.awaitTermination(
        (long) (SENDER_TASK_COUNT * THREAD_SLEEP_MILLIS * 1.2), TimeUnit.MILLISECONDS);
    assertTrue(es.isTerminated());
    assertTrue(es.isShutdown());
    final Iterator<Runnable> it = threads.keySet().iterator();
    while (it.hasNext()) {
      final Throwable t = threads.get(it.next());
      if (t != null) {
        fail("One of the threads threw following exception: " + t.getMessage());
      }
    }
    msm.close();
  }
    @Override
    public void run() {
      try {
        final MessageSender sender = msm.acquireSender();
        Thread.sleep(rnd.nextInt(THREAD_SLEEP_MILLIS));
        msm.releaseSender(sender);
        counter.decrementAndGet();

      } catch (final Throwable t) {
        threads.put(Thread.currentThread(), t);
      }
    }
  @Test
  public void messageSenderManagerTest() throws Exception {
    final MessageSenderManager msm = new MessageSenderManager();
    msm.setSenderPoolSize(SENDER_COUNT);
    msm.setSenderClass(SENDER_CLASS_NAME);
    msm.init();

    assertTrue(msm.availableSenderCount() == SENDER_COUNT);
    final MessageSender[] senders = new MessageSender[SENDER_COUNT];
    int i = 0;
    final int n = 5;
    for (; i < n; i++) {
      senders[i] = msm.acquireSender();
    }
    assertNotNull(senders[0]);
    assertTrue(msm.availableSenderCount() == (SENDER_COUNT - n));
    for (i = 0; i < n; i++) {
      msm.releaseSender(senders[i]);
    }
    assertTrue(msm.availableSenderCount() == SENDER_COUNT);
    for (i = 0; i < SENDER_COUNT; i++) {
      senders[i] = msm.acquireSender();
    }
    assertTrue(
        senders[0] instanceof DummySender,
        "Sender is an instance of "
            + senders[0].getClass().getName()
            + ". It should be instance of "
            + SENDER_CLASS_NAME);
    assertTrue(msm.availableSenderCount() == 0);
    try {
      msm.acquireSender();
    } catch (final PerfCakeException te) {
      assertTrue(te.getMessage().equals("MessageSender pool is empty."));
    }
    msm.releaseAllSenders();
    assertTrue(msm.availableSenderCount() == SENDER_COUNT);
    msm.close();
  }