/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package org.fcrepo.server.journal.readerwriter.multicast.rmi;
import java.io.BufferedWriter;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.Date;
import org.junit.Before;
import org.junit.Test;
import org.fcrepo.server.journal.JournalException;
import org.fcrepo.server.journal.readerwriter.multicast.rmi.RmiJournalReceiverHelper;
import org.fcrepo.server.journal.readerwriter.multicast.rmi.RmiTransportWriter;
import static junit.framework.Assert.assertEquals;
/**
* <p>
* <b>Title:</b> TestRmiTransportWriter.java
* </p>
* <p>
* <b>Description:</b> Put the RmiTransportWriter through its paces.
* </p>
*
* @author jblake
* @version $Id: TestRmiTransportWriter.java,v 1.3 2007/06/01 17:21:31 jblake
* Exp $
*/
public class TestRmiTransportWriter {
// Supports legacy test runners
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(TestRmiTransport.class);
}
MockRmiJournalReceiver receiver;
String repositoryHash;
@Before
public void initializeReceiver() throws RemoteException {
receiver = new MockRmiJournalReceiver();
}
@Before
public void initializeRepositoryHash() {
repositoryHash = "Hash" + new Date().getTime();
}
@Test
public void testConstructorOpensConnection() throws JournalException, IOException {
RmiTransportWriter rtw = new RmiTransportWriter(receiver, repositoryHash, "theFilename");
rtw.close();
assertCorrectNumberOfCalls(receiver, 1, 0, 0);
assertEquals(repositoryHash, receiver.getRepositoryHash());
assertEquals("theFilename", receiver.getFilename());
}
@Test(expected = JournalException.class)
public void testConstructorGetsException() throws JournalException, IOException {
receiver.setOpenFileThrowsException(true);
RmiTransportWriter rtw = new RmiTransportWriter(receiver, repositoryHash, "theFilename");
rtw.close();
}
@Test
public void testSeriesOfWrites() throws JournalException, IOException {
RmiTransportWriter writer =
new RmiTransportWriter(receiver, repositoryHash, "theFilename");
assertCorrectNumberOfCalls(receiver, 1, 0, 0);
String text1 = "Some silly text";
char[] chars = text1.toCharArray();
writer.write(chars, 0, text1.length());
assertCorrectNumberOfCalls(receiver, 1, 1, 0);
assertEquals("unexpected text 1", text1, receiver.getText());
assertCorrectItemHash(receiver, 0);
String text2 = "This is something else";
writer.write(text2);
assertCorrectNumberOfCalls(receiver, 1, 2, 0);
assertEquals("unexpected text 2", text2, receiver.getText());
assertCorrectItemHash(receiver, 1);
String text3 = "What's going on?";
writer.write(text3, 3, 8);
try {
assertCorrectNumberOfCalls(receiver, 1, 3, 0);
assertEquals("unexpected text 3", text3.substring(3, 11), receiver
.getText());
assertCorrectItemHash(receiver, 2);
} finally {
writer.close();
}
}
@Test(expected = IOException.class)
public void testWriteGetsException() throws JournalException, IOException {
receiver.setWriteTextThrowsException(true);
RmiTransportWriter writer =
new RmiTransportWriter(receiver, repositoryHash, "theFilename");
try {
writer.write("Throw an exception");
} finally {
writer.close();
}
}
@Test
public void testCloseClosesFile() throws JournalException, IOException {
RmiTransportWriter writer =
new RmiTransportWriter(receiver, repositoryHash, "theFilename");
writer.close();
assertCorrectNumberOfCalls(receiver, 1, 0, 1);
}
@Test(expected = IOException.class)
public void testCloseThrowsException() throws JournalException, IOException {
// Note that the mock receiver throws a JournalException on close, but
// the writer wraps it in an IOException.
receiver.setCloseFileThrowsException(true);
RmiTransportWriter writer =
new RmiTransportWriter(receiver, repositoryHash, "theFilename");
writer.close();
}
@Test
public void testBigBufferYieldsOnlyOneWrite() throws JournalException,
IOException {
String text1 = "Write a bunch of stuff to the buffer";
String text2 = "But it doesn't go out to the RmiTransportWriter";
String text3 = "Until we do a flush or a close.";
BufferedWriter buffered =
new BufferedWriter(new RmiTransportWriter(receiver,
repositoryHash,
"theFilename"), 10000);
assertCorrectNumberOfCalls(receiver, 1, 0, 0);
buffered.write(text1);
assertCorrectNumberOfCalls(receiver, 1, 0, 0);
buffered.write(text2);
assertCorrectNumberOfCalls(receiver, 1, 0, 0);
buffered.write(text3);
assertCorrectNumberOfCalls(receiver, 1, 0, 0);
buffered.flush();
buffered.close();
assertCorrectNumberOfCalls(receiver, 1, 1, 0);
assertEquals("unexpected text", text1 + text2 + text3, receiver
.getText());
}
private void assertCorrectItemHash(MockRmiJournalReceiver receiver,
int index) {
assertEquals("unexpected item hash", RmiJournalReceiverHelper
.figureIndexedHash(repositoryHash, index), receiver
.getIndexedHash());
}
private void assertCorrectNumberOfCalls(MockRmiJournalReceiver receiver,
int i,
int j,
int k) {
assertEquals("wrong number of calls to openFile()", i, receiver
.howManyCallsToOpenFile());
assertEquals("wrong number of calls to writeText()", j, receiver
.howManyCallsToWriteText());
assertEquals("wrong number of calls to closeFile()", k, receiver
.howManyCallsToClosefile());
}
}