package org.distributeme.core.routing; import org.distributeme.core.ClientSideCallContext; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicLong; import static org.junit.Assert.assertEquals; /** * TODO comment this class * * @author lrosenberg * @since 30.10.12 15:53 */ public class RoundRobinRouterConcurrentTest { private static Logger log = LoggerFactory.getLogger(RoundRobinRouterConcurrentTest.class); @Test public void testConcurrentAccess(){ int threadCount = 5; final int limit = 1000000; final CountDownLatch ready = new CountDownLatch(threadCount); final CountDownLatch go = new CountDownLatch(1); final CountDownLatch finish = new CountDownLatch(threadCount); final AtomicLong requestCounter0 = new AtomicLong(0); final AtomicLong requestCounter1 = new AtomicLong(0); final AtomicLong requestCounter2 = new AtomicLong(0); final AtomicLong wtf = new AtomicLong(0); final RoundRobinRouter router = new RoundRobinRouter(); router.customize("3"); final ClientSideCallContext context = new ClientSideCallContext("service", "method", new ArrayList<Object>(0)); for (int i=0; i<threadCount; i++){ Thread t = new Thread(new Runnable() { @Override public void run() { ready.countDown(); try{ go.await(); }catch(InterruptedException ignored){} for (int x = 0; x<limit; x++){ String id = router.getServiceIdForCall(context); if (id.equals("service_0")) requestCounter0.incrementAndGet(); else if (id.equals("service_1")) requestCounter1.incrementAndGet(); else if (id.equals("service_2")) requestCounter2.incrementAndGet(); else wtf.incrementAndGet(); }//for finish.countDown(); } }); t.start(); } try{ ready.await(); }catch(InterruptedException ignore){} go.countDown(); try{ finish.await(); }catch(InterruptedException ignore){} log.debug("Finished: "); log.debug("1: "+requestCounter0.get()); log.debug("2: "+requestCounter1.get()); log.debug("3: "+requestCounter2.get()); long total = requestCounter0.get()+requestCounter1.get()+requestCounter2.get() ; log.debug("TOTAL: "+total); log.debug("WTF: "+wtf); log.debug("first % "+(requestCounter0.get()*100/total)); log.debug("second % "+(requestCounter1.get()*100/total)); log.debug("third % "+(requestCounter2.get()*100/total)); assertEquals(0, wtf.get()); } }