blob: deea63f94e789bdf541741b7b4157219fea2560f [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.java.nio;
import java.nio.Buffer;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import junit.framework.TestCase;
/**
* Tests for some buffers from the java.nio package.
*/
public class OldAndroidNIOTest extends TestCase {
void checkBuffer(Buffer b) {
assertTrue(0 <= b.position());
assertTrue(b.position() <= b.limit());
assertTrue(b.limit() <= b.capacity());
}
public void testNIO_byte_array() throws Exception {
// Test byte array-based buffer
byteBufferTest(ByteBuffer.allocate(12));
}
public void testNIO_direct() throws Exception {
// Test native heap-allocated buffer
byteBufferTest(ByteBuffer.allocateDirect(12));
}
public void testNIO_short_array() throws Exception {
// Test short array-based buffer
short[] shortArray = new short[8];
ShortBuffer sb = ShortBuffer.wrap(shortArray);
shortBufferTest(sb);
}
public void testNIO_int_array() throws Exception {
// Test int array-based buffer
int[] intArray = new int[8];
IntBuffer ib = IntBuffer.wrap(intArray);
intBufferTest(ib);
}
public void testNIO_float_array() throws Exception {
// Test float array-based buffer
float[] floatArray = new float[8];
FloatBuffer fb = FloatBuffer.wrap(floatArray);
floatBufferTest(fb);
}
private void byteBufferTest(ByteBuffer b) {
checkBuffer(b);
// Duplicate buffers revert to big-endian.
b.order(ByteOrder.LITTLE_ENDIAN);
ByteBuffer dupe = b.duplicate();
assertEquals(ByteOrder.BIG_ENDIAN, dupe.order());
b.order(ByteOrder.BIG_ENDIAN);
// Bounds checks
try {
b.put(-1, (byte) 0);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
b.put(b.limit(), (byte) 0);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// IndexOutOfBoundsException: offset < 0
try {
byte[] data = new byte[8];
b.position(0);
b.put(data, -1, 2);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// IndexOutOfBoundsException: length > array.length - offset
try {
byte[] data = new byte[8];
b.position(0);
b.put(data, 1, 8);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// BufferOverflowException: length > remaining()
try {
byte[] data = new byte[8];
b.position(b.limit() - 2);
b.put(data, 0, 3);
fail("expected exception not thrown");
} catch (BufferOverflowException e) {
// expected
}
// Fill buffer with bytes A0 A1 A2 A3 ...
b.position(0);
for (int i = 0; i < b.capacity(); i++) {
b.put((byte) (0xA0 + i));
}
try {
b.put((byte) 0xFF);
fail("expected exception not thrown");
} catch (BufferOverflowException e) {
// expected
}
b.position(0);
assertEquals((byte) 0xA7, b.get(7));
try {
b.get(12);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
b.get(-10);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
b.position(0);
b.order(ByteOrder.LITTLE_ENDIAN);
assertEquals((byte) 0xA0, b.get());
assertEquals((byte) 0xA1, b.get());
assertEquals((byte) 0xA2, b.get());
assertEquals((byte) 0xA3, b.get());
assertEquals((byte) 0xA4, b.get());
assertEquals((byte) 0xA5, b.get());
assertEquals((byte) 0xA6, b.get());
assertEquals((byte) 0xA7, b.get());
assertEquals((byte) 0xA8, b.get());
assertEquals((byte) 0xA9, b.get());
assertEquals((byte) 0xAA, b.get());
assertEquals((byte) 0xAB, b.get());
try {
b.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
b.position(0);
b.order(ByteOrder.BIG_ENDIAN);
assertEquals((byte) 0xA0, b.get());
assertEquals((byte) 0xA1, b.get());
assertEquals((byte) 0xA2, b.get());
assertEquals((byte) 0xA3, b.get());
assertEquals((byte) 0xA4, b.get());
assertEquals((byte) 0xA5, b.get());
assertEquals((byte) 0xA6, b.get());
assertEquals((byte) 0xA7, b.get());
assertEquals((byte) 0xA8, b.get());
assertEquals((byte) 0xA9, b.get());
assertEquals((byte) 0xAA, b.get());
assertEquals((byte) 0xAB, b.get());
try {
b.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
b.position(6);
b.limit(10);
assertEquals((byte) 0xA6, b.get());
// Check sliced buffer
b.position(6);
ByteBuffer bb = b.slice();
checkBuffer(bb);
assertEquals(0, bb.position());
assertEquals(4, bb.limit());
assertEquals(4, bb.capacity());
assertEquals((byte) 0xA6, bb.get());
assertEquals((byte) 0xA7, bb.get());
assertEquals((byte) 0xA8, bb.get());
assertEquals((byte) 0xA9, bb.get());
try {
bb.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
// Reset position and limit
b.position(0);
b.limit(b.capacity());
// Check 'getShort'
b.order(ByteOrder.LITTLE_ENDIAN);
b.position(0);
assertEquals((short) 0xA1A0, b.getShort());
assertEquals((short) 0xA3A2, b.getShort());
assertEquals((short) 0xA5A4, b.getShort());
assertEquals((short) 0xA7A6, b.getShort());
assertEquals((short) 0xA9A8, b.getShort());
assertEquals((short) 0xABAA, b.getShort());
try {
bb.getShort();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
b.order(ByteOrder.BIG_ENDIAN);
b.position(0);
assertEquals((short) 0xA0A1, b.getShort());
assertEquals((short) 0xA2A3, b.getShort());
assertEquals((short) 0xA4A5, b.getShort());
assertEquals((short) 0xA6A7, b.getShort());
assertEquals((short) 0xA8A9, b.getShort());
assertEquals((short) 0xAAAB, b.getShort());
try {
bb.getShort();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
// Check 'getInt'
b.order(ByteOrder.LITTLE_ENDIAN);
b.position(0);
assertEquals(0xA3A2A1A0, b.getInt());
assertEquals(0xA7A6A5A4, b.getInt());
assertEquals(0xABAAA9A8, b.getInt());
try {
bb.getInt();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
b.order(ByteOrder.BIG_ENDIAN);
b.position(0);
assertEquals(0xA0A1A2A3, b.getInt());
assertEquals(0xA4A5A6A7, b.getInt());
assertEquals(0xA8A9AAAB, b.getInt());
try {
bb.getInt();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
// Check 'getFloat'
b.order(ByteOrder.LITTLE_ENDIAN);
b.position(0);
assertEquals(0xA3A2A1A0, Float.floatToRawIntBits(b.getFloat()));
assertEquals(0xA7A6A5A4, Float.floatToRawIntBits(b.getFloat()));
assertEquals(0xABAAA9A8, Float.floatToRawIntBits(b.getFloat()));
try {
b.getFloat();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
b.order(ByteOrder.BIG_ENDIAN);
b.position(0);
assertEquals(0xA0A1A2A3, Float.floatToRawIntBits(b.getFloat()));
assertEquals(0xA4A5A6A7, Float.floatToRawIntBits(b.getFloat()));
assertEquals(0xA8A9AAAB, Float.floatToRawIntBits(b.getFloat()));
try {
b.getFloat();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
// Check 'getDouble(int position)'
b.order(ByteOrder.LITTLE_ENDIAN);
assertEquals(0xA7A6A5A4A3A2A1A0L, Double.doubleToRawLongBits(b.getDouble(0)));
assertEquals(0xA8A7A6A5A4A3A2A1L, Double.doubleToRawLongBits(b.getDouble(1)));
try {
b.getDouble(-1);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
b.getDouble(5);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
b.order(ByteOrder.BIG_ENDIAN);
assertEquals(0xA0A1A2A3A4A5A6A7L, Double.doubleToRawLongBits(b.getDouble(0)));
assertEquals(0xA1A2A3A4A5A6A7A8L, Double.doubleToRawLongBits(b.getDouble(1)));
try {
b.getDouble(-1);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
b.getDouble(5);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// Slice and check 'getInt'
b.position(1);
b.limit(5);
b.order(ByteOrder.LITTLE_ENDIAN);
bb = b.slice();
assertEquals(4, bb.capacity());
assertEquals(ByteOrder.BIG_ENDIAN, bb.order());
assertEquals(0xA1A2A3A4, bb.getInt(0));
bb.order(ByteOrder.LITTLE_ENDIAN);
assertEquals(0xA4A3A2A1, bb.getInt(0));
bb.order(ByteOrder.LITTLE_ENDIAN);
ShortBuffer sb = bb.asShortBuffer();
checkBuffer(sb);
assertEquals(2, sb.capacity());
assertEquals((short) 0xA2A1, sb.get());
assertEquals((short) 0xA4A3, sb.get());
bb.order(ByteOrder.BIG_ENDIAN);
sb = bb.asShortBuffer();
checkBuffer(sb);
assertEquals(2, sb.capacity());
assertEquals((short) 0xA1A2, sb.get());
assertEquals((short) 0xA3A4, sb.get());
bb.order(ByteOrder.LITTLE_ENDIAN);
IntBuffer ib = bb.asIntBuffer();
checkBuffer(ib);
assertEquals(1, ib.capacity());
assertEquals(0xA4A3A2A1, ib.get());
bb.order(ByteOrder.BIG_ENDIAN);
ib = bb.asIntBuffer();
checkBuffer(ib);
assertEquals(1, ib.capacity());
assertEquals(0xA1A2A3A4, ib.get());
bb.order(ByteOrder.LITTLE_ENDIAN);
FloatBuffer fb = bb.asFloatBuffer();
checkBuffer(fb);
assertEquals(1, fb.capacity());
assertEquals(0xA4A3A2A1, Float.floatToRawIntBits(fb.get()));
bb.order(ByteOrder.BIG_ENDIAN);
fb = bb.asFloatBuffer();
checkBuffer(fb);
assertEquals(1, fb.capacity());
assertEquals(0xA1A2A3A4, Float.floatToRawIntBits(fb.get()));
}
private void shortBufferTest(ShortBuffer sb) {
checkBuffer(sb);
try {
sb.put(-1, (short) 0);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
sb.put(sb.limit(), (short) 0);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// IndexOutOfBoundsException: offset < 0
try {
short[] data = new short[8];
sb.position(0);
sb.put(data, -1, 2);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// IndexOutOfBoundsException: length > array.length - offset
try {
short[] data = new short[8];
sb.position(0);
sb.put(data, 1, 8);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// BufferOverflowException: length > remaining()
try {
short[] data = new short[8];
sb.position(sb.limit() - 2);
sb.put(data, 0, 3);
fail("expected exception not thrown");
} catch (BufferOverflowException e) {
// expected
}
short[] data = {0, 10, 20, 30, 40, 50, 60, 70};
sb.position(0);
sb.put(data);
try {
sb.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
sb.position(0);
assertEquals((short) 0, sb.get());
assertEquals((short) 10, sb.get());
assertEquals((short) 20, sb.get());
assertEquals((short) 30, sb.get());
assertEquals((short) 40, sb.get());
assertEquals((short) 50, sb.get());
assertEquals((short) 60, sb.get());
assertEquals((short) 70, sb.get());
try {
sb.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
sb.position(1);
sb.put((short) 11);
assertEquals((short) 11, sb.get(1));
short[] ss1 = {33, 44, 55, 66};
sb.position(3);
sb.put(ss1);
sb.position(0);
assertEquals((short) 0, sb.get());
assertEquals((short) 11, sb.get());
assertEquals((short) 20, sb.get());
assertEquals((short) 33, sb.get());
assertEquals((short) 44, sb.get());
assertEquals((short) 55, sb.get());
assertEquals((short) 66, sb.get());
assertEquals((short) 70, sb.get());
short[] ss2 = {10, 22, 30};
sb.position(2);
sb.put(ss2, 1, 1);
sb.position(0);
assertEquals((short) 0, sb.get());
assertEquals((short) 11, sb.get());
assertEquals((short) 22, sb.get());
assertEquals((short) 33, sb.get());
assertEquals((short) 44, sb.get());
assertEquals((short) 55, sb.get());
assertEquals((short) 66, sb.get());
assertEquals((short) 70, sb.get());
}
private void intBufferTest(IntBuffer ib) {
checkBuffer(ib);
try {
ib.put(-1, (int) 0);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
ib.put(ib.limit(), (int) 0);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// IndexOutOfBoundsException: offset < 0
try {
int[] data = new int[8];
ib.position(0);
ib.put(data, -1, 2);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// IndexOutOfBoundsException: length > array.length - offset
try {
int[] data = new int[8];
ib.position(0);
ib.put(data, 1, 8);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// BufferOverflowException: length > remaining()
try {
int[] data = new int[8];
ib.position(ib.limit() - 2);
ib.put(data, 0, 3);
fail("expected exception not thrown");
} catch (BufferOverflowException e) {
// expected
}
int[] data = {0, 10, 20, 30, 40, 50, 60, 70};
ib.position(0);
ib.put(data);
try {
ib.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
ib.position(0);
assertEquals((int) 0, ib.get());
assertEquals((int) 10, ib.get());
assertEquals((int) 20, ib.get());
assertEquals((int) 30, ib.get());
assertEquals((int) 40, ib.get());
assertEquals((int) 50, ib.get());
assertEquals((int) 60, ib.get());
assertEquals((int) 70, ib.get());
try {
ib.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
ib.position(1);
ib.put((int) 11);
assertEquals((int) 11, ib.get(1));
int[] ss1 = {33, 44, 55, 66};
ib.position(3);
ib.put(ss1);
ib.position(0);
assertEquals((int) 0, ib.get());
assertEquals((int) 11, ib.get());
assertEquals((int) 20, ib.get());
assertEquals((int) 33, ib.get());
assertEquals((int) 44, ib.get());
assertEquals((int) 55, ib.get());
assertEquals((int) 66, ib.get());
assertEquals((int) 70, ib.get());
int[] ss2 = {10, 22, 30};
ib.position(2);
ib.put(ss2, 1, 1);
ib.position(0);
assertEquals((int) 0, ib.get());
assertEquals((int) 11, ib.get());
assertEquals((int) 22, ib.get());
assertEquals((int) 33, ib.get());
assertEquals((int) 44, ib.get());
assertEquals((int) 55, ib.get());
assertEquals((int) 66, ib.get());
assertEquals((int) 70, ib.get());
}
void floatBufferTest(FloatBuffer fb) {
checkBuffer(fb);
try {
fb.put(-1, (float) 0);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
fb.put(fb.limit(), (float) 0);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// IndexOutOfBoundsException: offset < 0
try {
float[] data = new float[8];
fb.position(0);
fb.put(data, -1, 2);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// IndexOutOfBoundsException: length > array.length - offset
try {
float[] data = new float[8];
fb.position(0);
fb.put(data, 1, 8);
fail("expected exception not thrown");
} catch (IndexOutOfBoundsException e) {
// expected
}
// BufferOverflowException: length > remaining()
try {
float[] data = new float[8];
fb.position(fb.limit() - 2);
fb.put(data, 0, 3);
fail("expected exception not thrown");
} catch (BufferOverflowException e) {
// expected
}
float[] data = {0, 10, 20, 30, 40, 50, 60, 70};
fb.position(0);
fb.put(data);
try {
fb.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
fb.position(0);
assertEquals((float) 0, fb.get());
assertEquals((float) 10, fb.get());
assertEquals((float) 20, fb.get());
assertEquals((float) 30, fb.get());
assertEquals((float) 40, fb.get());
assertEquals((float) 50, fb.get());
assertEquals((float) 60, fb.get());
assertEquals((float) 70, fb.get());
try {
fb.get();
fail("expected exception not thrown");
} catch (BufferUnderflowException e) {
// expected
}
fb.position(1);
fb.put((float) 11);
assertEquals((float) 11, fb.get(1));
float[] ss1 = {33, 44, 55, 66};
fb.position(3);
fb.put(ss1);
fb.position(0);
assertEquals((float) 0, fb.get());
assertEquals((float) 11, fb.get());
assertEquals((float) 20, fb.get());
assertEquals((float) 33, fb.get());
assertEquals((float) 44, fb.get());
assertEquals((float) 55, fb.get());
assertEquals((float) 66, fb.get());
assertEquals((float) 70, fb.get());
float[] ss2 = {10, 22, 30};
fb.position(2);
fb.put(ss2, 1, 1);
fb.position(0);
assertEquals((float) 0, fb.get());
assertEquals((float) 11, fb.get());
assertEquals((float) 22, fb.get());
assertEquals((float) 33, fb.get());
assertEquals((float) 44, fb.get());
assertEquals((float) 55, fb.get());
assertEquals((float) 66, fb.get());
assertEquals((float) 70, fb.get());
}
}