blob: 6718c830689f0774a31ee1e14e2dde9bb3e0e0cd [file] [log] [blame]
package org.apache.maven.shared.utils;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.maven.shared.utils.io.FileUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.Assert;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.URL;
import static org.hamcrest.CoreMatchers.*;
/**
* This will test the plexus utility class {@link Expand}.
*
* Most of this stuff will be obsolete because java-1.4.2
* introduced a java.util.zip package which works like a charm.
*
* We of course need to implement this class due to compatibility
* reasons.
*
* @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
*/
public class ExpandTest
extends Assert
{
private static final String TEST_ZIP_LOCATION = "/expand/expand_test.zip";
private static final String TEST_ZIP_TARGET_FOLDER = "expand_test_target/";
private static final String TEST_UNZIPPED_FILE = "expand_test/test_file.txt";
private static final String TEST_UNZIPPED_CONTENT = "TestContent";
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
private File getSourceFile()
{
URL zipFileUrl = getClass().getResource( TEST_ZIP_LOCATION );
assertNotNull( zipFileUrl );
return new File( zipFileUrl.getFile() );
}
/**
* Create a clean target directory for unzipping.
* If it did exist, then clean it first.
*
* @return The target folder.
*/
private File getTestTargetDir()
throws Exception
{
return tempFolder.newFolder( TEST_ZIP_TARGET_FOLDER );
}
@Test
public void testSetDest_No_NPE()
{
Expand expand = new Expand();
expand.setDest( null );
}
@Test
public void testSetSrc_No_NPE()
{
Expand expand = new Expand();
expand.setSrc( null );
}
@Test
public void testExecute()
throws Exception
{
Expand expand = new Expand();
File source = getSourceFile();
expand.setSrc( source );
File targetDir = getTestTargetDir();
expand.setDest( targetDir );
expand.execute();
verifyExpandedFileAndContent( targetDir, TEST_UNZIPPED_CONTENT );
}
@Test
public void testExecuteIntoNonexistingDirectory()
throws Exception
{
Expand expand = new Expand();
File source = getSourceFile();
expand.setSrc( source );
File nonexisingDir = new File( getTestTargetDir(), "nonexisting_dir" );
if ( nonexisingDir.exists() )
{
FileUtils.deleteDirectory( nonexisingDir );
}
expand.setDest( nonexisingDir );
expand.execute();
verifyExpandedFileAndContent( nonexisingDir, TEST_UNZIPPED_CONTENT );
}
@Test
public void testExecuteNonexistingSource()
throws Exception
{
Expand expand = new Expand();
File nonexistingSource = new File( "target/expand_test_target/nonexisting_source_file.nixda" );
expand.setSrc( nonexistingSource );
File targetDir = getTestTargetDir();
expand.setDest( targetDir );
try
{
expand.execute();
fail( "expand with notexiting source must throw Exception!" );
}
catch ( Exception e )
{
Throwable cause = ExceptionUtils.getRootCause( e );
if ( cause == null )
{
cause = e;
}
assertTrue( "cause must be a FileNotFoundException", cause instanceof FileNotFoundException );
}
}
@Test( expected = NullPointerException.class )
public void testExecute_NullSource()
throws Exception
{
Expand expand = new Expand();
expand.setSrc( null );
File targetDir = getTestTargetDir();
expand.setDest( targetDir );
expand.execute();
}
@Test
public void testExecute_NullDest()
throws Exception
{
Expand expand = new Expand();
expand.setSrc( getSourceFile() );
// execute without a dest directory seems to
// expand all the archive into the current working directory
expand.setDest( null );
String oldWorkingDirectory = System.getProperty( "user.dir" );
try
{
File targetDir = getTestTargetDir();
System.setProperty( "user.dir", targetDir.getAbsolutePath() );
expand.execute();
verifyExpandedFileAndContent( targetDir, TEST_UNZIPPED_CONTENT );
}
finally
{
System.setProperty( "user.dir", oldWorkingDirectory );
}
}
@Test
public void testExecute_Overwrite()
throws Exception
{
File targetDir = getTestTargetDir();
File expandedFile = null;
{
// part1: expand
Expand expand = new Expand();
File source = getSourceFile();
expand.setSrc( source );
expand.setDest( targetDir );
expand.execute();
expandedFile = verifyExpandedFile( targetDir );
}
// turn the clock back 10 seconds
long time = System.currentTimeMillis() - 10000L;
// round down to 1s;
time = time - time % 1000L;
expandedFile.setLastModified( time );
assertEquals( time, expandedFile.lastModified() );
{
// part2: expand in non-overwrite mode
Expand expand = new Expand();
File source = getSourceFile();
expand.setSrc( source );
expand.setDest( targetDir );
expand.setOverwrite( false );
expand.execute();
expandedFile = verifyExpandedFile( targetDir );
assertEquals( "file must still have the old lastModified timestamp"
, time, expandedFile.lastModified() );
}
{
// part3: expand in overwrite mode but local file is still newer than the one in the archive
Expand expand = new Expand();
File source = getSourceFile();
expand.setSrc( source );
expand.setDest( targetDir );
expand.setOverwrite( true );
expand.execute();
expandedFile = verifyExpandedFile( targetDir );
// obviously the file will be overwritten anyway
assertTrue( "file must now have the original old lastModified timestamp, but was: time=" + time
+ " expandedFile.lastModified()= " + expandedFile.lastModified()
, time > expandedFile.lastModified() );
}
// turn the clock back a loooong time!
time = 100000000L;
expandedFile.setLastModified( time );
assertEquals( time, expandedFile.lastModified() );
{
// part3: expand in overwrite mode but local file is now older than the one in the archive
Expand expand = new Expand();
File source = getSourceFile();
expand.setSrc( source );
expand.setDest( targetDir );
expand.setOverwrite( true );
expand.execute();
expandedFile = verifyExpandedFile( targetDir );
assertTrue( "file must now have newer lastModified timestamp, but was: time=" + time
+ " expandedFile.lastModified()= " + expandedFile.lastModified()
, time < expandedFile.lastModified() );
}
}
private File verifyExpandedFile( File targetDir )
{
assertThat( "target directory must exist"
, targetDir.exists()
, is( true ) );
File expandedFile = new File( targetDir, TEST_UNZIPPED_FILE );
assertThat( "expanded file must exist: " + expandedFile.getAbsolutePath()
, expandedFile.exists()
, is( true ) );
return expandedFile;
}
private void verifyExpandedFileAndContent( File targetDir, String expectedContent )
throws FileNotFoundException
{
File expandedFile = verifyExpandedFile( targetDir );
assertNotNull( expandedFile );
java.util.Scanner scanner = new java.util.Scanner( expandedFile ).useDelimiter( "\n" );
String text = scanner.next();
assertThat( "expanded file content must match"
, text
, is( expectedContent ) );
}
}