java-tutorials/libraries/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java

108 lines
4.4 KiB
Java
Raw Normal View History

package com.baeldung.netty;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.nio.charset.Charset;
import org.junit.Assert;
import org.junit.Test;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.http.DefaultFullHttpRequest;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;
public class EmbeddedChannelUnitTest {
@Test
public void givenTwoChannelHandlers_testPipeline() {
final FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/calculate?a=10&b=5");
httpRequest.headers().add("Operator", "Add");
EmbeddedChannel channel = new EmbeddedChannel(
new HttpMessageHandler(), new CalculatorOperationHandler());
channel.pipeline()
.addFirst(new HttpMessageHandler())
.addLast(new CalculatorOperationHandler());
// send HTTP request to server and check that the message is on the inbound pipeline
assertTrue(channel.writeInbound(httpRequest));
long inboundChannelResponse = channel.readInbound();
assertEquals(15, inboundChannelResponse);
// we should have an outbound message in the form of a HTTP response
assertEquals(1, channel.outboundMessages().size());
// Object response = channel.readOutbound();
FullHttpResponse httpResponse = channel.readOutbound();
String httpResponseContent = httpResponse.content().toString(Charset.defaultCharset());
assertTrue("15".equalsIgnoreCase(httpResponseContent));
}
@Test
public void givenTwoChannelHandlers_testExceptionHandlingInHttpMessageHandler() {
EmbeddedChannel channel = new EmbeddedChannel(
new HttpMessageHandler(), new CalculatorOperationHandler());
final FullHttpRequest wrongHttpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/calculate?a=10&b=5");
wrongHttpRequest.headers().add("Operator", "Add");
try {
// send invalid HTTP request to server and expect and error
channel.pipeline().fireChannelRead(wrongHttpRequest);
channel.checkException();
// channel.writeInbound(wrongHttpRequest);
Assert.fail();
} catch (Exception ex) {
// the HttpMessageHandler does not handle the exception and throws it down the pipeline
assertTrue(ex instanceof UnsupportedOperationException);
assertTrue(ex.getMessage().equalsIgnoreCase("HTTP method not supported"));
FullHttpResponse errorHttpResponse = channel.readOutbound();
String errorHttpResponseContent = errorHttpResponse.content().toString(Charset.defaultCharset());
assertTrue("Operation not defined".equalsIgnoreCase(errorHttpResponseContent));
assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, errorHttpResponse.status());
}
}
@Test
public void givenTwoChannelHandlers_testExceptionHandlingInCalculatorOperationHandler() {
EmbeddedChannel channel = new EmbeddedChannel(
new HttpMessageHandler(), new CalculatorOperationHandler());
final FullHttpRequest wrongHttpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/calculate?a=10&b=5");
wrongHttpRequest.headers().add("Operator", "Invalid_operation");
try {
// send invalid HTTP request to server and expect and error
channel.writeInbound(wrongHttpRequest);
Assert.fail();
} catch (Exception ex) {
// the HttpMessageHandler does not handle the exception and throws it down the pipeline
assertTrue(ex instanceof IllegalArgumentException);
assertTrue(ex.getMessage().equalsIgnoreCase("Operation not defined"));
// the outbound message is a HTTP response with the status code 500
FullHttpResponse errorHttpResponse = channel.readOutbound();
String errorHttpResponseContent = errorHttpResponse.content().toString(Charset.defaultCharset());
assertTrue("Operation not defined".equalsIgnoreCase(errorHttpResponseContent));
assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, errorHttpResponse.status());
}
}
}