package org.jgroups.tests;
import org.jgroups.Global;
import org.jgroups.util.Bits;
import org.jgroups.util.ByteArrayDataInputStream;
import org.jgroups.util.ByteArrayDataOutputStream;
import org.testng.annotations.Test;
import java.io.EOFException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Tests {@link ByteArrayDataInputStream} and {@link ByteArrayDataOutputStream}.
* @author Bela Ban
* @since 3.5
*/
@Test(groups=Global.FUNCTIONAL)
public class ByteArrayDataInputOutputStreamTest {
public void testLimit() {
byte[] buf=new byte[100];
buf[0]='B'; buf[1]='e'; buf[2]='l'; buf[3]='a';
ByteArrayDataInputStream in=new ByteArrayDataInputStream(buf);
assert in.position() == 0;
assert in.limit() == buf.length;
assert in.capacity() == buf.length;
in=new ByteArrayDataInputStream(buf, 0, 4);
assert in.position() == 0;
assert in.limit() == 4;
assert in.capacity() == buf.length;
byte tmp[]=new byte[4];
in.read(tmp, 0, tmp.length);
assert "Bela".equals(new String(tmp));
}
public void testOffsetAndLimit() {
byte[] buf=new byte[100];
buf[10]='B'; buf[11]='e'; buf[12]='l'; buf[13]='a';
ByteArrayDataInputStream in=new ByteArrayDataInputStream(buf, 10, 4);
assert in.position() == 10;
assert in.limit() == 14;
assert in.capacity() == buf.length;
byte tmp[]=new byte[4];
in.read(tmp, 0, tmp.length);
assert "Bela".equals(new String(tmp));
}
public void testReadBeyondLimit() {
byte[] buf=new byte[100];
buf[10]='B'; buf[11]='e'; buf[12]='l'; buf[13]='a';
ByteArrayDataInputStream in=new ByteArrayDataInputStream(buf, 10, 4);
assert in.position() == 10;
assert in.limit() == 14;
assert in.capacity() == buf.length;
byte tmp[]=new byte[5];
try {
in.readFully(tmp, 0, tmp.length);
assert false : " should have gotten an exception";
}
catch(Exception ex) {
System.out.println("caught exception as expected: " + ex);
assert ex instanceof EOFException;
}
in.position(10);
for(int i=0; i < 4; i++) in.read();
assert in.read() == -1;
}
public void testPosition() {
byte[] buf=new byte[100];
buf[10]='B'; buf[11]='e'; buf[12]='l'; buf[13]='a';
ByteArrayDataInputStream in=new ByteArrayDataInputStream(buf, 10, 4);
in.position(13);
try {
in.position(14);
}
catch(Exception ex) {
System.out.println("caught exception as expected: " + ex);
assert ex instanceof IndexOutOfBoundsException;
}
}
public void testExpanding() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1);
for(int i='A'; i < 'A' + 20; i++)
out.write(i);
assert out.position() == 20;
byte[] buffer=new byte[20];
for(int i=0; i < 5; i++)
out.write(buffer);
assert out.position() == 120;
}
public void testExpanding2() {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1);
out.write(new byte[]{'b', 'e', 'l', 'a'});
out=new ByteArrayDataOutputStream(1);
out.writeBoolean(true);
out.writeBoolean(false);
out=new ByteArrayDataOutputStream(1);
out.writeShort(22);
out.writeShort(23);
out=new ByteArrayDataOutputStream(1);
out.writeInt(23);
out.writeInt(24);
}
public void testSkipBytes() {
byte[] buf={'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
ByteArrayDataInputStream in=new ByteArrayDataInputStream(buf);
assert in.position() == 0;
int skipped=in.skipBytes(6);
assert skipped == 6;
assert in.position() == 6;
skipped=in.skipBytes(0);
assert skipped == 0;
assert in.position() == 6;
skipped=in.skipBytes(-1);
assert skipped == 0;
assert in.position() == 6;
skipped=in.skipBytes(5);
assert skipped == 5;
assert in.position() == 11;
in.position(6);
skipped=in.skipBytes(20);
assert skipped == 5;
assert in.position() == 11;
}
public void testRead() {
byte[] buf={'b', 'e', 'l', 'a'};
ByteArrayDataInputStream in=new ByteArrayDataInputStream(buf);
for(byte b: buf)
assert b == in.read();
assert -1 == in.read();
in=new ByteArrayDataInputStream(buf, 2, 2);
assert in.read() == 'l';
assert in.read() == 'a';
assert -1 == in.read();
ByteBuffer buffer=ByteBuffer.wrap(buf);
System.out.println("buffer = " + buffer);
}
public void testReadFully() {
byte[] name="Bela".getBytes();
ByteArrayDataInputStream in=new ByteArrayDataInputStream(name);
byte[] buf=new byte[10];
int read=in.read(buf, 0, buf.length);
assert read == 4;
assert in.position() == 4;
in.position(0);
try {
in.readFully(buf, 0, buf.length);
assert false : "readFully() should have thrown an EOFException";
}
catch(Exception eof_ex) {
System.out.println("got exception as expected: " + eof_ex);
assert eof_ex instanceof EOFException;
}
}
public void testByte() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(Byte.MAX_VALUE * 2);
for(short i=Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++)
out.writeByte(i);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(short i=Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {
byte read=in.readByte();
assert i == read;
}
}
public void testUnsignedByte() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(20);
byte[] bytes={-100, -50, 0, 1, 100, 127};
for(byte b: bytes)
out.writeByte(b);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(byte b: bytes) {
int tmp=in.readUnsignedByte();
assert tmp == (b & 0xff);
}
}
public void testBoolean() throws Exception {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(2);
out.writeBoolean(true);
out.writeBoolean(false);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
assert in.readBoolean();
assert !in.readBoolean();
}
public void testShort() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(Short.MAX_VALUE * 4 + 10);
for(int i=Short.MIN_VALUE; i <= Short.MAX_VALUE; i++)
out.writeShort(i);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(int i=Short.MIN_VALUE; i <= Short.MAX_VALUE; i++) {
short read=in.readShort();
assert i == read;
}
}
public void testUnsignedShort() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(20);
out.writeShort(-22);
out.writeShort(22);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
short num=in.readShort();
assert num == -22;
num=in.readShort();
assert num == 22;
in.position(0);
int val=in.readUnsignedShort();
assert val == 65514;
val=in.readUnsignedShort();
assert val == 22;
}
public void testChar() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1024);
for(int i=0; i < 500; i++) {
int ch='a' + i;
out.writeChar(ch);
}
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(int i=0; i < 500; i++) {
char ch=in.readChar();
assert ch == 'a' + i;
}
}
public void testInt() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1024);
int[] numbers={Integer.MIN_VALUE, -322649, -500, 0, 1, 100, 322649, Integer.MAX_VALUE};
for(int i: numbers)
out.writeInt(i);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(int i: numbers) {
int num=in.readInt();
assert num == i;
}
}
public void testLong() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1024);
long[] numbers={Long.MIN_VALUE, -322649, -500, 0, 1, 100, 322649, Long.MAX_VALUE};
for(long i: numbers)
out.writeLong(i);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(long i: numbers) {
long num=in.readLong();
assert num == i;
}
}
public void testCompressedLong() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1024);
long[] numbers={Long.MIN_VALUE, -500, 0, 1, 100, Long.MAX_VALUE};
for(long i: numbers)
Bits.writeLong(i, out);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(long i: numbers) {
long num=Bits.readLong(in);
assert num == i;
}
}
public void testCompressedLongSequence() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1024);
long[] numbers={0, 1, 100, 322649, Long.MAX_VALUE-1000};
for(long i: numbers)
Bits.writeLongSequence(i, i + 100,out);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(long i: numbers) {
long[] seq=Bits.readLongSequence(in);
assert Arrays.equals(seq, new long[]{i, i+100});
}
}
public void testFloat() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1024);
float[] numbers={-322649.25f, 100.7531f, 0f, 1f, 2.75f, 3.1425f, 322649f, 322649.75f};
for(float i: numbers)
out.writeFloat(i);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(float i: numbers) {
float num=in.readFloat();
assert num == i;
}
}
public void testDouble() throws IOException {
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(1024);
double[] numbers={-322649.25, 100.7531, 0.0, 1.5, 2.75, 3.1425, 322649, 322649.75};
for(double i: numbers)
out.writeDouble(i);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
for(double i: numbers) {
double num=in.readDouble();
assert num == i;
}
}
public void testWriteBytes() {
String name="Bela";
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(2);
out.writeBytes(name);
assert out.position() == name.length();
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
byte[] tmp=new byte[name.length()];
int read=in.read(tmp, 0, tmp.length);
assert read == name.length();
assert name.equals(new String(tmp));
}
public void testWriteChars() throws IOException {
String name="Bela";
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(2);
out.writeChars(name);
assert out.position() == name.length() * 2;
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
char[] tmp=new char[name.length()];
for(int i=0; i < name.length(); i++)
tmp[i]=in.readChar();
assert name.equals(new String(tmp));
}
public void testUTF() throws IOException {
String name="Bela";
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(2);
out.writeUTF(name);
assert out.position() == name.length() + 2;
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
String tmp=in.readUTF();
assert name.equals(tmp);
}
public void testUTFWithDoubleByteChar() throws IOException {
String name="Bela\234";
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(2);
out.writeUTF(name);
assert out.position() == Bits.sizeUTF(name);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
String tmp=in.readUTF();
assert name.equals(tmp);
}
public void testUTFWithDoubleByteChar2() throws IOException {
String name="Bela\420";
ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(2);
out.writeUTF(name);
assert out.position() == Bits.sizeUTF(name);
ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer());
String tmp=in.readUTF();
assert name.equals(tmp);
name="";
out=new ByteArrayDataOutputStream(2);
out.writeUTF(name);
assert out.position() == Bits.sizeUTF(name);
in=new ByteArrayDataInputStream(out.buffer());
tmp=in.readUTF();
assert name.equals(tmp);
name=null;
out=new ByteArrayDataOutputStream(2);
out.writeUTF(name);
assert out.position() == Bits.sizeUTF(name);
in=new ByteArrayDataInputStream(out.buffer());
tmp=in.readUTF();
assert tmp == null;
}
public static void testReadLine() throws IOException {
String str="Gallia est omnis divisa in partes tres,\n\rquarum unam incolunt Belgae,\naliam Aquitani," +
"\ntertiam qui ipsorum lingua Celtae, nostra Galli appellantur";
byte[] buf=str.getBytes();
ByteArrayDataInputStream in=new ByteArrayDataInputStream(buf);
List<String> lines=new ArrayList<String>(4);
String line;
while((line=in.readLine()) != null) {
System.out.println(line);
lines.add(line);
}
assert lines.size() == 4;
}
}