/*
* 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.ignite.spi.discovery.tcp.ipfinder.vm;
import java.util.Arrays;
import java.util.Collections;
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.util.lang.GridAbsPredicate;
import org.apache.ignite.internal.util.typedef.G;
import org.apache.ignite.spi.IgniteSpiException;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinderAbstractSelfTest;
import org.apache.ignite.testframework.GridTestUtils;
import static org.apache.ignite.internal.processors.cache.binary.GridCacheBinaryObjectsAbstractSelfTest.IP_FINDER;
/**
* GridTcpDiscoveryVmIpFinder test.
*/
public class TcpDiscoveryVmIpFinderSelfTest
extends TcpDiscoveryIpFinderAbstractSelfTest<TcpDiscoveryVmIpFinder> {
/**
* Constructor.
*
* @throws Exception If any error occurs.
*/
public TcpDiscoveryVmIpFinderSelfTest() throws Exception {
// No-op.
}
/** {@inheritDoc} */
@Override protected TcpDiscoveryVmIpFinder ipFinder() {
TcpDiscoveryVmIpFinder finder = new TcpDiscoveryVmIpFinder();
assert !finder.isShared() : "Ip finder should NOT be shared by default.";
return finder;
}
/**
* @throws Exception If any error occurs.
*/
public void testAddressesInitialization() throws Exception {
TcpDiscoveryVmIpFinder finder = ipFinder();
try {
finder.setAddresses(Arrays.asList("127.0.0.1:475000001"));
assert false;
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
assert e.getMessage().contains("127.0.0.1:475000001");
}
try {
finder.setAddresses(Arrays.asList("127.0.0.1:-2"));
assert false;
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
assert e.getMessage().contains("127.0.0.1:-2");
}
finder.setAddresses(Arrays.asList("127.0.0.1:45555", "8.8.8.8", "some-dns-name", "some-dns-name1:200",
"127.0.0.1:"));
info("IP finder initialized: " + finder);
assert finder.getRegisteredAddresses().size() == 5;
finder = ipFinder();
try {
finder.setAddresses(Collections.singleton("127.0.0.1:555..444"));
assert false;
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
}
try {
finder.setAddresses(Collections.singleton("127.0.0.1:0..444"));
assert false;
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
}
try {
finder.setAddresses(Collections.singleton("127.0.0.1:-8080..-80"));
assert false;
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
}
finder.setAddresses(Collections.singleton("127.0.0.1:47500..47509"));
assert finder.getRegisteredAddresses().size() == 10 : finder.getRegisteredAddresses();
}
/**
* @throws Exception If any error occurs.
*/
public void testIpV6AddressesInitialization() throws Exception {
TcpDiscoveryVmIpFinder finder = ipFinder();
try {
finder.setAddresses(Arrays.asList("[::1]:475000001"));
fail();
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
}
try {
finder.setAddresses(Arrays.asList("[::1]:-2"));
fail();
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
}
finder.setAddresses(Arrays.asList("[::1]:45555", "8.8.8.8", "some-dns-name", "some-dns-name1:200", "::1"));
info("IP finder initialized: " + finder);
assertEquals(5, finder.getRegisteredAddresses().size());
finder = ipFinder();
try {
finder.setAddresses(Collections.singleton("[::1]:555..444"));
fail();
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
}
try {
finder.setAddresses(Collections.singleton("[::1]:0..444"));
fail();
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
}
try {
finder.setAddresses(Collections.singleton("[::1]:-8080..-80"));
fail();
}
catch (IgniteSpiException e) {
info("Caught expected exception: " + e);
}
finder.setAddresses(Collections.singleton("0:0:0:0:0:0:0:1"));
assertEquals(1, finder.getRegisteredAddresses().size());
finder.setAddresses(Collections.singleton("[0:0:0:0:0:0:0:1]"));
assertEquals(1, finder.getRegisteredAddresses().size());
finder.setAddresses(Collections.singleton("[0:0:0:0:0:0:0:1]:47509"));
assertEquals(1, finder.getRegisteredAddresses().size());
finder.setAddresses(Collections.singleton("[::1]:47500..47509"));
assertEquals("Registered addresses: " + finder.getRegisteredAddresses().toString(),
10, finder.getRegisteredAddresses().size());
}
/**
*
*/
public void testUnregistration() throws Exception {
Ignition.start(config("server1", false, false));
int srvSize = IP_FINDER.getRegisteredAddresses().size();
Ignition.start(config("server2", false, false));
Ignition.start(config("client1", true, false));
assertEquals(2 * srvSize, IP_FINDER.getRegisteredAddresses().size());
Ignition.start(config("client2", true, false));
Ignition.start(config("client3", true, false));
assertEquals(2 * srvSize, IP_FINDER.getRegisteredAddresses().size());
Ignition.start(config("client4", true, true));
assertEquals(3 * srvSize, IP_FINDER.getRegisteredAddresses().size());
Ignition.stop("client1", true);
Ignition.stop("client2", true);
assertEquals(3 * srvSize, IP_FINDER.getRegisteredAddresses().size());
Ignition.stop("client4", true);
GridTestUtils.waitForCondition(new GridAbsPredicate() {
@Override public boolean apply() {
return 2 == G.allGrids().size();
}
}, 10000);
Ignition.stop("server1", true);
Ignition.stop("server2", true);
GridTestUtils.waitForCondition(new GridAbsPredicate() {
@Override public boolean apply() {
return 0 == G.allGrids().size();
}
}, 10000);
assertTrue(3 * srvSize >= IP_FINDER.getRegisteredAddresses().size());
}
/**
* @param name Name.
* @param client Client.
*/
private static IgniteConfiguration config(String name, boolean client, boolean forceServerMode) {
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setIgniteInstanceName(name);
cfg.setClientMode(client);
TcpDiscoverySpi disco = new TcpDiscoverySpi();
disco.setForceServerMode(forceServerMode);
disco.setIpFinder(IP_FINDER);
cfg.setDiscoverySpi(disco);
return cfg;
}
}