/* 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.validation; import java.io.IOException; import org.junit.Test; import org.xml.sax.SAXException; import junit.framework.JUnit4TestAdapter; import fedora.common.FaultException; import fedora.common.PID; import fedora.server.ReadOnlyContext; import fedora.server.errors.ValidationException; import fedora.server.security.MockPolicyParser; import fedora.server.security.PolicyParser; import fedora.server.storage.DOReader; import fedora.server.storage.MockRepositoryReader; import fedora.server.storage.types.BasicDigitalObject; import fedora.server.storage.types.DigitalObject; import fedora.server.storage.types.ObjectBuilder; import fedora.server.utilities.StreamUtility; import static fedora.server.security.TestPolicyParser.POLICY_GOODENOUGH; import static fedora.server.security.TestPolicyParser.POLICY_QUESTIONABLE; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * Unit tests for ValidationUtility. */ public class ValidationUtilityTest { private static final String TEST_PID = "test:1"; private static final String RELSEXT_GOOD = "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#\'\n" + " xmlns:rel='info:fedora/fedora-system:def/relations-external#'>\n" + " <rdf:Description rdf:about='info:fedora/" + TEST_PID + "'>\n" + " <rel:isMemberOf rdf:resource='info:fedora/test:X'/>\n" + " </rdf:Description>\n" + "</rdf:RDF>"; private static final String RELSINT_GOOD = "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#\'\n" + " xmlns:foo='http://www.example.org/bar#'>\n" + " <rdf:Description rdf:about='info:fedora/" + TEST_PID + "/DS1" + "'>\n" + " <foo:baz rdf:resource='info:fedora/test:X'/>\n" + " </rdf:Description>\n" + " <rdf:Description rdf:about='info:fedora/" + TEST_PID + "/DS2" + "'>\n" + " <foo:qux>quux</foo:qux>\n" + " </rdf:Description>\n" + "</rdf:RDF>"; private final String tmpDir = System.getProperty("java.io.tmpdir"); @Test public void testValidUrls() throws Exception { String[] urls_managed = {"http://localhost", "http://localhost:8080", "uploaded:///tmp/foo.xml", "file:///etc/passwd", "file:/etc/passwd" }; for (String url : urls_managed) { ValidationUtility.validateURL(url,"M"); } String[] urls = {"http://localhost", "http://localhost:8080", "uploaded:///tmp/foo.xml", }; for (String url : urls) { ValidationUtility.validateURL(url,"M"); } } @Test public void testInvalidUrls(){ String[] urls_management = {"", "a", "temp:///etc/passwd", "copy:///etc/passwd", "temp://" + tmpDir + "/../etc/passwd", "temp://" + tmpDir + "/../../etc/passwd", "/etc/passwd", "../../etc/passwd"}; for (String url : urls_management) { try { ValidationUtility.validateURL(url,"M"); } catch (Exception e) { assertTrue("Expected Exception of type " + ValidationException.class.getName() + " but got: " + e.getClass().getName(), e.getClass().getName() .equals(ValidationException.class.getName())); continue; } fail("Expected " + ValidationException.class.getName() + " for URL:" + url + " but got none"); } String[] urls = {"", "a", "temp:///etc/passwd", "copy:///etc/passwd", "temp://" + tmpDir + "/../etc/passwd", "temp://" + tmpDir + "/../../etc/passwd", "/etc/passwd", "../../etc/passwd", "file:///etc/passwd", "file:/etc/passwd"}; for (String url : urls) { try { ValidationUtility.validateURL(url,"R"); } catch (Exception e) { assertTrue("Expected Exception of type " + ValidationException.class.getName() + " but got: " + e.getClass().getName(), e.getClass().getName() .equals(ValidationException.class.getName())); continue; } fail("Expected " + ValidationException.class.getName() + " for URL:" + url + " but got none"); } } @Test(expected=NullPointerException.class) public void testValidatePolicyParserNotSet() throws IOException, SAXException, ValidationException { validatePolicy(null, POLICY_GOODENOUGH); } @Test(expected=ValidationException.class) public void testValidatePolicyBad() throws IOException, SAXException, ValidationException { validatePolicy(new MockPolicyParser(), POLICY_QUESTIONABLE); } @Test public void testValidatePolicyGood() throws IOException, SAXException, ValidationException { validatePolicy(new MockPolicyParser(), POLICY_GOODENOUGH); } @Test(expected=ValidationException.class) public void testValidateRelsExtBad() throws ValidationException { validateRels("RELS-EXT", ""); } @Test(expected=ValidationException.class) public void testValidateRelsIntBad() throws ValidationException { validateRels("RELS-INT", ""); } @Test public void testValidateRelsExtGood() throws ValidationException { validateRels("RELS-EXT", RELSEXT_GOOD); } @Test public void testValidateRelsIntGood() throws ValidationException { validateRels("RELS-INT", RELSINT_GOOD); } @Test public void testValidateReservedNone() throws ValidationException { validateReserved(null, new String[] { }); } @Test(expected=ValidationException.class) public void testValidateReservedPolicyBad() throws IOException, SAXException, ValidationException { validateReserved(new MockPolicyParser(), new String[] { "POLICY", POLICY_QUESTIONABLE }); } @Test public void testValidateReservedPolicyGood() throws IOException, SAXException, ValidationException { validateReserved(new MockPolicyParser(), new String[] { "POLICY", POLICY_GOODENOUGH }); } @Test(expected=ValidationException.class) public void testValidateReservedRelsExtBad() throws IOException, SAXException, ValidationException { validateReserved(new MockPolicyParser(), new String[] { "RELS-EXT", "" }); } @Test(expected=ValidationException.class) public void testValidateReservedRelsIntBad() throws IOException, SAXException, ValidationException { validateReserved(new MockPolicyParser(), new String[] { "RELS-INT", "" }); } @Test public void testValidateReservedRelsExtGood() throws IOException, SAXException, ValidationException { validateReserved(new MockPolicyParser(), new String[] { "RELS-EXT", RELSEXT_GOOD }); } @Test public void testValidateReservedRelsIntGood() throws IOException, SAXException, ValidationException { validateReserved(new MockPolicyParser(), new String[] { "RELS-INT", RELSINT_GOOD }); } @Test public void testValidateReservedAllGood() throws IOException, SAXException, ValidationException { validateReserved(new MockPolicyParser(), new String[] { "POLICY", POLICY_GOODENOUGH, "RELS-EXT", RELSEXT_GOOD, "RELS-INT", RELSINT_GOOD}); } private static void validatePolicy(PolicyParser parser, String policy) throws IOException, SAXException, ValidationException { ValidationUtility.setPolicyParser(parser); ValidationUtility.validateReservedDatastream(PID.getInstance(TEST_PID), "POLICY", StreamUtility.getStream(policy)); } private static void validateRels(String dsId, String rels) throws ValidationException { ValidationUtility.validateReservedDatastream(PID.getInstance(TEST_PID), dsId, StreamUtility.getStream(rels)); } private static void validateReserved(PolicyParser parser, String[] dsData) throws ValidationException { ValidationUtility.setPolicyParser(parser); ValidationUtility.validateReservedDatastreams(getDOReader(dsData)); } private static DOReader getDOReader(String[] dsData) { MockRepositoryReader repo = new MockRepositoryReader(); try { DigitalObject obj = new BasicDigitalObject(); obj.setPid(TEST_PID); for (int i = 0; i < dsData.length; i+=2) { ObjectBuilder.addXDatastream(obj, dsData[i], dsData[i+1]); } repo.putObject(obj); DOReader reader = repo.getReader(false, ReadOnlyContext.EMPTY, TEST_PID); return reader; } catch (Exception wontHappen) { throw new FaultException(wontHappen); } } public static junit.framework.Test suite() { return new JUnit4TestAdapter(ValidationUtilityTest.class); } }