package com.lambdaworks.redis; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; import java.net.SocketException; import java.util.concurrent.TimeUnit; import org.junit.Test; import io.netty.channel.ConnectTimeoutException; /** * @author Mark Paluch */ public class SocketOptionsTest extends AbstractRedisClientTest { @Test public void testNew() throws Exception { checkAssertions(SocketOptions.create()); } @Test public void testBuilder() throws Exception { SocketOptions sut = SocketOptions.builder().connectTimeout(1, TimeUnit.MINUTES).keepAlive(true).tcpNoDelay(true) .build(); assertThat(sut.isKeepAlive()).isEqualTo(true); assertThat(sut.isTcpNoDelay()).isEqualTo(true); assertThat(sut.getConnectTimeout()).isEqualTo(1); assertThat(sut.getConnectTimeoutUnit()).isEqualTo(TimeUnit.MINUTES); } @Test public void testCopy() throws Exception { checkAssertions(SocketOptions.copyOf(SocketOptions.builder().build())); } protected void checkAssertions(SocketOptions sut) { assertThat(sut.isKeepAlive()).isEqualTo(false); assertThat(sut.isTcpNoDelay()).isEqualTo(false); assertThat(sut.getConnectTimeout()).isEqualTo(10); assertThat(sut.getConnectTimeoutUnit()).isEqualTo(TimeUnit.SECONDS); } @Test(timeout = 1000) public void testConnectTimeout() { SocketOptions socketOptions = SocketOptions.builder().connectTimeout(100, TimeUnit.MILLISECONDS).build(); client.setOptions(ClientOptions.builder().socketOptions(socketOptions).build()); try { client.connect(RedisURI.create("2:4:5:5::1", 60000)); fail("Missing RedisConnectionException"); } catch (RedisConnectionException e) { if (e.getCause() instanceof ConnectTimeoutException) { assertThat(e).hasRootCauseInstanceOf(ConnectTimeoutException.class); assertThat(e.getCause()).hasMessageContaining("connection timed out"); return; } if (e.getCause() instanceof SocketException) { // Network is unreachable or No route to host are OK as well. return; } } } }