package org.distributeme.core.routing; import org.distributeme.core.ClientSideCallContext; import org.junit.Test; 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 16:53 */ public class FairRoundRobinRouterConcurrentTest { @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 FairRoundRobinRouter router = new FairRoundRobinRouter(); 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){} //System.out.println(requestCounter0); System.out.println(requestCounter1); System.out.println(requestCounter2); assertEquals(0, wtf.get()); } }