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

191 lines
6 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 junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import com.sleepycat.db.BtreeStats;
import com.sleepycat.db.Database;
import com.sleepycat.db.DatabaseConfig;
import com.sleepycat.db.DatabaseEntry;
import com.sleepycat.db.DatabaseType;
import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.EventHandlerAdapter;
import com.sleepycat.db.ReplicationManagerSiteConfig;
import com.sleepycat.db.ReplicationManagerStartPolicy;
import com.sleepycat.db.VerboseConfig;
/**
* Regression test for #15788. No fiddler funny-business, just a
* straightforward test of internal init with a healthy amount of data
* (enough to flood the outgoing TCP queue, so that we're force to
* invoke our new waiting feature).
*/
public class TestRepmgr extends TestCase {
private static final String TEST_DIR_NAME = "TESTDIR";
private File testdir;
class MyEventHandler extends EventHandlerAdapter {
private boolean done = false;
private boolean panic = false;
@Override
synchronized public void handleRepStartupDoneEvent() {
done = true;
notifyAll();
}
@Override
synchronized public void handlePanicEvent() {
done = true;
panic = true;
notifyAll();
}
synchronized void await() throws Exception {
while (!done) { wait(); }
if (panic)
throw new Exception("aborted by panic in DB");
}
}
@Before
public void setUp() throws Exception {
testdir = new File(TEST_DIR_NAME);
Util.rm_rf(testdir);
testdir.mkdir();
}
@After
public void tearDown() throws Exception {
// Hmm, this kind of interesting. What we really want
// is to clean up the env directories *only* if the
// test passed. If it failed, it may be useful to
// keep it around for analysis.
//
// if (completed)
// Util.rm_rf(testdir);
}
public void testSanity() {
int x = 1;
int y = 2;
assertTrue(x + y == 3);
}
public void testEnvCreate() throws Exception {
boolean junk = false;
// TODO: move this to a test runner.
if (Boolean.getBoolean("debug.pause")) {
// force DB to be loaded first (is this necessary?)
Environment.getVersionString();
System.out.println(".> ");
System.in.read();
}
int[] testPorts = Util.findAvailablePorts(2);
int masterPort = testPorts[0];
int clientPort = testPorts[1];
EnvironmentConfig ec = makeBasicConfig();
ec.setReplicationLimit(100000000);
ReplicationManagerSiteConfig dbsite =
new ReplicationManagerSiteConfig("localhost", masterPort);
dbsite.setLocalSite(true);
ec.addReplicationManagerSite(dbsite);
Environment master = new Environment(mkdir("master"), ec);
master.replicationManagerStart(3, ReplicationManagerStartPolicy.REP_MASTER);
if (junk) {
DatabaseConfig dc = new DatabaseConfig();
dc.setTransactional(true);
dc.setAllowCreate(true);
dc.setType(DatabaseType.BTREE);
Database db = master.openDatabase(null, "test.db", null, dc);
System.err.println("created database");
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry value = new DatabaseEntry();
value.setData("This is a reasonably long string. The controller is responsible for maintaining the view, and for interpreting UI events and turning them into operations on the model.".getBytes());
int i = 0;
BtreeStats stats = (BtreeStats)db.getStats(null, null);
while (stats.getPageCount() < 4) {
String k = "The record number is: " + ++i;
key.setData(k.getBytes());
db.put(null, key, value);
stats = (BtreeStats)db.getStats(null, null);
}
db.close();
System.err.println("closed database");
}
ec = makeBasicConfig();
// ec.setReplicationRequestMin(200);
// ec.setReplicationRequestMax(1000);
dbsite = new ReplicationManagerSiteConfig("localhost", clientPort);
dbsite.setLocalSite(true);
ec.addReplicationManagerSite(dbsite);
dbsite = new ReplicationManagerSiteConfig("localhost", masterPort);
dbsite.setBootstrapHelper(true);
ec.addReplicationManagerSite(dbsite);
MyEventHandler mon = new MyEventHandler();
ec.setEventHandler(mon);
Environment client = new Environment(mkdir("client"), ec);
client.replicationManagerStart(2, ReplicationManagerStartPolicy.REP_CLIENT);
// ReplicationHostAddress[] sites = client.getReplicationManagerSiteList();
// assertEquals(1, sites.length);
// assertEquals("localhost", sites[0].host);
// assertEquals(masterSpoofPort, sites[0].port);
System.err.println("started client");
mon.await();
System.err.println("completed await()");
// sites = master.getReplicationManagerSiteList();
// assertEquals(1, sites.length);
// assertEquals("localhost", sites[0].host);
// assertEquals(clientPort, sites[0].port);
// ec.setReplicationRequestMax(128);
// ec.setReplicationRequestMin(4);
// client.setConfig(ec);
// System.out.println(client.getReplicationStats(StatsConfig.DEFAULT));
client.close();
master.close();
}
public static EnvironmentConfig makeBasicConfig() {
EnvironmentConfig ec = new EnvironmentConfig();
ec.setAllowCreate(true);
ec.setInitializeCache(true);
ec.setInitializeLocking(true);
ec.setInitializeLogging(true);
ec.setInitializeReplication(true);
ec.setTransactional(true);
ec.setThreaded(true);
if (Boolean.getBoolean("VERB_REPLICATION"))
ec.setVerbose(VerboseConfig.REPLICATION, true);
return (ec);
}
public File mkdir(String dname) {
File f = new File(testdir, dname);
f.mkdir();
return f;
}
}