From f7a2398a7508af4c88c10d9b58ed685f15f3dff5 Mon Sep 17 00:00:00 2001 From: Mark Vainomaa Date: Sun, 26 Mar 2017 17:50:35 +0300 Subject: [PATCH] Make code more robust --- pom.xml | 2 +- .../uurimustoo/algoritmidetest/Utils.java | 14 ++++++++- .../compressors/AbstractCompressor.java | 29 ++++++++++++++++--- .../compressors/CompressGZip.java | 9 +++++- .../compressors/CompressXZ.java | 9 +++++- .../compressors/CompressZip.java | 26 +++++++++++++++-- 6 files changed, 78 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 87566ce..404c924 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ eu.mikroskeem - shuriken.common + shuriken.instrumentation 0.0.1-SNAPSHOT diff --git a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/Utils.java b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/Utils.java index 854a15c..7656058 100644 --- a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/Utils.java +++ b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/Utils.java @@ -1,5 +1,6 @@ package eu.mikroskeem.uurimustoo.algoritmidetest; +import eu.mikroskeem.shuriken.instrumentation.validate.Validate; import eu.mikroskeem.shuriken.reflect.Reflect; import eu.mikroskeem.uurimustoo.algoritmidetest.compressors.AbstractCompressor; import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner; @@ -34,7 +35,18 @@ public class Utils { public static CompressorResult executeCompressor(byte[] input, AbstractCompressor compressor){ - return new CompressorResult(compressor.getName(), compressor.compress(input).length); + String compressorName = compressor.getName(); + byte[] compressed = compressor.compress(input); + /* Verify for sure */ + try { + byte[] decompressed = compressor.decompress(compressed); + Validate.checkGeneratedClass(decompressed); + assert decompressed.length == input.length; + } catch (Throwable e){ + System.out.println(String.format("Tekkis viga %s algoritmi lahtipakkimisel! %s", compressorName, e.toString())); + compressorName = compressorName + " (katki)"; + } + return new CompressorResult(compressorName, compressed.length); } public static List executeAllAndSort(byte[] input){ diff --git a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/AbstractCompressor.java b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/AbstractCompressor.java index 53c6e35..78a04eb 100644 --- a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/AbstractCompressor.java +++ b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/AbstractCompressor.java @@ -14,7 +14,7 @@ public abstract class AbstractCompressor { try { ByteArrayInputStream bais = new ByteArrayInputStream(input); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - pipe0(bais, baos); + compress0(bais, baos); return baos.toByteArray(); } catch (IOException e){ SneakyThrow.throwException(e); @@ -22,13 +22,34 @@ public abstract class AbstractCompressor { return new byte[0]; // Never reaches here anyway } - public void pipe0(InputStream inputStream, OutputStream outputStream) throws IOException { - try(OutputStream out = pipe(outputStream)) { + public final byte[] decompress(byte[] input){ + try { + ByteArrayInputStream bais = new ByteArrayInputStream(input); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + decompress0(bais, baos); + return baos.toByteArray(); + } catch (IOException e){ + SneakyThrow.throwException(e); + } + return new byte[0]; // Never reaches here anyway + } + + public void compress0(InputStream inputStream, OutputStream outputStream) throws IOException { + try(OutputStream out = compress(outputStream)) { byte[] buf = new byte[8192]; int s; while ((s = inputStream.read(buf)) != -1) out.write(buf, 0, s); out.flush(); } } - public abstract OutputStream pipe(OutputStream outputStream) throws IOException; + public void decompress0(InputStream inputStream, OutputStream outputStream) throws IOException { + try(InputStream is = decompress(inputStream)) { + byte[] buf = new byte[8192]; + int s; while ((s = is.read(buf)) != -1) outputStream.write(buf, 0, s); + outputStream.flush(); + } + } + + public abstract OutputStream compress(OutputStream outputStream) throws IOException; + public abstract InputStream decompress(InputStream inputStream) throws IOException; } diff --git a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressGZip.java b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressGZip.java index 2f4896f..9b8edba 100644 --- a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressGZip.java +++ b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressGZip.java @@ -3,7 +3,9 @@ package eu.mikroskeem.uurimustoo.algoritmidetest.compressors; import lombok.Getter; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; /** @@ -13,7 +15,12 @@ public class CompressGZip extends AbstractCompressor { @Getter private final String name = "GZip"; @Override - public OutputStream pipe(OutputStream outputStream) throws IOException { + public OutputStream compress(OutputStream outputStream) throws IOException { return new GZIPOutputStream(outputStream); } + + @Override + public InputStream decompress(InputStream inputStream) throws IOException { + return new GZIPInputStream(inputStream); + } } diff --git a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressXZ.java b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressXZ.java index 691b941..77c97e5 100644 --- a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressXZ.java +++ b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressXZ.java @@ -2,9 +2,11 @@ package eu.mikroskeem.uurimustoo.algoritmidetest.compressors; import lombok.Getter; import org.tukaani.xz.LZMA2Options; +import org.tukaani.xz.XZInputStream; import org.tukaani.xz.XZOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; /** @@ -14,8 +16,13 @@ public class CompressXZ extends AbstractCompressor { @Getter private final String name = "XZ"; @Override - public OutputStream pipe(OutputStream outputStream) throws IOException { + public OutputStream compress(OutputStream outputStream) throws IOException { LZMA2Options options = new LZMA2Options(); return new XZOutputStream(outputStream, options); } + + @Override + public InputStream decompress(InputStream inputStream) throws IOException { + return new XZInputStream(inputStream); + } } diff --git a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressZip.java b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressZip.java index 67ed9fb..e61c9e4 100644 --- a/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressZip.java +++ b/src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/compressors/CompressZip.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; /** @@ -15,7 +16,7 @@ public class CompressZip extends AbstractCompressor { @Getter private final String name = "ZIP"; @Override - public void pipe0(InputStream inputStream, OutputStream outputStream) throws IOException { + public void compress0(InputStream inputStream, OutputStream outputStream) throws IOException { try(ZipOutputStream out = new ZipOutputStream(outputStream)){ ZipEntry ze = new ZipEntry("Test.class"); out.putNextEntry(ze); @@ -30,7 +31,26 @@ public class CompressZip extends AbstractCompressor { } @Override - public OutputStream pipe(OutputStream outputStream) throws IOException { - throw new UnsupportedOperationException("See void pipe0()"); + public void decompress0(InputStream inputStream, OutputStream outputStream) throws IOException { + try(ZipInputStream in = new ZipInputStream(inputStream)){ + ZipEntry ze = in.getNextEntry(); + assert ze.getName().equals("Test.class"); + byte[] buf = new byte[8192]; + int s; + while((s = in.read(buf)) != -1){ + outputStream.write(buf, 0, s); + } + outputStream.flush(); + } + } + + @Override + public OutputStream compress(OutputStream outputStream) throws IOException { + throw new UnsupportedOperationException("See void compress0()"); + } + + @Override + public InputStream decompress(InputStream inputStream) throws IOException { + throw new UnsupportedOperationException("See void decompress0()"); } }