blob: 1c872f8e0ecf608d1cb198ff72539f2f2091ee0d [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.war;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.maven.plugin.testing.stubs.ArtifactStub;
import org.apache.maven.plugins.war.stub.MavenProjectArtifactsStub;
import org.codehaus.plexus.util.FileUtils;
/**
* @author Stephane Nicoll
*/
public abstract class AbstractWarExplodedMojoTest extends AbstractWarMojoTest {
protected WarExplodedMojo mojo;
public void setUp() throws Exception {
super.setUp();
mojo = (WarExplodedMojo) lookupMojo("exploded", getPomFile());
}
/**
* Returns the pom configuration to use.
*
* @return the pom configuration
*/
protected abstract File getPomFile();
/**
* Returns the test directory to use.
*
* @return the test directory
*/
protected abstract File getTestDirectory();
/**
* Configures the exploded mojo for the specified test.
*
* If the {@code sourceFiles} parameter is {@code null}, sample JSPs are created by default.
*
* @param testId the id of the test
* @param artifactStubs the dependencies (may be null)
* @param sourceFiles the source files to create (may be null)
* @return the webapp directory
* @throws Exception if an error occurs while configuring the mojo
*/
protected File setUpMojo(final String testId, ArtifactStub[] artifactStubs, String[] sourceFiles) throws Exception {
final MavenProjectArtifactsStub project = new MavenProjectArtifactsStub();
final File webAppDirectory = new File(getTestDirectory(), testId);
// Create the webapp sources
File webAppSource;
if (sourceFiles == null) {
webAppSource = createWebAppSource(testId);
} else {
webAppSource = createWebAppSource(testId, false);
for (String sourceFile : sourceFiles) {
File sample = new File(webAppSource, sourceFile);
createFile(sample);
}
}
final File classesDir = createClassesDir(testId, true);
final File workDirectory = new File(getTestDirectory(), "/war/work-" + testId);
createDir(workDirectory);
if (artifactStubs != null) {
for (ArtifactStub artifactStub : artifactStubs) {
project.addArtifact(artifactStub);
}
}
configureMojo(mojo, new LinkedList<>(), classesDir, webAppSource, webAppDirectory, project);
setVariableValueToObject(mojo, "workDirectory", workDirectory);
return webAppDirectory;
}
/**
* Configures the exploded mojo for the specified test.
*
* @param testId the id of the test
* @param artifactStubs the dependencies (may be null)
* @return the webapp directory
* @throws Exception if an error occurs while configuring the mojo
*/
protected File setUpMojo(final String testId, ArtifactStub[] artifactStubs) throws Exception {
return setUpMojo(testId, artifactStubs, null);
}
/**
* Cleans up a directory.
*
* @param directory the directory to remove
* @throws IOException if an error occurred while removing the directory
*/
protected void cleanDirectory(File directory) throws IOException {
if (directory != null && directory.isDirectory() && directory.exists()) {
FileUtils.deleteDirectory(directory);
}
}
/**
* Asserts the default content of the war based on the specified webapp directory.
*
* @param webAppDirectory the webapp directory
* @return a list of File objects that have been asserted
*/
protected List<File> assertDefaultContent(File webAppDirectory) {
// Validate content of the webapp
File expectedWebSourceFile = new File(webAppDirectory, "pansit.jsp");
File expectedWebSource2File = new File(webAppDirectory, "org/web/app/last-exile.jsp");
assertTrue("source file not found: " + expectedWebSourceFile.toString(), expectedWebSourceFile.exists());
assertTrue("source file not found: " + expectedWebSource2File.toString(), expectedWebSource2File.exists());
final List<File> content = new ArrayList<>();
content.add(expectedWebSourceFile);
content.add(expectedWebSource2File);
return content;
}
/**
* Asserts the web.xml file of the war based on the specified webapp directory.
*
* @param webAppDirectory the webapp directory
* @return a list with the web.xml File object
*/
protected List<File> assertWebXml(File webAppDirectory) {
File expectedWEBXMLFile = new File(webAppDirectory, "WEB-INF/web.xml");
assertTrue("web xml not found: " + expectedWEBXMLFile.toString(), expectedWEBXMLFile.exists());
final List<File> content = new ArrayList<>();
content.add(expectedWEBXMLFile);
return content;
}
/**
* Asserts custom content of the war based on the specified webapp directory.
*
* @param webAppDirectory the webapp directory
* @param filePaths an array of file paths relative to the webapp directory
* @param customMessage a custom message if an assertion fails
* @return a list of File objects that have been inspected
*/
protected List<File> assertCustomContent(File webAppDirectory, String[] filePaths, String customMessage) {
final List<File> content = new ArrayList<>();
for (String filePath : filePaths) {
final File expectedFile = new File(webAppDirectory, filePath);
if (customMessage != null) {
assertTrue(customMessage + " - " + expectedFile.toString(), expectedFile.exists());
} else {
assertTrue("source file not found: " + expectedFile.toString(), expectedFile.exists());
}
content.add(expectedFile);
}
return content;
}
/**
* Asserts that the webapp contains only the specified files.
*
* @param webAppDirectory the webapp directory
* @param expectedFiles the expected files
* @param filter an optional filter to ignore some resources
*/
protected void assertWebAppContent(File webAppDirectory, List<File> expectedFiles, FileFilter filter) {
final List<File> webAppContent = new ArrayList<>();
if (filter != null) {
buildFilesList(webAppDirectory, filter, webAppContent);
} else {
buildFilesList(webAppDirectory, new FileFilterImpl(webAppDirectory, null), webAppContent);
}
// Now we have the files, sort them.
Collections.sort(expectedFiles);
Collections.sort(webAppContent);
assertEquals(
"Invalid webapp content, expected " + expectedFiles.size() + "file(s) " + expectedFiles + " but got "
+ webAppContent.size() + " file(s) " + webAppContent,
expectedFiles,
webAppContent);
}
/**
* Builds the list of files and directories from the specified dir.
*
* Note that the filter is not used the usual way. If the filter does not accept the current file, it's not added
* but yet the subdirectories are added if any.
*
* @param dir the base directory
* @param filter the filter
* @param content the current content, updated recursively
*/
private void buildFilesList(final File dir, FileFilter filter, final List<File> content) {
final File[] files = dir.listFiles();
for (File file : files) {
// Add the file if the filter is ok with it
if (filter.accept(file)) {
content.add(file);
}
// Even if the file is not accepted and is a directory, add it
if (file.isDirectory()) {
buildFilesList(file, filter, content);
}
}
}
class FileFilterImpl implements FileFilter {
private final List<String> rejectedFilePaths;
private final int webAppDirIndex;
public FileFilterImpl(File webAppDirectory, String[] rejectedFilePaths) {
if (rejectedFilePaths != null) {
this.rejectedFilePaths = Arrays.asList(rejectedFilePaths);
} else {
this.rejectedFilePaths = new ArrayList<>();
}
this.webAppDirIndex = webAppDirectory.getAbsolutePath().length() + 1;
}
public boolean accept(File file) {
String effectiveRelativePath = buildRelativePath(file);
return !(rejectedFilePaths.contains(effectiveRelativePath) || file.isDirectory());
}
private String buildRelativePath(File f) {
return f.getAbsolutePath().substring(webAppDirIndex);
}
}
}