1 package parse;
   2 
   3 import java.io.ByteArrayInputStream;
   4 import java.io.IOException;
   5 import javax.xml.parsers.DocumentBuilderFactory;
   6 import javax.xml.parsers.ParserConfigurationException;
   7 
   8 import static org.testng.Assert.assertEquals;
   9 import org.testng.annotations.DataProvider;
  10 import org.testng.annotations.Test;
  11 import org.w3c.dom.Document;
  12 import org.xml.sax.SAXException;
  13 
  14 /**
  15  * JDK-8059327: XML parser returns corrupt attribute value
  16  * https://bugs.openjdk.java.net/browse/JDK-8059327
  17  *
  18  * Also:
  19  * JDK-8061550: XMLEntityScanner can corrupt corrupt content during parsing
  20  * https://bugs.openjdk.java.net/browse/JDK-8061550
  21  *
  22  * @Summary: verify that the character cache in XMLEntityScanner is reset properly
  23  */
  24 
  25 public class XMLEntityScannerLoad {
  26 
  27     @Test(dataProvider = "xmls")
  28     public void test(String xml) throws SAXException, IOException, ParserConfigurationException {
  29         Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ChunkInputStream(xml));
  30         String value = d.getDocumentElement().getAttribute("a1");
  31         assertEquals(value, "w");
  32     }
  33 
  34     static class ChunkInputStream extends ByteArrayInputStream {
  35         ChunkInputStream(String xml) {
  36             super(xml.getBytes());
  37         }
  38 
  39         @Override
  40         public synchronized int read(byte[] b, int off, int len) {
  41             return super.read(b, off, 7);
  42         }
  43     }
  44 
  45     @DataProvider(name = "xmls")
  46     private Object[][] xmls() {
  47         return new Object[][] {
  48             {"<?xml version=\"1.0\"?><element a1=\"w\" a2=\"&quot;&quot;\"/>"},
  49             {"<?xml version=\"1.1\"?><element a1=\"w\" a2=\"&quot;&quot;\"/>"}
  50         };
  51     }
  52 }