| 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 ) ); |
| } |
| } |