/*
* Copyright (C) 2015 SoftIndex LLC.
*
* 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 io.datakernel.rpc.protocol;
import io.datakernel.bytebuf.ByteBuf;
import io.datakernel.bytebuf.ByteBufPool;
import io.datakernel.serializer.BufferSerializer;
import io.datakernel.serializer.SerializerBuilder;
import io.datakernel.serializer.annotations.Deserialize;
import io.datakernel.serializer.annotations.Serialize;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.net.UnknownHostException;
import static io.datakernel.bytebuf.ByteBufPool.getPoolItemsString;
import static java.lang.ClassLoader.getSystemClassLoader;
import static org.junit.Assert.assertEquals;
public class RpcMessageSerializeTest {
public static class TestRpcMessageData {
private final String s;
public TestRpcMessageData(@Deserialize("s") String s) {
this.s = s;
}
@Serialize(order = 0)
public String getS() {
return s;
}
}
public static class TestRpcMessageData2 {
private final int i;
public TestRpcMessageData2(@Deserialize("i") int i) {
this.i = i;
}
@Serialize(order = 0)
public int getI() {
return i;
}
}
private static <T> T doTest(Class<T> type, T testData1) {
BufferSerializer<T> serializer = SerializerBuilder.create(getSystemClassLoader())
.withSubclasses(RpcMessage.MESSAGE_TYPES, TestRpcMessageData.class, TestRpcMessageData2.class)
.build(type);
return doTest(testData1, serializer, serializer);
}
private static <T> T doTest(T testData1, BufferSerializer<T> serializer, BufferSerializer<T> deserializer) {
byte[] array = new byte[1000];
ByteBuf buf = ByteBuf.wrapForWriting(array);
serializer.serialize(buf, testData1);
return deserializer.deserialize(buf);
}
@Before
public void before() {
ByteBufPool.clear();
ByteBufPool.setSizes(0, Integer.MAX_VALUE);
}
@Test
public void testRpcMessage() throws UnknownHostException {
TestRpcMessageData messageData1 = new TestRpcMessageData("TestMessageData");
RpcMessage message1 = RpcMessage.of(1, messageData1);
RpcMessage message2 = doTest(RpcMessage.class, message1);
Assert.assertEquals(message1.getCookie(), message2.getCookie());
Assert.assertTrue(message2.getData() instanceof TestRpcMessageData);
TestRpcMessageData messageData2 = (TestRpcMessageData) message2.getData();
Assert.assertEquals(messageData1.getS(), messageData2.getS());
assertEquals(getPoolItemsString(), ByteBufPool.getCreatedItems(), ByteBufPool.getPoolItems());
}
}