package org.codehaus.plexus.archiver.tar;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
import org.codehaus.plexus.components.io.attributes.Java7Reflector;
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.Os;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class TarFileAttributesTest
extends PlexusTestCase
{
private final List<File> toDelete = new ArrayList<File>();
public void setUp()
throws Exception
{
super.setUp();
System.out.println( "Octal 0660 is decimal " + 0660 );
System.out.println( "Octal 0644 is decimal " + 0644 );
System.out.println( "Octal 0440 is decimal " + 0440 );
}
public void tearDown()
throws Exception
{
super.tearDown();
if ( !toDelete.isEmpty() )
{
for ( File f : toDelete )
{
System.out.println( "Deleting: " + f );
if ( f.isDirectory() )
{
try
{
FileUtils.deleteDirectory( f );
}
catch ( IOException e )
{
System.out.println( "Error deleting test directory: " + f );
}
}
else
{
f.delete();
f.deleteOnExit();
}
}
}
}
private void printTestHeader()
{
StackTraceElement e = new Throwable().getStackTrace()[1];
System.out.println( "\n\nRunning: " + e.getMethodName() + "\n\n" );
}
public void testUseAttributesFromTarArchiveInputInTarArchiverOutput()
throws Exception
{
printTestHeader();
if ( checkForWindows() )
{
System.out.println( "This test cannot run on windows. Aborting." );
return;
}
File tempFile = File.createTempFile( "tar-file-attributes.", ".tmp" );
toDelete.add( tempFile );
FileWriter writer = null;
try
{
writer = new FileWriter( tempFile );
writer.write( "This is a test file." );
}
finally
{
IOUtil.close( writer );
}
int result = Runtime.getRuntime().exec( "chmod 440 " + tempFile.getAbsolutePath() ).waitFor();
assertEquals( 0, result );
TarArchiver tarArchiver = getPosixCompliantTarArchiver();
File tempTarFile = File.createTempFile( "tar-file.", ".tar" );
toDelete.add( tempTarFile );
tarArchiver.setDestFile( tempTarFile );
tarArchiver.addFile( tempFile, tempFile.getName(), 0660 );
tarArchiver.createArchive();
TarArchiver tarArchiver2 = getPosixCompliantTarArchiver();
File tempTarFile2 = File.createTempFile( "tar-file.", ".tar" );
toDelete.add( tempTarFile2 );
tarArchiver2.setDestFile( tempTarFile2 );
DefaultArchivedFileSet afs = new DefaultArchivedFileSet(tempTarFile);
System.out.println( "Adding tar archive to new archiver: " + tempTarFile );
tarArchiver2.addArchivedFileSet( afs );
tarArchiver2.createArchive();
// Cut from here, and feed it into a new tar archiver...then unarchive THAT.
TarUnArchiver tarUnArchiver = (TarUnArchiver) lookup( UnArchiver.ROLE, "tar" );
File tempTarDir = File.createTempFile( "tar-test.", ".dir" );
tempTarDir.delete();
tempTarDir.mkdirs();
toDelete.add( tempTarDir );
tarUnArchiver.setDestDirectory( tempTarDir );
tarUnArchiver.setSourceFile( tempTarFile2 );
tarUnArchiver.extract();
PlexusIoResourceAttributes fileAttributes =
PlexusIoResourceAttributeUtils.getFileAttributes( new File( tempTarDir, tempFile.getName() ) );
final int expected = Java7Reflector.isAtLeastJava7() ? 0660 : 0644;
assertEquals( "This test will fail if your umask is not X2X (or more)",
expected, fileAttributes.getOctalMode() );
}
public void testUseDetectedFileAttributes()
throws Exception
{
printTestHeader();
if ( checkForWindows() )
{
System.out.println( "This test cannot run on windows. Aborting." );
return;
}
File tempFile = File.createTempFile( "tar-file-attributes.", ".tmp" );
toDelete.add( tempFile );
FileWriter writer = null;
try
{
writer = new FileWriter( tempFile );
writer.write( "This is a test file." );
}
finally
{
IOUtil.close( writer );
}
int result = Runtime.getRuntime().exec( "chmod 440 " + tempFile.getAbsolutePath() ).waitFor();
assertEquals( 0, result );
PlexusIoResourceAttributes fileAttributes = PlexusIoResourceAttributeUtils.getFileAttributes( tempFile );
assertEquals( 0440, fileAttributes.getOctalMode() );
TarArchiver tarArchiver = getPosixCompliantTarArchiver();
File tempTarFile = File.createTempFile( "tar-file.", ".tar" );
toDelete.add( tempTarFile );
tarArchiver.setDestFile( tempTarFile );
tarArchiver.addFile( tempFile, tempFile.getName() );
tarArchiver.createArchive();
TarUnArchiver tarUnArchiver = (TarUnArchiver) lookup( UnArchiver.ROLE, "tar" );
File tempTarDir = File.createTempFile( "tar-test.", ".dir" );
tempTarDir.delete();
tempTarDir.mkdirs();
toDelete.add( tempTarDir );
tarUnArchiver.setDestDirectory( tempTarDir );
tarUnArchiver.setSourceFile( tempTarFile );
tarUnArchiver.extract();
fileAttributes = PlexusIoResourceAttributeUtils.getFileAttributes( new File( tempTarDir, tempFile.getName() ) );
final int expected = Java7Reflector.isAtLeastJava7() ? 0440 : 0444;
assertEquals( "This test will fail if your umask is not X2X (or more)",
expected, fileAttributes.getOctalMode() );
}
private boolean checkForWindows()
{
return Os.isFamily(Os.FAMILY_WINDOWS);
}
public void testOverrideDetectedFileAttributes()
throws Exception
{
printTestHeader();
if ( checkForWindows() )
{
System.out.println( "This test cannot run on windows. Aborting." );
return;
}
File tempFile = File.createTempFile( "tar-file-attributes.", ".tmp" );
toDelete.add( tempFile );
FileWriter writer = null;
try
{
writer = new FileWriter( tempFile );
writer.write( "This is a test file." );
}
finally
{
IOUtil.close( writer );
}
int result = Runtime.getRuntime().exec( "chmod 440 " + tempFile.getAbsolutePath() ).waitFor();
assertEquals( 0, result );
TarArchiver tarArchiver = getPosixCompliantTarArchiver();
File tempTarFile = File.createTempFile( "tar-file.", ".tar" );
toDelete.add( tempTarFile );
tarArchiver.setDestFile( tempTarFile );
tarArchiver.addFile( tempFile, tempFile.getName(), 0660 );
tarArchiver.createArchive();
TarUnArchiver tarUnArchiver = (TarUnArchiver) lookup( UnArchiver.ROLE, "tar" );
File tempTarDir = File.createTempFile( "tar-test.", ".dir" );
tempTarDir.delete();
tempTarDir.mkdirs();
toDelete.add( tempTarDir );
tarUnArchiver.setDestDirectory( tempTarDir );
tarUnArchiver.setSourceFile( tempTarFile );
tarUnArchiver.extract();
PlexusIoResourceAttributes fileAttributes =
PlexusIoResourceAttributeUtils.getFileAttributes( new File( tempTarDir, tempFile.getName() ) );
final int expected = Java7Reflector.isAtLeastJava7() ? 0660 : 0644;
assertEquals( "This test will fail if your umask is not X2X (or more)",
expected, fileAttributes.getOctalMode() );
}
private TarArchiver getPosixCompliantTarArchiver() throws Exception {
TarArchiver tarArchiver = (TarArchiver) lookup( Archiver.ROLE, "tar" );
tarArchiver.setLongfile(TarLongFileMode.posix );
return tarArchiver;
}
public void testOverrideDetectedFileAttributesUsingFileMode()
throws Exception
{
printTestHeader();
if ( checkForWindows() )
{
System.out.println( "This test cannot run on windows. Aborting." );
return;
}
File tempFile = File.createTempFile( "tar-file-attributes.", ".tmp" );
toDelete.add( tempFile );
FileWriter writer = null;
try
{
writer = new FileWriter( tempFile );
writer.write( "This is a test file." );
}
finally
{
IOUtil.close( writer );
}
int result = Runtime.getRuntime().exec( "chmod 440 " + tempFile.getAbsolutePath() ).waitFor();
assertEquals( 0, result );
TarArchiver tarArchiver = getPosixCompliantTarArchiver();
File tempTarFile = File.createTempFile( "tar-file.", ".tar" );
toDelete.add( tempTarFile );
tarArchiver.setDestFile( tempTarFile );
tarArchiver.setFileMode( 0660 );
tarArchiver.addFile( tempFile, tempFile.getName() );
tarArchiver.createArchive();
TarUnArchiver tarUnArchiver = (TarUnArchiver) lookup( UnArchiver.ROLE, "tar" );
File tempTarDir = File.createTempFile( "tar-test.", ".dir" );
tempTarDir.delete();
tempTarDir.mkdirs();
toDelete.add( tempTarDir );
tarUnArchiver.setDestDirectory( tempTarDir );
tarUnArchiver.setSourceFile( tempTarFile );
tarUnArchiver.extract();
PlexusIoResourceAttributes fileAttributes =
PlexusIoResourceAttributeUtils.getFileAttributes( new File( tempTarDir, tempFile.getName() ) );
final int expected = Java7Reflector.isAtLeastJava7() ? 0660 : 0644;
assertEquals( "This test will fail if your umask is not X2X (or more)",
expected, fileAttributes.getOctalMode() );
}
}