/*
* 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.stream.processor;
import io.datakernel.eventloop.Eventloop;
import io.datakernel.serializer.BufferSerializer;
import io.datakernel.serializer.SerializerBuilder;
import io.datakernel.serializer.annotations.Deserialize;
import io.datakernel.serializer.annotations.Serialize;
import io.datakernel.stream.StreamConsumers;
import io.datakernel.stream.StreamProducer;
import io.datakernel.stream.StreamProducers;
import org.junit.Before;
import org.junit.Test;
import java.util.Collections;
import java.util.List;
import static io.datakernel.bytebuf.ByteBufPool.*;
import static io.datakernel.eventloop.FatalErrorHandlers.rethrowOnAnyError;
import static java.lang.ClassLoader.getSystemClassLoader;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
public class StreamBinaryDeserializerTest {
private Eventloop eventloop;
private StreamBinaryDeserializer<Data> deserializer;
private StreamBinarySerializer<Data> serializer;
@Before
public void before() {
eventloop = Eventloop.create().withFatalErrorHandler(rethrowOnAnyError());
deserializer = StreamBinaryDeserializer.create(eventloop, createSerializer());
serializer = StreamBinarySerializer.create(eventloop, createSerializer()).withDefaultBufferSize(1);
}
private BufferSerializer<Data> createSerializer() {
return SerializerBuilder.create(getSystemClassLoader()).build(Data.class);
}
@Test
public void deserializesSingleMessage() {
Data data = new Data("a");
StreamProducer<Data> producer = StreamProducers.ofValue(eventloop, data);
StreamConsumers.ToList<Data> consumer = StreamConsumers.toList(eventloop);
producer.streamTo(serializer.getInput());
serializer.getOutput().streamTo(deserializer.getInput());
deserializer.getOutput().streamTo(consumer);
eventloop.run();
assertEquals(Collections.singletonList(data), consumer.getList());
assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems());
}
@Test
public void deserializesMultipleMessages() {
List<Data> inputData = asList(new Data("a"), new Data("b"), new Data("c"));
StreamProducer<Data> producer = StreamProducers.ofIterable(eventloop, inputData);
StreamConsumers.ToList<Data> consumer = StreamConsumers.toList(eventloop);
producer.streamTo(serializer.getInput());
serializer.getOutput().streamTo(deserializer.getInput());
deserializer.getOutput().streamTo(consumer);
eventloop.run();
assertEquals(inputData, consumer.getList());
assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems());
}
@Test
public void deserializesMultipleMessages_SplittedIntoDifferentBytebufs() {
List<Data> inputData = asList(new Data("a"), new Data("b"), new Data("c"));
StreamProducer<Data> producer = StreamProducers.ofIterable(eventloop, inputData);
StreamConsumers.ToList<Data> consumer = StreamConsumers.toList(eventloop);
StreamByteChunker bufSplitter = StreamByteChunker.create(eventloop, 4, 4);
producer.streamTo(serializer.getInput());
serializer.getOutput().streamTo(bufSplitter.getInput());
bufSplitter.getOutput().streamTo(deserializer.getInput());
deserializer.getOutput().streamTo(consumer);
eventloop.run();
assertEquals(inputData, consumer.getList());
assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems());
}
@Test
public void deserializesMultipleMessages_SplittedIntoSingleByte_ByteBufs_withMaxHeaderSizeInMessage() {
List<Data> inputData =
asList(new Data("1"), new Data("8282"), new Data("80982"), new Data("3634921"), new Data("7162"));
StreamProducer<Data> producer = StreamProducers.ofIterable(eventloop, inputData);
StreamConsumers.ToList<Data> consumer = StreamConsumers.toList(eventloop);
StreamByteChunker bufSplitter = StreamByteChunker.create(eventloop, 1, 1);
producer.streamTo(serializer.getInput());
serializer.getOutput().streamTo(bufSplitter.getInput());
bufSplitter.getOutput().streamTo(deserializer.getInput());
deserializer.getOutput().streamTo(consumer);
eventloop.run();
assertEquals(inputData, consumer.getList());
assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems());
}
public static class Data {
private final String info;
public Data(@Deserialize("info") String info) {
this.info = info;
}
@Serialize(order = 1)
public String getInfo() {
return info;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Data data = (Data) o;
return !(info != null ? !info.equals(data.info) : data.info != null);
}
@Override
public int hashCode() {
return info != null ? info.hashCode() : 0;
}
@Override
public String toString() {
return "Data{" +
"info='" + info + '\'' +
'}';
}
}
}