From 9006e31bc25f3f3282d6d39f09e5dda5bd1be1ce Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Mon, 22 Jun 2015 17:20:04 +0100 Subject: Add CTS test for unaligned reads / writes with swaps. bug: 21491780 (cherry picked from commit 11b2b3f7d8ef8538bdda11db197eb68aa662678e) Change-Id: I22a7307694dbd554566d8992e187f504665d5506 --- .../tests/java/nio/DirectByteBufferTest.java | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'harmony-tests') diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/DirectByteBufferTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/DirectByteBufferTest.java index ffdfb2c..892cd1d 100644 --- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/DirectByteBufferTest.java +++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/DirectByteBufferTest.java @@ -16,6 +16,10 @@ package org.apache.harmony.tests.java.nio; import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.nio.ShortBuffer; public class DirectByteBufferTest extends ByteBufferTest { @@ -57,4 +61,57 @@ public class DirectByteBufferTest extends ByteBufferTest { public void testIsReadOnly() { assertFalse(buf.isReadOnly()); } + + // http://b/19692084 + // http://b/21491780 + public void testUnalignedReadsAndWrites() { + // We guarantee that the first byte of the buffer is 8 byte aligned. + ByteBuffer buf = ByteBuffer.allocateDirect(23); + // Native order is always little endian, so this forces swaps. + buf.order(ByteOrder.BIG_ENDIAN); + + for (int i = 0; i < 8; ++i) { + buf.position(i); + + // 2 byte swaps. + ShortBuffer shortBuf = buf.asShortBuffer(); + short[] shortArray = new short[] { 42, 24 }; + + // Write. + shortBuf.put(shortArray); + // Read + shortBuf.flip(); + shortBuf.get(shortArray); + // Assert Equality + assertEquals(42, shortArray[0]); + assertEquals(24, shortArray[1]); + + buf.position(i); + // 4 byte swaps. + IntBuffer intBuf = buf.asIntBuffer(); + int[] intArray = new int[] { 967, 1983 }; + // Write. + intBuf.put(intArray); + // Read + intBuf.flip(); + intBuf.get(intArray); + // Assert Equality + assertEquals(967, intArray[0]); + assertEquals(1983, intArray[1]); + + + buf.position(i); + // 8 byte swaps. + LongBuffer longBuf = buf.asLongBuffer(); + long[] longArray = new long[] { 2147484614L, 2147485823L }; + // Write. + longBuf.put(longArray); + // Read + longBuf.flip(); + longBuf.get(longArray); + // Assert Equality + assertEquals(2147484614L, longArray[0]); + assertEquals(2147485823L, longArray[1]); + } + } } -- cgit v1.1