/**
* '$RCSfile$'
* Copyright: 2010 Regents of the University of California and the
* National Center for Ecological Analysis and Synthesis
*
* '$Author: tao $'
* '$Date: 2016-09-02 17:58:12 -0900 $'
* '$Revision: 5211 $'
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.ucsb.nceas.metacattest;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.StringReader;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.xml.sax.*;
import edu.ucsb.nceas.metacat.dataone.D1NodeServiceTest;
import edu.ucsb.nceas.MCTestCase;
import edu.ucsb.nceas.metacat.AccessionNumber;
import edu.ucsb.nceas.metacat.AccessionNumberException;
import edu.ucsb.nceas.metacat.IdentifierManager;
import edu.ucsb.nceas.metacat.McdbDocNotFoundException;
import edu.ucsb.nceas.metacat.client.MetacatAuthException;
import edu.ucsb.nceas.metacat.client.MetacatException;
import edu.ucsb.nceas.metacat.client.MetacatInaccessibleException;
import edu.ucsb.nceas.metacat.dataone.CNodeService;
import edu.ucsb.nceas.metacat.dataone.MNodeService;
import org.apache.commons.io.FileUtils;
import org.dataone.service.types.v1.Identifier;
import org.dataone.service.types.v1.ObjectFormatIdentifier;
import org.dataone.service.types.v1.Session;
import org.dataone.service.types.v2.SystemMetadata;
/**
* This test tests some scenarios during Metacat inserting:
* dtd, schema with namespace, schema without namespace and no-dtd/schema.
* @author tao
*
*/
public class MetacatValidationAlgorithmTest extends D1NodeServiceTest {
private static final String UNREGISTERED_SCHEMA_XML_INSTANCE=" "+
" "+
"ToveJaniReminderDon't forget me this weekend!";
private static final String UNREGISTERED_NONAMESPACE_SCHEMA_XML_INSTANCE = " "+
""+
"National Center for Earth Surface Dynamics20160811Shuttle Radar Topography Mission (SRTM)"+
"http://doi.org/10.5967/M09W0CGK";
public MetacatValidationAlgorithmTest (String name) {
super(name);
}
/**
* Create a suite of tests to be run together
*/
public static Test suite() {
TestSuite suite = new TestSuite();
// Test basic functions
suite.addTest(new MetacatValidationAlgorithmTest("testRegisteredDTDDucoment"));
suite.addTest(new MetacatValidationAlgorithmTest("testRegisteredDTDInvalidDucoment"));
suite.addTest(new MetacatValidationAlgorithmTest("testUnRegisteredDTDDucoment"));
suite.addTest(new MetacatValidationAlgorithmTest("testValidationUnneededDucoment"));
suite.addTest(new MetacatValidationAlgorithmTest("testUnregisteredNamespaceSchema"));
suite.addTest(new MetacatValidationAlgorithmTest("testEML201"));
suite.addTest(new MetacatValidationAlgorithmTest("testEML211"));
suite.addTest(new MetacatValidationAlgorithmTest("testRegisteredNamespaceOrFormatIdSchema"));
suite.addTest(new MetacatValidationAlgorithmTest("testUnregisteredNoNamespaceSchema"));
suite.addTest(new MetacatValidationAlgorithmTest("testRegisteredNoNamespaceSchema"));
return suite;
}
/**
* Initialize the connection to metacat, and insert a document to be
* used for testing with a known docid.
*/
public void setUp() throws Exception{
metacatConnectionNeeded = true;
super.setUp();
}
/**
* Insert a test document which's dtd was registered, returning the docid that was used.
*/
public void testRegisteredDTDDucoment() throws Exception {
String xml = FileUtils.readFileToString(new File("./test/jones.204.22.xml"), "UTF-8");
String docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = insertDocumentId(docid, xml, true, false);
assertTrue(response.contains(docid));
} catch (MetacatAuthException e) {
fail(e.getMessage());
} catch (MetacatInaccessibleException e) {
fail(e.getMessage());
}
}
/**
* Insert a test document which's dtd was registered. But the xml doesn't follow the dta and returning an error.
*/
public void testRegisteredDTDInvalidDucoment() throws Exception {
String xml = FileUtils.readFileToString(new File("./test/jones.204.22.xml.invalid"), "UTF-8");
String docid = generateDocumentId() + ".1";
m.login(username, password);
try {
String response = m.insert(docid, new StringReader(xml), null);
fail("we shouldn't get get since we inserted an invalid xml");
} catch (MetacatException e) {
assertTrue(e.getMessage().contains(""));
}
}
/**
* Insert a test document which's dtd was registered. But the xml doesn't follow the dta and returning an error.
*/
public void testUnRegisteredDTDDucoment() throws Exception {
String xml = FileUtils.readFileToString(new File("./test/doc_with_unregister_dtd.xml"), "UTF-8");
String docid = generateDocumentId() + ".1";
m.login(username, password);
try {
String response = m.insert(docid, new StringReader(xml), null);
fail("We can't get since the inserted xml has a unregistered dtd");
} catch (MetacatException e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("isn't registered in Metacat"));
}
}
/**
* Insert test documents which don't need to be validated: with embeded dtd or no declaration at all.
*/
public void testValidationUnneededDucoment() throws Exception {
//with embedded dtd
String xml = FileUtils.readFileToString(new File("./test/doc_with_embedded_dtd.xml"), "UTF-8");
String docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = insertDocumentId(docid, xml, true, false);
assertTrue(response.contains(docid));
} catch (MetacatAuthException e) {
fail(e.getMessage());
} catch (MetacatInaccessibleException e) {
fail(e.getMessage());
}
//without dtd and scheam declaration
xml = FileUtils.readFileToString(new File("./test/doc_without_declaration.xml"), "UTF-8");
docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = insertDocumentId(docid, xml, true, false);
assertTrue(response.contains(docid));
} catch (MetacatAuthException e) {
fail(e.getMessage());
} catch (MetacatInaccessibleException e) {
fail(e.getMessage());
}
}
/**
* Insert a test documents which uses an unregistered namespace
*/
public void testUnregisteredNamespaceSchema() throws Exception {
ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
formatId.setValue("http://www.cuahsi.org/waterML/1.1/");
//Metacat API
String docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(UNREGISTERED_SCHEMA_XML_INSTANCE), null);
fail("We shouldn't get there since the above statement should throw an exception.");
} catch (MetacatException e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("http://www.w3schools.com"));
assertTrue(e.getMessage().contains("not registered"));
}
Thread.sleep(200);
//DaaONEAPI - MN.create
try {
Session session = getTestSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(UNREGISTERED_SCHEMA_XML_INSTANCE.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
} catch (Exception e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("http://www.w3schools.com"));
assertTrue(e.getMessage().contains("not registered"));
}
//DaaONEAPI - CN.create
Thread.sleep(200);
try {
Session session = getCNSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(UNREGISTERED_SCHEMA_XML_INSTANCE.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
} catch(Exception e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("http://www.w3schools.com"));
assertTrue(e.getMessage().contains("not registered"));
}
}
/**
* Test to insert an eml 201 document
* @throws Exception
*/
public void testEML201 () throws Exception{
String title = "it is a test";
String emlVersion = EML2_0_1;
String eml200 = getTestEmlDoc(title, emlVersion);
//System.out.println("the eml document is \n"+eml200);
ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
formatId.setValue("eml://ecoinformatics.org/eml-2.0.1");
//Metacat API
String docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(eml200), null);
assertTrue(response.contains(docid));
} catch (MetacatException e) {
fail("The test failed since "+e.getMessage());
}
Thread.sleep(200);
//DaaONEAPI - MN.create
try {
Session session = getTestSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(eml200.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertTrue(pid.getValue().equals(guid.getValue()));
} catch (Exception e) {
fail("The test failed since "+e.getMessage());
}
//DaaONEAPI - CN.create
Thread.sleep(200);
try {
Session session = getCNSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(eml200.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertTrue(pid.getValue().equals(guid.getValue()));
} catch(Exception e) {
fail("The test failed since "+e.getMessage());
}
//insert a invalid eml 201
String invalidEml2 = eml200.replaceAll("access", "access1");
//System.out.println(""+invalidEml2);
docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(invalidEml2), null);
fail("We can't get here since the document is invalid.");
} catch (MetacatException e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("access1"));
}
}
/**
* Test to insert an eml 211 document
* @throws Exception
*/
public void testEML211 () throws Exception{
String title = "it is a test";
String emlVersion = EML2_1_1;
String eml211 = getTestEmlDoc(title, emlVersion);
System.out.println("the eml document is \n"+eml211);
ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
formatId.setValue("eml://ecoinformatics.org/eml-2.1.1");
//Metacat API
String docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(eml211), null);
assertTrue(response.contains(docid));
} catch (MetacatException e) {
fail("The test failed since "+e.getMessage());
}
Thread.sleep(200);
//DaaONEAPI - MN.create
try {
Session session = getTestSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(eml211.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertTrue(pid.getValue().equals(guid.getValue()));
} catch (Exception e) {
fail("The test failed since "+e.getMessage());
}
//DaaONEAPI - CN.create
Thread.sleep(200);
try {
Session session = getCNSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(eml211.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertTrue(pid.getValue().equals(guid.getValue()));
} catch(Exception e) {
fail("The test failed since "+e.getMessage());
}
//insert a invalid eml 201
String invalidEml2 = eml211.replaceAll("access", "access1");
//System.out.println(""+invalidEml2);
docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(invalidEml2), null);
fail("We can't get here since the document is invalid.");
} catch (MetacatException e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("access1"));
}
}
/**
* Test to insert a non-eml document but its namespace is registered.
* @throws Exception
*/
public void testRegisteredNamespaceOrFormatIdSchema() throws Exception {
String xml = FileUtils.readFileToString(new File("./test/dryad-metadata-profile-sample.xml"), "UTF-8");
ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
formatId.setValue("http://datadryad.org/profile/v3.1");
//Metacat API
String docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(xml), null);
assertTrue(response.contains(docid));
} catch (MetacatException e) {
fail("The test failed since "+e.getMessage());
}
Thread.sleep(200);
//DaaONEAPI - MN.create
try {
Session session = getTestSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(xml.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertTrue(pid.getValue().equals(guid.getValue()));
} catch (Exception e) {
fail("The test failed since "+e.getMessage());
}
//DaaONEAPI - CN.create
Thread.sleep(200);
try {
Session session = getCNSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(xml.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertTrue(pid.getValue().equals(guid.getValue()));
} catch(Exception e) {
fail("The test failed since "+e.getMessage());
}
//insert a invalid dryad
String invalidXml = FileUtils.readFileToString(new File("./test/dryad-metadata-profile-invalid.xml"), "UTF-8");
//System.out.println(""+invalidEml2);
docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(invalidXml), null);
fail("We can't get here since the document is invalid.");
} catch (MetacatException e) {
assertTrue(e.getMessage().contains("bad"));
assertTrue(e.getMessage().contains(""));
}
}
public void testUnregisteredNoNamespaceSchema() throws Exception {
ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
formatId.setValue("www.fgdc.gov/foo/");
String xml = UNREGISTERED_NONAMESPACE_SCHEMA_XML_INSTANCE;
//Metacat API
String docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(xml), null);
fail("We shouldn't get there since the above statement should throw an exception.");
} catch (MetacatException e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("http://www.fgdc.gov/metadata/foo.xsd"));
assertTrue(e.getMessage().contains("not registered"));
}
Thread.sleep(200);
//DaaONEAPI - MN.create
try {
Session session = getTestSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(UNREGISTERED_NONAMESPACE_SCHEMA_XML_INSTANCE.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
} catch (Exception e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("www.fgdc.gov/foo/"));
assertTrue(e.getMessage().contains("http://www.fgdc.gov/metadata/foo.xsd"));
assertTrue(e.getMessage().contains("not registered"));
}
//DaaONEAPI - CN.create
Thread.sleep(200);
try {
Session session = getCNSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(UNREGISTERED_NONAMESPACE_SCHEMA_XML_INSTANCE.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
} catch(Exception e) {
assertTrue(e.getMessage().contains(""));
assertTrue(e.getMessage().contains("www.fgdc.gov/foo/"));
assertTrue(e.getMessage().contains("http://www.fgdc.gov/metadata/foo.xsd"));
assertTrue(e.getMessage().contains("not registered"));
}
}
public void testRegisteredNoNamespaceSchema() throws Exception {
String xml = FileUtils.readFileToString(new File("./test/fgdc.xml"), "UTF-8");
ObjectFormatIdentifier formatId = new ObjectFormatIdentifier();
formatId.setValue("FGDC-STD-001-1998");
//Metacat API
String docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(xml), null);
assertTrue(response.contains(docid));
} catch (MetacatException e) {
fail("The test failed since "+e.getMessage());
}
Thread.sleep(200);
//DaaONEAPI - MN.create
try {
Session session = getTestSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(xml.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertTrue(pid.getValue().equals(guid.getValue()));
} catch (Exception e) {
fail("The test failed since "+e.getMessage());
}
//DaaONEAPI - CN.create
Thread.sleep(200);
try {
Session session = getCNSession();
Identifier guid = new Identifier();
guid.setValue("testCreate." + System.currentTimeMillis());
InputStream object = new ByteArrayInputStream(xml.getBytes("UTF-8"));
SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
sysmeta.setFormatId(formatId);
Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
assertTrue(pid.getValue().equals(guid.getValue()));
} catch(Exception e) {
fail("The test failed since "+e.getMessage());
}
//insert a invalid fgdc
String invalidXml = xml.replace("metadata", "metadata1");
//System.out.println(""+invalidEml2);
docid = generateDocumentId() + ".1";
try {
m.login(username, password);
String response = m.insert(docid, new StringReader(invalidXml), null);
fail("We can't get here since the document is invalid.");
} catch (MetacatException e) {
assertTrue(e.getMessage().contains("metadata1"));
assertTrue(e.getMessage().contains(""));
}
}
}