/** * 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.cxf.systest.clustering; import java.util.HashMap; import java.util.Map; import javax.xml.ws.WebServiceException; import org.apache.cxf.clustering.LoadDistributorTargetSelector; import org.apache.cxf.endpoint.ConduitSelector; import org.apache.cxf.frontend.ClientProxy; import org.junit.Test; /** * Tests load distribution within a static cluster. */ public class LoadDistributorTest extends FailoverTest { private static final String FAILOVER_CONFIG = "org/apache/cxf/systest/clustering/load_distributor.xml"; protected String getConfig() { return FAILOVER_CONFIG; } private String responseFrom(String response) { if (response.endsWith(REPLICA_A)) { return REPLICA_A; } else if (response.endsWith(REPLICA_B)) { return REPLICA_B; } else if (response.endsWith(REPLICA_C)) { return REPLICA_C; } else if (response.endsWith(REPLICA_E)) { return REPLICA_E; } else { return response; } } private void incrementResponseCount(Map< String, Integer > responseCounts, String response) { String responder = responseFrom(response); Integer currentCount = responseCounts.get(responder); responseCounts.put(responder, 1 + (currentCount == null ? 0 : currentCount)); } /* * This test can't be left to super because the distributor ignores the default * endpoint, so we need to get REPLICA_A added to the list of endpoints. */ @Test @Override public void testRevertExceptionOnUnsucessfulFailover() throws Exception { targets.add(REPLICA_A); super.testRevertExceptionOnUnsucessfulFailover(); } @Test public void testDistributedSequentialStrategy() throws Exception { startTarget(REPLICA_A); startTarget(REPLICA_B); startTarget(REPLICA_C); startTarget(REPLICA_E); setupGreeter(); // Change the strategy to iterate through the endpoints ConduitSelector conduitSelector = ClientProxy.getClient(greeter).getConduitSelector(); if (conduitSelector instanceof LoadDistributorTargetSelector) { ((LoadDistributorTargetSelector)conduitSelector).setStrategy( new LoadDistributorStaticStrategy()); } else { fail("unexpected conduit selector: " + conduitSelector); } Map< String, Integer > responseCounts = new HashMap<>(); for (int i = 0; i < 12; ++i) { String response = greeter.greetMe("fred"); assertNotNull("expected non-null response", response); incrementResponseCount(responseCounts, response); } assertEquals(3, (long)responseCounts.get(REPLICA_A)); assertEquals(3, (long)responseCounts.get(REPLICA_B)); assertEquals(3, (long)responseCounts.get(REPLICA_C)); assertEquals(3, (long)responseCounts.get(REPLICA_E)); stopTarget(REPLICA_A); stopTarget(REPLICA_B); stopTarget(REPLICA_C); stopTarget(REPLICA_E); } @Test public void testDistributedSequentialStrategyWithFailover() throws Exception { startTarget(REPLICA_A); startTarget(REPLICA_B); startTarget(REPLICA_C); setupGreeter(); stopTarget(REPLICA_B); ConduitSelector conduitSelector = ClientProxy.getClient(greeter).getConduitSelector(); if (conduitSelector instanceof LoadDistributorTargetSelector) { ((LoadDistributorTargetSelector)conduitSelector).setStrategy( new LoadDistributorStaticStrategy()); } else { fail("unexpected conduit selector: " + conduitSelector); } Map< String, Integer > responseCounts = new HashMap<>(); for (int i = 0; i < 12; ++i) { String response = greeter.greetMe("fred"); assertNotNull("expected non-null response", response); incrementResponseCount(responseCounts, response); } assertTrue((long)responseCounts.get(REPLICA_A) > 0); assertTrue((long)responseCounts.get(REPLICA_C) > 0); assertEquals(12, responseCounts.get(REPLICA_A) + responseCounts.get(REPLICA_C)); stopTarget(REPLICA_A); stopTarget(REPLICA_C); } @Test public void testDistributedSequentialStrategyWithoutFailover() throws Exception { startTarget(REPLICA_A); startTarget(REPLICA_B); startTarget(REPLICA_C); startTarget(REPLICA_E); setupGreeter(); stopTarget(REPLICA_B); ConduitSelector conduitSelector = ClientProxy.getClient(greeter).getConduitSelector(); if (conduitSelector instanceof LoadDistributorTargetSelector) { ((LoadDistributorTargetSelector)conduitSelector).setStrategy( new LoadDistributorStaticStrategy()); ((LoadDistributorTargetSelector)conduitSelector).setFailover(false); } else { fail("unexpected conduit selector: " + conduitSelector); } Map< String, Integer > responseCounts = new HashMap<>(); for (int i = 0; i < 12; ++i) { try { String response = greeter.greetMe("fred"); assertNotNull("expected non-null response", response); incrementResponseCount(responseCounts, response); } catch (WebServiceException ex) { incrementResponseCount(responseCounts, ""); } } assertEquals(3, (long)responseCounts.get(REPLICA_A)); assertEquals(null, responseCounts.get(REPLICA_B)); assertEquals(3, (long)responseCounts.get(REPLICA_C)); assertEquals(3, (long)responseCounts.get(REPLICA_E)); assertEquals(3, (long)responseCounts.get("")); stopTarget(REPLICA_A); stopTarget(REPLICA_C); stopTarget(REPLICA_E); } }