/******************************************************************************* * 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 java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.junit.Ignore; import junit.framework.TestCase; @Ignore( "Need to replace some test archives" ) public class FileEntryIteratorTest extends TestCase { public void testURLtoFile() throws MalformedURLException { assertEquals( "test", FileEntryIterator.toFile( new URL( "file:test" ) ).getPath() ); assertEquals( "A B C", FileEntryIterator.toFile( new URL( "file:A B C" ) ).getPath() ); assertEquals( "A B C%%", FileEntryIterator.toFile( new URL( "file:A B%20C%%" ) ).getPath() ); assertEquals( "A%B%C%", FileEntryIterator.toFile( new URL( "file:A%B%C%" ) ).getPath() ); assertEquals( "A+%+C", FileEntryIterator.toFile( new URL( "file:A+%+C" ) ).getPath() ); } public void testNoSuchFile() throws Exception { final Iterator<String> i = new FileEntryIterator( new URL( "file:UNKNOWN" ), "", true ); assertFalse( i.hasNext() ); try { i.next(); fail( "Expected NoSuchElementException" ); } catch ( final NoSuchElementException e ) { } } public void testEmptyFolder() throws Exception { final Iterator<String> i = new FileEntryIterator( expand( resource( "empty.zip" ) ), "", true ); assertFalse( i.hasNext() ); try { i.next(); fail( "Expected NoSuchElementException" ); } catch ( final NoSuchElementException e ) { } } public void testTrivialFolder() throws Exception { final Iterator<String> i = new FileEntryIterator( expand( resource( "empty.jar" ) ), "", true ); assertTrue( i.hasNext() ); assertEquals( "META-INF/", i.next() ); assertTrue( i.hasNext() ); assertEquals( "META-INF/MANIFEST.MF", i.next() ); assertFalse( i.hasNext() ); try { i.next(); fail( "Expected NoSuchElementException" ); } catch ( final NoSuchElementException e ) { } } public void testSimpleFolder() throws Exception { final Iterator<String> i = new FileEntryIterator( expand( resource( "simple.jar" ) ), "", true ); final Set<String> names = new HashSet<String>(); while ( i.hasNext() ) { names.add( i.next() ); } assertTrue( names.remove( "META-INF/" ) ); assertTrue( names.remove( "META-INF/MANIFEST.MF" ) ); assertTrue( names.remove( "0" ) ); assertTrue( names.remove( "a/" ) ); assertTrue( names.remove( "a/1" ) ); assertTrue( names.remove( "a/b/" ) ); assertTrue( names.remove( "a/b/2" ) ); assertTrue( names.remove( "a/b/c/" ) ); assertTrue( names.remove( "a/b/c/3" ) ); assertTrue( names.remove( "4" ) ); assertTrue( names.remove( "x/" ) ); assertTrue( names.remove( "x/5" ) ); assertTrue( names.remove( "x/y/" ) ); assertTrue( names.remove( "x/y/6" ) ); assertTrue( names.remove( "7" ) ); assertTrue( names.isEmpty() ); } public void testNoRecursion() throws Exception { final Iterator<String> i = new FileEntryIterator( expand( resource( "simple.jar" ) ), "", false ); final Set<String> names = new HashSet<String>(); while ( i.hasNext() ) { names.add( i.next() ); } assertTrue( names.remove( "META-INF/" ) ); assertTrue( names.remove( "0" ) ); assertTrue( names.remove( "a/" ) ); assertTrue( names.remove( "4" ) ); assertTrue( names.remove( "x/" ) ); assertTrue( names.remove( "7" ) ); assertTrue( names.isEmpty() ); } public void testSubPath() throws Exception { final Iterator<String> i = new FileEntryIterator( expand( resource( "simple.jar" ) ), "a/b", true ); final Set<String> names = new HashSet<String>(); while ( i.hasNext() ) { names.add( i.next() ); } assertTrue( names.remove( "a/b/2" ) ); assertTrue( names.remove( "a/b/c/" ) ); assertTrue( names.remove( "a/b/c/3" ) ); assertTrue( names.isEmpty() ); } public void testRemoveNotSupported() throws IOException { final Iterator<String> i = new FileEntryIterator( new URL( "file:" ), "", false ); try { i.remove(); fail( "Expected UnsupportedOperationException" ); } catch ( final UnsupportedOperationException e ) { } } static URL expand( final URL url ) throws Exception { final File jar = new File( url.toURI() ); final File dir = new File( jar.getParentFile(), jar.getName() + "_expanded" ); try { final ZipFile zip = new ZipFile( jar ); for ( final Enumeration<? extends ZipEntry> e = zip.entries(); e.hasMoreElements(); ) { final ZipEntry entry = e.nextElement(); final File path = new File( dir, entry.getName() ); if ( entry.isDirectory() ) { path.mkdirs(); } else { path.getParentFile().mkdirs(); final ReadableByteChannel in = Channels.newChannel( zip.getInputStream( entry ) ); final FileOutputStream os = new FileOutputStream( path ); os.getChannel().transferFrom( in, 0, entry.getSize() ); os.close(); in.close(); } } zip.close(); } catch ( final IOException e ) { } return dir.toURI().toURL(); } private static URL resource( final String name ) { return FileEntryIteratorTest.class.getResource( name ); } }