Add tests to spring-boot-autoconfigure (#763)

This commit is contained in:
Munir Abdinur 2020-07-28 15:09:56 -04:00 committed by GitHub
parent dcbfecd2c6
commit fbfa062694
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 469 additions and 0 deletions

View File

@ -0,0 +1,85 @@
/*
* Copyright The OpenTelemetry 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 io.opentelemetry.instrumentation.spring.autoconfigure;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import io.opentelemetry.OpenTelemetry;
import io.opentelemetry.trace.Tracer;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
/** Spring Boot auto configuration test for {@link TracerAutoConfiguration} */
public class TracerAutoConfigurationTest {
@TestConfiguration
static class CustomTracerConfiguration {
@Bean
public Tracer customTestTracer() {
return OpenTelemetry.getTracer("customTestTracer");
}
}
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();
@Test
public void should_NOT_initalize_otelTracer_if_tracer_bean_exists() {
this.contextRunner
.withUserConfiguration(CustomTracerConfiguration.class)
.withConfiguration(AutoConfigurations.of(TracerAutoConfiguration.class))
.run(
(context) -> {
assertTrue(
"Application Context contains customTestTracer bean",
context.containsBean("customTestTracer"));
assertFalse(
"Application Context DOES NOT contain the otelTracer bean defined in TracerAutoConfiguration",
context.containsBean("otelTracer"));
});
}
@Test
public void should_contain_otelTracer_bean() {
this.contextRunner
.withConfiguration(AutoConfigurations.of(TracerAutoConfiguration.class))
.run(
(context) -> {
assertTrue(
"Application Context contains otelTracer bean",
context.containsBean("otelTracer"));
});
}
@Test
public void should_set_tracer_name() {
this.contextRunner
.withPropertyValues("opentelemetry.trace.tracer.name=testTracer")
.withConfiguration(AutoConfigurations.of(TracerAutoConfiguration.class))
.run(
(context) -> {
assertEquals(
"Application Context sets the Tracer with name to testTracer",
context.getBean("otelTracer", Tracer.class),
OpenTelemetry.getTracer("testTracer"));
});
}
}

View File

@ -0,0 +1,72 @@
/*
* Copyright The OpenTelemetry 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 io.opentelemetry.instrumentation.spring.autoconfigure.httpclients.resttemplate;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import io.opentelemetry.instrumentation.spring.autoconfigure.TracerAutoConfiguration;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
/** Spring Boot auto configuration test for {@link RestTemplateAutoConfiguration} */
public class RestTemplateAutoConfigurationTest {
private final ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withConfiguration(
AutoConfigurations.of(
TracerAutoConfiguration.class, RestTemplateAutoConfiguration.class));
@Test
public void should_initialize_RestTemplateInterceptor_bean_when_httpclients_are_ENABLED() {
this.contextRunner
.withPropertyValues("opentelemetry.trace.httpclients.enabled=true")
.run(
(context) -> {
assertNotNull(
"Application Context contains RestTemplateBeanPostProcessor bean",
context.getBean(
"otelRestTemplateBeanPostProcessor", RestTemplateBeanPostProcessor.class));
});
}
@Test
public void should_NOT_initialize_RestTemplateInterceptor_bean_when_httpclients_are_DISABLED() {
this.contextRunner
.withPropertyValues("opentelemetry.trace.httpclients.enabled=false")
.run(
(context) -> {
assertFalse(
"Application Context DOES NOT contain otelRestTemplateBeanPostProcessor bean",
context.containsBean("otelRestTemplateBeanPostProcessor"));
});
}
@Test
public void
should_initialize_RestTemplateInterceptor_bean_when_httpclients_enabled_property_is_MISSING() {
this.contextRunner.run(
(context) -> {
assertNotNull(
"Application Context contains RestTemplateBeanPostProcessor bean",
context.getBean(
"otelRestTemplateBeanPostProcessor", RestTemplateBeanPostProcessor.class));
});
}
}

View File

@ -0,0 +1,70 @@
/*
* Copyright The OpenTelemetry 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 io.opentelemetry.instrumentation.spring.autoconfigure.httpclients.resttemplate;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import io.opentelemetry.instrumentation.spring.httpclients.RestTemplateInterceptor;
import io.opentelemetry.trace.Tracer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.web.client.RestTemplate;
/** Spring bean post processor test {@link RestTemplateBeanPostProcessor} */
@RunWith(MockitoJUnitRunner.class)
public class RestTemplateBeanPostProcessorTest {
@Mock Tracer tracer;
RestTemplateBeanPostProcessor restTemplateBeanPostProcessor =
new RestTemplateBeanPostProcessor(tracer);
@Test
public void should_return_object_if_processed_bean_is_not_of_type_RestTemplate() {
assertEquals(
restTemplateBeanPostProcessor
.postProcessAfterInitialization(new Object(), "testObject")
.getClass(),
Object.class);
}
@Test
public void should_return_RestTemplate_if_processed_bean_is_of_type_RestTemplate() {
assertTrue(
restTemplateBeanPostProcessor.postProcessAfterInitialization(
new RestTemplate(), "testRestTemplate")
instanceof RestTemplate);
}
@Test
public void should_add_ONE_RestTemplateInterceptor_if_processed_bean_is_of_type_RestTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplateBeanPostProcessor.postProcessAfterInitialization(restTemplate, "testRestTemplate");
restTemplateBeanPostProcessor.postProcessAfterInitialization(restTemplate, "testRestTemplate");
restTemplateBeanPostProcessor.postProcessAfterInitialization(restTemplate, "testRestTemplate");
assertEquals(
restTemplate.getInterceptors().stream()
.filter(rti -> rti instanceof RestTemplateInterceptor)
.count(),
1);
}
}

View File

@ -0,0 +1,72 @@
/*
* Copyright The OpenTelemetry 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 io.opentelemetry.instrumentation.spring.autoconfigure.httpclients.webclient;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import io.opentelemetry.instrumentation.spring.autoconfigure.TracerAutoConfiguration;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
/** Spring Boot auto configuration test for {@link WebClientAutoConfiguration} */
public class WebClientAutoConfigurationTest {
private final ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withConfiguration(
AutoConfigurations.of(
TracerAutoConfiguration.class, WebClientAutoConfiguration.class));
@Test
public void should_initialize_WebClientBeanPostProccesor_bean_when_httpclients_are_ENABLED() {
this.contextRunner
.withPropertyValues("opentelemetry.trace.httpclients.enabled=true")
.run(
(context) -> {
assertNotNull(
"Application Context contains WebClientBeanPostProcessor bean",
context.getBean(
"otelWebClientBeanPostProcessor", WebClientBeanPostProcessor.class));
});
}
@Test
public void
should_NOT_initialize_WebClientBeanPostProccesor_bean_when_httpclients_are_DISABLED() {
this.contextRunner
.withPropertyValues("opentelemetry.trace.httpclients.enabled=false")
.run(
(context) -> {
assertFalse(
"Application Context DOES NOT contain otelWebClientBeanPostProcessor bean",
context.containsBean("otelWebClientBeanPostProcessor"));
});
}
@Test
public void
should_initialize_WebClientBeanPostProccesor_bean_when_httpclients_enabled_property_is_MISSING() {
this.contextRunner.run(
(context) -> {
assertNotNull(
"Application Context contains WebClientBeanPostProcessor bean",
context.getBean("otelWebClientBeanPostProcessor", WebClientBeanPostProcessor.class));
});
}
}

View File

@ -0,0 +1,101 @@
/*
* Copyright The OpenTelemetry 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 io.opentelemetry.instrumentation.spring.autoconfigure.httpclients.webclient;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import io.opentelemetry.instrumentation.springwebflux.client.WebClientTracingFilter;
import io.opentelemetry.trace.Tracer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.web.reactive.function.client.WebClient;
/** Spring bean post processor test {@link WebClientBeanPostProcessor} */
@RunWith(MockitoJUnitRunner.class)
public class WebClientBeanPostProcessorTest {
@Mock Tracer tracer;
WebClientBeanPostProcessor webClientBeanPostProcessor = new WebClientBeanPostProcessor(tracer);
@Test
public void
should_return_object_if_processed_bean_is_NOT_of_type_WebClient_or_WebClientBuilder() {
assertEquals(
webClientBeanPostProcessor
.postProcessAfterInitialization(new Object(), "testObject")
.getClass(),
Object.class);
}
@Test
public void should_return_web_client_if_processed_bean_is_of_type_WebClient() {
WebClient webClient = WebClient.create();
assertTrue(
webClientBeanPostProcessor.postProcessAfterInitialization(webClient, "testWebClient")
instanceof WebClient);
}
@Test
public void should_return_WebClientBuilder_if_processed_bean_is_of_type_WebClientBuilder() {
WebClient.Builder webClientBuilder = WebClient.builder();
assertTrue(
webClientBeanPostProcessor.postProcessAfterInitialization(
webClientBuilder, "testWebClientBuilder")
instanceof WebClient.Builder);
}
@Test
public void should_add_exchange_filter_to_WebClient() {
WebClient webClient = WebClient.create();
Object processedWebClient =
webClientBeanPostProcessor.postProcessAfterInitialization(webClient, "testWebClient");
assertTrue(processedWebClient instanceof WebClient);
((WebClient) processedWebClient)
.mutate()
.filters(
functions -> {
assertEquals(
functions.stream().filter(wctf -> wctf instanceof WebClientTracingFilter).count(),
1);
});
}
@Test
public void should_add_ONE_exchange_filter_to_WebClientBuilder() {
WebClient.Builder webClientBuilder = WebClient.builder();
webClientBeanPostProcessor.postProcessAfterInitialization(
webClientBuilder, "testWebClientBuilder");
webClientBeanPostProcessor.postProcessAfterInitialization(
webClientBuilder, "testWebClientBuilder");
webClientBeanPostProcessor.postProcessAfterInitialization(
webClientBuilder, "testWebClientBuilder");
webClientBuilder.filters(
functions -> {
assertEquals(
functions.stream().filter(wctf -> wctf instanceof WebClientTracingFilter).count(), 1);
});
}
}

View File

@ -0,0 +1,69 @@
/*
* Copyright The OpenTelemetry 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 io.opentelemetry.instrumentation.spring.autoconfigure.webmvc;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import io.opentelemetry.instrumentation.spring.autoconfigure.TracerAutoConfiguration;
import io.opentelemetry.instrumentation.springwebmvc.WebMVCTracingFilter;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
/** Spring Boot auto configuration test for {@link WebMVCFilterAutoConfiguration} */
public class WebMVCFilterAutoConfigurationTest {
private final ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withConfiguration(
AutoConfigurations.of(
TracerAutoConfiguration.class, WebMVCFilterAutoConfiguration.class));
@Test
public void should_initialize_WebMvcTracingFilter_bean_when_web_is_enabled() {
this.contextRunner
.withPropertyValues("opentelemetry.trace.web.enabled=true")
.run(
(context) -> {
assertNotNull(
"Application Context contains WebMVCTracingFilter bean",
context.getBean("otelWebMVCTracingFilter", WebMVCTracingFilter.class));
});
}
@Test
public void should_NOT_initialize_WebMvcTracingFilter_bean_when_web_is_NOT_enabled() {
this.contextRunner
.withPropertyValues("opentelemetry.trace.web.enabled=false")
.run(
(context) -> {
assertFalse(
"Application Context DOES NOT contain WebMVCTracingFilter bean",
context.containsBean("otelWebMVCTracingFilter"));
});
}
@Test
public void should_initialize_WebMvcTracingFilter_bean_when_web_enabled_property_is_MISSING() {
this.contextRunner.run(
(context) -> {
assertNotNull(
"Application Context contains WebMVCTracingFilter bean",
context.getBean("otelWebMVCTracingFilter", WebMVCTracingFilter.class));
});
}
}