1*1212f9a0SAndroid Build Coastguard Worker /* 2*1212f9a0SAndroid Build Coastguard Worker * Licensed to the Apache Software Foundation (ASF) under one 3*1212f9a0SAndroid Build Coastguard Worker * or more contributor license agreements. See the NOTICE file 4*1212f9a0SAndroid Build Coastguard Worker * distributed with this work for additional information 5*1212f9a0SAndroid Build Coastguard Worker * regarding copyright ownership. The ASF licenses this file 6*1212f9a0SAndroid Build Coastguard Worker * to you under the Apache License, Version 2.0 (the "License"); 7*1212f9a0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 8*1212f9a0SAndroid Build Coastguard Worker * You may obtain a copy of the License at 9*1212f9a0SAndroid Build Coastguard Worker * 10*1212f9a0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 11*1212f9a0SAndroid Build Coastguard Worker * 12*1212f9a0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 13*1212f9a0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 14*1212f9a0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*1212f9a0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 16*1212f9a0SAndroid Build Coastguard Worker * limitations under the License. 17*1212f9a0SAndroid Build Coastguard Worker */ 18*1212f9a0SAndroid Build Coastguard Worker // Common Qetest / Xalan testing imports 19*1212f9a0SAndroid Build Coastguard Worker import org.apache.qetest.Datalet; 20*1212f9a0SAndroid Build Coastguard Worker import org.apache.qetest.Logger; 21*1212f9a0SAndroid Build Coastguard Worker import org.apache.qetest.TestletImpl; 22*1212f9a0SAndroid Build Coastguard Worker 23*1212f9a0SAndroid Build Coastguard Worker // REPLACE_imports needed for reproducing the bug 24*1212f9a0SAndroid Build Coastguard Worker import java.io.StringReader; 25*1212f9a0SAndroid Build Coastguard Worker import org.apache.xerces.parsers.DOMParser; 26*1212f9a0SAndroid Build Coastguard Worker import org.apache.xpath.XPath; 27*1212f9a0SAndroid Build Coastguard Worker import org.apache.xpath.XPathAPI; 28*1212f9a0SAndroid Build Coastguard Worker import org.apache.xpath.objects.XObject; 29*1212f9a0SAndroid Build Coastguard Worker import org.w3c.dom.Document; 30*1212f9a0SAndroid Build Coastguard Worker import org.w3c.dom.Node; 31*1212f9a0SAndroid Build Coastguard Worker import org.w3c.dom.traversal.NodeIterator; 32*1212f9a0SAndroid Build Coastguard Worker import org.xml.sax.InputSource; 33*1212f9a0SAndroid Build Coastguard Worker 34*1212f9a0SAndroid Build Coastguard Worker /** 35*1212f9a0SAndroid Build Coastguard Worker * Testlet for reproducing Bugzilla reported bugs. 36*1212f9a0SAndroid Build Coastguard Worker * @author [email protected] 37*1212f9a0SAndroid Build Coastguard Worker * @author [email protected] 38*1212f9a0SAndroid Build Coastguard Worker */ 39*1212f9a0SAndroid Build Coastguard Worker public class Bugzilla1110 extends TestletImpl 40*1212f9a0SAndroid Build Coastguard Worker { 41*1212f9a0SAndroid Build Coastguard Worker // Initialize our classname for TestletImpl's main() method - must be updated! 42*1212f9a0SAndroid Build Coastguard Worker static { thisClassName = "Bugzilla1110"; } 43*1212f9a0SAndroid Build Coastguard Worker 44*1212f9a0SAndroid Build Coastguard Worker /** 45*1212f9a0SAndroid Build Coastguard Worker * Write Minimal code to reproduce your Bugzilla bug report. 46*1212f9a0SAndroid Build Coastguard Worker * Many Bugzilla tests won't bother with a datalet; they'll 47*1212f9a0SAndroid Build Coastguard Worker * just have the data to reproduce the bug encoded by default. 48*1212f9a0SAndroid Build Coastguard Worker * @param d (optional) Datalet to use as data point for the test. 49*1212f9a0SAndroid Build Coastguard Worker */ execute(Datalet d)50*1212f9a0SAndroid Build Coastguard Worker public void execute(Datalet d) 51*1212f9a0SAndroid Build Coastguard Worker { 52*1212f9a0SAndroid Build Coastguard Worker // Use logger.logMsg(...) instead of System.out.println(...) 53*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "Reproducing Bugzilla1110"); 54*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "User reports: I expect the following program prints ' e1\n null\n'."); 55*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "User reports: But it actually prints ' null\n e1\n'."); 56*1212f9a0SAndroid Build Coastguard Worker 57*1212f9a0SAndroid Build Coastguard Worker try 58*1212f9a0SAndroid Build Coastguard Worker { 59*1212f9a0SAndroid Build Coastguard Worker DOMParser domp = new DOMParser(); 60*1212f9a0SAndroid Build Coastguard Worker final String docStr = 61*1212f9a0SAndroid Build Coastguard Worker "<!DOCTYPE doc []>\n" 62*1212f9a0SAndroid Build Coastguard Worker +"<doc>\n" 63*1212f9a0SAndroid Build Coastguard Worker +" <e1>\n" 64*1212f9a0SAndroid Build Coastguard Worker +" <e2/>\n" 65*1212f9a0SAndroid Build Coastguard Worker +" </e1>\n" 66*1212f9a0SAndroid Build Coastguard Worker +"</doc>\n"; 67*1212f9a0SAndroid Build Coastguard Worker 68*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "---- about to parse document"); 69*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, docStr); 70*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "----"); 71*1212f9a0SAndroid Build Coastguard Worker domp.parse(new InputSource(new StringReader(docStr))); 72*1212f9a0SAndroid Build Coastguard Worker Document doc = domp.getDocument(); 73*1212f9a0SAndroid Build Coastguard Worker 74*1212f9a0SAndroid Build Coastguard Worker final String xpathStr = "(//.)[self::e1]"; 75*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "about to eval '" + xpathStr + "'"); 76*1212f9a0SAndroid Build Coastguard Worker XObject xobj = XPathAPI.eval(doc, xpathStr); 77*1212f9a0SAndroid Build Coastguard Worker if (xobj.getType() != XObject.CLASS_NODESET) { 78*1212f9a0SAndroid Build Coastguard Worker logger.checkFail("XObject returned is NOT a nodeset, is:" + xobj.str()); 79*1212f9a0SAndroid Build Coastguard Worker } else { 80*1212f9a0SAndroid Build Coastguard Worker NodeIterator iter = xobj.nodeset(); 81*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "XObject returned Class is: " + iter.getClass().getName()); 82*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "---- XObject returned value is"); 83*1212f9a0SAndroid Build Coastguard Worker 84*1212f9a0SAndroid Build Coastguard Worker Node n = iter.nextNode(); 85*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, n == null ? " null" : " " + n.getNodeName()); 86*1212f9a0SAndroid Build Coastguard Worker n = iter.nextNode(); 87*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, n == null ? " null" : " " + n.getNodeName()); 88*1212f9a0SAndroid Build Coastguard Worker while ((n = iter.nextNode()) != null) 89*1212f9a0SAndroid Build Coastguard Worker { 90*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, " " + n.getNodeName()); 91*1212f9a0SAndroid Build Coastguard Worker } 92*1212f9a0SAndroid Build Coastguard Worker iter.detach(); 93*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.WARNINGMSG, "NOTE: still need to validate expected error!"); 94*1212f9a0SAndroid Build Coastguard Worker } 95*1212f9a0SAndroid Build Coastguard Worker } 96*1212f9a0SAndroid Build Coastguard Worker catch (Throwable t) 97*1212f9a0SAndroid Build Coastguard Worker { 98*1212f9a0SAndroid Build Coastguard Worker logger.logThrowable(Logger.ERRORMSG, t, "execute threw"); 99*1212f9a0SAndroid Build Coastguard Worker logger.checkFail("execute threw: " + t.toString()); 100*1212f9a0SAndroid Build Coastguard Worker } 101*1212f9a0SAndroid Build Coastguard Worker } 102*1212f9a0SAndroid Build Coastguard Worker 103*1212f9a0SAndroid Build Coastguard Worker /** 104*1212f9a0SAndroid Build Coastguard Worker * <a href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=NNNN"> 105*1212f9a0SAndroid Build Coastguard Worker * Link to Bugzilla report</a> 106*1212f9a0SAndroid Build Coastguard Worker * @return REPLACE_Bugzilla1110_description. 107*1212f9a0SAndroid Build Coastguard Worker */ getDescription()108*1212f9a0SAndroid Build Coastguard Worker public String getDescription() 109*1212f9a0SAndroid Build Coastguard Worker { 110*1212f9a0SAndroid Build Coastguard Worker return "REPLACE_Bugzilla1110_description"; 111*1212f9a0SAndroid Build Coastguard Worker } 112*1212f9a0SAndroid Build Coastguard Worker 113*1212f9a0SAndroid Build Coastguard Worker } // end of class Bugzilla1110 114*1212f9a0SAndroid Build Coastguard Worker 115