/* * Copyright 2015-2017 the original author or authors. * * 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 org.springframework.data.redis.connection.lettuce; import static org.hamcrest.core.Is.*; import static org.hamcrest.core.IsEqual.*; import static org.hamcrest.core.IsInstanceOf.*; import static org.junit.Assert.*; import static org.springframework.data.redis.connection.ClusterTestVariables.*; import static org.springframework.data.redis.connection.lettuce.LettuceTestClientResources.*; import static org.springframework.test.util.ReflectionTestUtils.*; import io.lettuce.core.AbstractRedisClient; import io.lettuce.core.RedisClient; import io.lettuce.core.RedisURI; import io.lettuce.core.cluster.RedisClusterClient; import java.util.Collections; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisSentinelConfiguration; /** * @author Christoph Strobl * @author Mark Paluch * @author Balázs Németh */ public class LettuceConnectionFactoryUnitTests { RedisClusterConfiguration clusterConfig; @Before public void setUp() { clusterConfig = new RedisClusterConfiguration().clusterNode("127.0.0.1", 6379).clusterNode("127.0.0.1", 6380); } @After public void tearDown() throws Exception { ConnectionFactoryTracker.cleanUp(); } @Test // DATAREDIS-315 public void shouldInitClientCorrectlyWhenClusterConfigPresent() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfig); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); assertThat(getField(connectionFactory, "client"), instanceOf(RedisClusterClient.class)); } @Test // DATAREDIS-315 @SuppressWarnings("unchecked") public void timeoutShouldBeSetCorrectlyOnClusterClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfig); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setTimeout(1000); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClusterClient.class)); Iterable<RedisURI> initialUris = (Iterable<RedisURI>) getField(client, "initialUris"); for (RedisURI uri : initialUris) { assertThat(uri.getTimeout(), is(equalTo(connectionFactory.getTimeout()))); assertThat(uri.getUnit(), is(equalTo(TimeUnit.MILLISECONDS))); } } @Test // DATAREDIS-315 @SuppressWarnings("unchecked") public void passwordShouldBeSetCorrectlyOnClusterClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfig); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setPassword("o_O"); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClusterClient.class)); Iterable<RedisURI> initialUris = (Iterable<RedisURI>) getField(client, "initialUris"); for (RedisURI uri : initialUris) { assertThat(uri.getPassword(), is(equalTo(connectionFactory.getPassword().toCharArray()))); } } @Test // DATAREDIS-524 public void passwordShouldBeSetCorrectlyOnSentinelClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory( new RedisSentinelConfiguration("mymaster", Collections.singleton("host:1234"))); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setPassword("o_O"); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClient.class)); RedisURI redisUri = (RedisURI) getField(client, "redisURI"); assertThat(redisUri.getPassword(), is(equalTo(connectionFactory.getPassword().toCharArray()))); } @Test // DATAREDIS-462 public void clusterClientShouldInitializeWithoutClientResources() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfig); connectionFactory.setShutdownTimeout(0); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClusterClient.class)); } @Test // DATAREDIS-480 public void sslOptionsShouldBeDisabledByDefaultOnClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClient.class)); RedisURI redisUri = (RedisURI) getField(client, "redisURI"); assertThat(redisUri.isSsl(), is(false)); assertThat(connectionFactory.isUseSsl(), is(false)); assertThat(redisUri.isStartTls(), is(false)); assertThat(connectionFactory.isStartTls(), is(false)); assertThat(redisUri.isVerifyPeer(), is(true)); assertThat(connectionFactory.isVerifyPeer(), is(true)); } @Test // DATAREDIS-476 public void sslShouldBeSetCorrectlyOnClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setUseSsl(true); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClient.class)); RedisURI redisUri = (RedisURI) getField(client, "redisURI"); assertThat(redisUri.isSsl(), is(true)); assertThat(connectionFactory.isUseSsl(), is(true)); assertThat(redisUri.isVerifyPeer(), is(true)); assertThat(connectionFactory.isVerifyPeer(), is(true)); } @Test // DATAREDIS-480 public void verifyPeerOptionShouldBeSetCorrectlyOnClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setVerifyPeer(false); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClient.class)); RedisURI redisUri = (RedisURI) getField(client, "redisURI"); assertThat(redisUri.isVerifyPeer(), is(false)); assertThat(connectionFactory.isVerifyPeer(), is(false)); } @Test // DATAREDIS-480 public void startTLSOptionShouldBeSetCorrectlyOnClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setStartTls(true); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClient.class)); RedisURI redisUri = (RedisURI) getField(client, "redisURI"); assertThat(redisUri.isStartTls(), is(true)); assertThat(connectionFactory.isStartTls(), is(true)); } @Test // DATAREDIS-537 public void sslShouldBeSetCorrectlyOnClusterClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory( new RedisClusterConfiguration().clusterNode(CLUSTER_NODE_1)); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setUseSsl(true); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClusterClient.class)); Iterable<RedisURI> initialUris = (Iterable<RedisURI>) getField(client, "initialUris"); for (RedisURI uri : initialUris) { assertThat(uri.isSsl(), is(true)); } } @Test // DATAREDIS-537 public void startTLSOptionShouldBeSetCorrectlyOnClusterClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory( new RedisClusterConfiguration().clusterNode(CLUSTER_NODE_1)); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setStartTls(true); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClusterClient.class)); Iterable<RedisURI> initialUris = (Iterable<RedisURI>) getField(client, "initialUris"); for (RedisURI uri : initialUris) { assertThat(uri.isStartTls(), is(true)); } } @Test // DATAREDIS-537 public void verifyPeerTLSOptionShouldBeSetCorrectlyOnClusterClient() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory( new RedisClusterConfiguration().clusterNode(CLUSTER_NODE_1)); connectionFactory.setClientResources(getSharedClientResources()); connectionFactory.setVerifyPeer(true); connectionFactory.afterPropertiesSet(); ConnectionFactoryTracker.add(connectionFactory); AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client"); assertThat(client, instanceOf(RedisClusterClient.class)); Iterable<RedisURI> initialUris = (Iterable<RedisURI>) getField(client, "initialUris"); for (RedisURI uri : initialUris) { assertThat(uri.isVerifyPeer(), is(true)); } } }