package org.codehaus.plexus.archiver;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.archiver.tar.TarArchiver;
import org.codehaus.plexus.archiver.tar.TarLongFileMode;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.FileUtils;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.util.Enumeration;
/**
* @author Erik Engstrom
*/
public class DuplicateFilesTest
extends PlexusTestCase
{
private static final File file1 = getTestFile( "src/test/resources/group-writable/foo.txt" );
private static final File file2 = getTestFile( "src/test/resources/world-writable/foo.txt" );
private static final File destination = getTestFile( "target/output/duplicateFiles" );
public void setUp()
throws Exception
{
super.setUp();
getContainer().getLoggerManager().setThreshold( Logger.LEVEL_DEBUG );
}
public void testZipArchiver()
throws Exception
{
Archiver archiver = (Archiver) lookup( Archiver.ROLE, "zip" );
archiver.setDuplicateBehavior( Archiver.DUPLICATES_SKIP );
File archive = createArchive( archiver, "zip" );
org.apache.commons.compress.archivers.zip.ZipFile zf = new org.apache.commons.compress.archivers.zip.ZipFile( archive );
Enumeration e = zf.getEntries();
int entryCount = 0;
while ( e.hasMoreElements() )
{
ZipArchiveEntry entry = (ZipArchiveEntry) e.nextElement();
System.out.println( entry.getName() );
entryCount++;
}
// Zip file should have 2 entries, 1 for the directory and one for foo.txt
assertEquals( 2, entryCount );
testArchive( archive, "zip" );
}
public void testDirArchiver()
throws Exception
{
Archiver archiver = (Archiver) lookup( Archiver.ROLE, "dir" );
createArchive( archiver, "dir" );
testFinalFile( "target/output/duplicateFiles.dir/duplicateFiles/foo.txt" );
}
public void testTarArchiver()
throws Exception
{
TarArchiver archiver = (TarArchiver) lookup( Archiver.ROLE, "tar" );
archiver.setLongfile(TarLongFileMode.posix );
archiver.setDuplicateBehavior( Archiver.DUPLICATES_SKIP );
File archive = createArchive( archiver, "tar" );
TarArchiveInputStream tis;
tis = new TarArchiveInputStream( new BufferedInputStream( new FileInputStream( archive ) ) );
int entryCount = 0;
while ( ( tis.getNextEntry() ) != null )
{
entryCount++;
}
assertEquals( 1, entryCount );
testArchive( archive, "tar" );
tis.close();
}
private File createArchive( Archiver archiver, String outputFileExt )
throws Exception
{
archiver.addFile( file1, "duplicateFiles/foo.txt" );
archiver.addFile( file2, "duplicateFiles/foo.txt" );
// delete it if it exists to ensure it is actually empty
if ( destination.exists() )
{
destination.delete();
}
File archive = getTestFile( "target/output/duplicateFiles." + outputFileExt );
if ( archive.exists() )
{
if ( archive.isDirectory() )
{
FileUtils.deleteDirectory( archive );
}
else
{
archive.delete();
}
}
archiver.setDestFile( archive );
archiver.createArchive();
return archive;
}
private void testArchive( File archive, String role )
throws Exception
{
// Check the content of the archive by extracting it
UnArchiver unArchiver = (UnArchiver) lookup( UnArchiver.ROLE, role );
unArchiver.setSourceFile( archive );
unArchiver.setDestDirectory( getTestFile( "target/output/" ) );
unArchiver.extract();
assertTrue( destination.exists() );
assertTrue( destination.isDirectory() );
testFinalFile( "target/output/duplicateFiles/foo.txt" );
}
private void testFinalFile( String path )
throws Exception
{
File outputFile = getTestFile( path );
assertTrue( outputFile.exists() );
BufferedReader reader = new BufferedReader( new FileReader( outputFile ) );
String firstLine = reader.readLine();
reader.close();
reader = new BufferedReader( new FileReader( file2 ) );
String expectedFirstLine = reader.readLine();
reader.close();
assertEquals( expectedFirstLine, firstLine );
}
}