/* * 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 java.util.Map; import java.util.HashMap; import java.util.List; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicInteger; import org.apache.synapse.endpoints.Endpoint; import org.apache.synapse.endpoints.AddressEndpoint; import org.apache.synapse.endpoints.EndpointDefinition; import org.apache.synapse.endpoints.LoadbalanceEndpoint; import org.apache.synapse.mediators.MediatorProperty; import org.apache.synapse.MessageContext; import org.apache.synapse.config.SynapseConfiguration; import org.apache.synapse.core.axis2.Axis2MessageContext; import org.apache.synapse.core.axis2.Axis2SynapseEnvironment; import org.apache.synapse.core.SynapseEnvironment; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.engine.AxisConfiguration; public class WeightedRRLCAlgorithmTest extends TestCase { private String[] hosts = {"localhost:9000", "localhost:9001", "localhost:9002", "localhost:9003", "localhost:9004"}; private String[] weights = {"6", "5", "3", "2", "1"}; private AtomicInteger[] connections = { new AtomicInteger(18), new AtomicInteger(5), new AtomicInteger(4), new AtomicInteger(2), new AtomicInteger(1)}; public void testInitialization () { LoadbalanceEndpoint endpoint = createLoadBalanceEndpoint(); LoadbalanceAlgorithm algo = endpoint.getAlgorithm(); assert algo instanceof WeightedRRLCAlgorithm; WeightedRRLCAlgorithm algorithm = (WeightedRRLCAlgorithm) algo; assertEquals(6 + 5 + 3 + 2 + 1, algorithm.getTotalWeight()); assertEquals(0, algorithm.getTotalConnections()); assertEquals(0, algorithm.getEndpointCursor()); assertEquals(2, algorithm.getRoundsPerRecalculation()); } public void testNextEndpoint() { MessageContext messageContext = createMessageContext(); LoadbalanceEndpoint endpoint = createLoadBalanceEndpoint(); String []firstTwoRoundsExpected = { "6", "6", "6", "6", "6", "6", "5", "5", "5", "5", "5", "3", "3", "3", "2", "2", "1", "6", "6", "6", "6", "6", "6", "5", "5", "5", "5", "5", "3", "3", "3", "2", "2", "1"}; LoadbalanceAlgorithm algo = endpoint.getAlgorithm(); String []firstTwoRoundsResults = new String[34]; for (int i = 0; i < 34; i++) { Endpoint epr = algo.getNextEndpoint(messageContext, null); if (epr instanceof AddressEndpoint) { firstTwoRoundsResults[i] = ((AddressEndpoint)epr).getProperty( WeightedRRLCAlgorithm.LB_WEIGHTED_RRLC_WEIGHT).getValue(); } } for (int i = 0; i < 34; i++) { assertEquals(firstTwoRoundsExpected[i], firstTwoRoundsResults[i]); } String []secondTwoRoundsExpected = { "6", "6", "6", "6", "5", "5", "5", "5", "5", "5", "5", "3", "3", "3", "3", "2", "2", "2", "2", "1", "1", "6", "6", "6", "6", "5", "5", "5", "5", "5", "5", "5", "3", "3"}; String []secondTwoRoundsResults = new String[34]; for (int i = 0; i < 34; i++) { Endpoint epr = algo.getNextEndpoint(messageContext, null); if (epr instanceof AddressEndpoint) { secondTwoRoundsResults[i] = ((AddressEndpoint)epr).getProperty( WeightedRRLCAlgorithm.LB_WEIGHTED_RRLC_WEIGHT).getValue(); } } for (int i = 0; i < 34; i++) { assertEquals(secondTwoRoundsExpected[i], secondTwoRoundsResults[i]); } } private LoadbalanceEndpoint createLoadBalanceEndpoint() { LoadbalanceEndpoint loadbalanceEndpoint = new LoadbalanceEndpoint(); List<Endpoint> endpoints = createEndpoints(); WeightedRRLCAlgorithm algorithm = new WeightedRRLCAlgorithm(); MediatorProperty property = new MediatorProperty(); property.setName(WeightedRRLCAlgorithm.LB_WEIGHTED_RRLC_ROUNDS_PER_RECAL); property.setValue("2"); loadbalanceEndpoint.addProperty(property); algorithm.setEndpoints(endpoints); algorithm.setLoadBalanceEndpoint(loadbalanceEndpoint); loadbalanceEndpoint.setChildren(endpoints); loadbalanceEndpoint.setAlgorithm(algorithm); SynapseEnvironment env = new Axis2SynapseEnvironment( new ConfigurationContext(new AxisConfiguration()), new SynapseConfiguration()); loadbalanceEndpoint.init(env); return loadbalanceEndpoint; } private MessageContext createMessageContext() { org.apache.axis2.context.MessageContext axisMessageContext = new org.apache.axis2.context.MessageContext(); MessageContext synapseMessageContext = new Axis2MessageContext(axisMessageContext, null, null); axisMessageContext.setProperty("OPEN_CONNNECTIONS_MAP", createMap()); return synapseMessageContext; } private Map<String, AtomicInteger> createMap() { Map<String, AtomicInteger> connectionsMap = new HashMap<String, AtomicInteger>(); for (int i = 0; i < hosts.length; i++) { connectionsMap.put(hosts[i], connections[i]); } return connectionsMap; } private List<Endpoint> createEndpoints() { List<Endpoint> endpoints = new ArrayList<Endpoint>(); for (int i = 0; i < hosts.length; i++) { AddressEndpoint addressEndpoint = new AddressEndpoint(); EndpointDefinition definition = new EndpointDefinition(); definition.setAddress("http://" + hosts[i] + "/"); addressEndpoint.setDefinition(definition); MediatorProperty property = new MediatorProperty(); property.setName(WeightedRRLCAlgorithm.LB_WEIGHTED_RRLC_WEIGHT); property.setValue(weights[i]); addressEndpoint.addProperty(property); endpoints.add(addressEndpoint); } return endpoints; } }