Browse Source

new tests fail if the tests themselves live on the system classloader

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276724 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 21 years ago
parent
commit
cc1d22cffa
3 changed files with 104 additions and 52 deletions
  1. +2
    -0
      build.xml
  2. +102
    -0
      src/testcases/org/apache/tools/ant/AntClassLoaderDelegationTest.java
  3. +0
    -52
      src/testcases/org/apache/tools/ant/AntClassLoaderTest.java

+ 2
- 0
build.xml View File

@@ -1516,6 +1516,8 @@
unless="beanshell.present"/>

<!-- fail if testcases can be loaded from the system classloader -->
<exclude name="${ant.package}/AntClassLoaderDelegationTest.java"
if="tests.are.on.system.classpath"/>
<exclude name="${optional.package}/junit/JUnitClassLoaderTest.java"
if="tests.are.on.system.classpath"/>
<exclude name="${optional.package}/sitraka/XMLReportTest.java"


+ 102
- 0
src/testcases/org/apache/tools/ant/AntClassLoaderDelegationTest.java View File

@@ -0,0 +1,102 @@
/*
* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

package org.apache.tools.ant;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import junit.framework.TestCase;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.util.FileUtils;

/**
* Test case for ant class loader
*
*/
public class AntClassLoaderDelegationTest extends TestCase {

private Project p;

public AntClassLoaderDelegationTest(String name) {
super(name);
}

public void setUp() {
p = new Project();
p.init();
}

/** Sample resource present in build/testcases/ */
private static final String TEST_RESOURCE = "org/apache/tools/ant/IncludeTest.class";
public void testFindResources() throws Exception {
//System.err.println("loading from: " + AntClassLoader.class.getProtectionDomain().getCodeSource().getLocation());
// See bug #30161.
// This path should contain the class files for these testcases:
String buildTestcases = System.getProperty("build.tests");
assertNotNull("defined ${build.tests}", buildTestcases);
assertTrue("have a dir " + buildTestcases, new File(buildTestcases).isDirectory());
Path path = new Path(p, buildTestcases);
// A special parent loader which is not the system class loader:
ClassLoader parent = new ParentLoader();
// An AntClassLoader which is supposed to delegate to the parent and then to the disk path:
ClassLoader acl = new AntClassLoader(parent, p, path, true);
// The intended result URLs:
URL urlFromPath = new URL(FileUtils.newFileUtils().toURI(buildTestcases) + TEST_RESOURCE);
URL urlFromParent = new URL("http://ant.apache.org/" + TEST_RESOURCE);
assertEquals("correct resources (regular delegation order)",
Arrays.asList(new URL[] {urlFromParent, urlFromPath}),
enum2List(acl.getResources(TEST_RESOURCE)));
acl = new AntClassLoader(parent, p, path, false);
assertEquals("correct resources (reverse delegation order)",
Arrays.asList(new URL[] {urlFromPath, urlFromParent}),
enum2List(acl.getResources(TEST_RESOURCE)));
}
private static List enum2List(Enumeration e) {
// JDK 1.4: return Collections.list(e);
List l = new ArrayList();
while (e.hasMoreElements()) {
l.add(e.nextElement());
}
return l;
}
/** Special loader that just knows how to find TEST_RESOURCE. */
private static final class ParentLoader extends ClassLoader {
public ParentLoader() {}
protected Enumeration findResources(String name) throws IOException {
if (name.equals(TEST_RESOURCE)) {
return Collections.enumeration(Collections.singleton(new URL("http://ant.apache.org/" + name)));
} else {
return Collections.enumeration(Collections.EMPTY_SET);
}
}
}
}

+ 0
- 52
src/testcases/org/apache/tools/ant/AntClassLoaderTest.java View File

@@ -82,56 +82,4 @@ public class AntClassLoaderTest extends TestCase {
fail("loader should not fail even if project finished");
}
}
/** Sample resource present in build/testcases/ */
private static final String TEST_RESOURCE = "org/apache/tools/ant/IncludeTest.class";
public void testFindResources() throws Exception {
//System.err.println("loading from: " + AntClassLoader.class.getProtectionDomain().getCodeSource().getLocation());
// See bug #30161.
// This path should contain the class files for these testcases:
String buildTestcases = System.getProperty("build.tests");
assertNotNull("defined ${build.tests}", buildTestcases);
assertTrue("have a dir " + buildTestcases, new File(buildTestcases).isDirectory());
Path path = new Path(p, buildTestcases);
// A special parent loader which is not the system class loader:
ClassLoader parent = new ParentLoader();
// An AntClassLoader which is supposed to delegate to the parent and then to the disk path:
ClassLoader acl = new AntClassLoader(parent, p, path, true);
// The intended result URLs:
URL urlFromPath = new URL(FileUtils.newFileUtils().toURI(buildTestcases) + TEST_RESOURCE);
URL urlFromParent = new URL("http://ant.apache.org/" + TEST_RESOURCE);
assertEquals("correct resources (regular delegation order)",
Arrays.asList(new URL[] {urlFromParent, urlFromPath}),
enum2List(acl.getResources(TEST_RESOURCE)));
acl = new AntClassLoader(parent, p, path, false);
assertEquals("correct resources (reverse delegation order)",
Arrays.asList(new URL[] {urlFromPath, urlFromParent}),
enum2List(acl.getResources(TEST_RESOURCE)));
}
private static List enum2List(Enumeration e) {
// JDK 1.4: return Collections.list(e);
List l = new ArrayList();
while (e.hasMoreElements()) {
l.add(e.nextElement());
}
return l;
}
/** Special loader that just knows how to find TEST_RESOURCE. */
private static final class ParentLoader extends ClassLoader {
public ParentLoader() {}
protected Enumeration findResources(String name) throws IOException {
if (name.equals(TEST_RESOURCE)) {
return Collections.enumeration(Collections.singleton(new URL("http://ant.apache.org/" + name)));
} else {
return Collections.enumeration(Collections.EMPTY_SET);
}
}
}
}

Loading…
Cancel
Save