Author: hiranya
Date: Tue Aug  6 02:50:16 2013
New Revision: 1510848

URL: http://svn.apache.org/r1510848
Log:
Adding a test case to round robin load balancer

Added:
    
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/endpoints/algorithms/RoundRobinAlgorithmTest.java

Added: 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/endpoints/algorithms/RoundRobinAlgorithmTest.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/endpoints/algorithms/RoundRobinAlgorithmTest.java?rev=1510848&view=auto
==============================================================================
--- 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/endpoints/algorithms/RoundRobinAlgorithmTest.java
 (added)
+++ 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/endpoints/algorithms/RoundRobinAlgorithmTest.java
 Tue Aug  6 02:50:16 2013
@@ -0,0 +1,164 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.synapse.endpoints.algorithms;
+
+import junit.framework.TestCase;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.engine.AxisConfiguration;
+import org.apache.synapse.MessageContext;
+import org.apache.synapse.config.SynapseConfiguration;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.apache.synapse.core.axis2.Axis2SynapseEnvironment;
+import org.apache.synapse.endpoints.AddressEndpoint;
+import org.apache.synapse.endpoints.Endpoint;
+import org.apache.synapse.mediators.TestUtils;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class RoundRobinAlgorithmTest extends TestCase {
+
+    private List<Endpoint> endpoints;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        endpoints = new ArrayList<Endpoint>();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        for (Endpoint endpoint : endpoints) {
+            endpoint.destroy();
+        }
+    }
+
+    public void testRoundRobin() throws Exception {
+        AxisConfiguration axisConfig = new AxisConfiguration();
+        ConfigurationContext configContext = new 
ConfigurationContext(axisConfig);
+        SynapseConfiguration synapseConfig = new SynapseConfiguration();
+        SynapseEnvironment env = new Axis2SynapseEnvironment(configContext, 
synapseConfig);
+
+        endpoints.add(getEndpoint("ep1", env));
+        endpoints.add(getEndpoint("ep2", env));
+        endpoints.add(getEndpoint("ep3", env));
+        RoundRobin roundRobin = new RoundRobin(endpoints);
+
+        AlgorithmContext context = new AlgorithmContext(true, configContext, 
"ep");
+
+        MessageContext messageContext = 
TestUtils.createLightweightSynapseMessageContext("<test/>");
+        Endpoint endpoint = roundRobin.getNextEndpoint(messageContext, 
context);
+        assertEquals("ep1", endpoint.getName());
+
+        messageContext = 
TestUtils.createLightweightSynapseMessageContext("<test/>");
+        endpoint = roundRobin.getNextEndpoint(messageContext, context);
+        assertEquals("ep2", endpoint.getName());
+
+        messageContext = 
TestUtils.createLightweightSynapseMessageContext("<test/>");
+        endpoint = roundRobin.getNextEndpoint(messageContext, context);
+        assertEquals("ep3", endpoint.getName());
+
+        messageContext = 
TestUtils.createLightweightSynapseMessageContext("<test/>");
+        endpoint = roundRobin.getNextEndpoint(messageContext, context);
+        assertEquals("ep1", endpoint.getName());
+
+        messageContext = 
TestUtils.createLightweightSynapseMessageContext("<test/>");
+        endpoint = roundRobin.getNextEndpoint(messageContext, context);
+        assertEquals("ep2", endpoint.getName());
+
+        messageContext = 
TestUtils.createLightweightSynapseMessageContext("<test/>");
+        endpoint = roundRobin.getNextEndpoint(messageContext, context);
+        assertEquals("ep3", endpoint.getName());
+    }
+
+    public void testRoundRobinConcurrency() throws Exception {
+        // This test case sets up the load balancer with 10 endpoints and 
sends request using
+        // 10 concurrent threads. Each thread should get a separate endpoint.
+        int concurrency = 10;
+
+        AxisConfiguration axisConfig = new AxisConfiguration();
+        ConfigurationContext configContext = new 
ConfigurationContext(axisConfig);
+        SynapseConfiguration synapseConfig = new SynapseConfiguration();
+        SynapseEnvironment env = new Axis2SynapseEnvironment(configContext, 
synapseConfig);
+
+        for (int i = 0; i < concurrency; i++) {
+            endpoints.add(getEndpoint("ep" + i, env));
+        }
+        RoundRobin roundRobin = new RoundRobin(endpoints);
+        AlgorithmContext context = new AlgorithmContext(true, configContext, 
"ep");
+
+        ExecutorService exec = Executors.newFixedThreadPool(concurrency);
+        try {
+            TestWorker[] workers = new TestWorker[concurrency];
+            Future[]  futures = new Future[10];
+            for (int i = 0; i < concurrency; i++) {
+                workers[i] = new TestWorker(context, roundRobin);
+                futures[i] = exec.submit(workers[i]);
+            }
+            Set<Integer> results = new HashSet<Integer>();
+            for (int i = 0; i < concurrency; i++) {
+                futures[i].get();
+                if (workers[i].endpointIndex < 0) {
+                    fail("At least one test worker finished abnormally");
+                }
+                results.add(workers[i].endpointIndex);
+            }
+
+            assertEquals(concurrency, results.size());
+        } finally {
+            exec.shutdownNow();
+        }
+    }
+
+    private Endpoint getEndpoint(String name, SynapseEnvironment env) {
+        AddressEndpoint endpoint = new AddressEndpoint();
+        endpoint.setEnableMBeanStats(false);
+        endpoint.setName(name);
+        endpoint.init(env);
+        return endpoint;
+    }
+
+    private static class TestWorker implements Runnable {
+
+        AlgorithmContext context;
+        RoundRobin roundRobin;
+        int endpointIndex = -1;
+
+        private TestWorker(AlgorithmContext context, RoundRobin roundRobin) {
+            this.context = context;
+            this.roundRobin = roundRobin;
+        }
+
+        public void run() {
+            try {
+                MessageContext messageContext = 
TestUtils.createLightweightSynapseMessageContext("<test/>");
+                Endpoint ep = roundRobin.getNextEndpoint(messageContext, 
context);
+                String epName = ep.getName();
+                endpointIndex = Integer.parseInt(epName.substring(2));
+            } catch (Exception ignored) {
+            }
+        }
+    }
+}


Reply via email to