/*
* JBoss, Home of Professional Open Source
* Copyright 2009, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed 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.jboss.shrinkwrap.impl.base.importer;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.logging.Logger;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.Filters;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.exporter.ExplodedExporter;
import org.jboss.shrinkwrap.api.importer.ExplodedImporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.impl.base.path.BasicPath;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* TestCase to ensure the correctness of the ExplodedImporter
*
* @author <a href="mailto:aslak@conduct.no">Aslak Knutsen</a>
* @version $Revision: $
*/
public class ExplodedImporterTestCase {
private static final String EXISTING_DIRECTORY_RESOURCE = "exploded_import_test";
private static final String EXISTING_FILE_RESOURCE = "exploded_import_test/Test.properties";
/**
* Name of the empty directory
*/
private static final String EMPTY_DIR_NAME = "empty_dir";
/**
* Name of a parent directory
*/
private static final String PARENT_DIR_NAME = "parent";
/**
* Creates the empty directories for this test, as Git cannot store empty dirs in SCM
*
* @throws IOException
* @throws URISyntaxException
*/
@BeforeClass
public static void makeEmptyDirectories() throws IOException, URISyntaxException {
final File root = new File(ExplodedImporterTestCase.class.getProtectionDomain().getCodeSource().getLocation()
.toURI());
final File exlodedImportTest = new File(root, EXISTING_DIRECTORY_RESOURCE);
Assert.assertTrue("Import test folder does not exist: " + exlodedImportTest.getAbsolutePath(),
exlodedImportTest.exists());
final File empty = new File(exlodedImportTest, EMPTY_DIR_NAME);
Assert.assertTrue("Could not create the empty directory", empty.mkdir());
final File parent = new File(exlodedImportTest, PARENT_DIR_NAME);
final File parentEmpty = new File(parent, EMPTY_DIR_NAME);
Assert.assertTrue("Could not create the parent empty directory", parentEmpty.mkdirs());
parentEmpty.deleteOnExit();
empty.deleteOnExit();
}
@Test
public void shouldBeAbleToImportADirectory() throws Exception {
Archive<?> archive = ShrinkWrap
.create(ExplodedImporter.class, "test.jar")
.importDirectory(
SecurityActions.getThreadContextClassLoader().getResource(EXISTING_DIRECTORY_RESOURCE).toURI()
.getPath()).as(JavaArchive.class);
Logger.getLogger(ExplodedImporterTestCase.class.getName()).info(archive.toString(true));
Assert.assertTrue("Root files should be imported", archive.contains(new BasicPath("/Test.properties")));
Assert.assertTrue("Nested files should be imported", archive.contains(new BasicPath("/META-INF/MANIFEST.FM")));
Assert.assertTrue("Nested files should be imported",
archive.contains(new BasicPath("/org/jboss/Test.properties")));
Assert.assertTrue("Empty directories should be imported", archive.contains(new BasicPath("/empty_dir")));
Assert.assertTrue("Nested empty directories should be imported",
archive.contains(new BasicPath("/parent/empty_dir")));
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowExceptionIfImportingAFile() throws Exception {
ShrinkWrap.create(ExplodedImporter.class, "test.jar").importDirectory(
SecurityActions.getThreadContextClassLoader().getResource(EXISTING_FILE_RESOURCE).toURI().getPath());
}
@Test
public void shouldBeAbleToImportADirectoryWithIncludeFilter() throws Exception {
String fileName = SecurityActions.getThreadContextClassLoader().getResource(EXISTING_DIRECTORY_RESOURCE).toURI().getPath();
Archive<?> archive = ShrinkWrap
.create(ExplodedImporter.class, "test.jar")
.importDirectory(fileName, Filters.include(".*META-INF.*"))
.as(JavaArchive.class);
Logger.getLogger(ExplodedImporterTestCase.class.getName()).info(archive.toString(true));
Assert.assertEquals("Archive should contains only 2 paths", 2, archive.getContent().size());
Assert.assertTrue("Nested files should be imported", archive.contains(new BasicPath("/META-INF/MANIFEST.FM")));
}
@Test
public void shouldBeAbleToImportADirectoryWithExcludeFilter() throws Exception {
String fileName = SecurityActions.getThreadContextClassLoader().getResource(EXISTING_DIRECTORY_RESOURCE).toURI().getPath();
Archive<?> archive = ShrinkWrap
.create(ExplodedImporter.class, "test.jar")
.importDirectory(fileName, Filters.exclude(".*META-INF.*"))
.as(JavaArchive.class);
Logger.getLogger(ExplodedImporterTestCase.class.getName()).info(archive.toString(true));
Assert.assertTrue("Root files should be imported", archive.contains(new BasicPath("/Test.properties")));
Assert.assertTrue("Nested files should be imported", archive.contains(new BasicPath("/org/jboss/Test.properties")));
Assert.assertTrue("Empty directories should be imported", archive.contains(new BasicPath("/empty_dir")));
Assert.assertTrue("Nested empty directories should be imported", archive.contains(new BasicPath("/parent/empty_dir")));
}
@Test // SHRINKWRAP-392
public void shouldHaveEmptyDefaultExtension() {
ExplodedImporter explodedImporter = ShrinkWrap.create(ExplodedImporter.class);
String explodedImporterArchiveName = explodedImporter.as(JavaArchive.class).getName();
Assert.assertFalse(explodedImporterArchiveName.contains("."));
}
@Test // SHRINKWRAP-453
public void shouldImportDirectory() throws Exception {
shouldImportDirectory("arbitraryDirectory");
}
@Test // SHRINKWRAP-453
public void shouldImportDirectoryWithNameThatCouldCauseRegexPatternSyntaxException() throws Exception {
shouldImportDirectory("[deploymentExportPath");
}
@Test // SHRINKWRAP-453
public void shouldImportDirectoryWithBracketsInPath() throws Exception {
shouldImportDirectory("[deploymentExportPath]");
}
// SHRINKWRAP-453
private void shouldImportDirectory(final String subdirectory) throws Exception {
String fileName = SecurityActions.getThreadContextClassLoader().getResource(EXISTING_DIRECTORY_RESOURCE).toURI().getPath();
final File importDirectory = new File(fileName, subdirectory);
if (!importDirectory.exists()) {
Assert.assertTrue("Unable to create test folder: " + importDirectory.getAbsolutePath(), importDirectory.mkdir());
}
Assert.assertTrue("Import test folder does not exist: " + importDirectory.getAbsolutePath(), importDirectory.exists());
importDirectory.deleteOnExit();
ShrinkWrap.create(WebArchive.class, "test.war")
.addClass(ExplodedImporter.class)
.setWebXML(new StringAsset("<web-app></web-app>"))
.as(ExplodedExporter.class).exportExploded(importDirectory);
// test import of exploded directory
WebArchive war = ShrinkWrap.create(WebArchive.class, "SHRINKWRAP-453.war")
.as(ExplodedImporter.class).importDirectory(importDirectory)
.as(WebArchive.class);
Assert.assertTrue("Expected imported web archive to be present at web archive root", war.contains("/test.war"));
Assert.assertTrue("Expected imported web archive to include web.xml", war.contains("/test.war/WEB-INF/web.xml"));
}
}