Skip to content

Commit 2b453bb

Browse files
committedDec 12, 2018
Minimise dependencies on Log4j2
Closes spring-projectsgh-15441
1 parent e165112 commit 2b453bb

File tree

15 files changed

+188
-282
lines changed

15 files changed

+188
-282
lines changed
 

‎spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml

+1-6
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,6 @@
234234
<artifactId>kafka-clients</artifactId>
235235
<optional>true</optional>
236236
</dependency>
237-
<dependency>
238-
<groupId>org.apache.logging.log4j</groupId>
239-
<artifactId>log4j-core</artifactId>
240-
<optional>true</optional>
241-
</dependency>
242237
<dependency>
243238
<groupId>org.apache.tomcat.embed</groupId>
244239
<artifactId>tomcat-embed-core</artifactId>
@@ -488,7 +483,7 @@
488483
</dependency>
489484
<dependency>
490485
<groupId>org.apache.logging.log4j</groupId>
491-
<artifactId>log4j-slf4j-impl</artifactId>
486+
<artifactId>log4j-to-slf4j</artifactId>
492487
<scope>test</scope>
493488
</dependency>
494489
<dependency>

‎spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsAutoConfiguration.java

+15-12
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics;
1818

19-
import java.util.Collections;
20-
2119
import io.micrometer.core.instrument.MeterRegistry;
2220
import io.micrometer.core.instrument.binder.logging.Log4j2Metrics;
2321
import org.apache.logging.log4j.LogManager;
24-
import org.apache.logging.log4j.core.LoggerContext;
22+
import org.apache.logging.log4j.spi.LoggerContext;
2523

2624
import org.springframework.boot.actuate.autoconfigure.metrics.Log4J2MetricsAutoConfiguration.Log4JCoreLoggerContextCondition;
2725
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -44,31 +42,36 @@
4442
*/
4543
@Configuration
4644
@AutoConfigureAfter(MetricsAutoConfiguration.class)
47-
@ConditionalOnClass({ Log4j2Metrics.class, LoggerContext.class, LogManager.class })
45+
@ConditionalOnClass(value = { Log4j2Metrics.class,
46+
LogManager.class }, name = "org.apache.logging.log4j.core.LoggerContext")
4847
@ConditionalOnBean(MeterRegistry.class)
4948
@Conditional(Log4JCoreLoggerContextCondition.class)
5049
public class Log4J2MetricsAutoConfiguration {
5150

5251
@Bean
5352
@ConditionalOnMissingBean
5453
public Log4j2Metrics log4j2Metrics() {
55-
return new Log4j2Metrics(Collections.emptyList(),
56-
(LoggerContext) LogManager.getContext(false));
54+
return new Log4j2Metrics();
5755
}
5856

5957
static class Log4JCoreLoggerContextCondition extends SpringBootCondition {
6058

6159
@Override
6260
public ConditionOutcome getMatchOutcome(ConditionContext context,
6361
AnnotatedTypeMetadata metadata) {
64-
org.apache.logging.log4j.spi.LoggerContext loggerContext = LogManager
65-
.getContext(false);
66-
if (loggerContext instanceof LoggerContext) {
67-
return ConditionOutcome.match(
68-
"LoggerContext was an instance of org.apache.logging.log4j.spi.LoggerContext");
62+
LoggerContext loggerContext = LogManager.getContext(false);
63+
try {
64+
if (Class.forName("org.apache.logging.log4j.core.LoggerContext")
65+
.isInstance(loggerContext)) {
66+
return ConditionOutcome.match(
67+
"LoggerContext was an instance of org.apache.logging.log4j.core.LoggerContext");
68+
}
69+
}
70+
catch (Throwable ex) {
71+
// Continue with no match
6972
}
7073
return ConditionOutcome.noMatch(
71-
"Logger context was not an instance of org.apache.logging.log4j.spi.LoggerContext");
74+
"Logger context was not an instance of org.apache.logging.log4j.core.LoggerContext");
7275
}
7376

7477
}
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@
1717
package org.springframework.boot.actuate.autoconfigure.metrics;
1818

1919
import io.micrometer.core.instrument.binder.logging.Log4j2Metrics;
20-
import org.junit.jupiter.api.Test;
20+
import org.apache.logging.log4j.LogManager;
21+
import org.junit.Test;
22+
import org.junit.runner.RunWith;
2123

2224
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
2325
import org.springframework.boot.autoconfigure.AutoConfigurations;
2426
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
27+
import org.springframework.boot.testsupport.runner.classpath.ClassPathOverrides;
28+
import org.springframework.boot.testsupport.runner.classpath.ModifiedClassPathRunner;
2529
import org.springframework.context.annotation.Bean;
2630
import org.springframework.context.annotation.Configuration;
2731

@@ -32,20 +36,26 @@
3236
*
3337
* @author Andy Wilkinson
3438
*/
35-
public class Log4J2MetricsAutoConfigurationTests {
39+
@RunWith(ModifiedClassPathRunner.class)
40+
@ClassPathOverrides("org.apache.logging.log4j:log4j-core:2.11.1")
41+
public class Log4J2MetricsWithLog4jLoggerContextAutoConfigurationTests {
3642

3743
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
3844
.with(MetricsRun.simple()).withConfiguration(
3945
AutoConfigurations.of(Log4J2MetricsAutoConfiguration.class));
4046

4147
@Test
4248
public void autoConfiguresLog4J2Metrics() {
49+
assertThat(LogManager.getContext().getClass().getName())
50+
.isEqualTo("org.apache.logging.log4j.core.LoggerContext");
4351
this.contextRunner
4452
.run((context) -> assertThat(context).hasSingleBean(Log4j2Metrics.class));
4553
}
4654

4755
@Test
4856
public void allowsCustomLog4J2MetricsToBeUsed() {
57+
assertThat(LogManager.getContext().getClass().getName())
58+
.isEqualTo("org.apache.logging.log4j.core.LoggerContext");
4959
this.contextRunner.withUserConfiguration(CustomLog4J2MetricsConfiguration.class)
5060
.run((context) -> assertThat(context).hasSingleBean(Log4j2Metrics.class)
5161
.hasBean("customLog4J2Metrics"));

‎spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsWithSlf4jLoggerContextAutoConfigurationTests.java

+4-9
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@
1717
package org.springframework.boot.actuate.autoconfigure.metrics;
1818

1919
import io.micrometer.core.instrument.binder.logging.Log4j2Metrics;
20-
import org.junit.Test;
21-
import org.junit.runner.RunWith;
20+
import org.apache.logging.log4j.LogManager;
21+
import org.apache.logging.slf4j.SLF4JLoggerContext;
22+
import org.junit.jupiter.api.Test;
2223

2324
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
2425
import org.springframework.boot.autoconfigure.AutoConfigurations;
2526
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
26-
import org.springframework.boot.testsupport.runner.classpath.ClassPathExclusions;
27-
import org.springframework.boot.testsupport.runner.classpath.ClassPathOverrides;
28-
import org.springframework.boot.testsupport.runner.classpath.ModifiedClassPathRunner;
2927

3028
import static org.assertj.core.api.Assertions.assertThat;
3129

@@ -34,10 +32,6 @@
3432
*
3533
* @author Andy Wilkinson
3634
*/
37-
@RunWith(ModifiedClassPathRunner.class)
38-
@ClassPathOverrides({ "org.apache.logging.log4j:log4j-to-slf4j:2.11.1",
39-
"org.apache.logging.log4j:log4j-core:2.11.1" })
40-
@ClassPathExclusions("log4j-slf4j-impl-*.jar")
4135
public class Log4J2MetricsWithSlf4jLoggerContextAutoConfigurationTests {
4236

4337
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
@@ -46,6 +40,7 @@ public class Log4J2MetricsWithSlf4jLoggerContextAutoConfigurationTests {
4640

4741
@Test
4842
public void backsOffWhenLoggerContextIsBackedBySlf4j() {
43+
assertThat(LogManager.getContext()).isInstanceOf(SLF4JLoggerContext.class);
4944
this.contextRunner.run(
5045
(context) -> assertThat(context).doesNotHaveBean(Log4j2Metrics.class));
5146
}

‎spring-boot-project/spring-boot-actuator-autoconfigure/src/test/resources/log4j2-test.xml

-17
This file was deleted.

‎spring-boot-project/spring-boot-actuator/pom.xml

+5-10
Original file line numberDiff line numberDiff line change
@@ -294,23 +294,18 @@
294294
<scope>test</scope>
295295
</dependency>
296296
<dependency>
297-
<groupId>javax.xml.bind</groupId>
298-
<artifactId>jaxb-api</artifactId>
297+
<groupId>ch.qos.logback</groupId>
298+
<artifactId>logback-classic</artifactId>
299299
<scope>test</scope>
300300
</dependency>
301301
<dependency>
302-
<groupId>org.apache.logging.log4j</groupId>
303-
<artifactId>log4j-slf4j-impl</artifactId>
304-
<scope>test</scope>
305-
</dependency>
306-
<dependency>
307-
<groupId>org.apache.logging.log4j</groupId>
308-
<artifactId>log4j-api</artifactId>
302+
<groupId>javax.xml.bind</groupId>
303+
<artifactId>jaxb-api</artifactId>
309304
<scope>test</scope>
310305
</dependency>
311306
<dependency>
312307
<groupId>org.apache.logging.log4j</groupId>
313-
<artifactId>log4j-core</artifactId>
308+
<artifactId>log4j-to-slf4j</artifactId>
314309
<scope>test</scope>
315310
</dependency>
316311
<dependency>

‎spring-boot-project/spring-boot-autoconfigure/pom.xml

+1-6
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@
767767
</dependency>
768768
<dependency>
769769
<groupId>org.apache.logging.log4j</groupId>
770-
<artifactId>log4j-core</artifactId>
770+
<artifactId>log4j-to-slf4j</artifactId>
771771
<scope>test</scope>
772772
</dependency>
773773
<dependency>
@@ -790,11 +790,6 @@
790790
<artifactId>neo4j-ogm-embedded-driver</artifactId>
791791
<scope>test</scope>
792792
</dependency>
793-
<dependency>
794-
<groupId>org.slf4j</groupId>
795-
<artifactId>log4j-over-slf4j</artifactId>
796-
<scope>test</scope>
797-
</dependency>
798793
<dependency>
799794
<groupId>org.springframework</groupId>
800795
<artifactId>spring-test</artifactId>

‎spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchAutoConfigurationTests.java

+17-15
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
1716
package org.springframework.boot.autoconfigure.data.elasticsearch;
1817

1918
import java.util.List;
@@ -22,10 +21,12 @@
2221
import org.elasticsearch.client.transport.TransportClient;
2322
import org.elasticsearch.cluster.node.DiscoveryNode;
2423
import org.junit.After;
25-
import org.junit.jupiter.api.Test;
24+
import org.junit.ClassRule;
25+
import org.junit.Test;
2626

2727
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
2828
import org.springframework.boot.test.util.TestPropertyValues;
29+
import org.springframework.boot.testsupport.testcontainers.ElasticsearchContainer;
2930
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3031
import org.springframework.context.annotation.Bean;
3132
import org.springframework.context.annotation.Configuration;
@@ -41,6 +42,9 @@
4142
*/
4243
public class ElasticsearchAutoConfigurationTests {
4344

45+
@ClassRule
46+
public static ElasticsearchContainer elasticsearch = new ElasticsearchContainer();
47+
4448
private AnnotationConfigApplicationContext context;
4549

4650
@After
@@ -65,19 +69,17 @@ public void useExistingClient() {
6569
@Test
6670
public void createTransportClient() {
6771
this.context = new AnnotationConfigApplicationContext();
68-
new ElasticsearchNodeTemplate().doWithNode((node) -> {
69-
TestPropertyValues.of(
70-
"spring.data.elasticsearch.cluster-nodes:localhost:"
71-
+ node.getTcpPort(),
72-
"spring.data.elasticsearch.properties.path.home:target/es/client")
73-
.applyTo(this.context);
74-
this.context.register(PropertyPlaceholderAutoConfiguration.class,
75-
ElasticsearchAutoConfiguration.class);
76-
this.context.refresh();
77-
List<DiscoveryNode> connectedNodes = this.context
78-
.getBean(TransportClient.class).connectedNodes();
79-
assertThat(connectedNodes).hasSize(1);
80-
});
72+
TestPropertyValues
73+
.of("spring.data.elasticsearch.cluster-nodes:localhost:"
74+
+ elasticsearch.getMappedTransportPort(),
75+
"spring.data.elasticsearch.cluster-name:docker-cluster")
76+
.applyTo(this.context);
77+
this.context.register(PropertyPlaceholderAutoConfiguration.class,
78+
ElasticsearchAutoConfiguration.class);
79+
this.context.refresh();
80+
List<DiscoveryNode> connectedNodes = this.context.getBean(TransportClient.class)
81+
.connectedNodes();
82+
assertThat(connectedNodes).hasSize(1);
8183
}
8284

8385
@Configuration

‎spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfigurationTests.java

+36-40
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
package org.springframework.boot.autoconfigure.data.elasticsearch;
1818

1919
import org.junit.After;
20-
import org.junit.jupiter.api.Test;
20+
import org.junit.ClassRule;
21+
import org.junit.Test;
2122

2223
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
2324
import org.springframework.boot.test.util.TestPropertyValues;
25+
import org.springframework.boot.testsupport.testcontainers.ElasticsearchContainer;
2426
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
2527
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
2628
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
@@ -36,6 +38,9 @@
3638
*/
3739
public class ElasticsearchDataAutoConfigurationTests {
3840

41+
@ClassRule
42+
public static ElasticsearchContainer elasticsearch = new ElasticsearchContainer();
43+
3944
private AnnotationConfigApplicationContext context;
4045

4146
@After
@@ -55,55 +60,46 @@ public void templateBackOffWithNoClient() {
5560
@Test
5661
public void templateExists() {
5762
this.context = new AnnotationConfigApplicationContext();
58-
new ElasticsearchNodeTemplate().doWithNode((node) -> {
59-
TestPropertyValues
60-
.of("spring.data.elasticsearch.properties.path.data:target/data",
61-
"spring.data.elasticsearch.properties.path.logs:target/logs",
62-
"spring.data.elasticsearch.cluster-nodes:localhost:"
63-
+ node.getTcpPort())
64-
.applyTo(this.context);
65-
this.context.register(PropertyPlaceholderAutoConfiguration.class,
66-
ElasticsearchAutoConfiguration.class,
67-
ElasticsearchDataAutoConfiguration.class);
68-
this.context.refresh();
69-
assertHasSingleBean(ElasticsearchTemplate.class);
70-
});
63+
TestPropertyValues
64+
.of("spring.data.elasticsearch.cluster-nodes:localhost:"
65+
+ elasticsearch.getMappedTransportPort(),
66+
"spring.data.elasticsearch.cluster-name:docker-cluster")
67+
.applyTo(this.context);
68+
this.context.register(PropertyPlaceholderAutoConfiguration.class,
69+
ElasticsearchAutoConfiguration.class,
70+
ElasticsearchDataAutoConfiguration.class);
71+
this.context.refresh();
72+
assertHasSingleBean(ElasticsearchTemplate.class);
7173
}
7274

7375
@Test
7476
public void mappingContextExists() {
7577
this.context = new AnnotationConfigApplicationContext();
76-
new ElasticsearchNodeTemplate().doWithNode((node) -> {
77-
TestPropertyValues
78-
.of("spring.data.elasticsearch.properties.path.data:target/data",
79-
"spring.data.elasticsearch.properties.path.logs:target/logs",
80-
"spring.data.elasticsearch.cluster-nodes:localhost:"
81-
+ node.getTcpPort())
82-
.applyTo(this.context);
83-
this.context.register(PropertyPlaceholderAutoConfiguration.class,
84-
ElasticsearchAutoConfiguration.class,
85-
ElasticsearchDataAutoConfiguration.class);
86-
this.context.refresh();
87-
assertHasSingleBean(SimpleElasticsearchMappingContext.class);
88-
});
78+
TestPropertyValues
79+
.of("spring.data.elasticsearch.cluster-nodes:localhost:"
80+
+ elasticsearch.getMappedTransportPort(),
81+
"spring.data.elasticsearch.cluster-name:docker-cluster")
82+
.applyTo(this.context);
83+
this.context.register(PropertyPlaceholderAutoConfiguration.class,
84+
ElasticsearchAutoConfiguration.class,
85+
ElasticsearchDataAutoConfiguration.class);
86+
this.context.refresh();
87+
assertHasSingleBean(SimpleElasticsearchMappingContext.class);
8988
}
9089

9190
@Test
9291
public void converterExists() {
9392
this.context = new AnnotationConfigApplicationContext();
94-
new ElasticsearchNodeTemplate().doWithNode((node) -> {
95-
TestPropertyValues
96-
.of("spring.data.elasticsearch.properties.path.data:target/data",
97-
"spring.data.elasticsearch.properties.path.logs:target/logs",
98-
"spring.data.elasticsearch.cluster-nodes:localhost:"
99-
+ node.getTcpPort())
100-
.applyTo(this.context);
101-
this.context.register(PropertyPlaceholderAutoConfiguration.class,
102-
ElasticsearchAutoConfiguration.class,
103-
ElasticsearchDataAutoConfiguration.class);
104-
this.context.refresh();
105-
assertHasSingleBean(ElasticsearchConverter.class);
106-
});
93+
TestPropertyValues
94+
.of("spring.data.elasticsearch.cluster-nodes:localhost:"
95+
+ elasticsearch.getMappedTransportPort(),
96+
"spring.data.elasticsearch.cluster-name:docker-cluster")
97+
.applyTo(this.context);
98+
this.context.register(PropertyPlaceholderAutoConfiguration.class,
99+
ElasticsearchAutoConfiguration.class,
100+
ElasticsearchDataAutoConfiguration.class);
101+
this.context.refresh();
102+
assertHasSingleBean(ElasticsearchConverter.class);
107103
}
108104

109105
private void assertHasSingleBean(Class<?> type) {

‎spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchNodeTemplate.java

-112
This file was deleted.

‎spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java

+19-27
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,17 @@
1818

1919
import org.elasticsearch.client.Client;
2020
import org.junit.After;
21+
import org.junit.ClassRule;
2122
import org.junit.Test;
22-
import org.junit.runner.RunWith;
2323

2424
import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage;
2525
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
2626
import org.springframework.boot.autoconfigure.data.alt.elasticsearch.CityElasticsearchDbRepository;
27-
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchNodeTemplate.ElasticsearchNode;
2827
import org.springframework.boot.autoconfigure.data.elasticsearch.city.City;
2928
import org.springframework.boot.autoconfigure.data.elasticsearch.city.CityRepository;
3029
import org.springframework.boot.autoconfigure.data.empty.EmptyDataPackage;
3130
import org.springframework.boot.test.util.TestPropertyValues;
32-
import org.springframework.boot.testsupport.runner.classpath.ClassPathOverrides;
33-
import org.springframework.boot.testsupport.runner.classpath.ModifiedClassPathRunner;
31+
import org.springframework.boot.testsupport.testcontainers.ElasticsearchContainer;
3432
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3533
import org.springframework.context.annotation.Configuration;
3634
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
@@ -43,10 +41,11 @@
4341
* @author Phillip Webb
4442
* @author Andy Wilkinson
4543
*/
46-
@RunWith(ModifiedClassPathRunner.class)
47-
@ClassPathOverrides("org.apache.logging.log4j:log4j-core:2.10.0")
4844
public class ElasticsearchRepositoriesAutoConfigurationTests {
4945

46+
@ClassRule
47+
public static ElasticsearchContainer elasticsearch = new ElasticsearchContainer();
48+
5049
private AnnotationConfigApplicationContext context;
5150

5251
@After
@@ -56,46 +55,39 @@ public void close() {
5655

5756
@Test
5857
public void testDefaultRepositoryConfiguration() {
59-
new ElasticsearchNodeTemplate().doWithNode((node) -> {
60-
load(TestConfiguration.class, node);
61-
assertThat(this.context.getBean(CityRepository.class)).isNotNull();
62-
assertThat(this.context.getBean(Client.class)).isNotNull();
63-
});
58+
load(TestConfiguration.class);
59+
assertThat(this.context.getBean(CityRepository.class)).isNotNull();
60+
assertThat(this.context.getBean(Client.class)).isNotNull();
6461

6562
}
6663

6764
@Test
6865
public void testNoRepositoryConfiguration() {
69-
new ElasticsearchNodeTemplate().doWithNode((node) -> {
70-
load(EmptyConfiguration.class, node);
71-
assertThat(this.context.getBean(Client.class)).isNotNull();
72-
});
66+
load(EmptyConfiguration.class);
67+
assertThat(this.context.getBean(Client.class)).isNotNull();
7368
}
7469

7570
@Test
7671
public void doesNotTriggerDefaultRepositoryDetectionIfCustomized() {
77-
new ElasticsearchNodeTemplate().doWithNode((node) -> {
78-
load(CustomizedConfiguration.class, node);
79-
assertThat(this.context.getBean(CityElasticsearchDbRepository.class))
80-
.isNotNull();
81-
});
72+
load(CustomizedConfiguration.class);
73+
assertThat(this.context.getBean(CityElasticsearchDbRepository.class)).isNotNull();
8274
}
8375

84-
private void load(Class<?> config, ElasticsearchNode node) {
76+
private void load(Class<?> config) {
8577
this.context = new AnnotationConfigApplicationContext();
86-
addElasticsearchProperties(this.context, node);
78+
addElasticsearchProperties(this.context);
8779
this.context.register(config, ElasticsearchAutoConfiguration.class,
8880
ElasticsearchRepositoriesAutoConfiguration.class,
8981
ElasticsearchDataAutoConfiguration.class,
9082
PropertyPlaceholderAutoConfiguration.class);
9183
this.context.refresh();
9284
}
9385

94-
private void addElasticsearchProperties(AnnotationConfigApplicationContext context,
95-
ElasticsearchNode node) {
96-
TestPropertyValues.of("spring.data.elasticsearch.properties.path.home:target",
97-
"spring.data.elasticsearch.cluster-nodes:localhost:" + node.getTcpPort())
98-
.applyTo(context);
86+
private void addElasticsearchProperties(AnnotationConfigApplicationContext context) {
87+
TestPropertyValues.of(
88+
"spring.data.elasticsearch.cluster-nodes:localhost:"
89+
+ elasticsearch.getMappedTransportPort(),
90+
"spring.data.elasticsearch.cluster-name:docker-cluster").applyTo(context);
9991
}
10092

10193
@Configuration

‎spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/jest/JestAutoConfigurationTests.java

+8-21
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,14 @@
2727
import io.searchbox.client.http.JestHttpClient;
2828
import io.searchbox.core.Get;
2929
import io.searchbox.core.Index;
30-
import org.junit.After;
31-
import org.junit.Before;
30+
import org.junit.ClassRule;
3231
import org.junit.Test;
33-
import org.junit.runner.RunWith;
3432

3533
import org.springframework.beans.factory.BeanCreationException;
3634
import org.springframework.boot.autoconfigure.AutoConfigurations;
37-
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchNodeTemplate;
3835
import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration;
3936
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
40-
import org.springframework.boot.testsupport.runner.classpath.ClassPathOverrides;
41-
import org.springframework.boot.testsupport.runner.classpath.ModifiedClassPathRunner;
37+
import org.springframework.boot.testsupport.testcontainers.ElasticsearchContainer;
4238
import org.springframework.context.annotation.Bean;
4339
import org.springframework.context.annotation.Configuration;
4440
import org.springframework.context.annotation.Import;
@@ -52,24 +48,15 @@
5248
* @author Stephane Nicoll
5349
* @author Andy Wilkinson
5450
*/
55-
@RunWith(ModifiedClassPathRunner.class)
56-
@ClassPathOverrides("org.apache.logging.log4j:log4j-core:2.10.0")
5751
public class JestAutoConfigurationTests {
5852

53+
@ClassRule
54+
public static ElasticsearchContainer elasticsearch = new ElasticsearchContainer();
55+
5956
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
6057
.withConfiguration(AutoConfigurations.of(GsonAutoConfiguration.class,
6158
JestAutoConfiguration.class));
6259

63-
@Before
64-
public void preventElasticsearchFromConfiguringNetty() {
65-
System.setProperty("es.set.netty.runtime.available.processors", "false");
66-
}
67-
68-
@After
69-
public void close() {
70-
System.clearProperty("es.set.netty.runtime.available.processors");
71-
}
72-
7360
@Test
7461
public void jestClientOnLocalhostByDefault() {
7562
this.contextRunner
@@ -122,9 +109,9 @@ public void proxyHostWithoutPort() {
122109

123110
@Test
124111
public void jestCanCommunicateWithElasticsearchInstance() {
125-
new ElasticsearchNodeTemplate().doWithNode((node) -> this.contextRunner
112+
this.contextRunner
126113
.withPropertyValues("spring.elasticsearch.jest.uris=http://localhost:"
127-
+ node.getHttpPort())
114+
+ elasticsearch.getMappedPort())
128115
.run((context) -> {
129116
JestClient client = context.getBean(JestClient.class);
130117
Map<String, String> source = new HashMap<>();
@@ -136,7 +123,7 @@ public void jestCanCommunicateWithElasticsearchInstance() {
136123
Get getRequest = new Get.Builder("foo", "1").build();
137124
assertThat(execute(client, getRequest).getResponseCode())
138125
.isEqualTo(200);
139-
}));
126+
});
140127
}
141128

142129
private JestResult execute(JestClient client, Action<? extends JestResult> action) {

‎spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfigurationTests.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@
2525
import org.elasticsearch.client.RequestOptions;
2626
import org.elasticsearch.client.RestClient;
2727
import org.elasticsearch.client.RestHighLevelClient;
28-
import org.junit.jupiter.api.Test;
28+
import org.junit.ClassRule;
29+
import org.junit.Test;
2930

3031
import org.springframework.boot.autoconfigure.AutoConfigurations;
31-
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchNodeTemplate;
3232
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
33+
import org.springframework.boot.testsupport.testcontainers.ElasticsearchContainer;
3334
import org.springframework.context.annotation.Bean;
3435
import org.springframework.context.annotation.Configuration;
3536
import org.springframework.util.ReflectionUtils;
@@ -44,6 +45,9 @@
4445
*/
4546
public class RestClientAutoConfigurationTests {
4647

48+
@ClassRule
49+
public static ElasticsearchContainer elasticsearch = new ElasticsearchContainer();
50+
4751
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4852
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class));
4953

@@ -77,9 +81,9 @@ public void configureWhenBuilderCustomizerShouldApply() {
7781

7882
@Test
7983
public void restClientCanQueryElasticsearchNode() {
80-
new ElasticsearchNodeTemplate().doWithNode((node) -> this.contextRunner
84+
this.contextRunner
8185
.withPropertyValues("spring.elasticsearch.rest.uris=http://localhost:"
82-
+ node.getHttpPort())
86+
+ RestClientAutoConfigurationTests.elasticsearch.getMappedPort())
8387
.run((context) -> {
8488
RestHighLevelClient client = context
8589
.getBean(RestHighLevelClient.class);
@@ -92,7 +96,7 @@ public void restClientCanQueryElasticsearchNode() {
9296
GetRequest getRequest = new GetRequest("foo", "bar", "1");
9397
assertThat(client.get(getRequest, RequestOptions.DEFAULT).isExists())
9498
.isTrue();
95-
}));
99+
});
96100
}
97101

98102
@Configuration

‎spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/Container.java

+4
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ public int getMappedPort() {
7777
return this.container.getMappedPort(this.port);
7878
}
7979

80+
protected GenericContainer<?> getContainer() {
81+
return this.container;
82+
}
83+
8084
private static class SkipStatement extends Statement {
8185

8286
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright 2012-2018 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.testsupport.testcontainers;
18+
19+
import org.junit.runner.Description;
20+
import org.junit.runners.model.Statement;
21+
22+
/**
23+
* A {@link Container} for Elasticsearch.
24+
*
25+
* @author Andy Wilkinson
26+
*/
27+
public class ElasticsearchContainer extends Container {
28+
29+
public ElasticsearchContainer() {
30+
super("elasticsearch:6.4.3", 9200, (container) -> container.addExposedPort(9300));
31+
}
32+
33+
public int getMappedTransportPort() {
34+
return getContainer().getMappedPort(9300);
35+
}
36+
37+
@Override
38+
public Statement apply(Statement base, Description description) {
39+
Statement wrapped = super.apply(base, description);
40+
return new Statement() {
41+
42+
@Override
43+
public void evaluate() throws Throwable {
44+
System.setProperty("es.set.netty.runtime.available.processors", "false");
45+
try {
46+
wrapped.evaluate();
47+
}
48+
finally {
49+
System.clearProperty("es.set.netty.runtime.available.processors");
50+
}
51+
}
52+
53+
};
54+
55+
}
56+
57+
}

0 commit comments

Comments
 (0)
Please sign in to comment.