/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.rdfxml.xmlinput;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.jena.ontology.OntDocumentManager ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.rdf.model.ModelFactory ;
import org.apache.jena.rdfxml.xmlinput.ARPErrorNumbers ;
import org.apache.jena.rdfxml.xmlinput.NTriple ;
import org.apache.jena.rdfxml.xmlinput.ParseException ;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXParseException;
public class TaintingTests extends TestCase implements ErrorHandler,
ARPErrorNumbers {
static String promoteWarnings[] =
{
"WARN_UNQUALIFIED_ATTRIBUTE",
"WARN_UNKNOWN_RDF_ATTRIBUTE",
"WARN_REDEFINITION_OF_ID",
"WARN_UNKNOWN_PARSETYPE",
"WARN_MALFORMED_URI",
"WARN_BAD_NAME",
"WARN_RELATIVE_URI",
"WARN_BAD_XMLLANG",
};
static String files[] = {
"testing/arp/syntax-errors/error001.rdf",
"testing/arp/syntax-errors/error002.rdf",
"testing/arp/syntax-errors/error003.rdf",
"testing/wg/rdf-charmod-literals/error001.rdf",
"testing/wg/rdf-charmod-literals/error002.rdf",
"testing/wg/rdf-charmod-uris/error001.rdf",
"testing/wg/rdf-containers-syntax-vs-schema/error001.rdf",
"testing/wg/rdf-containers-syntax-vs-schema/error002.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0001.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0002.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0003.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0004.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0005.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0006.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0007.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0008.rdf",
"testing/wg/rdf-ns-prefix-confusion/error0009.rdf",
"testing/wg/rdfms-abouteach/error001.rdf",
"testing/wg/rdfms-abouteach/error002.rdf",
"testing/wg/rdfms-difference-between-ID-and-about/error1.rdf",
"testing/wg/rdfms-empty-property-elements/error001.rdf",
"testing/wg/rdfms-empty-property-elements/error002.rdf",
"testing/wg/rdfms-empty-property-elements/error003.rdf",
"testing/wg/rdfms-parseType/error001.rdf",
"testing/wg/rdfms-parseType/error002.rdf",
"testing/wg/rdfms-parseType/error003.rdf",
"testing/wg/rdfms-rdf-id/error001.rdf",
"testing/wg/rdfms-rdf-id/error002.rdf",
"testing/wg/rdfms-rdf-id/error003.rdf",
"testing/wg/rdfms-rdf-id/error004.rdf",
"testing/wg/rdfms-rdf-id/error005.rdf",
"testing/wg/rdfms-rdf-id/error006.rdf",
"testing/wg/rdfms-rdf-id/error007.rdf",
"testing/wg/rdfms-rdf-names-use/error-001.rdf",
"testing/wg/rdfms-rdf-names-use/error-002.rdf",
"testing/wg/rdfms-rdf-names-use/error-003.rdf",
"testing/wg/rdfms-rdf-names-use/error-004.rdf",
"testing/wg/rdfms-rdf-names-use/error-005.rdf",
"testing/wg/rdfms-rdf-names-use/error-006.rdf",
"testing/wg/rdfms-rdf-names-use/error-007.rdf",
"testing/wg/rdfms-rdf-names-use/error-008.rdf",
"testing/wg/rdfms-rdf-names-use/error-009.rdf",
"testing/wg/rdfms-rdf-names-use/error-010.rdf",
"testing/wg/rdfms-rdf-names-use/error-011.rdf",
"testing/wg/rdfms-rdf-names-use/error-012.rdf",
"testing/wg/rdfms-rdf-names-use/error-013.rdf",
"testing/wg/rdfms-rdf-names-use/error-014.rdf",
"testing/wg/rdfms-rdf-names-use/error-015.rdf",
"testing/wg/rdfms-rdf-names-use/error-016.rdf",
"testing/wg/rdfms-rdf-names-use/error-017.rdf",
"testing/wg/rdfms-rdf-names-use/error-018.rdf",
"testing/wg/rdfms-rdf-names-use/error-019.rdf",
"testing/wg/rdfms-rdf-names-use/error-020.rdf",
"testing/wg/rdfms-syntax-incomplete/error001.rdf",
"testing/wg/rdfms-syntax-incomplete/error002.rdf",
"testing/wg/rdfms-syntax-incomplete/error003.rdf",
"testing/wg/rdfms-syntax-incomplete/error004.rdf",
"testing/wg/rdfms-syntax-incomplete/error005.rdf",
"testing/wg/rdfms-syntax-incomplete/error006.rdf",
"testing/wg/xmlbase/error001.rdf",
"testing/arp/tainting/base.rdf",
"testing/arp/tainting/lang.rdf",
"testing/arp/tainting/ptUnknown.rdf",
"testing/arp/tainting/typedLiteral.rdf",
"testing/arp/tainting/typedNode.rdf",
"testing/arp/tainting/property.rdf",
"testing/arp/tainting/collection.rdf",
"testing/arp/tainting/propValueA.rdf",
"testing/arp/tainting/propValueB.rdf",
"testing/arp/tainting/propValueC.rdf",
"testing/arp/tainting/propValueD.rdf",
"testing/arp/tainting/propValueE.rdf",
};
static public Test suite() {
TestSuite suite = new TestSuite("ARP Tainting");
for ( String file : files )
{
suite.addTest( new TaintingTests( file ) );
}
suite.addTest(new TaintingTests("testing/arp/tainting/base.rdf",
badBase,
"testing/arp/tainting/base-with-bad-base-good.nt",
"testing/arp/tainting/base-with-bad-base-bad.nt"));
return suite;
}
final String fileName;
final String base;
final String goodTriples;
final String badTriples;
static final String badBase = "http://ww^w/";
public TaintingTests(String s) {
this(s,"http://example.org/",makeGood(s),makeBad(s));
}
static String makeGood(String s) {
return s.substring(0,s.length()-4)+"-good.nt";
}
static String makeBad(String s) {
return s.substring(0,s.length()-4)+"-bad.nt";
}
public TaintingTests(String s, String b, String good, String bad) {
super(s.substring(8));
fileName = s;
base = b;
goodTriples = good;
badTriples = bad;
}
protected Model createMemModel() {
return ModelFactory.createDefaultModel();
}
@Override
public void setUp() {
// ensure the ont doc manager is in a consistent state
OntDocumentManager.getInstance().reset(true);
}
@Override
public void runTest() throws IOException {
ByteArrayOutputStream goodBytes = new ByteArrayOutputStream();
ByteArrayOutputStream badBytes = new ByteArrayOutputStream();
PrintStream oldOut = System.out;
PrintStream oldErr = System.err;
try (PrintStream out = new PrintStream(goodBytes); PrintStream err = new PrintStream(badBytes); ) {
System.setOut(out);
System.setErr(err);
NTriple.mainEh(new String[]{"-e","102,136,105,103,108,107,116,106,004,131",
"-E","-b",base,fileName},this,null);
}
finally {
System.setErr(oldErr);
System.setOut(oldOut);
}
InputStream good = new ByteArrayInputStream(goodBytes.toByteArray());
InputStream bad = new ByteArrayInputStream(badBytes.toByteArray());
compare(good,goodTriples);
compare(bad,badTriples);
}
private void compare(InputStream in, String filen) throws IOException {
Model m1 = this.createMemModel();
Model m2 = this.createMemModel();
m1.read(in,"","N-TRIPLES");
m2.read(new FileInputStream(filen),"","N-TRIPLES");
boolean isomorphicWith = m1.isIsomorphicWith(m2);
if (!isomorphicWith) {
System.err.println("Found Triples:");
System.err.println("===");
m1.write(System.err,"N-TRIPLES");
System.err.println("===");
System.err.println("Expected Triples:");
System.err.println("===");
m2.write(System.err,"N-TRIPLES");
System.err.println("===");
}
assertTrue("Triples were not as expected.",isomorphicWith);
}
static public boolean seen[] = new boolean[400];
@Override
public void warning(SAXParseException e) {
int eNo =((ParseException)e).getErrorNumber();
if (!seen[eNo]) {
seen[((ParseException)e).getErrorNumber()] = true;
System.out.print(eNo+", ");
System.err.println(e.getMessage());
}
}
@Override
public void error(SAXParseException e) {
}
@Override
public void fatalError(SAXParseException e) {
}
}