/* * Copyright (c) 2008-2014 MongoDB, Inc. * * 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.mongodb.connection; import com.mongodb.ReadPreference; import com.mongodb.ServerAddress; import com.mongodb.Tag; import com.mongodb.TagSet; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.net.UnknownHostException; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import static com.mongodb.connection.ClusterConnectionMode.MULTIPLE; import static com.mongodb.connection.ClusterType.REPLICA_SET; import static com.mongodb.connection.ClusterType.UNKNOWN; import static com.mongodb.connection.ServerConnectionState.CONNECTED; import static com.mongodb.connection.ServerConnectionState.CONNECTING; import static com.mongodb.connection.ServerDescription.MAX_DRIVER_WIRE_VERSION; import static com.mongodb.connection.ServerDescription.builder; import static com.mongodb.connection.ServerType.REPLICA_SET_OTHER; import static com.mongodb.connection.ServerType.REPLICA_SET_PRIMARY; import static com.mongodb.connection.ServerType.REPLICA_SET_SECONDARY; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class ClusterDescriptionTest { private ServerDescription primary, secondary, otherSecondary, uninitiatedMember, notOkMember; private ClusterDescription cluster; @Before public void setUp() throws IOException { TagSet tags1 = new TagSet(asList(new Tag("foo", "1"), new Tag("bar", "2"), new Tag("baz", "1"))); TagSet tags2 = new TagSet(asList(new Tag("foo", "1"), new Tag("bar", "2"), new Tag("baz", "2"))); TagSet tags3 = new TagSet(asList(new Tag("foo", "1"), new Tag("bar", "3"), new Tag("baz", "3"))); primary = builder() .state(CONNECTED).address(new ServerAddress("localhost", 27017)).ok(true) .type(REPLICA_SET_PRIMARY).tagSet(tags1) .build(); secondary = builder() .state(CONNECTED).address(new ServerAddress("localhost", 27018)).ok(true) .type(REPLICA_SET_SECONDARY).tagSet(tags2) .build(); otherSecondary = builder() .state(CONNECTED).address(new ServerAddress("otherhost", 27019)).ok(true) .type(REPLICA_SET_SECONDARY).tagSet(tags3) .build(); uninitiatedMember = builder() .state(CONNECTED).address(new ServerAddress("localhost", 27020)).ok(true) .type(REPLICA_SET_OTHER) .build(); notOkMember = builder().state(CONNECTED).address(new ServerAddress("localhost", 27021)).ok(false) .build(); List<ServerDescription> nodeList = asList(primary, secondary, otherSecondary, uninitiatedMember, notOkMember); cluster = new ClusterDescription(MULTIPLE, REPLICA_SET, nodeList); } @Test public void testMode() { ClusterDescription description = new ClusterDescription(MULTIPLE, UNKNOWN, Collections.<ServerDescription>emptyList()); assertEquals(MULTIPLE, description.getConnectionMode()); } @Test public void testSettings() { ClusterDescription description = new ClusterDescription(MULTIPLE, UNKNOWN, Collections.<ServerDescription>emptyList()); assertNull(description.getClusterSettings()); assertNull(description.getServerSettings()); ClusterDescription descriptionWithSettings = new ClusterDescription(MULTIPLE, UNKNOWN, Collections.<ServerDescription>emptyList(), ClusterSettings.builder() .hosts(asList(new ServerAddress())) .build(), ServerSettings.builder().build()); assertNotNull(descriptionWithSettings.getClusterSettings()); assertNotNull(descriptionWithSettings.getServerSettings()); } @Test @SuppressWarnings("deprecation") public void testAll() { ClusterDescription description = new ClusterDescription(MULTIPLE, UNKNOWN, Collections.<ServerDescription>emptyList()); assertTrue(description.getAll().isEmpty()); assertEquals(new HashSet<ServerDescription>(asList(primary, secondary, otherSecondary, uninitiatedMember, notOkMember)), cluster.getAll()); } @Test @SuppressWarnings("deprecation") public void testAny() throws UnknownHostException { List<ServerDescription> any = cluster.getAny(); assertEquals(4, any.size()); assertTrue(any.contains(primary)); assertTrue(any.contains(secondary)); assertTrue(any.contains(uninitiatedMember)); assertTrue(any.contains(otherSecondary)); } @Test @SuppressWarnings("deprecation") public void testPrimaryOrSecondary() throws UnknownHostException { assertEquals(asList(primary, secondary, otherSecondary), cluster.getAnyPrimaryOrSecondary()); assertEquals(asList(primary, secondary), cluster.getAnyPrimaryOrSecondary(new TagSet(asList(new Tag("foo", "1"), new Tag("bar", "2"))))); } @Test public void testHasReadableServer() { assertTrue(cluster.hasReadableServer(ReadPreference.primary())); assertFalse(new ClusterDescription(MULTIPLE, REPLICA_SET, asList(secondary, otherSecondary)) .hasReadableServer(ReadPreference.primary())); assertTrue(new ClusterDescription(MULTIPLE, REPLICA_SET, asList(secondary, otherSecondary)) .hasReadableServer(ReadPreference.secondary())); } @Test public void testHasWritableServer() { assertTrue(cluster.hasWritableServer()); assertFalse(new ClusterDescription(MULTIPLE, REPLICA_SET, asList(secondary, otherSecondary)) .hasWritableServer()); } @Test @SuppressWarnings("deprecation") public void getByServerAddress() throws UnknownHostException { assertEquals(primary, cluster.getByServerAddress(primary.getAddress())); assertNull(cluster.getByServerAddress(notOkMember.getAddress())); } @Test @SuppressWarnings("deprecation") public void testSortingOfAll() throws UnknownHostException { ClusterDescription description = new ClusterDescription(MULTIPLE, UNKNOWN, asList( builder() .state(CONNECTING) .address(new ServerAddress("loc:27019")) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27018")) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27017")) .build()) ); Iterator<ServerDescription> iter = description.getAll().iterator(); assertEquals(new ServerAddress("loc:27017"), iter.next().getAddress()); assertEquals(new ServerAddress("loc:27018"), iter.next().getAddress()); assertEquals(new ServerAddress("loc:27019"), iter.next().getAddress()); } @Test public void clusterDescriptionWithAnIncompatibleServerShouldBeIncompatible() throws UnknownHostException { ClusterDescription description = new ClusterDescription(MULTIPLE, UNKNOWN, asList( builder() .state(CONNECTING) .address(new ServerAddress("loc:27019")) .build(), builder() .state(CONNECTED) .ok(true) .address(new ServerAddress("loc:27018")) .minWireVersion(MAX_DRIVER_WIRE_VERSION + 1) .maxWireVersion(MAX_DRIVER_WIRE_VERSION + 1) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27017")) .build()) ); assertFalse(description.isCompatibleWithDriver()); } @Test public void clusterDescriptionWithCompatibleServerShouldBeCompatible() throws UnknownHostException { ClusterDescription description = new ClusterDescription(MULTIPLE, UNKNOWN, asList( builder() .state(CONNECTING) .address(new ServerAddress("loc:27019")) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27018")) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27017")) .build()) ); assertTrue(description.isCompatibleWithDriver()); } @Test public void testObjectOverrides() throws UnknownHostException { ClusterDescription description = new ClusterDescription(MULTIPLE, UNKNOWN, asList( builder() .state(CONNECTING) .address(new ServerAddress("loc:27019")) .lastUpdateTimeNanos(42L) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27018")) .lastUpdateTimeNanos(42L) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27017")) .lastUpdateTimeNanos(42L) .build()) ); ClusterDescription descriptionTwo = new ClusterDescription(MULTIPLE, UNKNOWN, asList( builder() .state(CONNECTING) .address(new ServerAddress("loc:27019")) .lastUpdateTimeNanos(42L) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27018")) .lastUpdateTimeNanos(42L) .build(), builder() .state(CONNECTING) .address(new ServerAddress("loc:27017")) .lastUpdateTimeNanos(42L) .build()) ); assertEquals(description, descriptionTwo); assertEquals(description.hashCode(), descriptionTwo.hashCode()); assertTrue(description.toString().startsWith("ClusterDescription")); } }