package com.linkedin.r2.transport.http.client; import com.linkedin.common.callback.Callback; import com.linkedin.common.util.None; import com.linkedin.r2.message.rest.RestResponse; import com.linkedin.r2.message.rest.RestResponseBuilder; import com.linkedin.r2.util.Cancellable; import io.netty.channel.Channel; import io.netty.channel.embedded.EmbeddedChannel; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.util.Collection; /** * @author Ang Xu * @version $Revision: $ */ public class TestChannelPoolHandler { @Test(dataProvider = "connectionClose") public void testConnectionClose(String headerName, String headerValue) { EmbeddedChannel ch = new EmbeddedChannel(new ChannelPoolHandler()); FakePool pool = new FakePool(); ch.attr(ChannelPoolHandler.CHANNEL_POOL_ATTR_KEY).set(pool); RestResponse response = new RestResponseBuilder().setHeader(headerName, headerValue).build(); ch.writeInbound(response); Assert.assertTrue(pool.isDisposeCalled()); Assert.assertFalse(pool.isPutCalled()); } @Test(dataProvider = "connectionKeepAlive") public void testConnectionKeepAlive(String headerName, String headerValue) { EmbeddedChannel ch = new EmbeddedChannel(new ChannelPoolHandler()); FakePool pool = new FakePool(); ch.attr(ChannelPoolHandler.CHANNEL_POOL_ATTR_KEY).set(pool); RestResponse response = new RestResponseBuilder().setHeader(headerName, headerValue).build(); ch.writeInbound(response); Assert.assertFalse(pool.isDisposeCalled()); Assert.assertTrue(pool.isPutCalled()); } @DataProvider(name = "connectionClose") public Object[][] createTestData1() { return new Object[][] { {"Connection", "close"}, {"connection", "foo, close, bar"}, {"CONNECTION", "Keep-Alive, Close"} }; } @DataProvider(name = "connectionKeepAlive") public Object[][] createTestData2() { return new Object[][] { {"Connection", "Keep-Alive"}, {"connection", "keep-alive"}, {"CONNECTION", "foo, bar"}, {"foo", "baz"} }; } private static class FakePool implements AsyncPool<Channel> { private boolean _isPutCalled = false; private boolean _isDisposeCalled = false; public boolean isPutCalled() { return _isPutCalled; } public boolean isDisposeCalled() { return _isDisposeCalled; } @Override public String getName() { return null; } @Override public void start() { } @Override public void shutdown(Callback<None> callback) { } @Override public Collection<Callback<Channel>> cancelWaiters() { return null; } @Override public PoolStats getStats() { return null; } @Override public void dispose(Channel obj) { _isDisposeCalled = true; } @Override public void put(Channel obj) { _isPutCalled = true; } @Override public Cancellable get(Callback<Channel> callback) { return null; } } }