/* 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 fedora.server.messaging;
import java.lang.reflect.Method;
import java.util.Date;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import junit.framework.JUnit4TestAdapter;
import fedora.common.Constants;
import fedora.server.Context;
import fedora.server.MockContext;
import fedora.server.Server;
import fedora.server.management.Management;
import fedora.server.storage.types.DatastreamXMLMetadata;
import fedora.server.storage.types.RelationshipTuple;
import fedora.test.FedoraTestCase;
/**
* @author Edwin Shin
* @version $Id$
*/
public class AtomAPIMMessageTest extends FedoraTestCase {
static String entry;
private static final String baseURL = getBaseURL();
static {
StringBuilder sb = new StringBuilder();
sb.append("<entry xmlns=\"http://www.w3.org/2005/Atom\">");
sb.append("<id>ingestdemo:atomTest2008-03-15T11:12:00Z</id>");
sb.append("<title type=\"text\">ingest</title>");
sb.append("<updated>2008-03-15T11:12:00Z</updated>");
sb.append("<author><name>fedoraAdmin</name><uri>").append(baseURL)
.append("</uri></author>");
sb.append("<summary>demo:atomTest</summary>");
sb.append("<content type=\"text\">demo:atomTest</content>");
sb.append("</entry>");
entry = sb.toString();
}
private final String messageFormat = Constants.ATOM_APIM1_0.uri;
/**
* @throws java.lang.Exception
*/
@Override
@Before
public void setUp() throws Exception {
}
/**
* @throws java.lang.Exception
*/
@Override
@After
public void tearDown() throws Exception {
}
@Test
public void testStringConstructor() throws Exception {
APIMMessage message = new AtomAPIMMessage(entry);
assertEquals("demo:atomTest", message.getPID());
assertEquals("ingest", message.getMethodName());
assertEquals(baseURL, message.getBaseUrl());
}
@Test
public void testFedoraMethodConstructor() throws Exception {
Context c = new MockContext();
FedoraMethod fm;
APIMMessage message;
fm =
new FedoraMethod(Management.class
.getDeclaredMethod("purgeObject", new Class[] {
Context.class, String.class, String.class,
boolean.class}), new Object[] {c, "demo:foo",
"a log message", false}, "blah");
message =
new AtomAPIMMessage(fm, baseURL, Server.VERSION, messageFormat);
assertNotNull(message.getDate());
assertEquals("purgeObject", message.getMethodName());
assertEquals("demo:foo", message.getPID().toString());
assertEquals(baseURL, message.getBaseUrl());
fm =
new FedoraMethod(Management.class
.getDeclaredMethod("addDatastream",
new Class[] {
Context.class,
String.class,
String.class,
String[].class,
String.class,
boolean.class,
String.class,
String.class,
String.class,
String.class,
String.class,
String.class,
String.class,
String.class}),
new Object[] {c, "demo:foo", "DS1",
new String[] {"altid1, altid2"},
"a label", true, "text/xml",
"some format uri", "dsLocation", "X",
"A", "none", "n/a", "a log message"},
"asdf");
message = new AtomAPIMMessage(fm, baseURL, Server.VERSION, messageFormat);
assertNotNull(message.getDate());
assertEquals("addDatastream", message.getMethodName());
assertEquals("demo:foo", message.getPID().toString());
assertEquals(baseURL, message.getBaseUrl());
DatastreamXMLMetadata ds = new DatastreamXMLMetadata();
ds.DatastreamID = "DS1";
ds.DSVersionID = "DS1.0";
ds.DSControlGrp = "X";
ds.xmlContent = "<doc/>".getBytes();
ds.DSCreateDT = new Date();
fm =
new FedoraMethod(Management.class
.getDeclaredMethod("getDatastream", new Class[] {
Context.class, String.class, String.class,
Date.class}), new Object[] {c, "demo:foo",
"DS1", new Date()}, ds);
message = new AtomAPIMMessage(fm, baseURL, Server.VERSION, messageFormat);
assertNotNull(message.getDate());
assertEquals("getDatastream", message.getMethodName());
assertEquals("demo:foo", message.getPID().toString());
assertEquals(baseURL, message.getBaseUrl());
RelationshipTuple tuple =
new RelationshipTuple("urn:subject",
"urn:predicate",
"object",
true,
null);
fm =
new FedoraMethod(Management.class
.getDeclaredMethod("getRelationships",
new Class[] {
Context.class,
String.class,
String.class}),
new Object[] {c, "demo:foo", "urn:foo"},
new RelationshipTuple[] {tuple});
message = new AtomAPIMMessage(fm, baseURL, Server.VERSION, messageFormat);
}
@Test
public void testRoundTrip() throws Exception {
Context context = new MockContext();
Method method =
Management.class.getDeclaredMethod("purgeObject", new Class[] {
Context.class, String.class, String.class,
boolean.class});
Object returnValue = "return";
// Quotes test
String logMessage = "a log message with \"quotes\" included";
Object[] parameters =
new Object[] {context, "demo:foo", logMessage, false};
FedoraMethod fm = new FedoraMethod(method, parameters, returnValue);
APIMMessage message =
new AtomAPIMMessage(fm, baseURL, Server.VERSION, messageFormat);
String messageText = message.toString();
APIMMessage messageFromText = new AtomAPIMMessage(messageText);
assertNotNull(messageFromText.getDate());
assertEquals("purgeObject", messageFromText.getMethodName());
assertEquals("demo:foo", messageFromText.getPID().toString());
assertEquals(baseURL, messageFromText
.getBaseUrl());
assertEquals(normalize(messageText), normalize(messageFromText
.toString()));
// Special characters test
logMessage =
"a log message with special characters (!@#$%^&*<>?`':;,.|[]{}) included";
parameters = new Object[] {context, "demo:foo", logMessage, false};
fm = new FedoraMethod(method, parameters, returnValue);
message = new AtomAPIMMessage(fm, baseURL, Server.VERSION, messageFormat);
messageText = message.toString();
messageFromText = new AtomAPIMMessage(messageText);
assertEquals(normalize(messageText), normalize(messageFromText
.toString()));
}
private String normalize(String xml) {
String newline = System.getProperty("line.separator");
return xml.replaceAll(newline, "").replaceAll("\n", "")
.replaceAll("\r", "").replaceAll(" ", "");
}
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(AtomAPIMMessageTest.class);
}
}