/* 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.test.api;
import java.util.HashMap;
import java.util.Map;
import org.custommonkey.xmlunit.NamespaceContext;
import org.custommonkey.xmlunit.SimpleNamespaceContext;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.After;
import org.w3c.dom.Document;
import junit.framework.Test;
import junit.framework.TestSuite;
import fedora.client.FedoraClient;
import fedora.server.access.FedoraAPIA;
import fedora.server.management.FedoraAPIM;
import fedora.test.FedoraServerTestCase;
import fedora.test.OneEmptyObjectTestSetup;
/**
* Tests correct/incorrect authentication against API-A/Lite and API-M/Lite.
* <p>
* These tests use basic authentication. To exercise the running server
* properly, it should be configured to require basic authentication on all
* interfaces.
* <p>
* By default, the tests will run against the "default" Fedora base URL, but
* this can be overridden by setting the "fedora.baseURL" system property.
*
* @author Chris Wilper
*/
public class TestAuthentication
extends FedoraServerTestCase {
private final static String TEST_PID = "demo:AuthNTestObject";
private final static int TIMES_PER_TEST = 50;
private static FedoraClient CLIENT_VALID_USER_VALID_PASS;
private static FedoraClient CLIENT_VALID_USER_BOGUS_PASS;
private static FedoraClient CLIENT_BOGUS_USER;
public static Test suite() {
TestSuite suite = new TestSuite("TestAuthentication TestSuite");
suite.addTestSuite(TestAuthentication.class);
return new OneEmptyObjectTestSetup(suite, TEST_PID);
}
//---
// API-M SOAP Tests
//---
public void testAPIMSOAPAuthNValidUserValidPass() throws Exception {
int failCount = modifyLabel(getClient(true, true), TIMES_PER_TEST);
assertEquals("Modifying object label using valid user, valid pass failed "
+ failCount
+ " times out of "
+ TIMES_PER_TEST
+ " attempts",
0,
failCount);
}
public void testAPIMSOAPAuthNValidUserBogusPass() throws Exception {
int failCount = modifyLabel(getClient(true, false), TIMES_PER_TEST);
int successCount = TIMES_PER_TEST - failCount;
assertEquals("Modifying object label using valid user, bogus pass succeeded "
+ successCount
+ " times out of "
+ TIMES_PER_TEST
+ " attempts",
0,
successCount);
}
public void testAPIMSOAPAuthNBogusUser() throws Exception {
int failCount = modifyLabel(getClient(false, false), TIMES_PER_TEST);
int successCount = TIMES_PER_TEST - failCount;
assertEquals("Modifying object label using bogus user, bogus pass succeeded "
+ successCount
+ " times out of "
+ TIMES_PER_TEST
+ " attempts",
0,
successCount);
}
//---
// API-M Lite Tests
//---
public void testAPIMLiteAuthNValidUserValidPass() throws Exception {
int failCount = getNextPID(getClient(true, true), TIMES_PER_TEST);
assertEquals("Getting next PID using valid user, valid pass failed "
+ failCount + " times out of " + TIMES_PER_TEST
+ " attempts",
0,
failCount);
}
public void testAPIMLiteAuthNValidUserBogusPass() throws Exception {
int failCount = getNextPID(getClient(true, false), TIMES_PER_TEST);
int successCount = TIMES_PER_TEST - failCount;
assertEquals("Getting next PID using valid user, bogus pass succeeded "
+ successCount + " times out of " + TIMES_PER_TEST
+ " attempts", 0, successCount);
}
public void testAPIMLiteAuthNBogusUser() throws Exception {
int failCount = getNextPID(getClient(false, false), TIMES_PER_TEST);
int successCount = TIMES_PER_TEST - failCount;
assertEquals("Getting next PID using bogus user, bogus pass succeeded "
+ successCount + " times out of " + TIMES_PER_TEST
+ " attempts", 0, successCount);
}
//---
// API-A SOAP Tests
//---
public void testAPIASOAPAuthNValidUserValidPass() throws Exception {
int failCount = listDatastreams(getClient(true, true), TIMES_PER_TEST);
assertEquals("Listing object datastreams using valid user, valid pass failed "
+ failCount
+ " times out of "
+ TIMES_PER_TEST
+ " attempts",
0,
failCount);
}
public void testAPIASOAPAuthNValidUserBogusPass() throws Exception {
int failCount = listDatastreams(getClient(true, false), TIMES_PER_TEST);
int successCount = TIMES_PER_TEST - failCount;
assertEquals("Listing object datastreams using valid user, bogus pass succeeded "
+ successCount
+ " times out of "
+ TIMES_PER_TEST
+ " attempts",
0,
successCount);
}
public void testAPIASOAPAuthNBogusUser() throws Exception {
int failCount =
listDatastreams(getClient(false, false), TIMES_PER_TEST);
int successCount = TIMES_PER_TEST - failCount;
assertEquals("Listing object datastreams using bogus user, bogus pass succeeded "
+ successCount
+ " times out of "
+ TIMES_PER_TEST
+ " attempts",
0,
successCount);
}
//---
// API-A Lite Tests
//---
public void testAPIALiteAuthNValidUserValidPass() throws Exception {
int failCount = getDCContent(getClient(true, true), TIMES_PER_TEST);
assertEquals("Getting DC content using valid user, valid pass failed "
+ failCount + " times out of " + TIMES_PER_TEST
+ " attempts",
0,
failCount);
}
public void testAPIALiteAuthNValidUserBogusPass() throws Exception {
int failCount = getDCContent(getClient(true, false), TIMES_PER_TEST);
int successCount = TIMES_PER_TEST - failCount;
assertEquals("Getting DC content using valid user, bogus pass succeeded "
+ successCount
+ " times out of "
+ TIMES_PER_TEST
+ " attempts",
0,
successCount);
}
public void testAPIALiteAuthNBogusUser() throws Exception {
int failCount = getDCContent(getClient(false, false), TIMES_PER_TEST);
int successCount = TIMES_PER_TEST - failCount;
assertEquals("Getting DC content using bogus user, bogus pass succeeded "
+ successCount
+ " times out of "
+ TIMES_PER_TEST
+ " attempts",
0,
successCount);
}
//---
// Static helpers
//---
@Override
public void setUp() throws Exception {
Map<String, String> nsMap = new HashMap<String, String>();
nsMap.put("oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/");
NamespaceContext ctx = new SimpleNamespaceContext(nsMap);
XMLUnit.setXpathNamespaceContext(ctx);
}
@Override
@After
public void tearDown() {
XMLUnit.setXpathNamespaceContext(SimpleNamespaceContext.EMPTY_CONTEXT);
}
private static FedoraClient getClient(boolean validUser, boolean validPass)
throws Exception {
if (validUser) {
if (validPass) {
System.out
.println("Using Fedora Client with valid user, valid pass");
if (CLIENT_VALID_USER_VALID_PASS == null) {
CLIENT_VALID_USER_VALID_PASS = getFedoraClient();
}
return CLIENT_VALID_USER_VALID_PASS;
} else {
System.out
.println("Using Fedora Client with valid user, bogus pass");
if (CLIENT_VALID_USER_BOGUS_PASS == null) {
CLIENT_VALID_USER_BOGUS_PASS =
getFedoraClient(getBaseURL(),
getUsername(),
"bogus");
}
return CLIENT_VALID_USER_BOGUS_PASS;
}
} else {
System.out.println("Using Fedora Client with bogus user");
if (CLIENT_BOGUS_USER == null) {
CLIENT_BOGUS_USER =
getFedoraClient(getBaseURL(), "bogus", "bogus");
}
return CLIENT_BOGUS_USER;
}
}
//---
// Instance helpers
//---
// returns failCount
private int modifyLabel(FedoraClient client, int numTimes) {
System.out.println("Modifying object label via API-M SOAP " + numTimes
+ " times...");
int failCount = 0;
FedoraAPIM apim = null;
for (int i = 0; i < numTimes; i++) {
try {
if (apim == null) {
apim = client.getAPIM();
}
apim.modifyObject(TEST_PID, null, null, null, "i=" + i);
} catch (Exception e) {
failCount++;
}
}
System.out.println("Failed " + failCount + " times");
return failCount;
}
// returns failCount
private int getNextPID(FedoraClient client, int numTimes) {
System.out.println("Getting next PID via API-M Lite " + numTimes
+ " times...");
int failCount = 0;
for (int i = 0; i < numTimes; i++) {
try {
Document result =
getXMLQueryResult(client,
"/management/getNextPID?xml=true");
assertXpathEvaluatesTo("1", "count(/pidList/pid)", result);
} catch (Exception e) {
failCount++;
}
}
System.out.println("Failed " + failCount + " times");
return failCount;
}
// returns failCount
private int listDatastreams(FedoraClient client, int numTimes) {
System.out.println("Listing object datastreams via API-A SOAP "
+ numTimes + " times...");
int failCount = 0;
FedoraAPIA apia = null;
for (int i = 0; i < numTimes; i++) {
try {
if (apia == null) {
apia = client.getAPIA();
}
apia.listDatastreams(TEST_PID, null);
} catch (Exception e) {
failCount++;
}
}
System.out.println("Failed " + failCount + " times");
return failCount;
}
// returns failCount
private int getDCContent(FedoraClient client, int numTimes) {
System.out.println("Getting DC content via API-A Lite " + numTimes
+ " times...");
int failCount = 0;
for (int i = 0; i < numTimes; i++) {
try {
Document result =
getXMLQueryResult(client, "/get/" + TEST_PID + "/DC");
assertXpathExists("/oai_dc:dc", result);
} catch (Exception e) {
failCount++;
}
}
System.out.println("Failed " + failCount + " times");
return failCount;
}
//---
// Command-line entry point
//---
public static void main(String[] args) {
junit.textui.TestRunner.run(TestAuthentication.class);
}
}