libdb/test/java/rep/tests/repmgrtests/Util.java
2011-09-13 13:44:24 -04:00

109 lines
3.3 KiB
Java

/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2010, 2011 Oracle and/or its affiliates. All rights reserved.
*
*/
package repmgrtests;
import java.io.File;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Miscellaneous utilities used by repmgr tests.
*/
public class Util {
public static Process startFiddler(PortsConfig p, String testName, int mgrPort)
throws Exception
{
ProcessBuilder pb =
new ProcessBuilder("erl", "-noshell",
"-s", "fiddler1", "startn",
Integer.toString(mgrPort),
p.getFiddlerConfig());
pb.directory(new File("fiddler")).redirectErrorStream(true);
Process fiddler = pb.start();
String fileName = testName + ".fiddler.out";
final BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));
final BufferedInputStream bis = new BufferedInputStream(fiddler.getInputStream());
// Spawn a thread to capture the fiddler's output and save it
// into a file.
//
Runnable copier = new Runnable() {
public void run() {
try {
byte[] buf = new byte[1000];
int len;
for (;;) {
len = bis.read(buf, 0, buf.length);
if (len == -1) { break; }
bos.write(buf, 0, len);
}
bos.close();
} catch (IOException x) {
x.printStackTrace();
}
}
};
Thread t = new Thread(copier);
t.start();
// wait til fiddler is ready, which we'll infer when it is
// listening on its mgmt port (Hmm, is that really late
// enough? Well, it's certainly better'n nuttin'.)
//
Socket s = null;
long deadline = System.currentTimeMillis() + 5000; // allow 5 seconds, max
do {
try {
s = new Socket("localhost", mgrPort);
} catch (IOException x) {
if (System.currentTimeMillis() > deadline) { throw x; }
Thread.sleep(200);
}
} while (s == null);
s.close();
return fiddler;
}
public static File mkdir(String dname) {
File d = new File("TESTDIR");
d.mkdir();
File f = new File(d, dname);
rm_rf(f);
f.mkdir();
return f;
}
public static void rm_rf(File f) {
if (f.isDirectory())
for (File f2 : f.listFiles())
rm_rf(f2);
f.delete();
}
public static int[] findAvailablePorts(int n) throws IOException {
int ports[] = new int[n];
ServerSocket[] sockets = new ServerSocket[n];
for (int i=0; i<n; i++) {
ServerSocket s = new ServerSocket(0);
s.setReuseAddress(true);
ports[i] = s.getLocalPort();
sockets[i] = s;
}
for (int i=0; i<n; i++)
sockets[i].close();
return ports;
}
}