W3C home > Mailing lists > Public > www-validator-cvs@w3.org > April 2006

2002/css-validator/autotest .classpath,NONE,1.1 .project,NONE,1.1 AutoTest.class,NONE,1.1 AutoTest.java,NONE,1.1 AutoTestContentHandler.class,NONE,1.1 AutoTestContentHandler.java,NONE,1.1 README,NONE,1.1 Result.class,NONE,1.1 Result.java,NONE,1.1 autotest.sh,NONE,1.1

From: Olivier Thereaux via cvs-syncmail <cvsmail@w3.org>
Date: Wed, 19 Apr 2006 07:55:35 +0000
To: www-validator-cvs@w3.org
Message-Id: <E1FW7XD-0003tN-TO@lionel-hutz.w3.org>

Update of /sources/public/2002/css-validator/autotest
In directory hutz:/tmp/cvs-serv14738

Added Files:
	.classpath .project AutoTest.class AutoTest.java 
	AutoTestContentHandler.class AutoTestContentHandler.java 
	README Result.class Result.java autotest.sh 
Log Message:
importing test suite/test cases made during european project lat year (Yves, Jean-Guilhem)

--- NEW FILE: AutoTest.java ---
import java.io.IOException;

import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

/**
 * AutoTest<br />
 * Created: Jul 28, 2005 5:36:18 PM<br />
 * Entry point of the software.<br/>
 * This soft allows to run a battery of CSSs test cases to check the the
 * CSS Validator.<br/>
 * To run the AutoTest, use this command:<br/>
 * java AutoTest uri [options]<br/>
 * where uri is the uri of the xml file containing the list of test cases,
 * and options a String containing the options for the validator, written in the
 * "URI" style (e.g. &usermedium=all&profile=css2).
 * There are some limitations in the options you can use:
 * <ul>
 * <li> The options list must begin with &amp;</li>
 * <li> Do not put text option nor uri one, they will be appended automatically
 *  from the xml file</li>
 * <li> Do not put output option, it MUST be soap12 for the soft to work well,
 *  so it is appended automatically to the options</li> 
 * </ul>
 */
/**

 */
public class AutoTest {
    
    XMLReader saxReader;
    
    /**
     * Constructor.
     * @throws SAXException 
     */
    public AutoTest() throws SAXException {
	saxReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
	saxReader.setContentHandler(new AutoTestContentHandler());
    }
    
    /**
     * Parse an xml file 
     * @param uri the uri of the file to parse
     * @throws IOException
     * @throws SAXException
     */
    public void parse(String uri) throws IOException, SAXException {
	saxReader.parse(uri);
    }
    
    /**
     * Entry point of the program
     * @param args list of arguments of the program: uri [options]
     */
    public static void main(String[] args) {
	if (args.length != 1) {
	    System.out.println("Usage : AutoTest uri");
	    System.exit(1);
	}
	
	String uri = args[0];
	
	try {	    
	    AutoTest parser = new AutoTest();
	    parser.parse(uri);
	} catch (Throwable t) {
	    t.printStackTrace();
	}
    }
}
--- NEW FILE: .project ---
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>autotest</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
	</natures>
</projectDescription>

--- NEW FILE: .classpath ---
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path=""/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="lib" path="/home/jean/usr/jwsdp-1.6/jaxp/lib/jaxp-api.jar"/>
	<classpathentry kind="lib" path="/home/jean/usr/Jigsaw/classes/jigsaw.jar"/>
	<classpathentry kind="lib" path="/home/jean/usr/Jigsaw/classes/xercesImpl.jar"/>
	<classpathentry kind="lib" path="/home/jean/usr/Jigsaw/classes/xml-apis.jar"/>
	<classpathentry kind="output" path=""/>
</classpath>

--- NEW FILE: AutoTestContentHandler.class ---
(This appears to be a binary file; contents omitted.)

--- NEW FILE: AutoTestContentHandler.java ---
// $Id: AutoTestContentHandler.java,v 1.1 2006/04/19 07:55:33 ot Exp $
// Author: Jean-Guilhem Rouel
// (c) COPYRIGHT MIT, ERCIM and Keio, 2003.
// Please first read the full copyright statement in file COPYRIGHT.html

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import org.w3c.www.http.HTTP;
import org.w3c.www.protocol.http.HttpException;
import org.w3c.www.protocol.http.HttpManager;
import org.w3c.www.protocol.http.Reply;
import org.w3c.www.protocol.http.Request;

import org.xml.sax.*;
//import org.xml.sax.helpers.LocatorImpl;
/*
 * TODO: add support for different profiles, Sender/Receiver errors
 */
/**
 * @author smeric
 *
 * Exemple d'implementation extremement simplifiee d'un SAX XML ContentHandler. Le but de cet exemple
 * est purement pedagogique.
 * Very simple implementation sample for XML SAX ContentHandler.
 */
public class AutoTestContentHandler implements ContentHandler {
    
    public static final String VALIDATOR = "http://qa-dev.w3.org:8001/css-validator/validator?";
    public static final String PARAMS = "&output=soap12";    
    
    public static final int TESTSUITE    = "testsuite".hashCode();
    public static final int TEST         = "test".hashCode();
    public static final int TYPE         = "type".hashCode();
    public static final int TITLE        = "title".hashCode();
    public static final int URL          = "url".hashCode();
    public static final int FILE         = "file".hashCode();
    public static final int DESCRIPTION  = "description".hashCode();
    public static final int RESULT       = "result".hashCode();
    public static final int VALIDITY     = "valid".hashCode();
    public static final int ERRORS       = "errors".hashCode();
    public static final int WARNINGS     = "warnings".hashCode();
      
    //private Locator locator;
    
    boolean inUrl        = false;
    boolean isFile       = false;
    boolean inDesc       = false;
    boolean inErrors     = false;
    boolean inWarnings    = false;
    
    String urlString     = "";
    String file          = "";
    String desc          = "";
    
    Result awaitedResult = new Result();
    Result result        = new Result();
    
    String profile;
    String warnings;
    String medium;
    
    /**
     * Default Constructor. 
     */
    public AutoTestContentHandler() {
	super();
	// On definit le locator par defaut.
	//locator = new LocatorImpl();	
    }    
    
    /**
     * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
     */
    public void setDocumentLocator(Locator value) {
	//locator =  value;
    }
    
    /**
     * @see org.xml.sax.ContentHandler#startDocument()
     */
    public void startDocument() throws SAXException {
    }
    
    /**
     * @see org.xml.sax.ContentHandler#endDocument()
     */
    public void endDocument() throws SAXException {
    }
    
    /**
     * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
     */
    public void startPrefixMapping(String prefix, String URI) throws SAXException {	
    }
    
    /**
     * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
     */
    public void endPrefixMapping(String prefix) throws SAXException {	
    }
    
    /**
     * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
     */
    public void startElement(String nameSpaceURI, String localName, String rawName, Attributes attributs) throws SAXException {
	
	int element = localName.hashCode();
	
	if(element == TESTSUITE) {
	    System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
	    System.out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
	    System.out.println("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">");
	    System.out.println("  <head>");
	    System.out.println("    <meta http-equiv=\"Content-Language\" content=\"en\" />");
	    System.out.println("    <title>Tests Results</title>");
	    System.out.println("    <style type=\"text/css\">");
	    System.out.println("      h1 {");
	    System.out.println("        text-align: center;");
	    System.out.println("        border: 2px solid;");
	    System.out.println("      }");
	    System.out.println("      h2 {");
	    System.out.println("        text-decoration: underline;");
	    System.out.println("        text-transform: capitalize");
	    System.out.println("      }");
	    System.out.println("      h3 {");
	    System.out.println("        font-size: 15pt;");
	    System.out.println("      }");
	    System.out.println("      dd {");
	    System.out.println("        display: inline;");
	    System.out.println("      }");
	    System.out.println("      .res, .error {");
	    System.out.println("        border-bottom: 1px solid black;");
	    System.out.println("      }");
	    System.out.println("      #valid {");
	    System.out.println("        text-align: center;");
	    System.out.println("      }");
	    System.out.println("    </style>");
	    System.out.println("  </head>");
	    System.out.println();
	    System.out.println("  <body>");
	    System.out.println("    <h1>Test Suite</h1>");
	    
	}
	else if(element == TEST) {
	    awaitedResult = new Result();
	    urlString     = "";
	    file          = "";
	    desc          = "";
	    result        = new Result();
	    
	    warnings      = null;
	    profile       = null;
	    medium        = null;	    
	    for(int i = 0; i < attributs.getLength(); i++) {
		String currentAttr = attributs.getLocalName(i);
		if(currentAttr.equals("warnings")) {
		    warnings = attributs.getValue(i);
		}
		else if(currentAttr.equals("profile")) {
		    profile = attributs.getValue(i);
		}
		else if(currentAttr.equals("medium")) {
		    medium = attributs.getValue(i);
		}
	    }
	}
	else if(element == TYPE) {
	    if(attributs.getLength() >= 1 &&
		    attributs.getLocalName(0).hashCode() == TITLE) {
		System.out.println("    <h2>" + attributs.getValue(0) + "</h2>");
	    }
	}
	else if(element == URL) {
	    inUrl = true;
	    isFile = false;
	}
	else if(element == FILE) {
	    inUrl = true;
	    isFile = true;
	}
	else if(element == DESCRIPTION) {
	    inDesc = true;
	}
	else if(element == RESULT) {
	    boolean valid = false;
	    if(attributs.getLength() >= 1 &&
		    attributs.getLocalName(0).hashCode() == VALIDITY) {
		valid = attributs.getValue(0).equals("true");
	    }
	    awaitedResult.setValid(valid);
	}
	else if(element == ERRORS) {
	    inErrors = true;
	}
	else if(element == WARNINGS) {
	    inWarnings = true;
	}
    }
    
    /**
     * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
     */
    public void endElement(String nameSpaceURI, String localName, String rawName)
    	throws SAXException {
	
	int element = localName.hashCode();
	
	if(element == TESTSUITE) {
//	    System.out.println("  <p id=\"valid\">");
//	    System.out.println("    <a href=\"http://validator.w3.org/check?uri=referer\">");
//	    System.out.println("    <img src=\"http://www.w3.org/Icons/valid-xhtml10\"");
//	    System.out.println("    alt=\"Valid XHTML 1.0!\" height=\"31\" width=\"88\" />");
//	    System.out.println("    </a>");
//	    System.out.println("    <a href=\"http://jigsaw.w3.org/css-validator/\">");
//	    System.out.println("      <img style=\"border:0;width:88px;height:31px\"");
//	    System.out.println("        src=\"http://jigsaw.w3.org/css-validator/images/vcss\""); 
//	    System.out.println("        alt=\"Valid CSS!\" />");
//	    System.out.println("    </a>");
//	    System.out.println("  </p>");
	    System.out.println("</body>");
	    System.out.println();
	    System.out.println("</html>");
	}
	else if(element == TEST) {
	    String val;
	    System.err.println(urlString);
	    String validURL = createValidURL(urlString);
	    if(isFile) {
		URL fileURL = AutoTestContentHandler.class.getResource(urlString);		    		    
		InputStream content;
		String text = "";
		try {
		    content = fileURL.openStream();
		    byte[] textBytes = new byte[content.available()];
		    content.read(textBytes, 0, textBytes.length);
		    text = createValidURL(new String(textBytes));
		}
		catch (IOException e) {
		    System.err.println(e.getMessage());
		}				
		val = VALIDATOR + "text=" + text;		
	    }
	    else {
		val = VALIDATOR + "uri=" + validURL;
	    }
	    
	    if(warnings != null) {
		val += "&warning=" + warnings;
	    }
	    if(profile != null) {
		val += "&profile=" + profile;
	    }
	    if(medium != null) {
		val += "&medium=" + medium;
	    }
	    val += PARAMS;
	    
	    try {
		HttpManager     manager = HttpManager.getManager() ;
		Request request = manager.createRequest() ;
		request.setMethod(HTTP.GET) ;
		request.setURL(new URL(val));
		Reply    reply = manager.runRequest(request) ;
		// Get the reply input stream that contains the actual data:
		InputStream res = reply.getInputStream();
		
		int currentChar;
		StringBuffer buf = new StringBuffer();
		while((currentChar = res.read()) != -1) {
		    buf.append((char) currentChar);
		}
		
		if(reply.getStatus() == 500) { // Internal Server Error
		    if(buf.indexOf("env:Sender") != -1) {
			printError(val, "Reply status code: 500<br/>" +
					"Invalid URL: Sender error");
		    }
		    else if(buf.indexOf("env:Receiver") != -1) {
			printError(val, "Reply status code: 500<br/>" +
					"Unreachable URL: Receiver error");
		    }
		    else {
			printError(val, "Reply status code: 500");
		    }
		}
		else {		    
		    result = new Result();
		    int begin = buf.indexOf("<m:validity>"); 
		    int end;
		    if(begin != -1) {
			end = buf.indexOf("</m:validity>");
			if(end != -1) {
			    String v = buf.substring(begin + 12, end).trim();			    
			    result.setValid(v.equals("true"));			    
			}
		    }
		    begin = buf.indexOf("<m:errorcount>");
		    end = buf.indexOf("</m:errorcount>");
		    if(begin != -1 && end != -1) {
			String err = buf.substring(begin + 14, end).trim();		    
			result.setErrors(Integer.parseInt(err));
		    }
		    begin = buf.indexOf("<m:warningcount>");
		    end = buf.indexOf("</m:warningcount>");
		    if(begin != -1 && end != -1) {
			String warn = buf.substring(begin + 16, end).trim();
			result.setWarnings(Integer.parseInt(warn));
		    }
		    printResult(val.substring(0,val.length() - 14));
		}
		
	    }
	    catch (MalformedURLException e) {
		printError(val, e.getMessage());
	    }
	    catch (IOException e) {
		printError(val, e.getMessage());
	    }
	    catch (HttpException e) {
		printError(val, e.getMessage());
	    }	    	       
	    
	    isFile = false;
	}
	else if(element == URL) {
	    inUrl = false;
	}
	else if(element == FILE) {
	    inUrl = false;	    
	}
	else if(element == DESCRIPTION) {
	    inDesc = false;
	}
	else if(element == ERRORS) {
	    inErrors = false;
	}
	else if(element == WARNINGS) {
	    inWarnings = false;
	}
    }
       
    /**
     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
     */
    public void characters(char[] ch, int start, int end) throws SAXException {
	if(inUrl) {
	    urlString += new String(ch, start, end).trim();
	}
	else if(inDesc) {
	    desc += new String(ch, start, end).trim();
	}
	else if(inErrors) {
	    int errors;
	    try {
		errors = Integer.parseInt(new String(ch, start, end));
	    }
	    catch (NumberFormatException e) {		
		errors = 0;
	    }
	    awaitedResult.setErrors(errors);
	}
	else if(inWarnings) {
	    int warnings;
	    try {
		warnings = Integer.parseInt(new String(ch, start, end));
	    }
	    catch (NumberFormatException e) {
		warnings = 0;
	    }
	    awaitedResult.setWarnings(warnings);
	}
    }
    
    /**
     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
     */
    public void ignorableWhitespace(char[] ch, int start, int end) throws SAXException {	
    }
    
    /**
     * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
     */
    public void processingInstruction(String target, String data) throws SAXException {
    }
    
    /**
     * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
     */
    public void skippedEntity(String arg0) throws SAXException {
	System.err.println("Malformed entity: " + arg0);              
    }
    
    /**
     * Prints an HTML result of a validation
     * @param validatorPage the validator page result
     */
    private void printResult(String validatorPage) {
	
	validatorPage = validatorPage.replaceAll("&", "&amp;");
	urlString = urlString.replaceAll("&", "&amp;");
	
	System.out.println("    <div class=\"res\">");
	System.out.println("      <h3><a href=\"" + urlString + "\">" + urlString +
		"</a></h3>");
	System.out.println("      <p><a href=\"" + validatorPage
		+ "\">Go to the Validator page</a></p>");
	System.out.println("      <p>" + desc + "</p>");
	System.out.println("      <dl>");
	System.out.println("	<dt>Awaited result</dt>");
	System.out.println("	<dd>" + 
		(awaitedResult.isValid()?"Valid":"Not valid") + "</dd>");
	System.out.println("	<dd>Errors: " + awaitedResult.getErrors() +
		"</dd>");
	System.out.println("	<dd>Warnings: " + awaitedResult.getWarnings() +
		"</dd>");
	System.out.println("	<dt>Result</dt>");
	System.out.println("	<dd>" + (result.isValid()?"Valid":"Not valid") +
		"</dd>");
	System.out.println("	<dd>Errors: " + result.getErrors() +
		"</dd>");
	System.out.println("	<dd>Warnings: " + result.getWarnings() +
		"</dd>");
	System.out.println("      </dl>");
	System.out.println("    </div>");
    }
    
    /**
     * Used when an error occurs
     * @param validatorPage the validator page result 
     * @param message the message to be displayed
     */
    private void printError(String validatorPage, String message) {
	
	validatorPage = validatorPage.replaceAll("&", "&amp;");
	urlString = urlString.replaceAll("&", "&amp;");
	
	System.out.println("    <div class=\"error\">");
	System.out.println("      <h3><a href=\"" + urlString + "\">" + urlString +
		"</a></h3>");
	System.out.println("      <p><a href=\"" + validatorPage
		+ "\">Go to the Validator page</a></p>");
	System.out.println("      <p>" + desc + "</p>");
	System.out.println("      <p>" + message + "</p>");
	System.out.println("    </div>");
    }
    
    /**
     * Replaces all URL special chars in a String with their 
     * matching URL entities
     * @param url the url to transform
     * @return the valid URL 
     */
    public String createValidURL(String url) {
	String res = url; 
	res = res.replaceAll("%", "%25");
	res = res.replaceAll("\"", "%22");
	res = res.replaceAll("\\{", "%7B");	
	res = res.replaceAll("\\}", "%7D");
	res = res.replaceAll("\\\t", "%09");
	res = res.replaceAll(" ", "+");
	res = res.replaceAll("#", "%23");
	res = res.replaceAll("&", "%26");
	res = res.replaceAll("\\(", "%28");
	res = res.replaceAll("\\)", "%29");
	res = res.replaceAll(",", "%2C");
	res = res.replaceAll("\\.", "%2E");
	res = res.replaceAll("/", "%2F");
	res = res.replaceAll(":", "%3A");
	res = res.replaceAll(";", "%3B");
	res = res.replaceAll("<", "%3C");
	res = res.replaceAll("=", "%3D");
	res = res.replaceAll(">", "%3E");
	res = res.replaceAll("\\?", "%3F");
	res = res.replaceAll("@", "%40");
	res = res.replaceAll("\\[", "%5B");
	res = res.replaceAll("\\\\", "%5C");
	res = res.replaceAll("\\]", "%5D");
	res = res.replaceAll("\\^", "%5E");
	res = res.replaceAll("'", "%27");
	res = res.replaceAll("\\|", "%7C");
	res = res.replaceAll("~'", "%7E");
	res = res.replaceAll("\\\n", "");
	return res;
    }
    
}

--- NEW FILE: AutoTest.class ---
(This appears to be a binary file; contents omitted.)

--- NEW FILE: README ---
Pour lancer les tests:
./autotest.sh file
ou file est le fichier xml contenant la liste des tests a effectuer.
Il est conseille de rediriger la sortie (du code html) vers un fichier
afin de pouvoir visualiser les resultats depuis un navigateur.

Des exemples de fichiers xml sont presents dans testsuite/xml.

Les tests sont groupes par types, ce qui permet de savoir ce que l'on teste.
Un test permet de verifier un unique chemin/url.
On peut preciser pour chaque test une description, ainsi que le
resultat attendu (validite, nombre d'erreurs et de warnings).

Exemples de tests:
- une url:
    <test>
      <url>http://forums.jeuxonline.info</url>
      <description>Forum of a French online gaming website</description>
      <result valid="false">
        <errors>24</errors>
        <warnings>0</warnings>
      </result>
    </test>
- un fichier local:
    <test>
      <file>testsuite/general/misc/sampleCSS1.css</file>
      <description>
	This style sheet is written according to the suggested rendering in the 
	HTML 2.0 specification. Some styles, e.g. colors, have been added for 
	completeness. It is suggested that a style sheet similar to this one 
	is used as the UA default.
      </description>
    </test>

--- NEW FILE: Result.class ---
(This appears to be a binary file; contents omitted.)

--- NEW FILE: Result.java ---
// $Id: Result.java,v 1.1 2006/04/19 07:55:33 ot Exp $
// Author: Jean-Guilhem Rouel
// (c) COPYRIGHT MIT, ERCIM and Keio, 2003.
// Please first read the full copyright statement in file COPYRIGHT.html

/**
 * Result<br />
 * Created: Jul 28, 2005 5:25:19 PM<br />
 */
public class Result {
    
    /**
     * Validity of the CSS document
     */
    boolean valid = true;
    
    /**
     * Errors count
     */
    int errors;
    
    /**
     * Warnings count
     */
    int warnings;
    
    /**
     * Returns the number of errors
     * @return Returns the errors.
     */
    public int getErrors() {
        return errors;
    }
    /**
     * Sets the number of errors
     * @param errors The errors to set.
     */
    public void setErrors(int errors) {
        this.errors = errors;
    }
    /**
     * Returns the number of warnings
     * @return Returns the warnings.
     */
    public int getWarnings() {
        return warnings;
    }
    /**
     * Sets the number of warnings
     * @param warnings The warnings to set.
     */
    public void setWarnings(int warnings) {
        this.warnings = warnings;
    }
    /**
     * Returns the validity of the document
     * @return Returns true if the document is valid, false otherwise
     */
    public boolean isValid() {
        return valid;
    }
    /**
     * Sets the validity of the document
     * @param valid The valid to set.
     */
    public void setValid(boolean valid) {
        this.valid = valid;
    }
    
    /**
     * @see java.lang.Object#toString()
     */
    public String toString() {
	String res = "";
	if(valid) {
	    res += "Valid!";
	    res += "\nWarnings: " + warnings;
	}
	else {
	    res += "Errors: " + errors;
	    res += "\nWarnings: " + warnings;
	}
	return res;
    }
}

--- NEW FILE: autotest.sh ---
#!/bin/sh

java -cp .:/usr/share/java/jaxp-1.2.jar:/usr/share/java/xercesImpl.jar:/usr/share/java/xmlParserAPIs.jar:/usr/local/Jigsaw/classes/jigsaw.jar AutoTest $1
Received on Wednesday, 19 April 2006 07:55:43 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Thursday, 26 April 2012 12:54:53 GMT