package org.infinispan.marshaller.test;
import static org.testng.Assert.assertEquals;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.infinispan.commons.io.ByteBuffer;
import org.infinispan.commons.marshall.Marshaller;
import org.infinispan.test.AbstractInfinispanTest;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @author Ryan Emerson
* @since 9.0
*/
@Test(groups = "functional")
public abstract class AbstractMarshallingTest extends AbstractInfinispanTest {
private final List<TestObject> testObjects = IntStream.range(1, 2).boxed().map(this::getTestObject).collect(Collectors.toList());
private final Marshaller marshaller;
private ByteArrayOutputStream outputStream;
protected AbstractMarshallingTest(Marshaller marshaller) {
this.marshaller = marshaller;
}
@BeforeMethod(alwaysRun = true)
protected void init() {
outputStream = new ByteArrayOutputStream(1024);
}
@AfterMethod(alwaysRun = true)
protected void reset() throws Exception {
resetCustomerSerializerCounters();
outputStream.close();
}
abstract protected void checkCustomSerializerCounters(int readCount, int writeCount);
abstract protected void resetCustomerSerializerCounters();
protected TestObject getTestObject(int id) {
TestObject testObject = new TestObject(id);
Map<Integer, String> map = new HashMap<>();
map.put(id, "Test" + id);
testObject.setMap(map);
testObject.setList(IntStream.range(0, id).boxed().collect(Collectors.toList()));
testObject.setUser(new User("User" + id));
return testObject;
}
@Test
protected void testObjectMarshallingTest() throws Exception {
List<ByteBuffer> serializedObjects = new ArrayList<>(testObjects.size());
for (TestObject object : testObjects) {
serializedObjects.add(marshaller.objectToBuffer(object));
}
assert serializedObjects.size() == testObjects.size();
for (int i = 0; i < testObjects.size(); i++) {
byte[] bytes = serializedObjects.get(i).getBuf();
Object testObj = testObjects.get(i);
Object unmarshalledObj = marshaller.objectFromByteBuffer(bytes);
assert testObj.equals(unmarshalledObj);
}
}
@Test
protected void testRegisterSerializersAreUtilised() throws Exception {
TestObject obj = testObjects.get(0);
byte[] bytes = marshaller.objectToByteBuffer(obj);
assert marshaller.objectFromByteBuffer(bytes).equals(obj);
checkCustomSerializerCounters(1, 1);
}
@Test
protected void testImmutableCollections() throws Exception {
int listSize = 10;
TestObject obj = testObjects.get(0);
obj.setList(Collections.unmodifiableList(IntStream.range(0, 10).boxed().collect(Collectors.toList())));
byte[] bytes = marshaller.objectToByteBuffer(obj);
TestObject unmarshalledObj = (TestObject) marshaller.objectFromByteBuffer(bytes);
assert unmarshalledObj.getList().size() == listSize;
for (int i = 0; i < listSize; i++)
assert unmarshalledObj.getList().get(i) == i;
}
@Test
protected void testSerializingByteArrays() throws Exception {
byte[] bytes = new byte[10];
IntStream.range(0, 10).forEach(i -> bytes[i] = (byte) i);
byte[] marshalledBytes = marshaller.objectToBuffer(bytes).getBuf();
byte[] unmarsalledBytes = (byte[]) marshaller.objectFromByteBuffer(marshalledBytes);
IntStream.range(0, 10).forEach(i -> assertEquals(unmarsalledBytes[i], i));
}
}