/*
* Copyright (c) 2009 - 2012 Deutsches Elektronen-Synchroton,
* Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program (see the file COPYING.LIB for more
* details); if not, write to the Free Software Foundation, Inc.,
* 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.dcache.xdr;
import java.nio.ByteOrder;
import java.util.Arrays;
import org.glassfish.grizzly.Buffer;
import org.glassfish.grizzly.memory.BuffersBuffer;
import org.glassfish.grizzly.memory.CompositeBuffer;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class XdrTest {
private Buffer _buffer;
@Before
public void setUp() {
_buffer = allocateBuffer(1024);
_buffer.order(ByteOrder.BIG_ENDIAN);
}
@Test
public void testDecodeInt() throws BadXdrOncRpcException {
int value = 17;
_buffer.putInt(value);
Xdr xdr = new Xdr(_buffer);
xdr.beginDecoding();
assertEquals("Decode value incorrect", 17, xdr.xdrDecodeInt());
}
@Test
public void testEncodeDecodeOpaque() throws BadXdrOncRpcException {
byte[] data = "some random data".getBytes();
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeDynamicOpaque(data);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
byte[] decoded = decoder.xdrDecodeDynamicOpaque();
assertTrue("encoded/decoded data do not match", Arrays.equals(data, decoded));
}
@Test
public void testDecodeBooleanTrue() throws BadXdrOncRpcException {
_buffer.putInt(1);
Xdr xdr = new Xdr(_buffer);
xdr.beginDecoding();
assertTrue("Decoded value incorrect", xdr.xdrDecodeBoolean() );
}
@Test
public void testEncodeDecodeBooleanTrue() throws BadXdrOncRpcException {
boolean value = true;
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeBoolean(value);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
boolean decoded = decoder.xdrDecodeBoolean();
assertEquals("Decoded boolean value incorrect", value, decoded );
}
@Test
public void testEncodeDecodeBooleanFalse() throws BadXdrOncRpcException {
boolean value = false;
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeBoolean(value);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
boolean decoded = decoder.xdrDecodeBoolean();
assertEquals("Decoded boolean value incorrect", value, decoded );
}
@Test
public void testDecodeBooleanFale() throws BadXdrOncRpcException {
_buffer.putInt(0);
Xdr xdr = new Xdr(_buffer);
xdr.beginDecoding();
assertFalse("Decoded value incorrect", xdr.xdrDecodeBoolean() );
}
@Test
public void testEncodeDecodeString() throws BadXdrOncRpcException {
String original = "some random data";
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeString(original);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
String decoded = decoder.xdrDecodeString();
assertEquals("encoded/decoded string do not match", original, decoded);
}
@Test
public void testEncodeDecodeEmptyString() throws BadXdrOncRpcException {
String original = "";
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeString(original);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
String decoded = decoder.xdrDecodeString();
assertEquals("encoded/decoded string do not match", original, decoded);
}
@Test
public void testEncodeDecodeNullString() throws BadXdrOncRpcException {
String original = null;
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeString(original);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
String decoded = decoder.xdrDecodeString();
assertEquals("encoded/decoded string do not match", "", decoded);
}
@Test
public void testEncodeDecodeLong() throws BadXdrOncRpcException {
long value = 7L << 32;
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeLong(value);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
long decoded = decoder.xdrDecodeLong();
assertEquals("encoded/decoded long do not match", value, decoded);
}
@Test
public void testEncodeDecodeMaxLong() throws BadXdrOncRpcException {
long value = Long.MAX_VALUE;
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeLong(value);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
long decoded = decoder.xdrDecodeLong();
assertEquals("encoded/decoded long do not match", value, decoded);
}
@Test
public void testEncodeDecodeMinLong() throws BadXdrOncRpcException {
long value = Long.MIN_VALUE;
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeLong(value);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
long decoded = decoder.xdrDecodeLong();
assertEquals("encoded/decoded long do not match", value, decoded);
}
@Test
public void testEncodeDecodeIntVector() throws BadXdrOncRpcException {
int vector[] = { 1, 2, 3, 4 };
XdrEncodingStream encoder = new Xdr(_buffer);
encoder.beginEncoding();
encoder.xdrEncodeIntVector(vector);
encoder.endEncoding();
XdrDecodingStream decoder = new Xdr(_buffer);
decoder.beginDecoding();
int[] decoded = decoder.xdrDecodeIntVector();
assertArrayEquals("encoded/decoded int array do not match", vector, decoded);
}
@Test
public void testSizeConstructor() {
Xdr xdr = new Xdr(1024);
assertEquals("encode/decode buffer size mismatch", 1024, xdr.asBuffer().capacity());
}
@Test
public void testAutoGrow() {
Xdr xdr = new Xdr(10);
xdr.beginEncoding();
xdr.xdrEncodeLong(1);
xdr.xdrEncodeLong(1);
}
@Test
public void testAutoGrowWthCompositeBuffer() {
CompositeBuffer buffer = BuffersBuffer.create();
buffer.append( allocateBuffer(10));
Xdr xdr = new Xdr(buffer);
xdr.beginEncoding();
xdr.xdrEncodeLong(1);
xdr.xdrEncodeLong(1);
}
@Test(expected = BadXdrOncRpcException.class)
public void testBadXdrWithInt() throws BadXdrOncRpcException {
CompositeBuffer buffer = BuffersBuffer.create();
buffer.append(allocateBuffer(10));
Xdr xdr = new Xdr(buffer);
xdr.beginEncoding();
xdr.xdrEncodeInt(1);
xdr.endEncoding();
xdr.beginDecoding();
xdr.xdrDecodeLong();
}
@Test(expected = BadXdrOncRpcException.class)
public void testBadXdrWithOpaque() throws BadXdrOncRpcException {
CompositeBuffer buffer = BuffersBuffer.create();
buffer.append(allocateBuffer(10));
byte[] b = new byte[10];
Xdr xdr = new Xdr(buffer);
xdr.beginEncoding();
xdr.xdrEncodeOpaque(b, b.length);
xdr.endEncoding();
xdr.beginDecoding();
xdr.xdrDecodeOpaque(b.length +5);
}
@Test(expected = BadXdrOncRpcException.class)
public void testBadXdrOnCorrption() throws BadXdrOncRpcException {
CompositeBuffer buffer = BuffersBuffer.create();
buffer.append(allocateBuffer(10));
int[] b = new int[10];
Xdr xdr = new Xdr(buffer);
xdr.beginEncoding();
xdr.xdrEncodeIntVector(b);
xdr.asBuffer().limit( xdr.asBuffer().position() -4);
xdr.endEncoding();
xdr.beginDecoding();
xdr.xdrDecodeIntVector();
}
@Test(expected = BadXdrOncRpcException.class)
public void testBadXdrOnNegativeArraySize() throws BadXdrOncRpcException {
CompositeBuffer buffer = BuffersBuffer.create();
buffer.append(allocateBuffer(10));
int[] b = new int[10];
Xdr xdr = new Xdr(buffer);
xdr.beginEncoding();
xdr.xdrEncodeInt(-2); // len
xdr.xdrEncodeInt(1); // first int
xdr.xdrEncodeInt(2); // second int
xdr.endEncoding();
xdr.beginDecoding();
xdr.xdrDecodeIntVector();
}
@Test
public void testAvailalbleData() throws BadXdrOncRpcException {
CompositeBuffer buffer = BuffersBuffer.create();
buffer.append(allocateBuffer(10));
Xdr xdr = new Xdr(buffer);
xdr.beginEncoding();
xdr.xdrEncodeInt(1); // first int
xdr.xdrEncodeInt(2); // second int
xdr.endEncoding();
xdr.beginDecoding();
assertTrue("available data not detected", xdr.hasMoreData());
xdr.xdrDecodeInt();
xdr.xdrDecodeInt();
assertFalse("empty stream not detected", xdr.hasMoreData());
}
private static Buffer allocateBuffer(int size) {
return GrizzlyMemoryManager.allocate(size);
}
}