package net.ayld.facade.api;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import junit.framework.Assert;
import net.ayld.facade.model.ClassName;
import net.ayld.facade.util.Settings;
import net.ayld.facade.util.Tokenizer;
import org.junit.Test;
import com.google.common.base.Joiner;
import com.google.common.io.Resources;
public class MinimizerTest {
@Test
public void minimize() throws IOException {
final JarFile outJar = Minimizer
.sources(toPath(Resources.getResource("test-classes/test-src-dir")))
.libs(toPath(Resources.getResource("test-classes/test-lib-dir")))
.getJar();
Assert.assertTrue(outJar != null);
final String outJarName = Tokenizer.delimiter(File.separator).tokenize(outJar.getName()).lastToken();
Assert.assertTrue(outJarName.equals(Settings.DEFAULT_FACADE_JAR_NAME.getValue()));
}
@Test
public void mandatoryInclude() throws IOException {
final JarFile mandatoryJar = new JarFile(new File(toPath(Resources.getResource("test-classes/test-lib-dir/commons-lang3-3.1.jar"))));
final JarFile outJar = Minimizer
.sources(toPath(Resources.getResource("test-classes/test-src-dir")))
.libs(toPath(Resources.getResource("test-classes/test-lib-dir")))
.forceInclude(new ClassName("org.primefaces.json.JSONArray"))
.forceInclude(mandatoryJar)
.getJar();
Assert.assertTrue("out jar is null", outJar != null);
final String outJarName = Tokenizer.delimiter(File.separator).tokenize(outJar.getName()).lastToken();
Assert.assertTrue(outJarName.equals(Settings.DEFAULT_FACADE_JAR_NAME.getValue()));
Assert.assertTrue("org.primefaces.json.JSONArray, mandatory include not found", outJar.getEntry(Joiner.on(File.separator).join("org", "primefaces", "json", "JSONArray.class")) != null);
final Enumeration<JarEntry> mandatoryEntries = mandatoryJar.entries();
while (mandatoryEntries.hasMoreElements()) {
final JarEntry mandatoryEntry = mandatoryEntries.nextElement();
// skip non-class entries
if (mandatoryEntry.getName().contains("META-INF") || mandatoryEntry.getName().contains("templates")) {
continue;
}
final Enumeration<JarEntry> actualEntries = outJar.entries();
boolean found = false;
while (actualEntries.hasMoreElements()) {
final JarEntry actualEntry = actualEntries.nextElement();
final String mandatoryEntryName = normalize(mandatoryEntry.getName());
final String actualEntryName = normalize(actualEntry.getName());
if (mandatoryEntryName.equals(actualEntryName)) {
found = true;
break;
}
}
if (!found) {
Assert.fail("entry: " + mandatoryEntry.getName() + ", not found");
}
}
}
// Here be dragons.
// A.K.A. The-Magic-Method-Of-Many-Slashes
private String normalize(String jarEntryName) {
if (jarEntryName.contains("/")) {
return jarEntryName.replace("/", File.separator);
}
if (jarEntryName.contains("\\")) {
return jarEntryName.replace("\\", File.separator); // because Windows is awesome !
}
return jarEntryName;
}
private String toPath(URL uri) {
return Tokenizer.delimiter(":").tokenize(uri.toString()).lastToken();
}
}