Package org.deftserver.io.callback

Source Code of org.deftserver.io.callback.JMXDebuggableCallbackManagerTest

package org.deftserver.io.callback;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.deftserver.web.AsyncCallback;
import org.junit.Test;


public class JMXDebuggableCallbackManagerTest {
 
  private final JMXDebuggableCallbackManager cm = new JMXDebuggableCallbackManager();
 
  @Test
  public void simpleJMXDeubggableCallbackManagerTest() {
    final CountDownLatch latch = new CountDownLatch(3);
   
    final AsyncCallback cb1 = new AsyncCallback() {
      @Override
      public void onCallback() { latch.countDown(); }
    };
   
    final AsyncCallback cb2 = new AsyncCallback() {
      @Override
      public void onCallback() { latch.countDown(); }
    };
   
    final AsyncCallback cb3 = new AsyncCallback() {
      @Override
      public void onCallback() {
        latch.countDown();
        cm.addCallback(cb1);   // adding a new callback that should be scheduled for execution
                    // during the next iteration (i.e next call to execute)
      }
    };
   
    cm.addCallback(cb1);
    cm.addCallback(cb2);
    cm.addCallback(cb3);
   
    assertEquals(3, cm.getNumberOfCallbacks());
   
    boolean pending = cm.execute();
   
    assertEquals(true, pending);
    assertEquals(1, cm.getNumberOfCallbacks());
    assertEquals(0, latch.getCount());
  }
 
  @Test
  public void concurrencyTest() {
    final int nThreads = 25;
    final int n = 20 * 1000;
    final int[] exceptionThrown = {0};
    Runnable ioLoopTask = new Runnable() {
     
      public void run() {
        try {
          cm.execute();
        } catch (Exception e) {
          exceptionThrown[0] = 1;
        }
      }
     
    };

    ScheduledExecutorService ioLoop = Executors.newSingleThreadScheduledExecutor();
    ioLoop.scheduleAtFixedRate(ioLoopTask, 0, 1, TimeUnit.MILLISECONDS);

    final CountDownLatch latch = new CountDownLatch(n);
    ScheduledExecutorService workerThreads = Executors.newScheduledThreadPool(nThreads);
    Runnable work = new Runnable() {

      public void run() {
        cm.addCallback(AsyncCallback.nopCb);
        latch.countDown();
      }

    };

    for (int i = 0; i < 25; i++) {
      workerThreads.scheduleWithFixedDelay(work, 0, 1, TimeUnit.MILLISECONDS);
    }

    try {
      latch.await(10, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
      assertTrue(false);
    }
    assertEquals(0, latch.getCount());
    assertEquals(0, exceptionThrown[0]);
    ioLoop.shutdownNow();
    workerThreads.shutdownNow();
  }

}
TOP

Related Classes of org.deftserver.io.callback.JMXDebuggableCallbackManagerTest

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.