/* * Copyright (c) 2008-2012, Hazel Bilisim Ltd. 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 com.hazelcast.client; import com.hazelcast.core.*; import com.hazelcast.core.LifecycleEvent.LifecycleState; import com.hazelcast.security.Credentials; import com.hazelcast.security.UsernamePasswordCredentials; import org.junit.Test; import org.junit.runner.RunWith; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(com.hazelcast.util.RandomBlockJUnit4ClassRunner.class) public class ConnectionManagerTest { final Credentials credentials = new UsernamePasswordCredentials(); private LifecycleServiceClientImpl createLifecycleServiceClientImpl(HazelcastClient hazelcastClient, final List<LifecycleState> lifecycleEvents) { final LifecycleServiceClientImpl lifecycleService = new LifecycleServiceClientImpl(hazelcastClient); lifecycleService.addLifecycleListener(new LifecycleListener() { public void stateChanged(LifecycleEvent event) { lifecycleEvents.add(event.getState()); } }); return lifecycleService; } @Test public void testGetConnection() throws Exception { HazelcastClient client = mock(HazelcastClient.class); InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5701); final Connection connection = mock(Connection.class); final CountDownLatch latch = new CountDownLatch(2); final List<LifecycleState> lifecycleEvents = new ArrayList<LifecycleState>(); final LifecycleServiceClientImpl lifecycleService = createLifecycleServiceClientImpl(client, lifecycleEvents); ClientConfig clientConfig = new ClientConfig(); clientConfig.setCredentials(credentials).addInetSocketAddress(inetSocketAddress).setConnectionTimeout(60000); ConnectionManager connectionManager = new ConnectionManager(client, clientConfig, lifecycleService) { protected Connection getNextConnection() { latch.countDown(); return connection; } }; ClientBinder binder = mock(ClientBinder.class); connectionManager.setBinder(binder); connectionManager.getConnection(); assertEquals(connection, connectionManager.getConnection()); verify(binder).bind(connection, credentials); assertEquals(connection, connectionManager.getConnection()); assertEquals(1, latch.getCount()); assertArrayEquals(new Object[]{LifecycleState.CLIENT_CONNECTION_OPENING}, lifecycleEvents.toArray()); } @Test public void testGetConnectionWhenThereIsNoConnection() throws Exception { HazelcastClient client = mock(HazelcastClient.class); InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5701); final List<LifecycleState> lifecycleEvents = new ArrayList<LifecycleState>(); final LifecycleServiceClientImpl lifecycleService = createLifecycleServiceClientImpl(client, lifecycleEvents); ClientConfig clientConfig = new ClientConfig(); clientConfig.setCredentials(credentials).addInetSocketAddress(inetSocketAddress).setConnectionTimeout(60000); ConnectionManager connectionManager = new ConnectionManager(client, clientConfig, lifecycleService) { protected Connection getNextConnection() { return null; } }; ClientBinder binder = mock(ClientBinder.class); connectionManager.setBinder(binder); connectionManager.getConnection(); assertEquals(null, connectionManager.getConnection()); assertEquals(null, connectionManager.getConnection()); assertArrayEquals(new Object[0], lifecycleEvents.toArray()); } @Test public void testDestroyConnection() throws Exception { HazelcastClient client = mock(HazelcastClient.class); InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5701); final Connection connection = mock(Connection.class); final CountDownLatch latch = new CountDownLatch(2); final List<LifecycleState> lifecycleEvents = new ArrayList<LifecycleState>(); final LifecycleServiceClientImpl lifecycleService = createLifecycleServiceClientImpl(client, lifecycleEvents); ClientConfig clientConfig = new ClientConfig(); clientConfig.setCredentials(credentials).addInetSocketAddress(inetSocketAddress).setConnectionTimeout(60000); ConnectionManager connectionManager = new ConnectionManager(client, clientConfig, lifecycleService) { protected Connection getNextConnection() { latch.countDown(); return connection; } }; ClientBinder binder = mock(ClientBinder.class); connectionManager.setBinder(binder); assertEquals(connection, connectionManager.getConnection()); connectionManager.destroyConnection(connection); connectionManager.getConnection(); assertTrue(latch.await(1, TimeUnit.SECONDS)); assertArrayEquals(new Object[]{LifecycleState.CLIENT_CONNECTION_OPENING, LifecycleState.CLIENT_CONNECTION_LOST, LifecycleState.CLIENT_CONNECTION_OPENING}, lifecycleEvents.toArray()); } @Test public void testSameMemberAdded() throws Exception { HazelcastClient client = mock(HazelcastClient.class); InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5701); final Connection connection = mock(Connection.class); final CountDownLatch latch = new CountDownLatch(2); final List<LifecycleState> lifecycleEvents = new ArrayList<LifecycleState>(); final LifecycleServiceClientImpl lifecycleService = createLifecycleServiceClientImpl(client, lifecycleEvents); ClientConfig clientConfig = new ClientConfig(); clientConfig.setCredentials(credentials).addInetSocketAddress(inetSocketAddress).setConnectionTimeout(60000); ConnectionManager connectionManager = new ConnectionManager(client, clientConfig, lifecycleService) { protected Connection getNextConnection() { latch.countDown(); return connection; } }; ClientBinder binder = mock(ClientBinder.class); connectionManager.setBinder(binder); Cluster cluster = mock(Cluster.class); Member member = mock(Member.class); when(member.getInetSocketAddress()).thenReturn(inetSocketAddress); MembershipEvent membershipEvent = new MembershipEvent(cluster, member, MembershipEvent.MEMBER_ADDED); connectionManager.memberAdded(membershipEvent); connectionManager.getClusterMembers().contains(inetSocketAddress); assertEquals(1, connectionManager.getClusterMembers().size()); assertArrayEquals(new Object[0], lifecycleEvents.toArray()); } @Test public void testDifferentMemberAdded() throws Exception { HazelcastClient client = mock(HazelcastClient.class); InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5701); final Connection connection = mock(Connection.class); final List<LifecycleState> lifecycleEvents = new ArrayList<LifecycleState>(); final LifecycleServiceClientImpl lifecycleService = createLifecycleServiceClientImpl(client, lifecycleEvents); ClientConfig clientConfig = new ClientConfig(); clientConfig.setCredentials(credentials).addInetSocketAddress(inetSocketAddress).setConnectionTimeout(60000); ConnectionManager connectionManager = new ConnectionManager(client, clientConfig, lifecycleService) { protected Connection getNextConnection() { return connection; } }; ClientBinder binder = mock(ClientBinder.class); connectionManager.setBinder(binder); Cluster cluster = mock(Cluster.class); InetSocketAddress inetSocketAddress2 = new InetSocketAddress("hostname", 5702); Member member = mock(Member.class); when(member.getInetSocketAddress()).thenReturn(inetSocketAddress2); MembershipEvent membershipEvent = new MembershipEvent(cluster, member, MembershipEvent.MEMBER_ADDED); connectionManager.memberAdded(membershipEvent); connectionManager.getClusterMembers().contains(inetSocketAddress2); assertEquals(2, connectionManager.getClusterMembers().size()); assertArrayEquals(new Object[0], lifecycleEvents.toArray()); } @Test public void testMemberRemoved() throws Exception { HazelcastClient client = mock(HazelcastClient.class); InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5701); final Connection connection = mock(Connection.class); final List<LifecycleState> lifecycleEvents = new ArrayList<LifecycleState>(); final LifecycleServiceClientImpl lifecycleService = createLifecycleServiceClientImpl(client, lifecycleEvents); ClientConfig clientConfig = new ClientConfig(); clientConfig.setCredentials(credentials).addInetSocketAddress(inetSocketAddress).setConnectionTimeout(60000); ConnectionManager connectionManager = new ConnectionManager(client, clientConfig, lifecycleService) { protected Connection getNextConnection() { return connection; } }; ClientBinder binder = mock(ClientBinder.class); connectionManager.setBinder(binder); Cluster cluster = mock(Cluster.class); Member member = mock(Member.class); when(member.getInetSocketAddress()).thenReturn(inetSocketAddress); MembershipEvent membershipEvent = new MembershipEvent(cluster, member, MembershipEvent.MEMBER_REMOVED); connectionManager.memberRemoved(membershipEvent); assertEquals(0, connectionManager.getClusterMembers().size()); assertArrayEquals(new Object[0], lifecycleEvents.toArray()); } @Test public void testUpdateMembers() throws Exception { HazelcastClient client = mock(HazelcastClient.class); Cluster cluster = mock(Cluster.class); when(client.getCluster()).thenReturn(cluster); Set<Member> members = new HashSet<Member>(); Member member1 = mock(Member.class); Member member2 = mock(Member.class); Member member3 = mock(Member.class); InetSocketAddress inetSocketAddress1 = new InetSocketAddress("localhost", 9701); InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 9702); InetSocketAddress inetSocketAddress3 = new InetSocketAddress("localhost", 9703); when(member1.getInetSocketAddress()).thenReturn(inetSocketAddress1); when(member2.getInetSocketAddress()).thenReturn(inetSocketAddress2); when(member3.getInetSocketAddress()).thenReturn(inetSocketAddress3); members.add(member1); members.add(member2); members.add(member3); when(cluster.getMembers()).thenReturn(members); InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5701); final Connection connection = mock(Connection.class); final List<LifecycleState> lifecycleEvents = new ArrayList<LifecycleState>(); final LifecycleServiceClientImpl lifecycleService = createLifecycleServiceClientImpl(client, lifecycleEvents); ClientConfig clientConfig = new ClientConfig(); clientConfig.setCredentials(credentials).addInetSocketAddress(inetSocketAddress).setConnectionTimeout(60000); ConnectionManager connectionManager = new ConnectionManager(client, clientConfig, lifecycleService) { protected Connection getNextConnection() { return connection; } }; ClientBinder binder = mock(ClientBinder.class); connectionManager.setBinder(binder); connectionManager.updateMembers(); assertTrue(connectionManager.getClusterMembers().contains(inetSocketAddress1)); assertTrue(connectionManager.getClusterMembers().contains(inetSocketAddress2)); assertTrue(connectionManager.getClusterMembers().contains(inetSocketAddress3)); assertFalse(connectionManager.getClusterMembers().contains(inetSocketAddress)); assertEquals(3, connectionManager.getClusterMembers().size()); assertArrayEquals(new Object[0], lifecycleEvents.toArray()); } @Test public void testShouldExecuteOnDisconnect() throws Exception { HazelcastClient client = mock(HazelcastClient.class); InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5701); final Connection connection = mock(Connection.class); final List<LifecycleState> lifecycleEvents = new ArrayList<LifecycleState>(); final LifecycleServiceClientImpl lifecycleService = createLifecycleServiceClientImpl(client, lifecycleEvents); ClientConfig clientConfig = new ClientConfig(); clientConfig.setCredentials(credentials).addInetSocketAddress(inetSocketAddress).setConnectionTimeout(60000); ConnectionManager connectionManager = new ConnectionManager(client, clientConfig, lifecycleService) { protected Connection getNextConnection() { return connection; } }; assertTrue(connectionManager.shouldExecuteOnDisconnect(connection)); assertFalse(connectionManager.shouldExecuteOnDisconnect(connection)); assertArrayEquals(new Object[0], lifecycleEvents.toArray()); } }