From 341ff9fbe695a22155e875ed95ff32dd0b3d5bad Mon Sep 17 00:00:00 2001 From: Stephane Bailliez Date: Sat, 2 Feb 2002 01:38:21 +0000 Subject: [PATCH] Make sure that it collects testcases correctly inside directories. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271051 13f79535-47bb-0310-9956-ffa450edef68 --- .../optional/rjunit/BatchTestElement.java | 13 +- .../rjunit/ClasspathTestCollector.java | 16 +- .../optional/rjunit/ClientElement.java | 17 +- .../taskdefs/optional/rjunit/JUnitHelper.java | 2 +- .../optional/rjunit/remote/Base64.java | 289 ------------------ 5 files changed, 38 insertions(+), 299 deletions(-) delete mode 100644 proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/remote/Base64.java diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/BatchTestElement.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/BatchTestElement.java index 5262a8c05..2c81f1c04 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/BatchTestElement.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/BatchTestElement.java @@ -59,6 +59,8 @@ import junit.runner.TestCollector; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.PatternSet; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; /** * A test element where tests files are specified by include/exclude @@ -72,10 +74,15 @@ import org.apache.tools.ant.types.PatternSet; * * @author Stephane Bailliez */ -public class BatchTestElement implements TestCollector { +public class BatchTestElement extends ProjectComponent implements TestCollector { private ClasspathTestCollector collector = new ClasspathTestCollector(); + public void setProject(Project p){ + collector.setProject(p); + super.setProject(p); + } + // Test collector implementation public Enumeration collectTests() { @@ -88,6 +95,10 @@ public class BatchTestElement implements TestCollector { collector.setPath(path); } + public Path getPath(){ + return collector.getPath(); + } + public PatternSet.NameEntry createInclude() { return collector.createInclude(); } diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClasspathTestCollector.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClasspathTestCollector.java index 9c65788b7..4292c8287 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClasspathTestCollector.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClasspathTestCollector.java @@ -73,12 +73,12 @@ import org.apache.tools.ant.types.PatternSet; * * @author Stephane Bailliez */ -public class ClasspathTestCollector extends ProjectComponent +public final class ClasspathTestCollector extends ProjectComponent implements TestCollector { private final static int SUFFIX_LENGTH = ".class".length(); - private PatternSet patterns = new PatternSet(); + private final PatternSet patterns = new PatternSet(); private Path path = null; @@ -101,11 +101,13 @@ public class ClasspathTestCollector extends ProjectComponent } // add tests to the already collected one final int includedCount = included.size(); + log("Adding " + includedCount + " testcases from " + f, Project.MSG_VERBOSE); for (int j = 0; j < includedCount; j++) { - String testname = (String) included.elementAt(i); + String testname = (String) included.elementAt(j); collected.put(testname, ""); } } + log("Collected " + collected.size() + " testcases from " + paths.length + " paths."); return collected.keys(); } @@ -114,8 +116,8 @@ public class ClasspathTestCollector extends ProjectComponent Project project = getProject(); DirectoryScanner ds = new DirectoryScanner(); ds.setBasedir(dir); - ds.setIncludes(patterns.getIncludePatterns(project)); - ds.setExcludes(patterns.getExcludePatterns(project)); + ds.setIncludes(patterns.getIncludePatterns(getProject())); + ds.setExcludes(patterns.getExcludePatterns(getProject())); ds.scan(); String[] included = ds.getIncludedFiles(); return testClassNameFromFile(included); @@ -163,6 +165,10 @@ public class ClasspathTestCollector extends ProjectComponent this.path = path; } + public Path getPath(){ + return this.path; + } + public PatternSet.NameEntry createInclude() { return patterns.createInclude(); } diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClientElement.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClientElement.java index dd80c9bc9..f89a154df 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClientElement.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClientElement.java @@ -58,6 +58,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.io.ByteArrayOutputStream; import java.util.Enumeration; import java.util.Properties; import java.util.Vector; @@ -110,7 +111,7 @@ public final class ClientElement extends ProjectComponent { /** create a new client */ public ClientElement(RJUnitTask value) { parent = value; - cmd.setClassname("org.apache.tools.ant.taskdefs.optional.junit.remote.TestRunner"); + cmd.setClassname("org.apache.tools.ant.taskdefs.optional.rjunit.remote.TestRunner"); } /** core entry point */ @@ -127,7 +128,7 @@ public final class ClientElement extends ProjectComponent { // must appended to classpath to avoid conflicts. JUnitHelper.addClasspathEntry(createClasspath(), "/junit/framework/TestCase.class"); JUnitHelper.addClasspathEntry(createClasspath(), "/org/apache/tools/ant/Task.class"); - JUnitHelper.addClasspathEntry(createClasspath(), "/org/apache/tools/ant/taskdefs/optional/junit/remote/TestRunner.class"); + JUnitHelper.addClasspathEntry(createClasspath(), "/org/apache/tools/ant/taskdefs/optional/rjunit/remote/TestRunner.class"); } protected void doExecute() throws BuildException { @@ -162,6 +163,13 @@ public final class ClientElement extends ProjectComponent { Enumeration[] tests = new Enumeration[testCollectors.size()]; for (int i = 0; i < testCollectors.size(); i++) { TestCollector te = (TestCollector) testCollectors.elementAt(i); + //@fixme I'm forced to append the classpath from batchtests + // here to make sure it will be included as part of the + // testrunner classpath. Need a better design ? + if (te instanceof BatchTestElement){ + Path path = ((BatchTestElement)te).getPath(); + cmd.getClasspath().append(path); + } tests[i] = te.collectTests(); } return new CompoundEnumeration(tests); @@ -191,8 +199,11 @@ public final class ClientElement extends ProjectComponent { File f = futils.createTempFile("junit-antrunner", "tmp", new File(".")); OutputStream os = null; try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); os = new BufferedOutputStream(new FileOutputStream(f)); - props.store(os, "JUnit Ant Runner configuration file"); + props.store(baos, "JUnit Ant Runner configuration file"); + log(baos.toString(), Project.MSG_VERBOSE); + os.write(baos.toByteArray()); } catch (IOException e) { throw new BuildException(e); } finally { diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/JUnitHelper.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/JUnitHelper.java index f5a713652..8b4f3f93a 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/JUnitHelper.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/JUnitHelper.java @@ -144,7 +144,7 @@ public final class JUnitHelper { */ public static File getResourceEntry(String resource) { URL url = JUnitHelper.class.getResource(resource); - if (url != null) { + if (url == null) { // can't find the resource... return null; } diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/remote/Base64.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/remote/Base64.java deleted file mode 100644 index 7609094df..000000000 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/remote/Base64.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. 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. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Ant", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 THE APACHE SOFTWARE FOUNDATION OR - * ITS 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. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -package org.apache.tools.ant.taskdefs.optional.rjunit.remote; - -/** - * This class has been taken from jakarta-commons-sandbox in the - * util project. Once there is an official release of commons, it should - * be replace to avoid duplication. - *

- * This class provides encode/decode for RFC 2045 Base64 as defined by - * RFC 2045, N. Freed and N. Borenstein. RFC 2045: - * Multipurpose Internet Mail Extensions (MIME) Part One: Format of - * Internet Message Bodies. Reference 1996 - * - * @author Jeffrey Rodriguez - */ -public final class Base64 { - static private final int BASELENGTH = 255; - static private final int LOOKUPLENGTH = 64; - static private final int TWENTYFOURBITGROUP = 24; - static private final int EIGHTBIT = 8; - static private final int SIXTEENBIT = 16; - static private final int SIXBIT = 6; - static private final int FOURBYTE = 4; - static private final int SIGN = -128; - static private final byte PAD = (byte) '='; - static private byte[] base64Alphabet = new byte[BASELENGTH]; - static private byte[] lookUpBase64Alphabet = new byte[LOOKUPLENGTH]; - //static private final Log log = LogSource.getInstance("org.apache.commons.util.Base64"); - - static { - for (int i = 0; i < BASELENGTH; i++) { - base64Alphabet[i] = -1; - } - for (int i = 'Z'; i >= 'A'; i--) { - base64Alphabet[i] = (byte) (i - 'A'); - } - for (int i = 'z'; i >= 'a'; i--) { - base64Alphabet[i] = (byte) (i - 'a' + 26); - } - for (int i = '9'; i >= '0'; i--) { - base64Alphabet[i] = (byte) (i - '0' + 52); - } - - base64Alphabet['+'] = 62; - base64Alphabet['/'] = 63; - - for (int i = 0; i <= 25; i++) - lookUpBase64Alphabet[i] = (byte) ('A' + i); - - for (int i = 26, j = 0; i <= 51; i++, j++) - lookUpBase64Alphabet[i] = (byte) ('a' + j); - - for (int i = 52, j = 0; i <= 61; i++, j++) - lookUpBase64Alphabet[i] = (byte) ('0' + j); - - lookUpBase64Alphabet[62] = (byte) '+'; - lookUpBase64Alphabet[63] = (byte) '/'; - } - - public static boolean isBase64(String isValidString) { - return isArrayByteBase64(isValidString.getBytes()); - } - - public static boolean isBase64(byte octect) { - //shall we ignore white space? JEFF?? - return (octect == PAD || base64Alphabet[octect] != -1); - } - - public static boolean isArrayByteBase64(byte[] arrayOctect) { - int length = arrayOctect.length; - if (length == 0) { - // shouldn't a 0 length array be valid base64 data? - // return false; - return true; - } - for (int i = 0; i < length; i++) { - if (!Base64.isBase64(arrayOctect[i])) - return false; - } - return true; - } - - /** - * Encodes hex octects into Base64. - * - * @param binaryData Array containing binary data to encode. - * @return Base64-encoded data. - */ - public static byte[] encode(byte[] binaryData) { - int lengthDataBits = binaryData.length * EIGHTBIT; - int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; - int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; - byte encodedData[] = null; - - - if (fewerThan24bits != 0) { - //data not divisible by 24 bit - encodedData = new byte[(numberTriplets + 1) * 4]; - } else { - // 16 or 8 bit - encodedData = new byte[numberTriplets * 4]; - } - - byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; - - int encodedIndex = 0; - int dataIndex = 0; - int i = 0; - //log.debug("number of triplets = " + numberTriplets); - for (i = 0; i < numberTriplets; i++) { - dataIndex = i * 3; - b1 = binaryData[dataIndex]; - b2 = binaryData[dataIndex + 1]; - b3 = binaryData[dataIndex + 2]; - - //log.debug("b1= " + b1 +", b2= " + b2 + ", b3= " + b3); - - l = (byte) (b2 & 0x0f); - k = (byte) (b1 & 0x03); - - encodedIndex = i * 4; - byte val1 = ((b1 & SIGN) == 0)?(byte) (b1 >> 2):(byte) ((b1) >> 2 ^ 0xc0); - byte val2 = ((b2 & SIGN) == 0)?(byte) (b2 >> 4):(byte) ((b2) >> 4 ^ 0xf0); - byte val3 = ((b3 & SIGN) == 0)?(byte) (b3 >> 6):(byte) ((b3) >> 6 ^ 0xfc); - - encodedData[encodedIndex] = lookUpBase64Alphabet[val1]; - //log.debug( "val2 = " + val2 ); - //log.debug( "k4 = " + (k<<4) ); - //log.debug( "vak = " + (val2 | (k<<4)) ); - encodedData[encodedIndex + 1] = - lookUpBase64Alphabet[val2 | (k << 4)]; - encodedData[encodedIndex + 2] = - lookUpBase64Alphabet[(l << 2) | val3]; - encodedData[encodedIndex + 3] = lookUpBase64Alphabet[b3 & 0x3f]; - } - - // form integral number of 6-bit groups - dataIndex = i * 3; - encodedIndex = i * 4; - if (fewerThan24bits == EIGHTBIT) { - b1 = binaryData[dataIndex]; - k = (byte) (b1 & 0x03); - //log.debug("b1=" + b1); - //log.debug("b1<<2 = " + (b1>>2) ); - byte val1 = ((b1 & SIGN) == 0)?(byte) (b1 >> 2):(byte) ((b1) >> 2 ^ 0xc0); - encodedData[encodedIndex] = lookUpBase64Alphabet[val1]; - encodedData[encodedIndex + 1] = lookUpBase64Alphabet[k << 4]; - encodedData[encodedIndex + 2] = PAD; - encodedData[encodedIndex + 3] = PAD; - } else if (fewerThan24bits == SIXTEENBIT) { - - b1 = binaryData[dataIndex]; - b2 = binaryData[dataIndex + 1]; - l = (byte) (b2 & 0x0f); - k = (byte) (b1 & 0x03); - - byte val1 = ((b1 & SIGN) == 0)?(byte) (b1 >> 2):(byte) ((b1) >> 2 ^ 0xc0); - byte val2 = ((b2 & SIGN) == 0)?(byte) (b2 >> 4):(byte) ((b2) >> 4 ^ 0xf0); - - encodedData[encodedIndex] = lookUpBase64Alphabet[val1]; - encodedData[encodedIndex + 1] = - lookUpBase64Alphabet[val2 | (k << 4)]; - encodedData[encodedIndex + 2] = lookUpBase64Alphabet[l << 2]; - encodedData[encodedIndex + 3] = PAD; - } - - return encodedData; - } - - /** - * Decodes Base64 data into octects - * - * @param binaryData Byte array containing Base64 data - * @return Array containing decoded data. - */ - public static byte[] decode(byte[] base64Data) { - // handle the edge case, so we don't have to worry about it later - if (base64Data.length == 0) { - return new byte[0]; - } - - int numberQuadruple = base64Data.length / FOURBYTE; - byte decodedData[] = null; - byte b1 = 0,b2 = 0,b3 = 0, b4 = 0, marker0 = 0, marker1 = 0; - - // Throw away anything not in base64Data - - int encodedIndex = 0; - int dataIndex = 0; - { - // this sizes the output array properly - rlw - int lastData = base64Data.length; - // ignore the '=' padding - while (base64Data[lastData - 1] == PAD) { - if (--lastData == 0) { - return new byte[0]; - } - } - decodedData = new byte[lastData - numberQuadruple]; - } - - for (int i = 0; i < numberQuadruple; i++) { - dataIndex = i * 4; - marker0 = base64Data[dataIndex + 2]; - marker1 = base64Data[dataIndex + 3]; - - b1 = base64Alphabet[base64Data[dataIndex]]; - b2 = base64Alphabet[base64Data[dataIndex + 1]]; - - if (marker0 != PAD && marker1 != PAD) { - //No PAD e.g 3cQl - b3 = base64Alphabet[marker0]; - b4 = base64Alphabet[marker1]; - - decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); - decodedData[encodedIndex + 1] = - (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); - decodedData[encodedIndex + 2] = (byte) (b3 << 6 | b4); - } else if (marker0 == PAD) { - //Two PAD e.g. 3c[Pad][Pad] - decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); - } else if (marker1 == PAD) { - //One PAD e.g. 3cQ[Pad] - b3 = base64Alphabet[marker0]; - - decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); - decodedData[encodedIndex + 1] = - (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); - } - encodedIndex += 3; - } - return decodedData; - } -} - -