package edu.pdx.cs410J.family;
import org.junit.After;
import org.junit.Assert;
import static org.junit.Assert.assertNotNull;
import org.junit.Before;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Calendar;
import java.util.Date;
/**
* This is the abstract superclass for all of the remote family
* tree tests.
*/
public abstract class RemoteTestCase {
/** The port on which the RMI registry runs */
private static final int RMI_PORT =
Integer.getInteger("RMI_PORT", 1999).intValue();
/** An RMI Registry that is co-located in the VM in which the test
* runs */
private static Registry registry;
/** The name of this test */
private String name = "RemoteTestCase" + System.currentTimeMillis();
/**
* Creates an empty <code>RemoteFamilyTree</code> and binds it into
* the RMI namespace.
*/
@Before
public void setUp() {
try {
File file = File.createTempFile("familyTree", "xml");
file.delete();
file.deleteOnExit();
RemoteFamilyTree tree = new XmlRemoteFamilyTree(file);
this.bind(tree);
} catch (Exception ex) {
fail("While getting creating remote family tree", ex);
}
}
/**
* Unbinds the remote family tree from the RMI namespace
*/
@After
public void tearDown() {
this.unbind();
}
/**
* Returns the name that the <code>RemoteFamilyTree</code> is bound
* into in the RMI namespace.
*/
protected String getFamilyName() {
return "RemoteTestCase";
}
/**
* Returns an RMI registry that is co-located in this VM. If one
* doesn't exist, it is started on {@link #RMI_PORT}
*/
private Registry getRegistry() {
if (registry != null) {
return registry;
}
synchronized (RemoteTestCase.class) {
if (registry != null) {
return registry;
}
try {
registry = LocateRegistry.createRegistry(RMI_PORT);
} catch (RemoteException ex) {
try {
registry = LocateRegistry.createRegistry(RMI_PORT);
} catch (RemoteException ex1) {
fail("Couldn't create local registry", ex);
}
}
assertNotNull(registry);
return registry;
}
}
/**
* Returns the <code>RemoteFamilyTree</code> used by this test
*/
protected RemoteFamilyTree getTree() {
// if (System.getSecurityManager() == null) {
// System.setSecurityManager(new RMISecurityManager());
// }
Registry registry = getRegistry();
try {
return (RemoteFamilyTree) registry.lookup(this.getName());
} catch (Exception ex) {
fail("While getting remote family tree on " + this.getName(), ex);
return null;
}
}
/**
* Convenience method that binds a given
* <code>RemoteFamilyTree</code> into the RMI namespace.
*/
protected void bind(RemoteFamilyTree tree) {
// if (System.getSecurityManager() == null) {
// System.setSecurityManager(new RMISecurityManager());
// }
Registry registry = getRegistry();
try {
registry.rebind(this.getName(), tree);
System.out.println("Successfully bound RemoteFamilyTree");
} catch (Exception ex) {
fail("While getting remote family tree on " + this.getName(), ex);
}
}
/**
* Convenience method that unbinds and shuts down the remote family
* tree from the RMI namespace.
*/
protected void unbind() {
// if (System.getSecurityManager() == null) {
// System.setSecurityManager(new RMISecurityManager());
// }
Registry registry = getRegistry();
try {
RemoteFamilyTree tree =
(RemoteFamilyTree) registry.lookup(this.getName());
tree.shutdown();
registry.unbind(this.getName());
System.out.println("Successfully unbound RemoteFamilyTree");
} catch (Exception ex) {
fail("While getting remote family tree on " + this.getName(), ex);
}
}
private String getName()
{
return name;
}
/**
* Asserts the equality of two dates. Only takes the month, day,
* and year into account.
*/
protected void assertEquals(Date d1, Date d2) {
Calendar cal1 = Calendar.getInstance();
cal1.setTime(d1);
Calendar cal2 = Calendar.getInstance();
cal1.setTime(d2);
Assert.assertEquals(cal1.get(Calendar.DAY_OF_YEAR),
cal2.get(Calendar.DAY_OF_YEAR));
Assert.assertEquals(cal1.get(Calendar.YEAR), cal2.get(Calendar.YEAR));
}
/**
* A JUnit failure that is caused by an exception. This method
* provides us with a nice strack trace for the failure.
*
* @since Winter 2004
*/
public static void fail(String message, Throwable cause) {
StringWriter sw = new StringWriter();
sw.write(message);
sw.write("\nCaused by: ");
PrintWriter pw = new PrintWriter(sw, true);
cause.printStackTrace(pw);
Assert.fail(sw.toString());
}
}