* @throws IOException
* @throws NodeInitException
* @throws InterruptedException
*/
public static void main(String[] args) throws InvalidThresholdException, IOException, NodeInitException, InterruptedException {
Node secondNode = null;
try {
String ipOverride = null;
if(args.length > 0)
ipOverride = args[0];
File dir = new File("bootstrap-pull-test");
FileUtil.removeAll(dir);
RandomSource random = NodeStarter.globalTestInit(dir.getPath(), false, LogLevel.ERROR, "", false);
byte[] seed = new byte[64];
random.nextBytes(seed);
MersenneTwister fastRandom = new MersenneTwister(seed);
File seednodes = new File("seednodes.fref");
if(!seednodes.exists() || seednodes.length() == 0 || !seednodes.canRead()) {
System.err.println("Unable to read seednodes.fref, it doesn't exist, or is empty");
System.exit(EXIT_NO_SEEDNODES);
}
File secondInnerDir = new File(dir, Integer.toString(DARKNET_PORT));
secondInnerDir.mkdir();
FileInputStream fis = new FileInputStream(seednodes);
FileUtil.writeTo(fis, new File(secondInnerDir, "seednodes.fref"));
fis.close();
// Create the test data
System.out.println("Creating test data.");
File dataFile = File.createTempFile("testdata", ".tmp", dir);
OutputStream os = new FileOutputStream(dataFile);
byte[] buf = new byte[4096];
for(long written = 0; written < TEST_SIZE;) {
fastRandom.nextBytes(buf);
int toWrite = (int) Math.min(TEST_SIZE - written, buf.length);
os.write(buf, 0, toWrite);
written += toWrite;
}
os.close();
// Insert it to the established node.
System.out.println("Inserting test data to an established node.");
FreenetURI uri = insertData(dataFile);
// Bootstrap a second node.
secondInnerDir.mkdir();
fis = new FileInputStream(seednodes);
FileUtil.writeTo(fis, new File(secondInnerDir, "seednodes.fref"));
fis.close();
PooledExecutor executor = new PooledExecutor();
secondNode = NodeStarter.createTestNode(DARKNET_PORT, OPENNET_PORT, dir.getPath(), false, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 5*1024*1024, true, true, true, true, true, true, true, 12*1024, false, true, false, false, ipOverride);
secondNode.start(true);
if (!TestUtil.waitForNodes(secondNode)) {
secondNode.park();
System.exit(EXIT_FAILED_TARGET);
}
// Fetch the data
long startFetchTime = System.currentTimeMillis();
HighLevelSimpleClient client = secondNode.clientCore.makeClient((short)0, false, false);
try {
client.fetch(uri);
} catch (FetchException e) {
System.err.println("FETCH FAILED: "+e);
e.printStackTrace();
System.exit(EXIT_FETCH_FAILED);
return;
}
long endFetchTime = System.currentTimeMillis();
System.out.println("RESULT: Fetch took "+(endFetchTime-startFetchTime)+"ms ("+TimeUtil.formatTime(endFetchTime-startFetchTime)+") of "+uri+" .");
secondNode.park();
System.exit(0);
} catch (Throwable t) {
System.err.println("CAUGHT: "+t);
t.printStackTrace();
try {
if(secondNode != null)
secondNode.park();
} catch (Throwable t1) {}
System.exit(EXIT_THREW_SOMETHING);
}
}