package io.datakernel.stream.net;
import com.google.common.base.Objects;
import com.google.gson.Gson;
import io.datakernel.bytebuf.ByteBuf;
import io.datakernel.bytebuf.ByteBufStrings;
import io.datakernel.exception.ParseException;
import org.junit.Test;
import static io.datakernel.bytebuf.ByteBufPool.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
public class MessagingSerializersTest {
private class Req {
String text;
int num;
double val;
Req(String text, int num, double val) {
this.text = text;
this.num = num;
this.val = val;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Req req = (Req) o;
return num == req.num &&
Double.compare(req.val, val) == 0 &&
Objects.equal(text, req.text);
}
@Override
public int hashCode() {
return Objects.hashCode(text, num, val);
}
@Override
public String toString() {
return "Req{" +
"text='" + text + '\'' +
", num=" + num +
", val=" + val +
'}';
}
}
private class Res {
boolean bool;
Res(boolean bool) {
this.bool = bool;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Res res = (Res) o;
return bool == res.bool;
}
@Override
public int hashCode() {
return Objects.hashCode(bool);
}
@Override
public String toString() {
return "Res{" +
"bool=" + bool +
'}';
}
}
private MessagingSerializer<Req, Res> serializer = MessagingSerializers.ofGson(new Gson(), Req.class, new Gson(), Res.class);
private MessagingSerializer<Res, Req> deserializer = MessagingSerializers.ofGson(new Gson(), Res.class, new Gson(), Req.class);
@Test
public void simpleTestOfGson() throws ParseException {
Req req = new Req("Hello", 1, 6.24);
ByteBuf buf = deserializer.serialize(req);
assertEquals("{\"text\":\"Hello\",\"num\":1,\"val\":6.24}\0", ByteBufStrings.decodeUtf8(buf));
Req newReq = serializer.tryDeserialize(buf);
assertEquals(req, newReq);
buf.recycle();
Res res = new Res(true);
buf = serializer.serialize(res);
assertEquals("{\"bool\":true}\0", ByteBufStrings.decodeUtf8(buf));
Res newRes = deserializer.tryDeserialize(buf);
assertEquals(res, newRes);
buf.recycle();
assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems());
}
@Test
public void testSerializeSeveralMessages() throws ParseException {
ByteBuf readBuf = ByteBufStrings.wrapUtf8("{\"text\":\"Greetings\",\"num\":1,\"val\":3.12}\0" +
"{\"text\":\"Hi\",\"num\":2,\"val\":6.24}\0" +
"{\"text\":\"Good morning\",\"num\":3,\"val\":9.36}\0" +
"{\"text\":\"Shalom\",\"n");
Req req1 = serializer.tryDeserialize(readBuf);
Req req2 = serializer.tryDeserialize(readBuf);
Req req3 = serializer.tryDeserialize(readBuf);
Req req4 = serializer.tryDeserialize(readBuf);
assertEquals(req1, new Req("Greetings", 1, 3.12));
assertEquals(req2, new Req("Hi", 2, 6.24));
assertEquals(req3, new Req("Good morning", 3, 9.36));
assertNull(req4);
assertEquals(116, readBuf.readPosition());
assertEquals(135, readBuf.writePosition());
readBuf.recycle();
assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems());
}
@Test
public void testDeserializeBadMessage() throws ParseException {
ByteBuf badInput = ByteBufStrings.wrapUtf8("{\"text\":\"Greetings\",\"num\":1,\"val\":3.12}\0" +
"{\"text\":\"Hi\",\"num\":s2,\"val\":6.2sad4}\0" +
"{\"text\":\"Good morning\",\"num\":3,\"val\":9.36edc}\0" +
"{\"text\":\"Shalom\",\"n");
Req req1 = serializer.tryDeserialize(badInput);
assertEquals(req1, new Req("Greetings", 1, 3.12));
try {
serializer.tryDeserialize(badInput);
} catch (ParseException e) {
assert e == MessagingSerializers.DESERIALIZE_ERR;
}
badInput.recycle();
assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems());
}
}