From 198c33bc26ab9090e7fa2b617783c90317ec712b Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sun, 21 Oct 2012 21:24:32 -0700 Subject: [PATCH] Add BareDexBuffer for testing DexBuffer --- .../org/jf/dexlib2/dexbacked/DexBuffer.java | 10 ++- .../jf/dexlib2/dexbacked/BareDexBuffer.java | 40 +++++++++++ .../jf/dexlib2/dexbacked/DexBufferTest.java | 66 +++++++++---------- .../dexbacked/DexFileReaderLeb128Test.java | 4 +- .../dexbacked/DexReaderSleb128Test.java | 4 +- .../jf/dexlib2/dexbacked/DexReaderTest.java | 20 +++--- 6 files changed, 96 insertions(+), 48 deletions(-) create mode 100644 dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BareDexBuffer.java diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBuffer.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBuffer.java index 0ffdee56..dfc77bf0 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBuffer.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBuffer.java @@ -40,8 +40,16 @@ public class DexBuffer { // TODO: consider using a direct ByteBuffer instead @Nonnull protected final byte[] buf; - public DexBuffer(@Nonnull byte[] buf) { + protected DexBuffer(@Nonnull byte[] buf, boolean bare) { this.buf = buf; + + if (!bare) { + // read header, verify magic, etc. etc. + } + } + + public DexBuffer(@Nonnull byte[] buf) { + this(buf, false); } public int getFieldIdItemOffset(int fieldIndex) { diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BareDexBuffer.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BareDexBuffer.java new file mode 100644 index 00000000..cfcbfc54 --- /dev/null +++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BareDexBuffer.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.jf.dexlib2.dexbacked; + +import javax.annotation.Nonnull; + +public class BareDexBuffer extends DexBuffer { + public BareDexBuffer(@Nonnull byte[] buf) { + super(buf, true); + } +} diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexBufferTest.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexBufferTest.java index aac2a5d1..94538349 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexBufferTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexBufferTest.java @@ -42,56 +42,56 @@ import java.util.Random; public class DexBufferTest { @Test public void testReadSmallUintSuccess() { - DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22, 0x33, 0x44}); + BareDexBuffer dexBuf = new BareDexBuffer(new byte[] {0x11, 0x22, 0x33, 0x44}); Assert.assertEquals(0x44332211, dexBuf.readSmallUint(0)); - dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00}); + dexBuf = new BareDexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00}); Assert.assertEquals(0, dexBuf.readSmallUint(0)); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, 0x7f}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, 0x7f}); Assert.assertEquals(0x7fffffff, dexBuf.readSmallUint(0)); } @Test(expected=ExceptionWithContext.class) public void testReadSmallUintTooLarge1() { - DexBuffer dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, (byte)0x80}); + BareDexBuffer dexBuf = new BareDexBuffer(new byte[] {0x00, 0x00, 0x00, (byte)0x80}); dexBuf.readSmallUint(0); } @Test(expected=ExceptionWithContext.class) public void testReadSmallUintTooLarge2() { - DexBuffer dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80}); + BareDexBuffer dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80}); dexBuf.readSmallUint(0); } @Test(expected=ExceptionWithContext.class) public void testReadSmallUintTooLarge3() { - DexBuffer dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}); + BareDexBuffer dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}); dexBuf.readSmallUint(0); } @Test public void testReadUshort() { - DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22}); + BareDexBuffer dexBuf = new BareDexBuffer(new byte[] {0x11, 0x22}); Assert.assertEquals(dexBuf.readUshort(0), 0x2211); - dexBuf = new DexBuffer(new byte[] {0x00, 0x00}); + dexBuf = new BareDexBuffer(new byte[] {0x00, 0x00}); Assert.assertEquals(dexBuf.readUshort(0), 0); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff}); Assert.assertEquals(dexBuf.readUshort(0), 0xffff); - dexBuf = new DexBuffer(new byte[] {(byte)0x00, (byte)0x80}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0x00, (byte)0x80}); Assert.assertEquals(dexBuf.readUshort(0), 0x8000); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0x7f}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0x7f}); Assert.assertEquals(dexBuf.readUshort(0), 0x7fff); } @Test public void testReadUbyte() { byte[] buf = new byte[1]; - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); for (int i=0; i<=0xff; i++) { buf[0] = (byte)i; @@ -101,24 +101,24 @@ public class DexBufferTest { @Test public void testReadLong() { - DexBuffer dexBuf = new DexBuffer(new byte[] {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}); + BareDexBuffer dexBuf = new BareDexBuffer(new byte[] {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}); Assert.assertEquals(0x7766554433221100L, dexBuf.readLong(0)); - dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}); + dexBuf = new BareDexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}); Assert.assertEquals(0, dexBuf.readLong(0)); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x7f}); Assert.assertEquals(Long.MAX_VALUE, dexBuf.readLong(0)); - dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0x80}); + dexBuf = new BareDexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0x80}); Assert.assertEquals(Long.MIN_VALUE, dexBuf.readLong(0)); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80}); Assert.assertEquals(0x80ffffffffffffffL, dexBuf.readLong(0)); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}); Assert.assertEquals(-1, dexBuf.readLong(0)); @@ -126,50 +126,50 @@ public class DexBufferTest { @Test public void testReadInt() { - DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22, 0x33, 0x44}); + BareDexBuffer dexBuf = new BareDexBuffer(new byte[] {0x11, 0x22, 0x33, 0x44}); Assert.assertEquals(0x44332211, dexBuf.readInt(0)); - dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00}); + dexBuf = new BareDexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00}); Assert.assertEquals(0, dexBuf.readInt(0)); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, 0x7f}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, 0x7f}); Assert.assertEquals(Integer.MAX_VALUE, dexBuf.readInt(0)); - dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, (byte)0x80}); + dexBuf = new BareDexBuffer(new byte[] {0x00, 0x00, 0x00, (byte)0x80}); Assert.assertEquals(Integer.MIN_VALUE, dexBuf.readInt(0)); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80}); Assert.assertEquals(0x80ffffff, dexBuf.readInt(0)); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}); Assert.assertEquals(-1, dexBuf.readInt(0)); } @Test public void testReadShort() { - DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22}); + BareDexBuffer dexBuf = new BareDexBuffer(new byte[] {0x11, 0x22}); Assert.assertEquals(dexBuf.readShort(0), 0x2211); - dexBuf = new DexBuffer(new byte[] {0x00, 0x00}); + dexBuf = new BareDexBuffer(new byte[] {0x00, 0x00}); Assert.assertEquals(dexBuf.readShort(0), 0); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0xff}); Assert.assertEquals(dexBuf.readShort(0), -1); - dexBuf = new DexBuffer(new byte[] {(byte)0x00, (byte)0x80}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0x00, (byte)0x80}); Assert.assertEquals(dexBuf.readShort(0), Short.MIN_VALUE); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0x7f}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0x7f}); Assert.assertEquals(dexBuf.readShort(0), 0x7fff); - dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0x80}); + dexBuf = new BareDexBuffer(new byte[] {(byte)0xff, (byte)0x80}); Assert.assertEquals(dexBuf.readShort(0), 0xffff80ff); } @Test public void testReadByte() { byte[] buf = new byte[1]; - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); for (int i=0; i<=0xff; i++) { buf[0] = (byte)i; @@ -182,7 +182,7 @@ public class DexBufferTest { Random r = new Random(1234567890); ByteBuffer byteBuf = ByteBuffer.allocateDirect(4).order(ByteOrder.LITTLE_ENDIAN); byte[] buf = new byte[4]; - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); for (int i=0; i<10000; i++) { int val = r.nextInt(); @@ -216,7 +216,7 @@ public class DexBufferTest { Random r = new Random(1234567890); ByteBuffer byteBuf = ByteBuffer.allocateDirect(8).order(ByteOrder.LITTLE_ENDIAN); byte[] buf = new byte[8]; - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); for (int i=0; i<10000; i++) { int val = r.nextInt(); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexFileReaderLeb128Test.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexFileReaderLeb128Test.java index cd59150a..f2b401ca 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexFileReaderLeb128Test.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexFileReaderLeb128Test.java @@ -246,7 +246,7 @@ public class DexFileReaderLeb128Test { } private void performTest(int expectedValue, byte[] buf, int expectedLength) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); Assert.assertEquals(expectedValue, reader.readSmallUleb128()); Assert.assertEquals(expectedLength, reader.getOffset()); @@ -257,7 +257,7 @@ public class DexFileReaderLeb128Test { } private void performFailureTest(byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); try { reader.readSmallUleb128(); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexReaderSleb128Test.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexReaderSleb128Test.java index f6a3d758..e59b526c 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexReaderSleb128Test.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexReaderSleb128Test.java @@ -253,14 +253,14 @@ public class DexReaderSleb128Test { } private void performTest(int expectedValue, byte[] buf, int expectedLength) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); Assert.assertEquals(expectedValue, reader.readSleb128()); Assert.assertEquals(expectedLength, reader.getOffset()); } private void performFailureTest(byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); try { reader.readSleb128(); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexReaderTest.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexReaderTest.java index 2423a77a..01f9e7a3 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexReaderTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/DexReaderTest.java @@ -67,7 +67,7 @@ public class DexReaderTest { } private void performSizedIntTest(int expectedValue, byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); Assert.assertEquals(expectedValue, reader.readSizedInt(buf.length)); } @@ -82,7 +82,7 @@ public class DexReaderTest { } private void performSizedIntFailureTest(byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); try { reader.readSizedInt(buf.length); @@ -122,7 +122,7 @@ public class DexReaderTest { } private void performSizedSmallUintTest(int expectedValue, byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); Assert.assertEquals(expectedValue, reader.readSizedSmallUint(buf.length)); } @@ -141,7 +141,7 @@ public class DexReaderTest { } private void performSizedSmallUintFailureTest(byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); try { reader.readSizedSmallUint(buf.length); @@ -192,7 +192,7 @@ public class DexReaderTest { } private void performSizedRightExtendedIntTest(int expectedValue, byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); Assert.assertEquals(expectedValue, reader.readSizedRightExtendedInt(buf.length)); } @@ -207,7 +207,7 @@ public class DexReaderTest { } private void performSizedRightExtendedIntFailureTest(byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); try { reader.readSizedRightExtendedInt(buf.length); @@ -301,7 +301,7 @@ public class DexReaderTest { } private void performSizedRightExtendedLongTest(long expectedValue, byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); Assert.assertEquals(expectedValue, reader.readSizedRightExtendedLong(buf.length)); } @@ -316,7 +316,7 @@ public class DexReaderTest { } private void performSizedRightExtendedLongFailureTest(byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); try { reader.readSizedRightExtendedLong(buf.length); @@ -410,7 +410,7 @@ public class DexReaderTest { } private void performSizedLongTest(long expectedValue, byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); Assert.assertEquals(expectedValue, reader.readSizedLong(buf.length)); } @@ -425,7 +425,7 @@ public class DexReaderTest { } private void performSizedLongFailureTest(byte[] buf) { - DexBuffer dexBuf = new DexBuffer(buf); + BareDexBuffer dexBuf = new BareDexBuffer(buf); DexReader reader = dexBuf.readerAt(0); try { reader.readSizedLong(buf.length);