/*
* Milyn - Copyright (C) 2006 - 2010
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (version 2.1) as published
* by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE.
*
* See the GNU Lesser General Public License for more details:
* http://www.gnu.org/licenses/lgpl.txt
*/
package org.milyn;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.core.StringContains.containsString;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.milyn.archive.Archive;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.jar.JarFile;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
/**
* Unit test for {@link ResourceMerger}.
* </p>
*
* @author Daniel Bevenius
* @since 1.4
*/
public class ResourceMergerTest {
private final static String CONTENT_HANDLER_PATH = "META-INF/content-handlers.inf";
private final ResourceMerger resourceMerger = new ResourceMerger(CONTENT_HANDLER_PATH);
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
@Test
public void merge_resources_from_two_jars() throws Exception {
final Archive firstJar = setupFirstJar();
final Archive secondJar = setupSecondJar();
final Archive mergedJar = resourceMerger.mergeJars("smooks-all.jar", Arrays.asList(firstJar, secondJar));
assertThat(mergedJar.getArchiveName(), is("smooks-all.jar"));
final String contentHandlers = readContent(mergedJar, CONTENT_HANDLER_PATH);
assertThat(contentHandlers, containsString("property1"));
assertThat(contentHandlers, containsString("property2"));
final String content = readContent(mergedJar, "firstJar/someFile");
assertThat(content, is("dummyContent"));
}
private Archive setupFirstJar() throws Exception {
final Archive jar = new Archive("firstJar");
addToJar(jar, "firstJar/someFile", "dummyContent");
return addToJar(jar, CONTENT_HANDLER_PATH, "property1");
}
private Archive setupSecondJar() throws Exception {
final Archive jar = new Archive("secondJar");
return addToJar(jar, CONTENT_HANDLER_PATH, "property2");
}
private String readContent(final Archive jar, final String path) throws IOException {
return new String(jar.getEntryBytes(path));
}
@Test
public void merge_with_pre_existing_jar() throws Exception {
final File jarfile = setupPreExistingJar();
final Archive firstJar = setupFirstJar();
final Archive merged = resourceMerger.mergeJars(jarfile.getAbsolutePath(), Arrays.asList(firstJar));
assertThat(readContent(merged, "firstJar/someFile"), is("dummyContent"));
assertThat(readContent(merged, "preExistingJar/file"), is("contentInPreExistingJar"));
}
private File setupPreExistingJar() throws Exception {
final String jarname = "prexisting.jar";
final Archive preExistingJar = createPreExistingJar();
return exportJarToFile(jarname, preExistingJar);
}
private Archive createPreExistingJar() throws Exception {
final String jarname = "prexisting.jar";
final Archive preExistingJar = new Archive(jarname);
addToJar(preExistingJar, "preExistingJar/file", "contentInPreExistingJar");
addToJar(preExistingJar, JarFile.MANIFEST_NAME, "manifesto");
return preExistingJar;
}
private File exportJarToFile(final String jarname, final Archive preExistingJar) throws Exception {
final File jarfile = tempFolder.newFile(jarname);
preExistingJar.toOutputStream(new JarOutputStream(new FileOutputStream(jarfile)));
return jarfile;
}
@Test
public void verify_that_metainf_is_the_first_entry_in_jar() throws Exception {
final Archive firstJar = setupFirstJar();
final File jarfile = setupPreExistingJar();
final Archive merged = resourceMerger.mergeJars(jarfile.getAbsolutePath(), Arrays.asList(firstJar));
final byte[] content = merged.getEntryBytes(JarFile.MANIFEST_NAME);
assertThat(content, is(notNullValue()));
final File newFile = exportJarToFile(merged, "output.jar");
final Manifest manifest = getManifest(newFile.getAbsolutePath());
assertNotNull("Manifest could not be found by JarInputStream", manifest);
}
private File exportJarToFile(final Archive jar, final String to) throws Exception {
final File newFile = tempFolder.newFile(to);
final JarOutputStream jarOutputStream = new JarOutputStream(new FileOutputStream(newFile));
jar.toOutputStream(jarOutputStream);
return newFile;
}
private Manifest getManifest(final String jarName) throws Exception {
final JarInputStream jarInputStream = new JarInputStream(new FileInputStream(jarName));
return jarInputStream.getManifest();
}
private Archive addToJar(final Archive jar, final String path, final String content) throws IOException {
jar.addEntry(path, new ByteArrayInputStream(content.getBytes()));
return jar;
}
}