package com.tacitknowledge.slowlight.proxyserver.handler;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Matchers;
import java.util.concurrent.TimeUnit;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/**
* @author Alexandr Donciu (adonciu@tacitknowledge.com)
*/
public class RandomDataChannelHandlerTest extends BaseChannelHandlerTest
{
@Test
public void handlerShouldRespondWithRandomData() throws Exception
{
final int dataFragments = 100;
final int dataFragmentSize = 3;
doReturn(Integer.toString(dataFragments)).when(handlerConfig).getParam(RandomDataChannelHandler.PARAM_DATA_FRAGMENTS);
doReturn(Integer.toString(dataFragmentSize)).when(handlerConfig).getParam(RandomDataChannelHandler.PARAM_DATA_FRAGMENT_SIZE);
final RandomDataChannelHandler randomDataChannelHandler = new RandomDataChannelHandler(handlerConfig);
randomDataChannelHandler.channelRead(channelHandlerContext, msg);
verify(eventExecutor).schedule((Runnable) Matchers.anyObject(), eq(0L), eq(TimeUnit.MILLISECONDS));
}
@Test
public void handlerShouldRequestChannelReadOnChannelActivation() throws Exception
{
final RandomDataChannelHandler randomDataChannelHandler = new RandomDataChannelHandler(handlerConfig);
randomDataChannelHandler.channelActive(channelHandlerContext);
verify(channelHandlerContext).read();
}
@Test
public void taskShouldGenerateRandomDataWithSpecifiedDataFragmentSize()
{
final RandomDataChannelHandler randomDataChannelHandler = new RandomDataChannelHandler(handlerConfig);
final RandomDataChannelHandler.GenerateRandomDataTask generateRandomDataTask = randomDataChannelHandler
.new GenerateRandomDataTask(channelHandlerContext, 3, 10);
final ChannelFuture writeFuture = mock(ChannelFuture.class);
doReturn(writeFuture).when(channel).writeAndFlush(any());
generateRandomDataTask.run();
final ArgumentCaptor<ByteBuf> msgCaptor = ArgumentCaptor.forClass(ByteBuf.class);
verify(channel).writeAndFlush(msgCaptor.capture());
verify(writeFuture).addListener(Matchers.<GenericFutureListener<Future<? super Void>>>any());
final ByteBuf msg = msgCaptor.getValue();
assertThat(msg.readableBytes(), is(equalTo(10)));
}
@Test
public void listenerShouldScheduleNextRandomDataFragmentGenerateTask() throws Exception
{
final RandomDataChannelHandler randomDataChannelHandler = new RandomDataChannelHandler(handlerConfig);
final RandomDataChannelHandler.GenerateRandomDataTask generateRandomDataTask = randomDataChannelHandler
.new GenerateRandomDataTask(channelHandlerContext, 3, 10);
final RandomDataChannelHandler.GenerateRandomDataTask.GenerateDataListener generateDataListener = generateRandomDataTask
.new GenerateDataListener();
doReturn(true).when(channelFuture).isSuccess();
doReturn(eventExecutor).when(channelHandlerContext).executor();
generateDataListener.operationComplete(channelFuture);
verify(eventExecutor).schedule(generateRandomDataTask, 0, TimeUnit.MILLISECONDS);
}
@Test
public void listenerShouldRequestNextChannelReadIfNoMoreDataFragmentsToBeGenerated() throws Exception
{
final RandomDataChannelHandler randomDataChannelHandler = new RandomDataChannelHandler(handlerConfig);
final RandomDataChannelHandler.GenerateRandomDataTask generateRandomDataTask = randomDataChannelHandler
.new GenerateRandomDataTask(channelHandlerContext, 0, 10);
final RandomDataChannelHandler.GenerateRandomDataTask.GenerateDataListener generateDataListener = generateRandomDataTask
.new GenerateDataListener();
final ChannelFuture writeFuture = mock(ChannelFuture.class);
doReturn(true).when(writeFuture).isSuccess();
generateDataListener.operationComplete(writeFuture);
verify(channel).read();
}
@Test
public void listenerShouldCloseChannelIfItCompletedUnsuccessfully() throws Exception
{
final RandomDataChannelHandler randomDataChannelHandler = new RandomDataChannelHandler(handlerConfig);
final RandomDataChannelHandler.GenerateRandomDataTask generateRandomDataTask = randomDataChannelHandler
.new GenerateRandomDataTask(channelHandlerContext, 0, 10);
final RandomDataChannelHandler.GenerateRandomDataTask.GenerateDataListener generateDataListener = generateRandomDataTask
.new GenerateDataListener();
doReturn(false).when(channelFuture).isSuccess();
final Channel futureChannel = mock(Channel.class);
doReturn(futureChannel).when(channelFuture).channel();
generateDataListener.operationComplete(channelFuture);
verify(futureChannel).close();
}
}