From 2d981ae995ad8cfadbb10a8cac0016c4769dd0af Mon Sep 17 00:00:00 2001 From: zxh0 Date: Tue, 9 Oct 2018 14:12:58 +0800 Subject: [PATCH] + tests --- .../zxh/classpy/wasm/WasmBinReader.java | 1 + .../com/github/zxh/classpy/wasm/FuncTest.java | 59 +++++++++++++++++++ .../github/zxh/classpy/wasm/LEB128Test.java | 20 +++++++ 3 files changed, 80 insertions(+) create mode 100644 classpy-wasm/src/test/java/com/github/zxh/classpy/wasm/FuncTest.java create mode 100644 classpy-wasm/src/test/java/com/github/zxh/classpy/wasm/LEB128Test.java diff --git a/classpy-wasm/src/main/java/com/github/zxh/classpy/wasm/WasmBinReader.java b/classpy-wasm/src/main/java/com/github/zxh/classpy/wasm/WasmBinReader.java index 59d7a180..70d4930a 100644 --- a/classpy-wasm/src/main/java/com/github/zxh/classpy/wasm/WasmBinReader.java +++ b/classpy-wasm/src/main/java/com/github/zxh/classpy/wasm/WasmBinReader.java @@ -4,6 +4,7 @@ import java.nio.ByteOrder; +// https://en.wikipedia.org/wiki/LEB128 public class WasmBinReader extends BytesReader { public WasmBinReader(byte[] data) { diff --git a/classpy-wasm/src/test/java/com/github/zxh/classpy/wasm/FuncTest.java b/classpy-wasm/src/test/java/com/github/zxh/classpy/wasm/FuncTest.java new file mode 100644 index 00000000..13409930 --- /dev/null +++ b/classpy-wasm/src/test/java/com/github/zxh/classpy/wasm/FuncTest.java @@ -0,0 +1,59 @@ +package com.github.zxh.classpy.wasm; + +import com.github.zxh.classpy.common.FileComponent; +import com.github.zxh.classpy.wasm.instructions.Expr; +import com.github.zxh.classpy.wasm.instructions.Instr; +import com.github.zxh.classpy.wasm.sections.Code; +import org.junit.Test; + +import java.util.Base64; + +public class FuncTest { + + @Test + public void read() { + String base64 = "AQJ/IAIEfwNAIAAsAAAiAyABLAAAIgRGBEAgAEEBaiEAIAFBAWohAUEAIAJBf2oiAkUNAxoMAQsLIANB/wFxIARB/wFxawVBAAsPCw=="; + byte[] code = Base64.getDecoder().decode(base64); + Code.Func func = new Code.Func(); + try { + func.read(new WasmBinReader(code)); + } catch (Exception e) { + new ExprPrinter().printExpr((Expr) func.getComponents().get(1)); + throw e; + } + } + + + private static class ExprPrinter { + + private int indentation; + + private void printExpr(Expr expr) { + for (FileComponent fc : expr.getComponents()) { + printInstr((Instr) fc); + } + } + + private void printInstr(Instr instr) { + if (instr.getOpcode() == 0x0B + || instr.getOpcode() == 0x05) { + indentation -= 1; + } + for (int i = 0; i < indentation; i++) { + System.out.print("\t"); + } + System.out.println(instr.getName()); + if (instr.getOpcode() == 0x02 + || instr.getOpcode() == 0x03 + || instr.getOpcode() == 0x04) { + indentation += 1; + } + for (FileComponent fc : instr.getComponents()) { + if (fc instanceof Instr) { + printInstr((Instr) fc); + } + } + } + } + +} diff --git a/classpy-wasm/src/test/java/com/github/zxh/classpy/wasm/LEB128Test.java b/classpy-wasm/src/test/java/com/github/zxh/classpy/wasm/LEB128Test.java new file mode 100644 index 00000000..ffcdc9c1 --- /dev/null +++ b/classpy-wasm/src/test/java/com/github/zxh/classpy/wasm/LEB128Test.java @@ -0,0 +1,20 @@ +package com.github.zxh.classpy.wasm; + +import org.junit.Assert; +import org.junit.Test; + +public class LEB128Test { + + @Test + public void readU32() { + Assert.assertEquals(624485, + new WasmBinReader(new byte[] {(byte) 0xE5, (byte) 0x8E, 0x26}).readU32()); + } + + @Test + public void readS32() { + Assert.assertEquals(-624485, + new WasmBinReader(new byte[] {(byte) 0x9B, (byte) 0xF1, 0x59}).readS32()); + } + +}