/*
* Copyright 2008-2012 LinkedIn, 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 voldemort.utils;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.ServerSocketChannel;
import java.util.Properties;
import org.junit.Test;
import voldemort.ServerTestUtils;
import voldemort.TestUtils;
import voldemort.cluster.Cluster;
import voldemort.server.VoldemortServer;
import voldemort.store.socket.SocketStoreFactory;
import voldemort.store.socket.clientrequest.ClientRequestExecutorPool;
public class ServerTestUtilsTest {
private static String storesXmlfile = "test/common/voldemort/config/stores.xml";
private SocketStoreFactory socketStoreFactory = new ClientRequestExecutorPool(2,
10000,
100000,
32 * 1024);
@Test
public void testStartVoldemortCluster() throws IOException {
int numServers = 8;
VoldemortServer[] servers = new VoldemortServer[numServers];
int partitionMap[][] = { { 0 }, { 1 }, { 2 }, { 3 }, { 4 }, { 5 }, { 6 }, { 7 } };
Cluster cluster = ServerTestUtils.startVoldemortCluster(numServers,
servers,
partitionMap,
socketStoreFactory,
true,
null,
storesXmlfile,
new Properties());
assertTrue(cluster != null);
}
// **********************************************************************
// * START : "commented out" tests
// These tests helped to find the root case of BindException problem when
// clusters were started. These tests were used in debugging and stress
// testing and should not be part of our general junit tests. The @Test
// parameter is therefore commented out. The debugging methods themselves
// are not commented out so that they can be kept up to date with other code
// changes.
// @Test
public void stressTestStartVoldemortCluster() throws IOException {
for(int i = 0; i < 10; i++) {
testStartVoldemortCluster();
}
}
// @Test
public void startMultipleVoldemortServers() throws IOException {
Cluster cluster = ServerTestUtils.getLocalCluster(16, new int[][] { { 0 }, { 1 }, { 2 },
{ 3 }, { 4 }, { 5 }, { 6 }, { 7 }, { 8 }, { 9 }, { 10 }, { 11 }, { 12 }, { 13 },
{ 14 }, { 15 } });
VoldemortServer[] servers = new VoldemortServer[16];
for(int i = 0; i < 16; i++) {
servers[i] = ServerTestUtils.startVoldemortServer(socketStoreFactory,
ServerTestUtils.createServerConfig(true,
i,
TestUtils.createTempDir()
.getAbsolutePath(),
null,
storesXmlfile,
new Properties()),
cluster);
}
assertTrue(true);
for(VoldemortServer server: servers) {
ServerTestUtils.stopVoldemortServer(server);
}
}
// @Test
public void startMultipleVoldemortServersUnsafe5() throws IOException {
for(int i = 0; i < 5; i++) {
startMultipleVoldemortServers();
}
assertTrue(true);
}
// @Test
public void startMultipleVoldemortServers10() {
for(int i = 0; i < 10; i++) {
boolean started = false;
boolean caught = false;
while(!started) {
try {
startMultipleVoldemortServers();
started = true;
} catch(IOException ioe) {
System.err.println("CAUGHT BIND ERROR! Trying again...");
ioe.printStackTrace();
caught = true;
}
}
assertFalse(caught);
}
}
// @Test
public void testFindFreePort() throws Exception {
ServerSocketChannel serverSocketChannel;
try {
serverSocketChannel = ServerSocketChannel.open();
} catch(IOException ioe) {
ioe.printStackTrace();
assertTrue(false);
return;
}
int port = ServerTestUtils.findFreePort();
try {
serverSocketChannel.socket().bind(new InetSocketAddress(port));
} catch(IOException ioe) {
ioe.printStackTrace();
assertTrue(false);
return;
}
assertTrue(true);
}
// @Test
public void testFindFreePort1000() throws Exception {
for(int i = 0; i < 1000; i++) {
testFindFreePort();
}
}
// @Test
public void testFindFreePorts() throws Exception {
int numPorts = 25000;
ServerSocketChannel serverSocketChannel[] = new ServerSocketChannel[numPorts];
int ports[] = ServerTestUtils.findFreePorts(numPorts);
for(int i = 0; i < numPorts; i++) {
boolean bound = false;
while(!bound) {
try {
serverSocketChannel[i] = ServerSocketChannel.open();
serverSocketChannel[i].socket().bind(new InetSocketAddress(ports[i]));
serverSocketChannel[i].socket().setReuseAddress(true);
bound = true;
} catch(IOException ioe) {
System.err.println("Attempt: " + i + ", port: " + ports[i]);
ioe.printStackTrace();
Thread.sleep(10);
}
}
}
for(int i = 0; i < numPorts; i++) {
try {
serverSocketChannel[i].socket().close();
} catch(IOException ioe) {
System.err.println("Attempt: " + i + ", port: " + ports[i]);
ioe.printStackTrace();
assertTrue(false);
return;
}
}
assertTrue(true);
}
// @Test
public void testFindFreePorts100() throws Exception {
for(int i = 0; i < 100; i++) {
System.out.println("testFindFreePorts100: " + i);
testFindFreePorts();
}
}
// * END : "commented out" tests
// **********************************************************************
}