/* * Copyright (c) 2013 Mike Heath. All rights reserved. * * Licensed 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 cloudeventbus.client; import org.testng.annotations.Test; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import static org.testng.Assert.*; /** * @author Mike Heath <elcapo@gmail.com> */ public class ServerListTest { @Test public void serverRotation() throws Exception { final SocketAddress address1 = new InetSocketAddress(1); final SocketAddress address2 = new InetSocketAddress(2); final SocketAddress address3 = new InetSocketAddress(3); final ServerList servers = new ServerList(); servers.addServer(address1); servers.addServer(address2); servers.addServer(address3); final Set<ServerList.Server> serverSet = new HashSet<>(); // Each server should be added to the set, don't check for order because server list gets shuffled. assertTrue(serverSet.add(servers.nextServer())); assertTrue(serverSet.add(servers.nextServer())); assertTrue(serverSet.add(servers.nextServer())); // Fourth call should already be in set. assertFalse(serverSet.add(servers.nextServer())); // Remove a server from the rotation. final ServerList.Server serverToRemove1 = removeServerFromRotation(servers); serverSet.clear(); // There should only be two servers in the active rotation. serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); assertEquals(serverSet.size(), 2); // Removed server should not be one of them. assertTrue(serverSet.add(serverToRemove1)); // Activate removed server serverToRemove1.connectionSuccess(); serverSet.clear(); serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); // There should be 3 servers back in the rotation assertEquals(serverSet.size(), 3); // Remove two servers from the rotation removeServerFromRotation(servers); removeServerFromRotation(servers); serverSet.clear(); serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); serverSet.add(servers.nextServer()); // There should only be 1 server in the rotation now assertEquals(serverSet.size(), 1); // Error out last server removeServerFromRotation(servers); // All three servers should be back in the rotation serverSet.clear(); assertTrue(serverSet.add(servers.nextServer())); assertTrue(serverSet.add(servers.nextServer())); assertTrue(serverSet.add(servers.nextServer())); } @Test public void addServers() { final SocketAddress address1 = new InetSocketAddress(1); final SocketAddress address2 = new InetSocketAddress(2); final SocketAddress address3 = new InetSocketAddress(3); final ServerList servers = new ServerList(); servers.addServers(Arrays.asList(address1, address2, address3)); final Set<SocketAddress> addresses = new HashSet<>(); addresses.add(servers.nextServer().getAddress()); addresses.add(servers.nextServer().getAddress()); addresses.add(servers.nextServer().getAddress()); assertEquals(addresses.size(), 3); assertTrue(addresses.contains(address1)); assertTrue(addresses.contains(address2)); assertTrue(addresses.contains(address3)); } @Test(expectedExceptions = IllegalStateException.class) public void emptyServerListShouldError() { new ServerList().nextServer(); } private ServerList.Server removeServerFromRotation(ServerList servers) { final ServerList.Server serverToRemove1 = servers.nextServer(); for (int i = 0; i < ServerList.RECONNECT_LIMIT; i++) { serverToRemove1.connectionFailure(); } clearCurrentIterator(servers); return serverToRemove1; } private void clearCurrentIterator(ServerList servers) { // Rotate through the list to clear out iterator servers.nextServer(); servers.nextServer(); servers.nextServer(); servers.nextServer(); servers.nextServer(); servers.nextServer(); } }