|
What this is
Other links
The source code/* Copyright (c) 2001-2004, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.File; import java.io.FileNotFoundException; import java.util.regex.Pattern; import java.util.regex.Matcher; // $Id: SqlToolHarness.java,v 1.6 2004/06/19 16:21:49 fredt Exp $ /** * Runs SqlTool tests based upon metacommands embedded in comments in SQL * files. */ public class SqlToolHarness { private static final int MAX_SQLFILE_LEN = 10240; private static final String SYNTAX_MSG = "SYNTAX: java org.hsqldb.test.SqlToolHarness file1.sql [file2.sq...]"; /** * To test the SqlToolHarness class itself. * (Basically, a sanity check). * * @param sa Each argument is a SQL file to process. * @returns Exits with 0 or 1 depending on whether the last * SqlToolHarness.execute() returned true or false (correspondingly). */ static public void main(String[] sa) throws IOException, InterruptedException { if (sa.length > 0 && sa[0].equals("-v")) { sa = ExecHarness.shift(sa); System.setProperty("VERBOSE", "true"); } if (sa.length < 1) { System.err.println(SYNTAX_MSG); System.exit(1); } SqlToolHarness harness = new SqlToolHarness(); boolean result = true; for (int i = 0; i < sa.length; i++) { result = harness.execute(new File(sa[i])); System.err.println(sa[i] + " ==> " + result); } System.exit(result ? 0 : 1); } ExecHarness execHarness; public SqlToolHarness() { execHarness = new ExecHarness("java"); String tmp = System.getProperty("VERBOSE"); Verbose = (tmp != null) && (tmp.trim().length() > 0); } private boolean Verbose = false; /** * Run SqlTool according to metacommands embedded in given SQL file. * * @param file SQL file */ public boolean execute(File file) throws IOException, InterruptedException { Metadata md = new Metadata(file); if (Verbose) { System.err.println("HARNESS METADATA:\n" + md); } execHarness.clear(); String[] args = new String[md.jvmargs.length + 1 + md.toolargs.length + (md.inputAsFile ? 1 : 0)]; int argIndex = 0; for (int i = 0; i < md.jvmargs.length; i++) { args[argIndex++] = md.jvmargs[i]; } args[argIndex++] = org.hsqldb.util.SqlTool.class.getName(); for (int i = 0; i < md.toolargs.length; i++) { args[argIndex++] = md.toolargs[i]; } if (md.inputAsFile) { args[argIndex++] = file.toString(); } else { execHarness.setInput(file); } if (Verbose) { System.err.println("ALL ARGS: " + ExecHarness.stringArrayToString(args)); } execHarness.setArgs(args); execHarness.exec(); if (Verbose) { System.err.println( "STDOUT ******************************************"); System.out.print(execHarness.getStdout()); System.err.println( "ERROUT ******************************************"); System.err.print(execHarness.getErrout()); System.err.println( "*************************************************"); } if (md.exitValue != null) { if (md.exitValue.intValue() != execHarness.getExitValue()) { if (Verbose) { System.err.println("Failed exit value test"); } return false; } } String stdout = execHarness.getStdout(); String errout = execHarness.getErrout(); for (int i = 0; i < md.rejectErroutPatterns.length; i++) { if (md.rejectErroutPatterns[i].matcher(errout).find()) { if (Verbose) { System.err.println("Failed rejectErrOut regex '" + md.rejectErroutPatterns[i].pattern() + "'"); } return false; } } for (int i = 0; i < md.rejectStdoutPatterns.length; i++) { if (md.rejectStdoutPatterns[i].matcher(stdout).find()) { if (Verbose) { System.err.println("Failed rejectStdout regex '" + md.rejectStdoutPatterns[i].pattern() + "'"); } return false; } } for (int i = 0; i < md.requireErroutPatterns.length; i++) { if (!md.requireErroutPatterns[i].matcher(errout).find()) { if (Verbose) { System.err.println("Failed requireErrorOut regex '" + md.requireErroutPatterns[i].pattern() + "'"); } return false; } } for (int i = 0; i < md.requireStdoutPatterns.length; i++) { if (!md.requireStdoutPatterns[i].matcher(stdout).find()) { if (Verbose) { System.err.println("Failed requireStdOut regex '" + md.requireStdoutPatterns[i].pattern() + "'"); } return false; } } return true; } private static String[] mtString = {}; private static Pattern[] mtPattern = {}; private class Metadata { private byte[] ba = new byte[MAX_SQLFILE_LEN + 1]; public Metadata(File inFile) throws FileNotFoundException, IOException { String name, val; String metaBlock = getHarnessMetaBlock(inFile); /* This really only needed for debugging this class itself * (SqlToolHarness). if (Verbose) { System.err.println("METABLOCK {\n" + metaBlock + "}"); } */ Pattern directivePattern = Pattern.compile("(?m)^\\s*(\\w+)\\s+(.*\\S+)?"); Matcher directiveMatcher = directivePattern.matcher(metaBlock); while (directiveMatcher.find()) { if (directiveMatcher.groupCount() != 2) { throw new RuntimeException("Pattern '" + directivePattern + " matched " + directiveMatcher.groupCount() + " groups."); } name = directiveMatcher.group(1); val = ((directiveMatcher.groupCount() == 2) ? directiveMatcher.group(2) : null); if (name.equals("arg")) { toolargs = ExecHarness.push(val, toolargs); } else if (name.equals("jvmarg")) { jvmargs = ExecHarness.push(val, jvmargs); } else if (name.equals("requireStdoutRegex")) { requireStdoutPatterns = push(Pattern.compile(val), requireStdoutPatterns); } else if (name.equals("rejectStdoutRegex")) { rejectStdoutPatterns = push(Pattern.compile(val), rejectStdoutPatterns); } else if (name.equals("requireErroutRegex")) { requireErroutPatterns = push(Pattern.compile(val), requireErroutPatterns); } else if (name.equals("rejectErroutRegex")) { rejectErroutPatterns = push(Pattern.compile(val), rejectErroutPatterns); } else if (name.equals("inputAsFile")) { inputAsFile = Boolean.valueOf(val).booleanValue(); } else if (name.equals("exitValue")) { exitValue = ((val == null) ? null : Integer.valueOf(val)); } else { // TODO: Use a custom Exception class. throw new IOException("Unknown Metadata directive: " + name); } } } private String[] toolargs = mtString; private String[] jvmargs = mtString; private Pattern[] requireStdoutPatterns = mtPattern; private Pattern[] rejectStdoutPatterns = mtPattern; private Pattern[] requireErroutPatterns = mtPattern; private Pattern[] rejectErroutPatterns = mtPattern; private boolean inputAsFile = false; private Integer exitValue = new Integer(0); public String toString() { StringBuffer sb = new StringBuffer(); sb.append(" TOOLARGS: " + ExecHarness.stringArrayToString(toolargs) + '\n'); sb.append(" JVMARGS: " + ExecHarness.stringArrayToString(jvmargs) + '\n'); sb.append(" REQUIRE_STDOUT_PATTERNS: " + patternArrayToString(requireStdoutPatterns) + '\n'); sb.append(" REJECT_STDOUT_PATTERNS: " + patternArrayToString(rejectStdoutPatterns) + '\n'); sb.append(" REQUIRE_ERROUT_PATTERNS: " + patternArrayToString(requireErroutPatterns) + '\n'); sb.append(" REJECT_ERROUT_PATTERNS: " + patternArrayToString(rejectErroutPatterns) + '\n'); sb.append(" INPUTASFILE: " + inputAsFile + '\n'); sb.append(" EXITVALUE: " + exitValue + '\n'); return sb.toString(); } private String getHarnessMetaBlock(File inFile) throws FileNotFoundException, IOException { // The extra 1 is so we can request 1 more byte than we want. // If that read is satisfied, we know that we read > MAX_SQLFILE_LEN int i; int writePointer = 0; BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inFile)); while ((i = bis.read(ba, writePointer, ba.length - writePointer)) > 0) { writePointer += i; } if (i > -1) { throw new IOException(inFile.toString() + " is larger than " + (ba.length - 1) + " bytes."); } StringBuffer sb1 = new StringBuffer(); StringBuffer sb2 = new StringBuffer(); Pattern commentPattern = Pattern.compile("(?s)(?<=/\\*).*?(?=\\*/)"); Pattern mdPattern = Pattern.compile( "(?m)(^\\s*HARNESS_METADATA\\s+BEGIN\\s*^)(?s)(.*?$)(?-s)" + "(\\s*HARNESS_METADATA\\s+END\\s*$)"); Matcher commentMatcher = commentPattern.matcher(new String(ba, 0, writePointer)); while (commentMatcher.find()) { sb1.append(commentMatcher.group() + '\n'); } Matcher mdMatcher = mdPattern.matcher(sb1); while (mdMatcher.find()) { if (mdMatcher.groupCount() != 3) { continue; } sb2.append(mdMatcher.group(2) + '\n'); } return sb2.toString(); } } static public Pattern[] push(Pattern newTail, Pattern[] pataIn) { Pattern[] pataOut = new Pattern[pataIn.length + 1]; for (int i = 0; i < pataIn.length; i++) { pataOut[i] = pataIn[i]; } pataOut[pataOut.length - 1] = newTail; return pataOut; } static public String patternArrayToString(Pattern[] pata) { StringBuffer sb = new StringBuffer("{"); for (int i = 0; i < pata.length; i++) { if (i > 0) { sb.append(','); } sb.append(pata[i].pattern()); } return sb.toString() + '}'; } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.