blob: 8b9e7cba6e8bb37574d5a7353d697cc49b9e2f1c [file] [log] [blame]
/*
* 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.
*/
package org.apache.maven.plugins.clean;
import static org.apache.commons.io.FileUtils.copyDirectory;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
/**
* Test the clean mojo.
*
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
*/
public class CleanMojoTest extends AbstractMojoTestCase {
/**
* Tests the simple removal of directories
*
* @throws Exception in case of an error.
*/
public void testBasicClean() throws Exception {
String pluginPom = getBasedir() + "/src/test/resources/unit/basic-clean-test/plugin-pom.xml";
// safety
copyDirectory(
new File(getBasedir(), "src/test/resources/unit/basic-clean-test"),
new File(getBasedir(), "target/test-classes/unit/basic-clean-test"));
CleanMojo mojo = (CleanMojo) lookupMojo("clean", pluginPom);
assertNotNull(mojo);
mojo.execute();
assertFalse(
"Directory exists",
checkExists(getBasedir() + "/target/test-classes/unit/" + "basic-clean-test/buildDirectory"));
assertFalse(
"Directory exists",
checkExists(getBasedir() + "/target/test-classes/unit/basic-clean-test/" + "buildOutputDirectory"));
assertFalse(
"Directory exists",
checkExists(getBasedir() + "/target/test-classes/unit/basic-clean-test/" + "buildTestDirectory"));
}
/**
* Tests the removal of files and nested directories
*
* @throws Exception in case of an error.
*/
public void testCleanNestedStructure() throws Exception {
String pluginPom = getBasedir() + "/src/test/resources/unit/nested-clean-test/plugin-pom.xml";
// safety
copyDirectory(
new File(getBasedir(), "src/test/resources/unit/nested-clean-test"),
new File(getBasedir(), "target/test-classes/unit/nested-clean-test"));
CleanMojo mojo = (CleanMojo) lookupMojo("clean", pluginPom);
assertNotNull(mojo);
mojo.execute();
assertFalse(checkExists(getBasedir() + "/target/test-classes/unit/nested-clean-test/target"));
assertFalse(checkExists(getBasedir() + "/target/test-classes/unit/nested-clean-test/target/classes"));
assertFalse(checkExists(getBasedir() + "/target/test-classes/unit/nested-clean-test/target/test-classes"));
}
/**
* Tests that no exception is thrown when all internal variables are empty and that it doesn't
* just remove whats there
*
* @throws Exception in case of an error.
*/
public void testCleanEmptyDirectories() throws Exception {
String pluginPom = getBasedir() + "/src/test/resources/unit/empty-clean-test/plugin-pom.xml";
// safety
copyDirectory(
new File(getBasedir(), "src/test/resources/unit/empty-clean-test"),
new File(getBasedir(), "target/test-classes/unit/empty-clean-test"));
CleanMojo mojo = (CleanMojo) lookupEmptyMojo("clean", pluginPom);
assertNotNull(mojo);
mojo.execute();
assertTrue(checkExists(getBasedir() + "/target/test-classes/unit/empty-clean-test/testDirectoryStructure"));
assertTrue(checkExists(
getBasedir() + "/target/test-classes/unit/empty-clean-test/" + "testDirectoryStructure/file.txt"));
assertTrue(checkExists(getBasedir() + "/target/test-classes/unit/empty-clean-test/"
+ "testDirectoryStructure/outputDirectory"));
assertTrue(checkExists(getBasedir() + "/target/test-classes/unit/empty-clean-test/"
+ "testDirectoryStructure/outputDirectory/file.txt"));
}
/**
* Tests the removal of files using fileset
*
* @throws Exception in case of an error.
*/
public void testFilesetsClean() throws Exception {
String pluginPom = getBasedir() + "/src/test/resources/unit/fileset-clean-test/plugin-pom.xml";
// safety
copyDirectory(
new File(getBasedir(), "src/test/resources/unit/fileset-clean-test"),
new File(getBasedir(), "target/test-classes/unit/fileset-clean-test"));
CleanMojo mojo = (CleanMojo) lookupMojo("clean", pluginPom);
assertNotNull(mojo);
mojo.execute();
// fileset 1
assertTrue(checkExists(getBasedir() + "/target/test-classes/unit/fileset-clean-test/target"));
assertTrue(checkExists(getBasedir() + "/target/test-classes/unit/fileset-clean-test/target/classes"));
assertFalse(checkExists(getBasedir() + "/target/test-classes/unit/fileset-clean-test/target/test-classes"));
assertTrue(checkExists(getBasedir() + "/target/test-classes/unit/fileset-clean-test/target/subdir"));
assertFalse(checkExists(getBasedir() + "/target/test-classes/unit/fileset-clean-test/target/classes/file.txt"));
assertTrue(checkEmpty(getBasedir() + "/target/test-classes/unit/fileset-clean-test/target/classes"));
assertFalse(checkEmpty(getBasedir() + "/target/test-classes/unit/fileset-clean-test/target/subdir"));
assertTrue(checkExists(getBasedir() + "/target/test-classes/unit/fileset-clean-test/target/subdir/file.txt"));
// fileset 2
assertTrue(
checkExists(getBasedir() + "/target/test-classes/unit/fileset-clean-test/" + "buildOutputDirectory"));
assertFalse(checkExists(
getBasedir() + "/target/test-classes/unit/fileset-clean-test/" + "buildOutputDirectory/file.txt"));
}
/**
* Tests the removal of a directory as file
*
* @throws Exception in case of an error.
*/
public void testCleanInvalidDirectory() throws Exception {
String pluginPom = getBasedir() + "/src/test/resources/unit/invalid-directory-test/plugin-pom.xml";
// safety
copyDirectory(
new File(getBasedir(), "src/test/resources/unit/invalid-directory-test"),
new File(getBasedir(), "target/test-classes/unit/invalid-directory-test"));
CleanMojo mojo = (CleanMojo) lookupMojo("clean", pluginPom);
assertNotNull(mojo);
try {
mojo.execute();
fail("Should fail to delete a file treated as a directory");
} catch (MojoExecutionException expected) {
assertTrue(true);
}
}
/**
* Tests the removal of a missing directory
*
* @throws Exception in case of an error.
*/
public void testMissingDirectory() throws Exception {
String pluginPom = getBasedir() + "/src/test/resources/unit/missing-directory-test/plugin-pom.xml";
// safety
copyDirectory(
new File(getBasedir(), "src/test/resources/unit/missing-directory-test"),
new File(getBasedir(), "target/test-classes/unit/missing-directory-test"));
CleanMojo mojo = (CleanMojo) lookupMojo("clean", pluginPom);
assertNotNull(mojo);
mojo.execute();
assertFalse(checkExists(getBasedir() + "/target/test-classes/unit/missing-directory-test/does-not-exist"));
}
/**
* Test the removal of a locked file on Windows systems.
* <p>
* Note: Unix systems doesn't lock any files.
* </p>
*
* @throws Exception in case of an error.
*/
public void testCleanLockedFile() throws Exception {
if (!System.getProperty("os.name").toLowerCase().contains("windows")) {
assertTrue("Ignored this test on none Windows based systems", true);
return;
}
String pluginPom = getBasedir() + "/src/test/resources/unit/locked-file-test/plugin-pom.xml";
// safety
copyDirectory(
new File(getBasedir(), "src/test/resources/unit/locked-file-test"),
new File(getBasedir(), "target/test-classes/unit/locked-file-test"));
CleanMojo mojo = (CleanMojo) lookupMojo("clean", pluginPom);
assertNotNull(mojo);
File f = new File(getBasedir(), "target/test-classes/unit/locked-file-test/buildDirectory/file.txt");
try (FileChannel channel = new RandomAccessFile(f, "rw").getChannel();
FileLock ignored = channel.lock()) {
mojo.execute();
fail("Should fail to delete a file that is locked");
} catch (MojoExecutionException expected) {
assertTrue(true);
}
}
/**
* Test the removal of a locked file on Windows systems.
* <p>
* Note: Unix systems doesn't lock any files.
* </p>
*
* @throws Exception in case of an error.
*/
public void testCleanLockedFileWithNoError() throws Exception {
if (!System.getProperty("os.name").toLowerCase().contains("windows")) {
assertTrue("Ignored this test on none Windows based systems", true);
return;
}
String pluginPom = getBasedir() + "/src/test/resources/unit/locked-file-test/plugin-pom.xml";
// safety
copyDirectory(
new File(getBasedir(), "src/test/resources/unit/locked-file-test"),
new File(getBasedir(), "target/test-classes/unit/locked-file-test"));
CleanMojo mojo = (CleanMojo) lookupMojo("clean", pluginPom);
setVariableValueToObject(mojo, "failOnError", Boolean.FALSE);
assertNotNull(mojo);
File f = new File(getBasedir(), "target/test-classes/unit/locked-file-test/buildDirectory/file.txt");
try (FileChannel channel = new RandomAccessFile(f, "rw").getChannel();
FileLock ignored = channel.lock()) {
mojo.execute();
assertTrue(true);
} catch (MojoExecutionException expected) {
fail("Should display a warning when deleting a file that is locked");
}
}
/**
* @param dir a dir or a file
* @return true if a file/dir exists, false otherwise
*/
private boolean checkExists(String dir) {
return new File(new File(dir).getAbsolutePath()).exists();
}
/**
* @param dir a directory
* @return true if a dir is empty, false otherwise
*/
private boolean checkEmpty(String dir) {
File[] files = new File(dir).listFiles();
return files == null || files.length == 0;
}
}