blob: c658d2a802dd13f92ad56298043043ab62a0147b [file] [log] [blame]
/*
* 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.geode.internal.cache.wan.misc;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.GemFireConfigException;
import org.apache.geode.IncompatibleSystemException;
import org.apache.geode.internal.AvailablePortHelper;
import org.apache.geode.internal.OSProcess;
import org.apache.geode.internal.cache.wan.WANTestBase;
import org.apache.geode.test.dunit.Assert;
import org.apache.geode.test.dunit.AsyncInvocation;
import org.apache.geode.test.dunit.Host;
import org.apache.geode.test.dunit.IgnoredException;
import org.apache.geode.test.dunit.LogWriterUtils;
import org.apache.geode.test.junit.categories.WanTest;
@Category({WanTest.class})
public class WanAutoDiscoveryDUnitTest extends WANTestBase {
public WanAutoDiscoveryDUnitTest() {
super();
}
@Override
protected void postSetUpWANTestBase() throws Exception {
final Host host = Host.getHost(0);
}
/**
* Test to validate that sender can not be started without locator started. else
* GemFireConfigException will be thrown.
*/
@Test
public void test_GatewaySender_Started_Before_Locator() {
try {
int port = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
vm0.invoke(() -> WANTestBase.createCache(port));
vm0.invoke(
() -> WANTestBase.createSender("ln", 2, false, 100, 10, false, false, null, false));
fail("Expected GemFireConfigException but not thrown");
} catch (Exception e) {
if (!(e.getCause() instanceof GemFireConfigException)) {
Assert.fail("Expected GemFireConfigException but received :", e);
}
}
}
/**
* Test to validate that all locators in one DS should have same name. Though this test passes, it
* causes other below tests to fail. In this test, VM1 is throwing IncompatibleSystemException
* after startInitLocator. I think, after throwing this exception, locator is not stopped properly
* and hence other tests are failing.
*
*/
@Ignore
@Test
public void test_AllLocatorsInDSShouldHaveDistributedSystemId() throws Exception {
try {
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstLocatorWithDSId(1));
Integer lnLocPort2 =
(Integer) vm1.invoke(() -> WANTestBase.createSecondLocator(2, lnLocPort1));
fail("Expected IncompatibleSystemException but not thrown");
} catch (Exception e) {
if (!(e.getCause() instanceof IncompatibleSystemException)) {
Assert.fail("Expected IncompatibleSystemException but received :", e);
}
}
}
/**
* Test to validate that multiple locators added on LN site and multiple locators on Ny site
* recognizes each other
*
*/
@Test
public void test_NY_Recognises_ALL_LN_Locators() throws Exception {
Set<InetSocketAddress> locatorPorts = new HashSet<>();
Map<Integer, Set<InetSocketAddress>> dsVsPort = new HashMap<>();
dsVsPort.put(1, locatorPorts);
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstLocatorWithDSId(1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort1));
Integer lnLocPort2 = (Integer) vm1.invoke(() -> WANTestBase.createSecondLocator(1, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort2));
locatorPorts = new HashSet<>();
dsVsPort.put(2, locatorPorts);
Integer nyLocPort1 =
(Integer) vm2.invoke(() -> WANTestBase.createFirstRemoteLocator(2, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", nyLocPort1));
Integer nyLocPort2 = (Integer) vm3
.invoke(() -> WANTestBase.createSecondRemoteLocator(2, nyLocPort1, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", nyLocPort2));
final int siteSizeToCheck = dsVsPort.size();
vm0.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm2.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm3.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
}
/**
* Test to validate that multiple locators added two sets receive eachothers hostname for client
* setting even when the locator is started through the API.
*/
@Test
public void locatorsReceiveHostnameForClientsFromRemoteSite() throws Exception {
Set<InetSocketAddress> locatorPorts = new HashSet<>();
Map<Integer, Set<InetSocketAddress>> dsVsPort = new HashMap<>();
dsVsPort.put(1, locatorPorts);
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstLocatorWithDSId(1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort1));
Integer lnLocPort2 = (Integer) vm1.invoke(() -> WANTestBase.createSecondLocator(1, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort2));
locatorPorts = new HashSet<>();
dsVsPort.put(2, locatorPorts);
Integer nyLocPort1 =
(Integer) vm2.invoke(() -> WANTestBase.createFirstRemoteLocator(2, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", nyLocPort1));
Integer nyLocPort2 = (Integer) vm3.invoke(
() -> WANTestBase.createSecondRemoteLocatorWithAPI(2, nyLocPort1, lnLocPort1, "localhost"));
locatorPorts.add(new InetSocketAddress("localhost", nyLocPort2));
final int siteSizeToCheck = dsVsPort.size();
vm0.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm2.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm3.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
}
/**
* Test to validate that TK site's locator is recognized by LN and NY. Test to validate that HK
* site's locator is recognized by LN , NY, TK.
*/
@Test
public void test_NY_Recognises_TK_AND_HK_Through_LN_Locator() {
Map<Integer, Set<InetSocketAddress>> dsVsPort = new HashMap<>();
Set<InetSocketAddress> locatorPorts = new HashSet<>();
dsVsPort.put(1, locatorPorts);
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstLocatorWithDSId(1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort1));
locatorPorts = new HashSet<>();
dsVsPort.put(2, locatorPorts);
Integer nyLocPort1 =
(Integer) vm1.invoke(() -> WANTestBase.createFirstRemoteLocator(2, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", nyLocPort1));
locatorPorts = new HashSet<>();
dsVsPort.put(3, locatorPorts);
Integer tkLocPort =
(Integer) vm2.invoke(() -> WANTestBase.createFirstRemoteLocator(3, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", tkLocPort));
locatorPorts = new HashSet<>();
dsVsPort.put(4, locatorPorts);
Integer hkLocPort =
(Integer) vm3.invoke(() -> WANTestBase.createFirstRemoteLocator(4, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", hkLocPort));
final int siteSizeToCheck = dsVsPort.size();
vm0.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm2.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm3.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
}
@Test
public void test_TK_Recognises_LN_AND_NY() {
Map<Integer, Set<InetSocketAddress>> dsVsPort = new HashMap<>();
Set<InetSocketAddress> locatorPorts = new HashSet<>();
dsVsPort.put(1, locatorPorts);
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstLocatorWithDSId(1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort1));
locatorPorts = new HashSet<>();
dsVsPort.put(2, locatorPorts);
Integer nyLocPort1 =
(Integer) vm1.invoke(() -> WANTestBase.createFirstRemoteLocator(2, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", nyLocPort1));
locatorPorts = new HashSet<>();
dsVsPort.put(3, locatorPorts);
Integer tkLocPort =
(Integer) vm2.invoke(() -> WANTestBase.createFirstRemoteLocator(3, nyLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", tkLocPort));
final int siteSizeToCheck = dsVsPort.size();
vm0.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm2.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
}
@Category({WanTest.class})
@Test
public void test_NY_Recognises_TK_AND_HK_Simultaneously() {
Map<Integer, Set<InetSocketAddress>> dsVsPort = new HashMap<>();
Set<InetSocketAddress> locatorPortsln = new HashSet<>();
dsVsPort.put(1, locatorPortsln);
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstLocatorWithDSId(1));
locatorPortsln.add(new InetSocketAddress("localhost", lnLocPort1));
Set<InetSocketAddress> locatorPortsny = new HashSet<>();
dsVsPort.put(2, locatorPortsny);
Integer nyLocPort1 =
(Integer) vm1.invoke(() -> WANTestBase.createFirstRemoteLocator(2, lnLocPort1));
locatorPortsny.add(new InetSocketAddress("localhost", nyLocPort1));
int AsyncInvocationArrSize = 4;
AsyncInvocation[] async = new AsyncInvocation[AsyncInvocationArrSize];
Set<InetSocketAddress> locatorPortstk = new HashSet<>();
dsVsPort.put(3, locatorPortstk);
async[0] = vm2.invokeAsync(() -> WANTestBase.createFirstRemoteLocator(3, lnLocPort1));
Set<InetSocketAddress> locatorPortshk = new HashSet<>();
dsVsPort.put(4, locatorPortshk);
async[1] = vm3.invokeAsync(() -> WANTestBase.createFirstRemoteLocator(4, nyLocPort1));
ArrayList<Integer> locatorPortsln2 = new ArrayList<Integer>();
async[2] = vm4.invokeAsync(() -> WANTestBase.createSecondLocator(1, lnLocPort1));
ArrayList<Integer> locatorPortsny2 = new ArrayList<Integer>();
async[3] = vm5.invokeAsync(() -> WANTestBase.createSecondLocator(2, nyLocPort1));
try {
async[0].join();
async[1].join();
async[2].join();
async[3].join();
} catch (InterruptedException e) {
e.printStackTrace();
fail();
}
locatorPortstk.add(new InetSocketAddress("localhost", (Integer) async[0].getReturnValue()));
locatorPortshk.add(new InetSocketAddress("localhost", (Integer) async[1].getReturnValue()));
locatorPortsln.add(new InetSocketAddress("localhost", (Integer) async[2].getReturnValue()));
locatorPortsny.add(new InetSocketAddress("localhost", (Integer) async[3].getReturnValue()));
final int siteSizeToCheck = dsVsPort.size();
vm0.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm2.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm3.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
}
@Test
public void test_LN_Sender_recognises_ALL_NY_Locators() {
IgnoredException ie = IgnoredException
.addIgnoredException("could not get remote locator information for remote site");
try {
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstLocatorWithDSId(1));
Integer lnLocPort2 =
(Integer) vm5.invoke(() -> WANTestBase.createSecondLocator(1, lnLocPort1));
vm2.invoke(() -> WANTestBase.createCache(lnLocPort1, lnLocPort2));
vm2.invoke(() -> WANTestBase.createSender("ln", 2, false, 100, 10, false, false, null, true));
Integer nyLocPort1 =
(Integer) vm1.invoke(() -> WANTestBase.createFirstRemoteLocator(2, lnLocPort1));
vm2.invoke(() -> WANTestBase.startSender("ln"));
// Since to fix Bug#46289, we have moved call to initProxy in getConnection which will be
// called
// only when batch is getting dispatched.
// So for locator discovery callback to work, its now expected that atleast try to send a
// batch
// so that proxy will be initialized
vm2.invoke(
() -> WANTestBase.createReplicatedRegion(getTestMethodName() + "_RR", "ln", isOffHeap()));
vm2.invoke(() -> WANTestBase.doPuts(getTestMethodName() + "_RR", 10));
Integer nyLocPort2 = (Integer) vm3
.invoke(() -> WANTestBase.createSecondRemoteLocator(2, nyLocPort1, lnLocPort1));
InetSocketAddress locatorToWaitFor = new InetSocketAddress("localhost", nyLocPort2);
vm2.invoke(() -> WANTestBase.checkLocatorsinSender("ln", locatorToWaitFor));
Integer nyLocPort3 = (Integer) vm4
.invoke(() -> WANTestBase.createSecondRemoteLocator(2, nyLocPort1, lnLocPort1));
InetSocketAddress locatorToWaitFor2 = new InetSocketAddress("localhost", nyLocPort3);
vm2.invoke(() -> WANTestBase.checkLocatorsinSender("ln", locatorToWaitFor2));
} finally {
ie.remove();
}
}
@Test
public void test_RingTopology() {
int[] ports = AvailablePortHelper.getRandomAvailableTCPPortsForDUnitSite(4);
final Set<String> site1LocatorsPort = new HashSet<String>();
site1LocatorsPort.add("localhost[" + ports[0] + "]");
final Set<String> site2LocatorsPort = new HashSet<String>();
site2LocatorsPort.add("localhost[" + ports[1] + "]");
final Set<String> site3LocatorsPort = new HashSet<String>();
site3LocatorsPort.add("localhost[" + ports[2] + "]");
final Set<String> site4LocatorsPort = new HashSet<String>();
site4LocatorsPort.add("localhost[" + ports[3] + "]");
Map<Integer, Set<String>> dsVsPort = new HashMap<Integer, Set<String>>();
dsVsPort.put(1, site1LocatorsPort);
dsVsPort.put(2, site2LocatorsPort);
dsVsPort.put(3, site3LocatorsPort);
dsVsPort.put(4, site4LocatorsPort);
int AsyncInvocationArrSize = 9;
AsyncInvocation[] async = new AsyncInvocation[AsyncInvocationArrSize];
async[0] = vm0.invokeAsync(
() -> WANTestBase.createLocator(1, ports[0], site1LocatorsPort, site2LocatorsPort));
async[1] = vm1.invokeAsync(
() -> WANTestBase.createLocator(2, ports[1], site2LocatorsPort, site3LocatorsPort));
async[2] = vm2.invokeAsync(
() -> WANTestBase.createLocator(3, ports[2], site3LocatorsPort, site4LocatorsPort));
async[3] = vm3.invokeAsync(
() -> WANTestBase.createLocator(4, ports[3], site4LocatorsPort, site1LocatorsPort));
// pause(5000);
try {
async[0].join();
async[1].join();
async[2].join();
async[3].join();
} catch (InterruptedException e) {
e.printStackTrace();
fail("Could not join async operations");
}
vm0.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm2.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm3.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
}
@Ignore
@Test
public void test_3Sites3Locators() {
final Set<String> site1LocatorsPort = new HashSet<String>();
int site1Port1 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site1LocatorsPort.add("localhost[" + site1Port1 + "]");
int site1Port2 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site1LocatorsPort.add("localhost[" + site1Port2 + "]");
int site1Port3 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site1LocatorsPort.add("localhost[" + site1Port3 + "]");
final Set<String> site2LocatorsPort = new HashSet<String>();
int site2Port1 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site2LocatorsPort.add("localhost[" + site2Port1 + "]");
int site2Port2 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site2LocatorsPort.add("localhost[" + site2Port2 + "]");
int site2Port3 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site2LocatorsPort.add("localhost[" + site2Port3 + "]");
final Set<String> site3LocatorsPort = new HashSet<String>();
int site3Port1 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site3LocatorsPort.add("localhost[" + site3Port1 + "]");
final int site3Port2 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site3LocatorsPort.add("localhost[" + site3Port2 + "]");
int site3Port3 = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
site3LocatorsPort.add("localhost[" + site3Port3 + "]");
Map<Integer, Set<String>> dsVsPort = new HashMap<Integer, Set<String>>();
dsVsPort.put(1, site1LocatorsPort);
dsVsPort.put(2, site2LocatorsPort);
dsVsPort.put(3, site3LocatorsPort);
int AsyncInvocationArrSize = 9;
AsyncInvocation[] async = new AsyncInvocation[AsyncInvocationArrSize];
async[0] = vm0.invokeAsync(
() -> WANTestBase.createLocator(1, site1Port1, site1LocatorsPort, site2LocatorsPort));
async[8] = vm0.invokeAsync(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
async[1] = vm1.invokeAsync(
() -> WANTestBase.createLocator(1, site1Port2, site1LocatorsPort, site2LocatorsPort));
async[2] = vm2.invokeAsync(
() -> WANTestBase.createLocator(1, site1Port3, site1LocatorsPort, site2LocatorsPort));
async[3] = vm3.invokeAsync(
() -> WANTestBase.createLocator(2, site2Port1, site2LocatorsPort, site3LocatorsPort));
async[4] = vm4.invokeAsync(
() -> WANTestBase.createLocator(2, site2Port2, site2LocatorsPort, site3LocatorsPort));
async[5] = vm5.invokeAsync(
() -> WANTestBase.createLocator(2, site2Port3, site2LocatorsPort, site3LocatorsPort));
async[6] = vm6.invokeAsync(
() -> WANTestBase.createLocator(3, site3Port1, site3LocatorsPort, site1LocatorsPort));
async[7] = vm7.invokeAsync(
() -> WANTestBase.createLocator(3, site3Port2, site3LocatorsPort, site1LocatorsPort));
WANTestBase.createLocator(3, site3Port3, site3LocatorsPort, site1LocatorsPort);
long startTime = System.currentTimeMillis();
try {
async[0].join();
async[1].join();
async[2].join();
async[3].join();
async[4].join();
async[5].join();
async[6].join();
async[7].join();
async[8].join();
} catch (InterruptedException e) {
e.printStackTrace();
fail("Could not join async operations");
}
Long endTime = null;
try {
endTime = (Long) async[8].getResult();
} catch (Throwable e) {
e.printStackTrace();
Assert.fail("Could not get end time", e);
}
LogWriterUtils.getLogWriter().info(
"Time taken for all 9 locators discovery in 3 sites: " + (endTime.longValue() - startTime));
vm0.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm2.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm3.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm4.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm5.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm6.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
vm7.invoke(() -> WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort));
WANTestBase.checkAllSiteMetaDataFor3Sites(dsVsPort);
}
@Test
public void test_LN_Peer_Locators_Exchange_Information() {
Set<InetSocketAddress> locatorPorts = new HashSet<>();
Map<Integer, Set<InetSocketAddress>> dsVsPort = new HashMap<>();
dsVsPort.put(1, locatorPorts);
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstPeerLocator(1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort1));
Integer lnLocPort2 =
(Integer) vm1.invoke(() -> WANTestBase.createSecondPeerLocator(1, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort2));
final int siteSizeToCheck = dsVsPort.size();
vm0.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
}
@Test
public void test_LN_NY_TK_5_PeerLocators_1_ServerLocator() {
Map<Integer, Set<InetSocketAddress>> dsVsPort = new HashMap<>();
Set<InetSocketAddress> locatorPorts = new HashSet<>();
dsVsPort.put(1, locatorPorts);
Integer lnLocPort1 = (Integer) vm0.invoke(() -> WANTestBase.createFirstPeerLocator(1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort1));
Integer lnLocPort2 =
(Integer) vm1.invoke(() -> WANTestBase.createSecondPeerLocator(1, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", lnLocPort2));
locatorPorts = new HashSet<>();
dsVsPort.put(2, locatorPorts);
Integer nyLocPort1 =
(Integer) vm2.invoke(() -> WANTestBase.createFirstRemotePeerLocator(2, lnLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", nyLocPort1));
Integer nyLocPort2 = (Integer) vm3
.invoke(() -> WANTestBase.createSecondRemotePeerLocator(2, nyLocPort1, lnLocPort2));
locatorPorts.add(new InetSocketAddress("localhost", nyLocPort2));
locatorPorts = new HashSet<>();
dsVsPort.put(3, locatorPorts);
Integer tkLocPort1 =
(Integer) vm4.invoke(() -> WANTestBase.createFirstRemotePeerLocator(3, nyLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", tkLocPort1));
Integer tkLocPort2 = (Integer) vm5
.invoke(() -> WANTestBase.createSecondRemotePeerLocator(3, tkLocPort1, nyLocPort1));
locatorPorts.add(new InetSocketAddress("localhost", tkLocPort2));
Integer tkLocPort3 = (Integer) vm6
.invoke(() -> WANTestBase.createSecondRemoteLocator(3, tkLocPort1, nyLocPort2));
locatorPorts.add(new InetSocketAddress("localhost", tkLocPort3));
// pause(5000);
final int siteSizeToCheck = dsVsPort.size();
vm0.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm1.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm2.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm3.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm4.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm5.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
vm6.invoke(() -> WANTestBase.checkAllSiteMetaData(dsVsPort, siteSizeToCheck));
}
@Test
public void testNoThreadLeftBehind() {
// Get active thread count before test
int activeThreadCountBefore = Thread.activeCount();
// Start / stop locator
int port = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
WANTestBase.createFirstRemoteLocator(2, port);
disconnectFromDS();
// Validate active thread count after test
// Wait up to 60 seconds for all threads started during the test
// (including the 'WAN Locator Discovery Thread') to stop
// Note: Awaitility is not being used since it adds threads
for (int i = 0; i < 60; i++) {
if (Thread.activeCount() > activeThreadCountBefore) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
fail("Caught the following exception waiting for threads to stop: " + e);
}
} else {
break;
}
}
// Fail if the active thread count after the test is greater than the active thread count before
// the test
if (Thread.activeCount() > activeThreadCountBefore) {
OSProcess.printStacks(0);
StringBuilder builder = new StringBuilder();
builder.append("Expected ").append(activeThreadCountBefore).append(" threads but found ")
.append(Thread.activeCount()).append(". Check log file for a thread dump.");
fail(builder.toString());
}
}
@Test
public void testNoRemoteLocators() {
IgnoredException ie = IgnoredException
.addIgnoredException("could not get remote locator information for remote site");
try {
testRemoteLocators(null, false, 0);
} finally {
ie.remove();
}
}
@Test
public void testValidHostRemoteLocators() {
Set<String> remoteLocators = new HashSet();
remoteLocators.add("localhost[12345]");
testRemoteLocators(remoteLocators, true, 1);
}
// pool has been created even though locator address is not valid
@Test
public void testInvalidHostRemoteLocators() {
IgnoredException ie = IgnoredException
.addIgnoredException("could not get remote locator information for remote site");
try {
Set<String> remoteLocators = new HashSet();
addUnknownHost(remoteLocators);
// now we don't validata address upfront
testRemoteLocators(remoteLocators, true, 1);
} finally {
ie.remove();
}
}
@Test
public void testValidAndInvalidHostRemoteLocators() {
Set<String> remoteLocators = new HashSet();
remoteLocators.add("localhost[12345]");
addUnknownHost(remoteLocators);
// now we add the locator to pool, because we don't validate locator address
testRemoteLocators(remoteLocators, true, 2);
}
private void addUnknownHost(Set<String> remoteLocators) {
String unknownHostName = "unknownGeodeHostWanAutoDiscoveryDUnitTest";
boolean unknownHostFound = false;
int numTries = 10;
for (int i = 0; i < numTries; i++) {
try {
InetAddress.getByName(unknownHostName);
} catch (UnknownHostException e) {
unknownHostFound = true;
break;
}
unknownHostName = "_" + unknownHostName + "_";
}
assertTrue("An unknown host name could not be found in " + numTries + " tries",
unknownHostFound);
remoteLocators.add(unknownHostName + "[12345]");
}
private void testRemoteLocators(Set<String> remoteLocators, boolean poolShouldExist,
int expectedPoolLocatorsSize) {
// Start locator
Integer lnLocPort = (Integer) vm0.invoke(() -> WANTestBase.createFirstLocatorWithDSId(1));
// Add remote locators
int remoteDsId = 2;
vm0.invoke(() -> WANTestBase.putRemoteSiteLocators(remoteDsId, remoteLocators));
// Create cache
vm2.invoke(() -> WANTestBase.createCache(lnLocPort));
// Create sender
vm2.invoke(() -> WANTestBase.createSender("ln", remoteDsId, false, 100, 10, false, false, null,
false));
// Verify sender is running
vm2.invoke(() -> WANTestBase.verifySenderRunningState("ln"));
// Verify pool exists or not
vm2.invoke(() -> WANTestBase.verifyPool("ln", poolShouldExist, expectedPoolLocatorsSize));
}
}