/******************************************************************************* * Copyright (c) 2010-present Sonatype, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Stuart McCulloch (Sonatype, Inc.) - initial API and implementation *******************************************************************************/ package org.eclipse.sisu.space; import static org.eclipse.sisu.space.FileEntryIteratorTest.expand; import java.lang.reflect.Field; import java.net.URL; import java.util.Enumeration; import java.util.NoSuchElementException; import org.junit.Ignore; import junit.framework.TestCase; @Ignore( "Need to replace some test archives" ) public class ResourceEnumerationTest extends TestCase { private static final URL COMMONS_LOGGING_JAR = ZipEntryIteratorTest.class.getResource( "commons-logging-1.1.1.jar" ); public void testResourceEnumeration() throws Exception { final Enumeration<URL> e = new ResourceEnumeration( null, null, true, new URL[] { COMMONS_LOGGING_JAR, expand( COMMONS_LOGGING_JAR ) } ); int n = 0; while ( e.hasMoreElements() ) { e.nextElement(); n++; } assertEquals( 66, n ); try { e.nextElement(); fail( "Expected NoSuchElementException" ); } catch ( final NoSuchElementException nse ) { } } public void testFixedEnumeration() { final Enumeration<URL> e1 = new ResourceEnumeration( "org/apache/commons/logging", "LogFactory.clazz", false, new URL[] { COMMONS_LOGGING_JAR } ); assertFalse( e1.hasMoreElements() ); final Enumeration<URL> e2 = new ResourceEnumeration( "org/apache/commons/logging", "LogFactory.class", false, new URL[] { COMMONS_LOGGING_JAR } ); final String prefix = COMMONS_LOGGING_JAR + "!/"; assertEquals( prefix + "org/apache/commons/logging/LogFactory.class", e2.nextElement().getPath() ); assertFalse( e2.hasMoreElements() ); } public void testRecursiveEnumeration() { final Enumeration<URL> e = new ResourceEnumeration( "/", "LogFactory.class", true, new URL[] { COMMONS_LOGGING_JAR } ); final String prefix = COMMONS_LOGGING_JAR + "!/"; assertEquals( prefix + "org/apache/commons/logging/LogFactory.class", e.nextElement().getPath() ); assertFalse( e.hasMoreElements() ); } public void testGlobbedEnumeration() { int n = 0; final Enumeration<URL> e = new ResourceEnumeration( "/", "*", true, new URL[] { COMMONS_LOGGING_JAR } ); while ( e.hasMoreElements() ) { e.nextElement(); n++; } assertEquals( 33, n ); } public void testGlobbedEnumerationStart() { final Enumeration<URL> e = new ResourceEnumeration( null, "*$2.class", true, new URL[] { COMMONS_LOGGING_JAR } ); final String prefix = COMMONS_LOGGING_JAR + "!/"; assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$2.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$2.class", e.nextElement().getPath() ); assertFalse( e.hasMoreElements() ); } public void testGlobbedEnumerationEnd() { final Enumeration<URL> e = new ResourceEnumeration( null, "SimpleLog.*", true, new URL[] { COMMONS_LOGGING_JAR } ); final String prefix = COMMONS_LOGGING_JAR + "!/"; assertEquals( prefix + "org/apache/commons/logging/impl/SimpleLog.class", e.nextElement().getPath() ); assertFalse( e.hasMoreElements() ); } public void testGlobbedEnumerationMiddle() { final Enumeration<URL> e = new ResourceEnumeration( null, "LogFactory*.class", true, new URL[] { COMMONS_LOGGING_JAR } ); final String prefix = COMMONS_LOGGING_JAR + "!/"; assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$1.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$2.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$3.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$1.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$2.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$3.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$4.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$5.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$6.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory.class", e.nextElement().getPath() ); assertFalse( e.hasMoreElements() ); } public void testMultiGlobbedEnumeration() { final Enumeration<URL> e = new ResourceEnumeration( null, "*Fact*$*", true, new URL[] { COMMONS_LOGGING_JAR } ); final String prefix = COMMONS_LOGGING_JAR + "!/"; assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$1.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$2.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$3.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$1.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$2.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$3.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$4.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$5.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$6.class", e.nextElement().getPath() ); assertFalse( e.hasMoreElements() ); } public void testSubPathEnumeration() { final Enumeration<URL> e = new ResourceEnumeration( "/org/apache/commons/logging/impl", "*Fact*$*", true, new URL[] { COMMONS_LOGGING_JAR } ); final String prefix = COMMONS_LOGGING_JAR + "!/"; assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$1.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$2.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/impl/LogFactoryImpl$3.class", e.nextElement().getPath() ); assertFalse( e.hasMoreElements() ); } public void testNonRecursiveSubPathEnumeration() { final Enumeration<URL> e = new ResourceEnumeration( "/org/apache/commons/logging/", "*Fact*$*", false, new URL[] { COMMONS_LOGGING_JAR } ); final String prefix = COMMONS_LOGGING_JAR + "!/"; assertEquals( prefix + "org/apache/commons/logging/LogFactory$1.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$2.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$3.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$4.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$5.class", e.nextElement().getPath() ); assertEquals( prefix + "org/apache/commons/logging/LogFactory$6.class", e.nextElement().getPath() ); assertFalse( e.hasMoreElements() ); } public void testBrokenUrlEnumeration() throws Exception { final Enumeration<URL> e = new ResourceEnumeration( null, null, true, new URL[] { expand( COMMONS_LOGGING_JAR ) } ); assertTrue( e.hasMoreElements() ); // intentionally break the internal next entry name to trigger a malformed URL problem final Field nextEntryName = ResourceEnumeration.class.getDeclaredField( "nextEntryName" ); nextEntryName.setAccessible( true ); nextEntryName.set( e, "foo:" ); try { e.nextElement(); fail( "Expected IllegalStateException" ); } catch ( final IllegalStateException ise ) { } } }