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 import org.apache.qetest.CheckService; 23*1212f9a0SAndroid Build Coastguard Worker import org.apache.qetest.xsl.XHTFileCheckService; 24*1212f9a0SAndroid Build Coastguard Worker 25*1212f9a0SAndroid Build Coastguard Worker import org.apache.xalan.processor.TransformerFactoryImpl; 26*1212f9a0SAndroid Build Coastguard Worker import org.apache.xalan.transformer.TransformerImpl; 27*1212f9a0SAndroid Build Coastguard Worker import org.apache.xalan.transformer.XalanProperties; 28*1212f9a0SAndroid Build Coastguard Worker import javax.xml.transform.*; 29*1212f9a0SAndroid Build Coastguard Worker import javax.xml.transform.stream.*; 30*1212f9a0SAndroid Build Coastguard Worker 31*1212f9a0SAndroid Build Coastguard Worker import java.io.File; 32*1212f9a0SAndroid Build Coastguard Worker import java.io.FileReader; 33*1212f9a0SAndroid Build Coastguard Worker import java.io.BufferedReader; 34*1212f9a0SAndroid Build Coastguard Worker import java.io.IOException; 35*1212f9a0SAndroid Build Coastguard Worker 36*1212f9a0SAndroid Build Coastguard Worker /** 37*1212f9a0SAndroid Build Coastguard Worker * Custom Testlet for testing NodeInfo extension. 38*1212f9a0SAndroid Build Coastguard Worker * 39*1212f9a0SAndroid Build Coastguard Worker * @author [email protected] 40*1212f9a0SAndroid Build Coastguard Worker */ 41*1212f9a0SAndroid Build Coastguard Worker public class BugzillaNodeInfo extends TestletImpl 42*1212f9a0SAndroid Build Coastguard Worker { 43*1212f9a0SAndroid Build Coastguard Worker // Initialize our classname for TestletImpl's main() method - must be updated! 44*1212f9a0SAndroid Build Coastguard Worker static { thisClassName = "BugzillaNodeInfo"; } 45*1212f9a0SAndroid Build Coastguard Worker 46*1212f9a0SAndroid Build Coastguard Worker /** 47*1212f9a0SAndroid Build Coastguard Worker * Write Minimal code to reproduce your Bugzilla bug report. 48*1212f9a0SAndroid Build Coastguard Worker * Many Bugzilla tests won't bother with a datalet; they'll 49*1212f9a0SAndroid Build Coastguard Worker * just have the data to reproduce the bug encoded by default. 50*1212f9a0SAndroid Build Coastguard Worker * @param d (optional) Datalet to use as data point for the test. 51*1212f9a0SAndroid Build Coastguard Worker */ execute(Datalet d)52*1212f9a0SAndroid Build Coastguard Worker public void execute(Datalet d) 53*1212f9a0SAndroid Build Coastguard Worker { 54*1212f9a0SAndroid Build Coastguard Worker // Use logger.logMsg(...) instead of System.out.println(...) 55*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, getDescription()); 56*1212f9a0SAndroid Build Coastguard Worker 57*1212f9a0SAndroid Build Coastguard Worker String xslName = "BugzillaNodeInfo.xsl"; 58*1212f9a0SAndroid Build Coastguard Worker String xmlName = "BugzillaNodeInfo.xml"; 59*1212f9a0SAndroid Build Coastguard Worker String outputName = "BugzillaNodeInfo.output"; 60*1212f9a0SAndroid Build Coastguard Worker String goldName = "BugzillaNodeInfo.gold"; 61*1212f9a0SAndroid Build Coastguard Worker try 62*1212f9a0SAndroid Build Coastguard Worker { 63*1212f9a0SAndroid Build Coastguard Worker TransformerFactory factory = TransformerFactory.newInstance(); 64*1212f9a0SAndroid Build Coastguard Worker // Must set on both the factory impl.. 65*1212f9a0SAndroid Build Coastguard Worker TransformerFactoryImpl factoryImpl = (TransformerFactoryImpl)factory; 66*1212f9a0SAndroid Build Coastguard Worker factoryImpl.setAttribute(XalanProperties.SOURCE_LOCATION, Boolean.TRUE); 67*1212f9a0SAndroid Build Coastguard Worker 68*1212f9a0SAndroid Build Coastguard Worker Transformer transformer = factory.newTransformer(new StreamSource(xslName)); 69*1212f9a0SAndroid Build Coastguard Worker // ..and the transformer impl 70*1212f9a0SAndroid Build Coastguard Worker TransformerImpl impl = ((TransformerImpl) transformer); 71*1212f9a0SAndroid Build Coastguard Worker impl.setProperty(XalanProperties.SOURCE_LOCATION, Boolean.TRUE); 72*1212f9a0SAndroid Build Coastguard Worker transformer.transform(new StreamSource(xmlName), 73*1212f9a0SAndroid Build Coastguard Worker new StreamResult(outputName)); 74*1212f9a0SAndroid Build Coastguard Worker } 75*1212f9a0SAndroid Build Coastguard Worker catch (Throwable t) 76*1212f9a0SAndroid Build Coastguard Worker { 77*1212f9a0SAndroid Build Coastguard Worker logger.logThrowable(logger.ERRORMSG, t, "Unexpectedly threw"); 78*1212f9a0SAndroid Build Coastguard Worker logger.checkErr("Unexpectedly threw: " + t.toString()); 79*1212f9a0SAndroid Build Coastguard Worker return; 80*1212f9a0SAndroid Build Coastguard Worker } 81*1212f9a0SAndroid Build Coastguard Worker 82*1212f9a0SAndroid Build Coastguard Worker // CheckService fileChecker = new XHTFileCheckService(); 83*1212f9a0SAndroid Build Coastguard Worker // fileChecker.check(logger, 84*1212f9a0SAndroid Build Coastguard Worker // new File(outputName), 85*1212f9a0SAndroid Build Coastguard Worker // new File(goldName), 86*1212f9a0SAndroid Build Coastguard Worker // getDescription()); 87*1212f9a0SAndroid Build Coastguard Worker // Since the gold data isn't nailed down yet, do a simple validation 88*1212f9a0SAndroid Build Coastguard Worker // Just ensure the systemId of the xml file was included somewhere in the file 89*1212f9a0SAndroid Build Coastguard Worker checkFileContains(outputName, xmlName, "NodeInfo got partial systemID correct"); 90*1212f9a0SAndroid Build Coastguard Worker } 91*1212f9a0SAndroid Build Coastguard Worker 92*1212f9a0SAndroid Build Coastguard Worker 93*1212f9a0SAndroid Build Coastguard Worker /** 94*1212f9a0SAndroid Build Coastguard Worker * Checks and reports if a file contains a certain string 95*1212f9a0SAndroid Build Coastguard Worker * (all within one line). 96*1212f9a0SAndroid Build Coastguard Worker * 97*1212f9a0SAndroid Build Coastguard Worker * @param fName local path/name of file to check 98*1212f9a0SAndroid Build Coastguard Worker * @param checkStr String to look for in the file 99*1212f9a0SAndroid Build Coastguard Worker * @param comment to log with the check() call 100*1212f9a0SAndroid Build Coastguard Worker * @return true if pass, false otherwise 101*1212f9a0SAndroid Build Coastguard Worker */ checkFileContains(String fName, String checkStr, String comment)102*1212f9a0SAndroid Build Coastguard Worker protected boolean checkFileContains(String fName, String checkStr, 103*1212f9a0SAndroid Build Coastguard Worker String comment) 104*1212f9a0SAndroid Build Coastguard Worker { 105*1212f9a0SAndroid Build Coastguard Worker boolean passFail = false; 106*1212f9a0SAndroid Build Coastguard Worker File f = new File(fName); 107*1212f9a0SAndroid Build Coastguard Worker 108*1212f9a0SAndroid Build Coastguard Worker if (!f.exists()) 109*1212f9a0SAndroid Build Coastguard Worker { 110*1212f9a0SAndroid Build Coastguard Worker logger.checkFail("checkFileContains(" + fName 111*1212f9a0SAndroid Build Coastguard Worker + ") does not exist: " + comment); 112*1212f9a0SAndroid Build Coastguard Worker return false; 113*1212f9a0SAndroid Build Coastguard Worker } 114*1212f9a0SAndroid Build Coastguard Worker 115*1212f9a0SAndroid Build Coastguard Worker try 116*1212f9a0SAndroid Build Coastguard Worker { 117*1212f9a0SAndroid Build Coastguard Worker FileReader fr = new FileReader(f); 118*1212f9a0SAndroid Build Coastguard Worker BufferedReader br = new BufferedReader(fr); 119*1212f9a0SAndroid Build Coastguard Worker 120*1212f9a0SAndroid Build Coastguard Worker for (;;) 121*1212f9a0SAndroid Build Coastguard Worker { 122*1212f9a0SAndroid Build Coastguard Worker String inbuf = br.readLine(); 123*1212f9a0SAndroid Build Coastguard Worker if (inbuf == null) 124*1212f9a0SAndroid Build Coastguard Worker break; 125*1212f9a0SAndroid Build Coastguard Worker 126*1212f9a0SAndroid Build Coastguard Worker if (inbuf.indexOf(checkStr) >= 0) 127*1212f9a0SAndroid Build Coastguard Worker { 128*1212f9a0SAndroid Build Coastguard Worker passFail = true; 129*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(logger.TRACEMSG, 130*1212f9a0SAndroid Build Coastguard Worker "checkFileContains passes with line: " + inbuf); 131*1212f9a0SAndroid Build Coastguard Worker break; 132*1212f9a0SAndroid Build Coastguard Worker } 133*1212f9a0SAndroid Build Coastguard Worker } 134*1212f9a0SAndroid Build Coastguard Worker } 135*1212f9a0SAndroid Build Coastguard Worker catch (IOException ioe) 136*1212f9a0SAndroid Build Coastguard Worker { 137*1212f9a0SAndroid Build Coastguard Worker logger.checkFail("checkFileContains(" + fName + ") threw: " 138*1212f9a0SAndroid Build Coastguard Worker + ioe.toString() + " for: " + comment); 139*1212f9a0SAndroid Build Coastguard Worker 140*1212f9a0SAndroid Build Coastguard Worker return false; 141*1212f9a0SAndroid Build Coastguard Worker } 142*1212f9a0SAndroid Build Coastguard Worker 143*1212f9a0SAndroid Build Coastguard Worker if (passFail) 144*1212f9a0SAndroid Build Coastguard Worker { 145*1212f9a0SAndroid Build Coastguard Worker logger.checkPass(comment); 146*1212f9a0SAndroid Build Coastguard Worker } 147*1212f9a0SAndroid Build Coastguard Worker else 148*1212f9a0SAndroid Build Coastguard Worker { 149*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(logger.ERRORMSG, "checkFileContains failed to find: " + checkStr); 150*1212f9a0SAndroid Build Coastguard Worker logger.checkFail(comment); 151*1212f9a0SAndroid Build Coastguard Worker } 152*1212f9a0SAndroid Build Coastguard Worker return passFail; 153*1212f9a0SAndroid Build Coastguard Worker } 154*1212f9a0SAndroid Build Coastguard Worker 155*1212f9a0SAndroid Build Coastguard Worker 156*1212f9a0SAndroid Build Coastguard Worker /** 157*1212f9a0SAndroid Build Coastguard Worker * @return Xalan custom extension NodeInfo. 158*1212f9a0SAndroid Build Coastguard Worker */ getDescription()159*1212f9a0SAndroid Build Coastguard Worker public String getDescription() 160*1212f9a0SAndroid Build Coastguard Worker { 161*1212f9a0SAndroid Build Coastguard Worker return "Xalan custom extension NodeInfo"; 162*1212f9a0SAndroid Build Coastguard Worker } 163*1212f9a0SAndroid Build Coastguard Worker 164*1212f9a0SAndroid Build Coastguard Worker } // end of class BugzillaNodeInfo 165*1212f9a0SAndroid Build Coastguard Worker 166