package org.jboss.windup.decompiler;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.jboss.windup.decompiler.api.DecompilationException;
import org.jboss.windup.decompiler.api.DecompilationFailure;
import org.jboss.windup.decompiler.api.DecompilationListener;
import org.jboss.windup.decompiler.api.DecompilationResult;
import org.jboss.windup.decompiler.api.Decompiler;
import org.jboss.windup.decompiler.util.CountClassesFilter;
import org.jboss.windup.decompiler.util.ZipUtil;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Base class for decompiler tests .
*
* @author <a href="mailto:ozizka@redhat.com">Ondrej Zizka</a>
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public abstract class DecompilerTestBase
{
protected static final Logger log = Logger.getLogger(DecompilerTestBase.class.getName());
protected Path testTempDir;
/**
* Get an instance of the {@link Decompiler} under test.
*/
protected abstract Decompiler getDecompiler();
/**
* Allow the test to assert on the {@link DecompilationResult}.
*/
protected abstract boolean isResultValid(DecompilationResult res);
@Before
public void setUp() throws IOException
{
this.testTempDir = Paths.get("target").resolve("testTmp");
FileUtils.deleteQuietly(testTempDir.toFile());
Files.createDirectory(this.testTempDir);
}
@After
public void tearDown() throws IOException
{
}
/**
* Single class.
*/
@Test
public void testDecompileSingleClass() throws DecompilationException, IOException
{
final Decompiler dec = this.getDecompiler();
Path archive = Paths.get("target/TestJars/wicket-core-6.11.0.jar");
Path decompDir = testTempDir.resolve("decompiled");
Path unzipDir = testTempDir.resolve("unzipped");
ZipUtil.unzip(archive.toFile(), unzipDir.toFile());
// DECOMPILE
Path clsFile = unzipDir.resolve("org/apache/wicket/ajax/AbstractAjaxResponse.class");
final DecompilationResult res = dec.decompileClassFile(unzipDir, clsFile, decompDir);
Assert.assertNotNull("Results object was returned.", res);
if (!res.getFailures().isEmpty())
{
final StringBuilder sb = new StringBuilder();
sb.append("Failed decompilation of " + res.getFailures().size() + " classes: ");
for (final DecompilationFailure e : res.getFailures())
{
sb.append("\n ").append(e.getMessage());
final Throwable cause = e.getCause();
cause.printStackTrace();
if (cause instanceof NullPointerException)
sb.append(" - NPE at ").append(cause.getStackTrace()[0]);
else
sb.append(" - ").append(cause);
}
if (!this.isResultValid(res))
Assert.fail(sb.toString());
else
log.severe(sb.toString());
}
log.info("Compilation results: " + res.getDecompiledFiles().size() + " succeeded, " + res.getFailures().size()
+ " failed.");
final Path sampleFile = decompDir.resolve("org").resolve("apache").resolve("wicket").resolve("ajax").resolve("AbstractAjaxResponse.java");
Assert.assertTrue("Decompiled class did not exist in: " + sampleFile.toString(), Files.exists(sampleFile));
dec.close();
}
/**
* Decompile test .jar.
*/
@Test
public void testDecompileWicketJar() throws DecompilationException
{
Path archive = Paths.get("target/TestJars/wicket-core-6.11.0.jar");
Path decompDir = testTempDir.resolve("decompiled");
final Decompiler dec = this.getDecompiler();
final DecompilationResult res = dec.decompileArchive(archive, decompDir, new CountClassesFilter(100), new DecompilationListener()
{
@Override
public void decompilationProcessComplete()
{
// noop
}
@Override
public void decompilationFailed(List<String> inputPath, String message)
{
}
@Override
public void fileDecompiled(List<String> inputPath, String outputPath)
{
// noop
}
});
Assert.assertNotNull("Results object returned", res);
if (!res.getFailures().isEmpty())
{
final StringBuilder sb = new StringBuilder();
sb.append("Failed decompilation of " + res.getFailures().size() + " classes: ");
for (final DecompilationFailure dex : res.getFailures())
{
sb.append("\n ").append(dex.getMessage());
}
if (!this.isResultValid(res))
Assert.fail(sb.toString());
else
log.severe(sb.toString());
}
log.info("Compilation results: " + res.getDecompiledFiles().size() + " succeeded, " + res.getFailures().size()
+ " failed.");
final Path sampleFile = decompDir.resolve("org").resolve("apache").resolve("wicket").resolve("ajax").resolve("AbstractAjaxResponse.java");
Assert.assertTrue("Decompiled class files exist:\n " + sampleFile.toString(), Files.exists(sampleFile));
dec.close();
}
}