/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch 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.elasticsearch.test.disruption;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.disruption.NetworkDisruption.Bridge;
import org.elasticsearch.test.disruption.NetworkDisruption.TwoPartitions;
import java.util.HashSet;
import java.util.Set;
public class NetworkDisruptionTests extends ESTestCase {
public void testTwoPartitions() {
Set<String> partition1 = generateRandomStringSet(1, 10);
Set<String> partition2 = generateRandomStringSet(1, 10);
TwoPartitions topology = new TwoPartitions(partition1, partition2);
checkTwoPartitions(topology, partition1, partition2);
}
public void testRandomTwoPartitions() {
TwoPartitions topology = TwoPartitions.random(random(), generateRandomStringSet(2, 20));
Set<String> partition1 = topology.getNodesSideOne();
Set<String> partition2 = topology.getNodesSideTwo();
checkTwoPartitions(topology, partition1, partition2);
}
private void checkTwoPartitions(TwoPartitions topology, Set<String> partition1, Set<String> partition2) {
for (int i = 0; i < 10; i++) {
assertTrue(topology.disrupt(randomFrom(partition1), randomFrom(partition2)));
assertTrue(topology.disrupt(randomFrom(partition2), randomFrom(partition1)));
assertFalse(topology.disrupt(randomFrom(partition1), randomFrom(partition1)));
assertFalse(topology.disrupt(randomFrom(partition2), randomFrom(partition2)));
assertFalse(topology.disrupt(randomAlphaOfLength(10), randomFrom(partition1)));
assertFalse(topology.disrupt(randomAlphaOfLength(10), randomFrom(partition2)));
assertFalse(topology.disrupt(randomFrom(partition1), randomAlphaOfLength(10)));
assertFalse(topology.disrupt(randomFrom(partition2), randomAlphaOfLength(10)));
}
assertTrue(topology.getMajoritySide().size() >= topology.getMinoritySide().size());
}
public void testIsolateAll() {
Set<String> nodes = generateRandomStringSet(1, 10);
NetworkDisruption.DisruptedLinks topology = new NetworkDisruption.IsolateAllNodes(nodes);
for (int i = 0; i < 10; i++) {
final String node1 = randomFrom(nodes);
final String node2 = randomFrom(nodes);
if (node1.equals(node2)) {
continue;
}
assertTrue(topology.nodes().contains(node1));
assertTrue(topology.nodes().contains(node2));
assertTrue(topology.disrupt(node1, node2));
}
}
public void testBridge() {
Set<String> partition1 = generateRandomStringSet(1, 10);
Set<String> partition2 = generateRandomStringSet(1, 10);
String bridgeNode = randomAlphaOfLength(10);
Bridge topology = new Bridge(bridgeNode, partition1, partition2);
checkBridge(topology, bridgeNode, partition1, partition2);
}
public void testRandomBridge() {
Bridge topology = Bridge.random(random(), generateRandomStringSet(3, 20));
String bridgeNode = topology.getBridgeNode();
Set<String> partition1 = topology.getNodesSideOne();
Set<String> partition2 = topology.getNodesSideTwo();
checkBridge(topology, bridgeNode, partition1, partition2);
}
private void checkBridge(Bridge topology, String bridgeNode, Set<String> partition1, Set<String> partition2) {
for (int i = 0; i < 10; i++) {
assertTrue(topology.disrupt(randomFrom(partition1), randomFrom(partition2)));
assertTrue(topology.disrupt(randomFrom(partition2), randomFrom(partition1)));
assertFalse(topology.disrupt(randomFrom(partition1), randomFrom(partition1)));
assertFalse(topology.disrupt(randomFrom(partition1), bridgeNode));
assertFalse(topology.disrupt(bridgeNode, randomFrom(partition1)));
assertFalse(topology.disrupt(randomFrom(partition2), randomFrom(partition2)));
assertFalse(topology.disrupt(randomFrom(partition2), bridgeNode));
assertFalse(topology.disrupt(bridgeNode, randomFrom(partition2)));
assertFalse(topology.disrupt(randomAlphaOfLength(10), randomFrom(partition1)));
assertFalse(topology.disrupt(randomAlphaOfLength(10), randomFrom(partition2)));
assertFalse(topology.disrupt(randomAlphaOfLength(10), bridgeNode));
assertFalse(topology.disrupt(randomFrom(partition1), randomAlphaOfLength(10)));
assertFalse(topology.disrupt(randomFrom(partition2), randomAlphaOfLength(10)));
assertFalse(topology.disrupt(bridgeNode, randomAlphaOfLength(10)));
}
}
private Set<String> generateRandomStringSet(int minSize, int maxSize) {
assert maxSize >= minSize;
Set<String> result = new HashSet<>();
for (int i = 0; i < minSize + randomInt(maxSize - minSize); i++) {
result.add(randomAlphaOfLength(10));
}
return result;
}
}