/*
* Copyright (c) 2015-2016, Christoph Engelbert (aka noctarius) and
* contributors. All rights reserved.
*
* 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 com.noctarius.tengi.spi.serialization.codec.impl;
import com.noctarius.tengi.core.serialization.codec.Decoder;
import com.noctarius.tengi.core.serialization.codec.Encoder;
import com.noctarius.tengi.spi.buffer.MemoryBuffer;
import com.noctarius.tengi.spi.serialization.Serializer;
import com.noctarius.tengi.spi.serialization.codec.AutoClosableDecoder;
import com.noctarius.tengi.spi.serialization.codec.AutoClosableEncoder;
import com.noctarius.tengi.spi.serialization.codec.impl.utf8.UTF8Codec;
import com.noctarius.tengi.spi.serialization.impl.DefaultProtocolConstants;
import com.noctarius.tengi.testing.AbstractTestCase;
import org.junit.Test;
import org.mockito.Mockito;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyShort;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doAnswer;
public class DefaultCodecTestCase
extends AbstractTestCase {
@Test
public void test_read_bytes()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
byte[] data = {(byte) 1, (byte) 2, (byte) 3, (byte) 4};
memoryBuffer.writeBytes(data);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
byte[] result = new byte[4];
decoder.readBytes("data", result);
assertArrayEquals(data, result);
}
}
@Test
public void test_read_bytes_offset_length()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
byte[] data = {(byte) 1, (byte) 2, (byte) 3, (byte) 4};
memoryBuffer.writeBytes(data);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
byte[] result = new byte[2];
decoder.readBytes("data", result, 0, 2);
assertEquals(data[0], result[0]);
assertEquals(data[1], result[1]);
}
}
@Test
public void test_read_boolean()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
byte[] data = {(byte) 1, (byte) 0, (byte) 1};
memoryBuffer.writeBytes(data);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(true, decoder.readBoolean("value"));
assertEquals(false, decoder.readBoolean("value"));
assertEquals(true, decoder.readBoolean("value"));
}
}
@Test
public void test_read_bit_set()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
memoryBuffer.writeByte(0x76);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
boolean[] values = decoder.readBitSet("values");
assertEquals(false, values[0]);
assertEquals(true, values[1]);
assertEquals(true, values[2]);
}
}
@Test
public void test_read_byte()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
byte[] data = {(byte) 0x76};
memoryBuffer.writeBytes(data);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(0x76, decoder.readByte("value"));
}
}
@Test
public void test_read_unsigned_byte()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
memoryBuffer.writeByte(200);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(200, decoder.readUnsignedByte("value"));
}
}
@Test
public void test_read_short()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
ByteOrderUtils.putShort(Short.MAX_VALUE, memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(Short.MAX_VALUE, decoder.readShort("value"));
}
}
@Test
public void test_read_char()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
ByteOrderUtils.putShort((short) 'g', memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals('g', decoder.readChar("value"));
}
}
@Test
public void test_read_int32()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
ByteOrderUtils.putInt(Integer.MAX_VALUE, memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(Integer.MAX_VALUE, decoder.readInt32("value"));
}
}
@Test
public void test_read_compressed_int32()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
Int32Compressor.writeInt32(Integer.MAX_VALUE, memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(Integer.MAX_VALUE, decoder.readCompressedInt32("value"));
}
}
@Test
public void test_read_int64()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
ByteOrderUtils.putLong(Long.MAX_VALUE, memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(Long.MAX_VALUE, decoder.readInt64("value"));
}
}
@Test
public void test_read_compressed_int64()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
Int64Compressor.writeInt64(Long.MAX_VALUE, memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(Long.MAX_VALUE, decoder.readCompressedInt64("value"));
}
}
@Test
public void test_read_float()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
ByteOrderUtils.putInt(Float.floatToRawIntBits(Float.MAX_VALUE), memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(Float.MAX_VALUE, decoder.readFloat("value"), 0.01);
}
}
@Test
public void test_read_double()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
ByteOrderUtils.putLong(Double.doubleToRawLongBits(Double.MAX_VALUE), memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals(Double.MAX_VALUE, decoder.readDouble("value"), 0.01);
}
}
@Test
public void test_read_string()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
Encoder encoder = Mockito.mock(Encoder.class);
doAnswer((invocation) -> {
Object[] arguments = invocation.getArguments();
byte[] data = (byte[]) arguments[1];
int offset = (Integer) arguments[2];
int length = (Integer) arguments[3];
memoryBuffer.writeBytes(data, offset, length);
return null;
}).when(encoder).writeBytes(anyString(), any(byte[].class), anyInt(), anyInt());
doAnswer((invocation) -> {
Object[] arguments = invocation.getArguments();
int value = (Integer) arguments[1];
ByteOrderUtils.putInt(value, memoryBuffer);
return null;
}).when(encoder).writeInt32(anyString(), anyInt());
doAnswer((invocation) -> {
Object[] arguments = invocation.getArguments();
short value = (Short) arguments[1];
ByteOrderUtils.putShort(value, memoryBuffer);
return null;
}).when(encoder).writeShort(anyString(), anyShort());
UTF8Codec.writeUTF(encoder, "my-simple-string", new byte[1024]);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals("my-simple-string", decoder.readString("value"));
}
}
@Test
public void test_read_object()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
ByteOrderUtils.putShort(DefaultProtocolConstants.SERIALIZED_TYPE_INTEGER, memoryBuffer);
ByteOrderUtils.putInt(Integer.MAX_VALUE, memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertEquals((Object) Integer.MAX_VALUE, decoder.readObject("value"));
}
}
@Test
public void test_read_nullable_object()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
// Null element
memoryBuffer.writeByte(0);
// Non null element
memoryBuffer.writeByte(1);
ByteOrderUtils.putShort(DefaultProtocolConstants.SERIALIZED_TYPE_INTEGER, memoryBuffer);
ByteOrderUtils.putInt(Integer.MAX_VALUE, memoryBuffer);
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertNull(decoder.readNullableObject("value"));
assertEquals((Object) Integer.MAX_VALUE, decoder.readNullableObject("value"));
}
}
@Test
public void test_get_readable_memory_buffer()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableDecoder decoder = serializer.retrieveDecoder(memoryBuffer)) {
assertSame(memoryBuffer, decoder.getReadableMemoryBuffer());
}
}
@Test
public void test_write_bytes()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
byte[] data = {(byte) 1, (byte) 2, (byte) 3, (byte) 4};
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeBytes("data", data);
}
byte[] result = new byte[4];
memoryBuffer.readBytes(result);
assertArrayEquals(data, result);
}
@Test
public void test_write_bytes_offset_length()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
byte[] data = {(byte) 1, (byte) 2, (byte) 3, (byte) 4};
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeBytes("data", data, 2, 2);
}
byte[] result = new byte[2];
memoryBuffer.readBytes(result);
assertEquals(data[2], result[0]);
assertEquals(data[3], result[1]);
}
@Test
public void test_write_boolean()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeBoolean("value", true);
encoder.writeBoolean("value", false);
encoder.writeBoolean("value", true);
}
assertEquals(1, memoryBuffer.readByte());
assertEquals(0, memoryBuffer.readByte());
assertEquals(1, memoryBuffer.readByte());
}
@Test
public void test_write_bit_set()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
boolean[] values = {false, true, true};
encoder.writeBitSet("values", values);
}
byte result = memoryBuffer.readByte();
assertEquals(0x76, result);
}
@Test
public void test_write_byte()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeByte("value", 0x76);
}
byte result = memoryBuffer.readByte();
assertEquals(0x76, result);
}
@Test
public void test_write_unsigned_byte()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeUnsignedByte("value", (short) 255);
}
byte result = memoryBuffer.readByte();
assertEquals(255, result & 0xFF);
}
@Test
public void test_write_short()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeShort("value", Short.MAX_VALUE);
}
short result = ByteOrderUtils.getShort(memoryBuffer);
assertEquals(Short.MAX_VALUE, result);
}
@Test
public void test_write_char()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeChar("value", 'g');
}
short result = ByteOrderUtils.getShort(memoryBuffer);
assertEquals('g', (char) result);
}
@Test
public void test_write_int32()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeInt32("value", Integer.MAX_VALUE);
}
int result = ByteOrderUtils.getInt(memoryBuffer);
assertEquals(Integer.MAX_VALUE, result);
}
@Test
public void test_write_compressed_int32()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeCompressedInt32("value", Integer.MAX_VALUE);
}
int result = Int32Compressor.readInt32(memoryBuffer);
assertEquals(Integer.MAX_VALUE, result);
}
@Test
public void test_write_int64()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeInt64("value", Long.MAX_VALUE);
}
long result = ByteOrderUtils.getLong(memoryBuffer);
assertEquals(Long.MAX_VALUE, result);
}
@Test
public void test_write_compressed_int64()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeCompressedInt64("value", Long.MAX_VALUE);
}
long result = Int64Compressor.readInt64(memoryBuffer);
assertEquals(Long.MAX_VALUE, result);
}
@Test
public void test_write_float()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeFloat("value", Float.MAX_VALUE);
}
float result = Float.intBitsToFloat(ByteOrderUtils.getInt(memoryBuffer));
assertEquals(Float.MAX_VALUE, result, 0.01);
}
@Test
public void test_write_double()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeDouble("value", Double.MAX_VALUE);
}
double result = Double.longBitsToDouble(ByteOrderUtils.getLong(memoryBuffer));
assertEquals(Double.MAX_VALUE, result, 0.01);
}
@Test
public void test_write_string()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeString("value", "some-simple-string");
}
Decoder decoder = Mockito.mock(Decoder.class);
doAnswer((invocation) -> {
Object[] arguments = invocation.getArguments();
byte[] data = (byte[]) arguments[1];
int offset = (Integer) arguments[2];
int length = (Integer) arguments[3];
memoryBuffer.readBytes(data, offset, length);
return null;
}).when(decoder).readBytes(anyString(), any(byte[].class), anyInt(), anyInt());
doAnswer((invocation) -> ByteOrderUtils.getInt(memoryBuffer)).when(decoder).readInt32(anyString());
doAnswer((invocation) -> ByteOrderUtils.getShort(memoryBuffer)).when(decoder).readShort(anyString());
String result = UTF8Codec.readUTF(decoder, new byte[1024]);
assertEquals("some-simple-string", result);
}
@Test
public void test_write_object()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeObject("value", Integer.MAX_VALUE);
}
assertEquals(DefaultProtocolConstants.SERIALIZED_TYPE_INTEGER, ByteOrderUtils.getShort(memoryBuffer));
assertEquals(Integer.MAX_VALUE, ByteOrderUtils.getInt(memoryBuffer));
}
@Test
public void test_write_nullable_object()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
encoder.writeNullableObject("value", null);
encoder.writeNullableObject("value", Integer.MAX_VALUE);
}
// Null element
assertEquals(0, memoryBuffer.readByte());
// Non null element
assertEquals(1, memoryBuffer.readByte());
assertEquals(DefaultProtocolConstants.SERIALIZED_TYPE_INTEGER, ByteOrderUtils.getShort(memoryBuffer));
assertEquals(Integer.MAX_VALUE, ByteOrderUtils.getInt(memoryBuffer));
}
@Test
public void test_get_writable_memory_buffer()
throws Exception {
Serializer serializer = createSerializer();
MemoryBuffer memoryBuffer = createMemoryBuffer();
try (AutoClosableEncoder encoder = serializer.retrieveEncoder(memoryBuffer)) {
assertSame(memoryBuffer, encoder.getWritableMemoryBuffer());
}
}
}