package org.codehaus.plexus.archiver.zip; import java.io.File; import java.lang.reflect.Method; import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.archiver.UnArchiver; import org.codehaus.plexus.components.io.fileselectors.FileSelector; import org.codehaus.plexus.components.io.fileselectors.IncludeExcludeFileSelector; import org.codehaus.plexus.util.FileUtils; /** * @author Jason van Zyl */ public class ZipUnArchiverTest extends PlexusTestCase { public void testExtractingZipPreservesExecutableFlag() throws Exception { String s = "target/zip-unarchiver-tests"; File testZip = new File( getBasedir(), "src/test/jars/test.zip" ); File outputDirectory = new File( getBasedir(), s ); FileUtils.deleteDirectory( outputDirectory ); ZipUnArchiver zu = getZipUnArchiver(testZip); zu.extract( "", outputDirectory ); File testScript = new File( outputDirectory, "test.sh" ); final Method canExecute; try { canExecute = File.class.getMethod( "canExecute" ); canExecute.invoke( testScript ); assertTrue( (Boolean) canExecute.invoke( testScript ) ); } catch ( NoSuchMethodException ignore ) { } } public void testZeroFileModeInZip() throws Exception { String s = "target/zip-unarchiver-filemode-tests"; File testZip = new File( getBasedir(), "src/test/resources/zeroFileMode/foobar.zip" ); File outputDirectory = new File( getBasedir(), s ); FileUtils.deleteDirectory( outputDirectory ); ZipUnArchiver zu = getZipUnArchiver(testZip); zu.setIgnorePermissions( false ); zu.extract( "", outputDirectory ); File testScript = new File( outputDirectory, "foo.txt" ); final Method canRead; try { canRead = File.class.getMethod( "canRead" ); canRead.invoke( testScript ); assertTrue( (Boolean) canRead.invoke( testScript ) ); } catch ( NoSuchMethodException ignore ) { } } private void runUnarchiver( String path, FileSelector[] selectors, boolean[] results ) throws Exception { String s = "target/zip-unarchiver-tests"; File testJar = new File( getBasedir(), "src/test/jars/test.jar" ); File outputDirectory = new File( getBasedir(), s ); ZipUnArchiver zu = getZipUnArchiver(testJar); zu.setFileSelectors( selectors ); FileUtils.deleteDirectory( outputDirectory ); zu.extract( path, outputDirectory ); File f0 = new File( getBasedir(), s + "/resources/artifactId/test.properties" ); assertEquals( results[0], f0.exists() ); File f1 = new File( getBasedir(), s + "/resources/artifactId/directory/test.properties" ); assertEquals( results[1], f1.exists() ); File f2 = new File( getBasedir(), s + "/META-INF/MANIFEST.MF" ); assertEquals( results[2], f2.exists() ); } private ZipUnArchiver getZipUnArchiver(File testJar) throws Exception { ZipUnArchiver zu = (ZipUnArchiver) lookup( UnArchiver.ROLE, "zip" ); zu.setSourceFile( testJar ); return zu; } public void testExtractingADirectoryFromAJarFile() throws Exception { runUnarchiver( "resources/artifactId", null, new boolean[]{ true, true, false } ); runUnarchiver( "", null, new boolean[]{ true, true, true } ); } public void testSelectors() throws Exception { IncludeExcludeFileSelector fileSelector = new IncludeExcludeFileSelector(); runUnarchiver( "", new FileSelector[]{ fileSelector }, new boolean[]{ true, true, true } ); fileSelector.setExcludes( new String[]{ "**/test.properties" } ); runUnarchiver( "", new FileSelector[]{ fileSelector }, new boolean[]{ false, false, true } ); fileSelector.setIncludes( new String[]{ "**/test.properties" } ); fileSelector.setExcludes( null ); runUnarchiver( "", new FileSelector[]{ fileSelector }, new boolean[]{ true, true, false } ); fileSelector.setExcludes( new String[]{ "resources/artifactId/directory/test.properties" } ); runUnarchiver( "", new FileSelector[]{ fileSelector }, new boolean[]{ true, false, false } ); } }