|
1 | 1 | /*
|
2 |
| - * Copyright 2012-2019 the original author or authors. |
| 2 | + * Copyright 2012-2020 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
17 | 17 | package org.springframework.boot.autoconfigure.data.redis;
|
18 | 18 |
|
19 | 19 | import java.util.Arrays;
|
| 20 | +import java.util.EnumSet; |
20 | 21 | import java.util.List;
|
21 | 22 | import java.util.Set;
|
| 23 | +import java.util.function.Consumer; |
22 | 24 | import java.util.stream.Collectors;
|
23 | 25 |
|
| 26 | +import io.lettuce.core.ClientOptions; |
| 27 | +import io.lettuce.core.cluster.ClusterClientOptions; |
| 28 | +import io.lettuce.core.cluster.ClusterTopologyRefreshOptions.RefreshTrigger; |
24 | 29 | import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
25 | 30 | import org.junit.jupiter.api.Test;
|
26 | 31 |
|
27 | 32 | import org.springframework.boot.autoconfigure.AutoConfigurations;
|
| 33 | +import org.springframework.boot.test.context.assertj.AssertableApplicationContext; |
28 | 34 | import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
| 35 | +import org.springframework.boot.test.context.runner.ContextConsumer; |
29 | 36 | import org.springframework.context.annotation.Bean;
|
30 | 37 | import org.springframework.context.annotation.Configuration;
|
31 | 38 | import org.springframework.data.redis.connection.RedisClusterConfiguration;
|
32 | 39 | import org.springframework.data.redis.connection.RedisNode;
|
| 40 | +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; |
33 | 41 | import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder;
|
34 | 42 | import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
35 | 43 | import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
|
|
54 | 62 | */
|
55 | 63 | class RedisAutoConfigurationTests {
|
56 | 64 |
|
57 |
| - private ApplicationContextRunner contextRunner = new ApplicationContextRunner() |
| 65 | + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() |
58 | 66 | .withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class));
|
59 | 67 |
|
60 | 68 | @Test
|
@@ -230,6 +238,61 @@ void testRedisConfigurationWithClusterAndPassword() {
|
230 | 238 | );
|
231 | 239 | }
|
232 | 240 |
|
| 241 | + @Test |
| 242 | + void testRedisConfigurationCreateClientOptionsByDefault() { |
| 243 | + this.contextRunner.run(assertClientOptions(ClientOptions.class, (options) -> { |
| 244 | + assertThat(options.getTimeoutOptions().isApplyConnectionTimeout()).isTrue(); |
| 245 | + assertThat(options.getTimeoutOptions().isTimeoutCommands()).isTrue(); |
| 246 | + })); |
| 247 | + } |
| 248 | + |
| 249 | + @Test |
| 250 | + void testRedisConfigurationWithClusterCreateClusterClientOptions() { |
| 251 | + this.contextRunner.withPropertyValues("spring.redis.cluster.nodes=127.0.0.1:27379,127.0.0.1:27380") |
| 252 | + .run(assertClientOptions(ClusterClientOptions.class, (options) -> { |
| 253 | + assertThat(options.getTimeoutOptions().isApplyConnectionTimeout()).isTrue(); |
| 254 | + assertThat(options.getTimeoutOptions().isTimeoutCommands()).isTrue(); |
| 255 | + })); |
| 256 | + } |
| 257 | + |
| 258 | + @Test |
| 259 | + void testRedisConfigurationWithClusterRefreshPeriod() { |
| 260 | + this.contextRunner |
| 261 | + .withPropertyValues("spring.redis.cluster.nodes=127.0.0.1:27379,127.0.0.1:27380", |
| 262 | + "spring.redis.lettuce.cluster.refresh.period=30s") |
| 263 | + .run(assertClientOptions(ClusterClientOptions.class, |
| 264 | + (options) -> assertThat(options.getTopologyRefreshOptions().getRefreshPeriod()) |
| 265 | + .hasSeconds(30))); |
| 266 | + } |
| 267 | + |
| 268 | + @Test |
| 269 | + void testRedisConfigurationWithClusterAdaptiveRefresh() { |
| 270 | + this.contextRunner |
| 271 | + .withPropertyValues("spring.redis.cluster.nodes=127.0.0.1:27379,127.0.0.1:27380", |
| 272 | + "spring.redis.lettuce.cluster.refresh.adaptive=true") |
| 273 | + .run(assertClientOptions(ClusterClientOptions.class, |
| 274 | + (options) -> assertThat(options.getTopologyRefreshOptions().getAdaptiveRefreshTriggers()) |
| 275 | + .isEqualTo(EnumSet.allOf(RefreshTrigger.class)))); |
| 276 | + } |
| 277 | + |
| 278 | + @Test |
| 279 | + void testRedisConfigurationWithClusterRefreshPeriodHasNoEffectWithNonClusteredConfiguration() { |
| 280 | + this.contextRunner.withPropertyValues("spring.redis.cluster.refresh.period=30s").run(assertClientOptions( |
| 281 | + ClientOptions.class, (options) -> assertThat(options.getClass()).isEqualTo(ClientOptions.class))); |
| 282 | + } |
| 283 | + |
| 284 | + private <T extends ClientOptions> ContextConsumer<AssertableApplicationContext> assertClientOptions( |
| 285 | + Class<T> expectedType, Consumer<T> options) { |
| 286 | + return (context) -> { |
| 287 | + LettuceClientConfiguration clientConfiguration = context.getBean(LettuceConnectionFactory.class) |
| 288 | + .getClientConfiguration(); |
| 289 | + assertThat(clientConfiguration.getClientOptions()).isPresent(); |
| 290 | + ClientOptions clientOptions = clientConfiguration.getClientOptions().get(); |
| 291 | + assertThat(clientOptions.getClass()).isEqualTo(expectedType); |
| 292 | + options.accept(expectedType.cast(clientOptions)); |
| 293 | + }; |
| 294 | + } |
| 295 | + |
233 | 296 | private LettucePoolingClientConfiguration getPoolingClientConfiguration(LettuceConnectionFactory factory) {
|
234 | 297 | return (LettucePoolingClientConfiguration) ReflectionTestUtils.getField(factory, "clientConfiguration");
|
235 | 298 | }
|
|
0 commit comments