You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2015/02/20 15:16:19 UTC

svn commit: r1661129 - in /tika/trunk: ./ tika-parsers/src/test/java/org/apache/tika/ tika-parsers/src/test/java/org/apache/tika/parser/evil/ tika-parsers/src/test/resources/META-INF/ tika-parsers/src/test/resources/META-INF/services/ tika-parsers/src/...

Author: tallison
Date: Fri Feb 20 14:16:18 2015
New Revision: 1661129

URL: http://svn.apache.org/r1661129
Log:
TIKA-1553: add an EvilParser for testing purposes

Added:
    tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/
    tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParser.java
    tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParserTest.java
    tika/trunk/tika-parsers/src/test/resources/META-INF/
    tika/trunk/tika-parsers/src/test/resources/META-INF/services/
    tika/trunk/tika-parsers/src/test/resources/META-INF/services/org.apache.tika.parser.Parser
    tika/trunk/tika-parsers/src/test/resources/org/
    tika/trunk/tika-parsers/src/test/resources/org/apache/
    tika/trunk/tika-parsers/src/test/resources/org/apache/tika/
    tika/trunk/tika-parsers/src/test/resources/org/apache/tika/mime/
    tika/trunk/tika-parsers/src/test/resources/org/apache/tika/mime/custom-mimetypes.xml
    tika/trunk/tika-parsers/src/test/resources/test-documents/evil/
    tika/trunk/tika-parsers/src/test/resources/test-documents/evil/fake_oom.evil
    tika/trunk/tika-parsers/src/test/resources/test-documents/evil/heavy_hang.evil
    tika/trunk/tika-parsers/src/test/resources/test-documents/evil/nothing_bad.evil
    tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer.evil
    tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer_no_msg.evil
    tika/trunk/tika-parsers/src/test/resources/test-documents/evil/real_oom.evil
    tika/trunk/tika-parsers/src/test/resources/test-documents/evil/sleep.evil
Modified:
    tika/trunk/CHANGES.txt
    tika/trunk/tika-parsers/src/test/java/org/apache/tika/TikaTest.java

Modified: tika/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/tika/trunk/CHANGES.txt?rev=1661129&r1=1661128&r2=1661129&view=diff
==============================================================================
--- tika/trunk/CHANGES.txt (original)
+++ tika/trunk/CHANGES.txt Fri Feb 20 14:16:18 2015
@@ -1,10 +1,13 @@
 Release 1.8 - Current Development
 
+  * Added EvilParser for testing handling of exceptions, errors
+    and hangs in code that uses parsers. (TIKA-1533)
+
   * Increased the speed of language identification by 
     a factor of two. (TIKA-1549)
 
   * Added parser for Sqlite3 db files. Users need to add
-    org.xerial's sqlite-jdbc to their classpath.  Tika is not
+    org.xerial's sqlite-jdbc to their classpath!!!  Tika is not
     currently bundling that dependency. (TIKA-1511)
 
   * Use POST instead of PUT for tika-server form methods.

Modified: tika/trunk/tika-parsers/src/test/java/org/apache/tika/TikaTest.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/java/org/apache/tika/TikaTest.java?rev=1661129&r1=1661128&r2=1661129&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/test/java/org/apache/tika/TikaTest.java (original)
+++ tika/trunk/tika-parsers/src/test/java/org/apache/tika/TikaTest.java Fri Feb 20 14:16:18 2015
@@ -16,17 +16,9 @@
  */
 package org.apache.tika;
 
-import org.apache.tika.extractor.EmbeddedResourceHandler;
-import org.apache.tika.io.IOUtils;
-import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.mime.MediaType;
-import org.apache.tika.parser.AutoDetectParser;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.parser.Parser;
-import org.apache.tika.sax.BodyContentHandler;
-import org.apache.tika.sax.ToXMLContentHandler;
-import org.xml.sax.ContentHandler;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -39,9 +31,17 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import org.apache.tika.extractor.EmbeddedResourceHandler;
+import org.apache.tika.io.IOUtils;
+import org.apache.tika.io.TikaInputStream;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MediaType;
+import org.apache.tika.parser.AutoDetectParser;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.Parser;
+import org.apache.tika.sax.BodyContentHandler;
+import org.apache.tika.sax.ToXMLContentHandler;
+import org.xml.sax.ContentHandler;
 
 /**
  * Parent class of Tika tests
@@ -99,6 +99,10 @@ public abstract class TikaTest {
         }
     }
 
+    protected XMLResult getXML(String filePath, Metadata metadata) throws Exception {
+        return getXML(getResourceAsStream("/test-documents/" + filePath), new AutoDetectParser(), metadata);
+    }
+
     protected XMLResult getXML(String filePath) throws Exception {
         return getXML(getResourceAsStream("/test-documents/" + filePath), new AutoDetectParser(), new Metadata());
     }

Added: tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParser.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParser.java?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParser.java (added)
+++ tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParser.java Fri Feb 20 14:16:18 2015
@@ -0,0 +1,228 @@
+package org.apache.tika.parser.evil;
+
+/*
+ * 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.
+ */
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.io.IOUtils;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MediaType;
+import org.apache.tika.parser.AbstractParser;
+import org.apache.tika.parser.ParseContext;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * Parser to be used only for testing wrappers and drivers of Parsers.
+ * <p>
+ * This class enables tests for handling parsers that run into problems.
+ */
+
+public class EvilParser extends AbstractParser {
+
+    private static final long serialVersionUID = 1L;
+
+    //NOTE: these are just regexes, attributes must be in proper order!
+
+    //<throwable message="some message">java.lang.SomeException</throwable>
+    //<throwable>java.lang.SomeException</throwable>
+    private static final Pattern THROWABLE =
+            Pattern.compile("<throwable(?:\\s*message=\"([^\"]+)\")?\\s*>([^<>]+)</throwable>");
+
+    //<hang type="heavy" max_millis="1000" pulse_check_millis="100000000"/>
+    //<hang type="sleep" max_millis="1000"/>
+    private static final Pattern HANG =
+            Pattern.compile("<hang type=\"(heavy|sleep)\"\\s+max_millis=\"(\\d+)\"(?:\\s+pulse_check_millis=\"(\\d+)\")?\\s*/>");
+
+    //<real_oom/>
+    private final static Pattern REAL_OOM = Pattern.compile("<real_oom/>");
+
+
+    @Override
+    public Set<MediaType> getSupportedTypes(ParseContext context) {
+        Set<MediaType> types = new HashSet<MediaType>();
+        MediaType type = MediaType.application("evil");
+        types.add(type);
+        return types;
+    }
+
+    @Override
+    public void parse(InputStream stream, ContentHandler handler,
+                      Metadata metadata, ParseContext context) throws IOException,
+            SAXException, TikaException {
+        String content = IOUtils.toString(stream, IOUtils.UTF_8.toString());
+
+        Matcher hangMatcher = HANG.matcher(content);
+        if (hangMatcher.find()) {
+            handleHang(hangMatcher);
+            handle(content, handler);
+            return;
+        }
+        Matcher throwableMatcher = THROWABLE.matcher(content);
+        if (throwableMatcher.find()) {
+            String msg = throwableMatcher.group(1);
+            String throwableClass = throwableMatcher.group(2);
+            throwIt(throwableClass, msg);
+            //exception should have been thrown by now
+            assert(false);
+        }
+
+        Matcher realOOM = REAL_OOM.matcher(content);
+        if (realOOM.find()) {
+            kabOOM();
+        }
+
+        //if there has been no trigger, treat as
+        //regular utf-8 text file
+        handle(content, handler);
+
+    }
+
+    private void handleHang(Matcher hangMatcher) {
+        String hangType = hangMatcher.group(1);
+
+        if (hangMatcher.group(2) == null) {
+            throw new RuntimeException("must specify max_millis attribute in <hang>");
+        }
+
+        long maxMillis = parseLong(hangMatcher.group(2));
+        if ("heavy".equals(hangType)) {
+            if (hangMatcher.group(3) == null) {
+                throw new RuntimeException("must specify pulse_check_millis attribute in <hang> when type is heavy");
+            }
+            long heavyHangPulseMillis = parseLong(hangMatcher.group(3));
+            hangHeavy(maxMillis, heavyHangPulseMillis);
+        } else if ("sleep".equals(hangType)) {
+            sleep(maxMillis);
+        } else {
+            throw new RuntimeException("need to specify heavy|sleep as value to type attribute for <hang>");
+        }
+
+    }
+
+    private long parseLong(String s) {
+        long millis = -1;
+        try {
+            millis = Long.parseLong(s);
+        } catch (NumberFormatException e) {
+            //shouldn't happen unless something goes wrong w regex
+            throw new RuntimeException("Problem in regex parsing sleep duration");
+        }
+        return millis;
+    }
+
+    private void throwIt(String className, String msg) throws IOException,
+            SAXException, TikaException {
+        Throwable t = null;
+        if (msg == null) {
+            try {
+                t = (Throwable) Class.forName(className).newInstance();
+            } catch (Exception e) {
+                throw new RuntimeException("couldn't create throwable class:"+className, e);
+            }
+        } else {
+            try {
+                Class clazz = Class.forName(className);
+                Constructor con = clazz.getConstructor(String.class);
+                t = (Throwable) con.newInstance(msg);
+            } catch (Exception e) {
+                throw new RuntimeException("couldn't create throwable class:" + className, e);
+            }
+        }
+        if (t instanceof SAXException) {
+            throw (SAXException)t;
+        } else if (t instanceof IOException) {
+            throw (IOException) t;
+        } else if (t instanceof TikaException) {
+            throw (TikaException) t;
+        } else if (t instanceof Error) {
+            throw (Error) t;
+        } else if (t instanceof RuntimeException) {
+            throw (RuntimeException) t;
+        } else {
+            //wrap the throwable in a RuntimeException
+            throw new RuntimeException(t);
+        }
+    }
+
+    private void handle(String content, ContentHandler handler) throws SAXException {
+
+        handler.startDocument();
+        Attributes attrs = new AttributesImpl();
+        handler.startElement("", "body", "body", attrs);
+        handler.startElement("", "p", "p", attrs);
+        char[] charArr = content.toCharArray();
+        handler.characters(charArr, 0, charArr.length);
+        handler.endElement("", "p", "p");
+        handler.endElement("", "body", "body");
+        handler.endDocument();
+
+    }
+
+    private void kabOOM() {
+        List<int[]> ints = new ArrayList<int[]>();
+
+        while (true) {
+            int[] intArr = new int[32000];
+            ints.add(intArr);
+        }
+    }
+
+    private void hangHeavy(long maxMillis, long pulseCheckMillis) {
+        //do some heavy computation and occasionally check for
+        //whether time has exceeded maxMillis. see TIKA-1132 for inspiration
+        long start = new Date().getTime();
+        int lastChecked = 0;
+        while (true) {
+            for (int i = 1; i < Integer.MAX_VALUE; i++) {
+                for (int j = 1; j < Integer.MAX_VALUE; j++) {
+                    double div = (double) i / (double) j;
+                    lastChecked++;
+                    if (lastChecked > pulseCheckMillis) {
+                        lastChecked = 0;
+                        long elapsed = new Date().getTime()-start;
+                        if (elapsed > maxMillis) {
+                            return;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void sleep(long maxMillis) {
+        try {
+            Thread.sleep(maxMillis);
+        } catch (InterruptedException e) {
+
+        }
+    }
+}
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParserTest.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParserTest.java?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParserTest.java (added)
+++ tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/evil/EvilParserTest.java Fri Feb 20 14:16:18 2015
@@ -0,0 +1,159 @@
+package org.apache.tika.parser.evil;
+
+/*
+ * 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.
+ */
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNull;
+import static junit.framework.TestCase.assertTrue;
+
+import java.util.Date;
+
+import org.apache.tika.TikaTest;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.junit.Test;
+
+public class EvilParserTest extends TikaTest {
+
+    @Test
+    public void testNothingBad() throws Exception {
+        //For use cases that need to modify the mime types and potentially
+        //pass a non-evil document through the EvilParser.
+
+        Metadata m = new Metadata();
+        //need to set resource name so that detector can work
+        m.set(Metadata.RESOURCE_NAME_KEY, "nothing_bad.evil");
+        String content = getXML("evil/nothing_bad.evil", m).xml;
+
+        assertContains("Whan that Aprille", content);
+        assertEvilParser(m);
+    }
+
+    @Test
+    public void testNullPointer() throws Exception {
+        Metadata m = new Metadata();
+        //need to set resource name so that detector can work
+        m.set(Metadata.RESOURCE_NAME_KEY, "null_pointer.evil");
+        boolean ex = false;
+        try {
+            String content = getXML("evil/null_pointer.evil", m).xml;
+            //runtime exceptions are wrapped in a TikaException by CompositeParser
+        } catch (TikaException e) {
+            if (e.getCause() != null && e.getCause() instanceof java.lang.NullPointerException) {
+                String msg = e.getCause().getMessage();
+                assertEquals("null pointer message", msg);
+                ex = true;
+            }
+        }
+        assertTrue("NullPointerException", ex);
+    }
+
+    @Test
+    public void testNullPointerNoMsg() throws Exception {
+        Metadata m = new Metadata();
+        //need to set resource name so that detector can work
+        m.set(Metadata.RESOURCE_NAME_KEY, "null_pointer_no_msg.evil");
+        boolean ex = false;
+        try {
+            String content = getXML("evil/null_pointer_no_msg.evil", m).xml;
+            //runtime exceptions are wrapped in a TikaException by CompositeParser
+        } catch (TikaException e) {
+            if (e.getCause() != null && e.getCause() instanceof java.lang.NullPointerException) {
+                String msg = e.getCause().getMessage();
+                assertNull(msg);
+                ex = true;
+            }
+        }
+        assertTrue("NullPointerException with no msg", ex);
+    }
+
+
+    @Test
+    public void testSleep() throws Exception {
+        long start = new Date().getTime();
+        Metadata m = new Metadata();
+        //need to set resource name so that detector can work
+        m.set(Metadata.RESOURCE_NAME_KEY, "sleep.evil");
+        String content = getXML("evil/sleep.evil", m).xml;
+        assertEvilParser(m);
+        long elapsed = new Date().getTime()-start;
+        //should sleep for at least 3000
+        boolean enoughTimeHasElapsed = elapsed > 2000;
+        assertTrue("enough time has not elapsed: "+elapsed, enoughTimeHasElapsed);
+    }
+
+    @Test
+    public void testHeavyHang() throws Exception {
+        long start = new Date().getTime();
+        Metadata m = new Metadata();
+        //need to set resource name so that detector can work
+        m.set(Metadata.RESOURCE_NAME_KEY, "heavy_hang.evil");
+        String content = getXML("evil/heavy_hang.evil", m).xml;
+        assertEvilParser(m);
+        long elapsed = new Date().getTime()-start;
+        //should sleep for at least 3000
+        boolean enoughTimeHasElapsed = elapsed > 2000;
+        assertTrue("enough time has elapsed: "+elapsed, enoughTimeHasElapsed);
+    }
+
+    @Test
+    public void testFakeOOM() throws Exception {
+        Metadata m = new Metadata();
+        //need to set resource name so that detector can work
+        m.set(Metadata.RESOURCE_NAME_KEY, "fake_oom.evil");
+        boolean ex = false;
+        try {
+            String content = getXML("evil/fake_oom.evil", m).xml;
+        } catch (OutOfMemoryError e) {
+            assertEquals("fake oom", e.getMessage());
+            ex = true;
+        }
+        assertTrue("Fake oom", ex);
+    }
+
+    @Test
+    public void testRealOOM() throws Exception {
+        //this doesn't actually test real oom, but
+        //only relies on the message
+
+        Metadata m = new Metadata();
+        //need to set resource name so that detector can work
+        m.set(Metadata.RESOURCE_NAME_KEY, "real_oom.evil");
+        boolean ex = false;
+        try {
+            String content = getXML("evil/real_oom.evil", m).xml;
+        } catch (OutOfMemoryError e) {
+            assertContains("Java heap space", e.getMessage());
+            ex = true;
+        }
+        assertTrue("Real oom", ex);
+    }
+
+    private void assertEvilParser(Metadata m) {
+        String[] parsers = m.getValues("X-Parsed-By");
+        //make sure that it was actually parsed by evil.
+        boolean parsedByEvil = false;
+        for (String parser : parsers) {
+            if (parser.equals("org.apache.tika.parser.evil.EvilParser")) {
+                parsedByEvil = true;
+                break;
+            }
+        }
+        assertTrue("evil parser should have been called", parsedByEvil);
+    }
+}

Added: tika/trunk/tika-parsers/src/test/resources/META-INF/services/org.apache.tika.parser.Parser
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/META-INF/services/org.apache.tika.parser.Parser?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/META-INF/services/org.apache.tika.parser.Parser (added)
+++ tika/trunk/tika-parsers/src/test/resources/META-INF/services/org.apache.tika.parser.Parser Fri Feb 20 14:16:18 2015
@@ -0,0 +1 @@
+org.apache.tika.parser.evil.EvilParser
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/resources/org/apache/tika/mime/custom-mimetypes.xml
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/org/apache/tika/mime/custom-mimetypes.xml?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/org/apache/tika/mime/custom-mimetypes.xml (added)
+++ tika/trunk/tika-parsers/src/test/resources/org/apache/tika/mime/custom-mimetypes.xml Fri Feb 20 14:16:18 2015
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info>
+    <mime-type type="application/evil">
+        <glob pattern="*.evil"/>
+        <sub-class-of type="text/plain"/>
+    </mime-type>
+</mime-info>
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/resources/test-documents/evil/fake_oom.evil
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/evil/fake_oom.evil?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/test-documents/evil/fake_oom.evil (added)
+++ tika/trunk/tika-parsers/src/test/resources/test-documents/evil/fake_oom.evil Fri Feb 20 14:16:18 2015
@@ -0,0 +1 @@
+<throwable message="fake oom">java.lang.OutOfMemoryError</throwable>
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/resources/test-documents/evil/heavy_hang.evil
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/evil/heavy_hang.evil?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/test-documents/evil/heavy_hang.evil (added)
+++ tika/trunk/tika-parsers/src/test/resources/test-documents/evil/heavy_hang.evil Fri Feb 20 14:16:18 2015
@@ -0,0 +1 @@
+<hang type="heavy" max_millis="3000" pulse_check_millis="100000000"/>
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/resources/test-documents/evil/nothing_bad.evil
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/evil/nothing_bad.evil?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/test-documents/evil/nothing_bad.evil (added)
+++ tika/trunk/tika-parsers/src/test/resources/test-documents/evil/nothing_bad.evil Fri Feb 20 14:16:18 2015
@@ -0,0 +1,18 @@
+Whan that Aprille with his shoures soote
+The droghte of Marche hath perced to the roote,
+And bathed every veyne in swich licour,
+Of which vertu engendred is the flour;	
+Whan Zephirus eek with his swete breeth
+Inspired hath in every holt and heeth
+The tendre croppes, and the yonge sonne
+Hath in the Ram his halfe cours y-ronne,
+And smale fowles maken melodye,
+That slepen al the night with open ye,
+(So priketh hem nature in hir corages:
+Than longen folk to goon on pilgrimages,	
+And palmers for to seken straunge strondes,
+To ferne halwes, couthe in sondry londes;
+And specially, from every shires ende
+Of Engelond, to Caunterbury they wende,	
+The holy blisful martir for to seke,	
+That hem hath holpen, whan that they were seke.
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer.evil
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer.evil?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer.evil (added)
+++ tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer.evil Fri Feb 20 14:16:18 2015
@@ -0,0 +1 @@
+<throwable message="null pointer message">java.lang.NullPointerException</throwable>
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer_no_msg.evil
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer_no_msg.evil?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer_no_msg.evil (added)
+++ tika/trunk/tika-parsers/src/test/resources/test-documents/evil/null_pointer_no_msg.evil Fri Feb 20 14:16:18 2015
@@ -0,0 +1 @@
+<throwable>java.lang.NullPointerException</throwable>
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/resources/test-documents/evil/real_oom.evil
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/evil/real_oom.evil?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/test-documents/evil/real_oom.evil (added)
+++ tika/trunk/tika-parsers/src/test/resources/test-documents/evil/real_oom.evil Fri Feb 20 14:16:18 2015
@@ -0,0 +1 @@
+<real_oom/>
\ No newline at end of file

Added: tika/trunk/tika-parsers/src/test/resources/test-documents/evil/sleep.evil
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/resources/test-documents/evil/sleep.evil?rev=1661129&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/test/resources/test-documents/evil/sleep.evil (added)
+++ tika/trunk/tika-parsers/src/test/resources/test-documents/evil/sleep.evil Fri Feb 20 14:16:18 2015
@@ -0,0 +1 @@
+<hang type="sleep" max_millis="3000"/>
\ No newline at end of file