Skip to content

Commit 06a2072

Browse files
committed
Add tests for clients using normal Autoconfiguration
1 parent ad5b4a0 commit 06a2072

File tree

11 files changed

+158
-19
lines changed

11 files changed

+158
-19
lines changed

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/core/AwsAutoConfiguration.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@
1919
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2020
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2121
import org.springframework.boot.context.properties.EnableConfigurationProperties;
22+
import org.springframework.boot.context.properties.PropertyMapper;
2223
import org.springframework.context.annotation.Bean;
2324
import org.springframework.context.annotation.Configuration;
2425
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
2526
import software.amazon.awssdk.metrics.MetricPublisher;
2627
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
2728
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
2829

30+
import java.time.Duration;
31+
2932
/**
3033
* Autoconfigures AWS environment.
3134
*
@@ -36,7 +39,7 @@
3639
@EnableConfigurationProperties(AwsProperties.class)
3740
public class AwsAutoConfiguration {
3841

39-
private final AwsProperties awsProperties;
42+
private static AwsProperties awsProperties;
4043

4144
public AwsAutoConfiguration(AwsProperties awsProperties) {
4245
this.awsProperties = awsProperties;
@@ -46,9 +49,16 @@ public AwsAutoConfiguration(AwsProperties awsProperties) {
4649
static class MetricsAutoConfiguration {
4750
@Bean
4851
@ConditionalOnMissingBean
49-
@ConditionalOnProperty(name = "spring.cloud.aws.metrics-enabled", havingValue = "true", matchIfMissing = true)
52+
@ConditionalOnProperty(name = "spring.cloud.aws.metrics.enabled", havingValue = "true", matchIfMissing = true)
5053
MetricPublisher cloudWatchMetricPublisher() {
51-
return CloudWatchMetricPublisher.builder().build();
54+
CloudWatchMetricPublisher.Builder builder = CloudWatchMetricPublisher.builder();
55+
PropertyMapper propertyMapper = PropertyMapper.get();
56+
if (awsProperties.getMetrics() != null) {
57+
propertyMapper.from(awsProperties.getMetrics()::getNamespace).whenNonNull().to(builder::namespace);
58+
propertyMapper.from(awsProperties.getMetrics()::getUploadFrequencyInSeconds).whenNonNull()
59+
.to(v -> builder.uploadFrequency(Duration.ofSeconds(v)));
60+
}
61+
return builder.build();
5262
}
5363
}
5464

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/core/AwsClientBuilderConfigurer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public class AwsClientBuilderConfigurer {
5353
}
5454

5555
public <T extends AwsClientBuilder<?, ?>> T configure(T builder, @Nullable AwsClientProperties clientProperties,
56-
@Nullable AwsClientCustomizer<T> customizer, MetricPublisher metricPublisher) {
56+
@Nullable AwsClientCustomizer<T> customizer, @Nullable MetricPublisher metricPublisher) {
5757
ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder = clientOverrideConfiguration
5858
.toBuilder();
5959
Assert.notNull(builder, "builder is required");

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/dynamodb/DynamoDbAutoConfiguration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,17 @@ public DynamoDbAutoConfiguration(DynamoDbProperties properties) {
5656

5757
@ConditionalOnMissingBean
5858
@Bean
59-
public DynamoDbClient dynamoDbClient(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
59+
public DynamoDbClientBuilder dynamoDbClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
6060
ObjectProvider<AwsClientCustomizer<DynamoDbClientBuilder>> configurer,
6161
ObjectProvider<MetricPublisher> metricPublisher) {
6262
return awsClientBuilderConfigurer.configure(DynamoDbClient.builder(), properties, configurer.getIfAvailable(),
63-
metricPublisher.getIfAvailable()).build();
63+
metricPublisher.getIfAvailable());
64+
}
65+
66+
@ConditionalOnMissingBean
67+
@Bean
68+
public DynamoDbClient dynamoDbClient(DynamoDbClientBuilder dynamoDbClientBuilder) {
69+
return dynamoDbClientBuilder.build();
6470
}
6571

6672
@ConditionalOnMissingBean

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/metrics/CloudWatchExportAutoConfiguration.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
3939
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
4040
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClientBuilder;
41+
import software.amazon.awssdk.services.cloudwatch.CloudWatchClientBuilder;
4142

4243
/**
4344
* Configuration for exporting metrics to CloudWatch.
@@ -64,14 +65,20 @@ public CloudWatchMeterRegistry cloudWatchMeterRegistry(CloudWatchConfig config,
6465
return new CloudWatchMeterRegistry(config, clock, client);
6566
}
6667

68+
6769
@Bean
6870
@ConditionalOnMissingBean
69-
public CloudWatchAsyncClient cloudWatchAsyncClient(CloudWatchProperties properties,
70-
AwsClientBuilderConfigurer awsClientBuilderConfigurer,
71-
ObjectProvider<AwsClientCustomizer<CloudWatchAsyncClientBuilder>> configurer,
72-
ObjectProvider<MetricPublisher> metricPublisher) {
71+
public CloudWatchAsyncClientBuilder cloudWatchAsyncClientBuilder(CloudWatchProperties properties,
72+
AwsClientBuilderConfigurer awsClientBuilderConfigurer,
73+
ObjectProvider<AwsClientCustomizer<CloudWatchAsyncClientBuilder>> configurer,
74+
ObjectProvider<MetricPublisher> metricPublisher) {
7375
return awsClientBuilderConfigurer.configure(CloudWatchAsyncClient.builder(), properties,
74-
configurer.getIfAvailable(), metricPublisher.getIfAvailable()).build();
76+
configurer.getIfAvailable(), metricPublisher.getIfAvailable());
77+
}
78+
@Bean
79+
@ConditionalOnMissingBean
80+
public CloudWatchAsyncClient cloudWatchAsyncClient(CloudWatchAsyncClientBuilder cloudWatchAsyncClientBuilder) {
81+
return cloudWatchAsyncClientBuilder.build();
7582
}
7683

7784
@Bean

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfiguration.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,16 @@ public class SesAutoConfiguration {
5454

5555
@Bean
5656
@ConditionalOnMissingBean
57-
public SesClient sesClient(SesProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer,
58-
ObjectProvider<AwsClientCustomizer<SesClientBuilder>> configurer,
59-
ObjectProvider<MetricPublisher> metricPublisher) {
57+
public SesClientBuilder sesClientBuilder(SesProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer,
58+
ObjectProvider<AwsClientCustomizer<SesClientBuilder>> configurer,
59+
ObjectProvider<MetricPublisher> metricPublisher) {
6060
return awsClientBuilderConfigurer.configure(SesClient.builder(), properties, configurer.getIfAvailable(),
61-
metricPublisher.getIfAvailable()).build();
61+
metricPublisher.getIfAvailable());
62+
}
63+
@Bean
64+
@ConditionalOnMissingBean
65+
public SesClient sesClient(SesClientBuilder sesClientBuilder) {
66+
return sesClientBuilder.build();
6267
}
6368

6469
@Bean

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/sns/SnsAutoConfiguration.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,20 @@
5959
@ConditionalOnProperty(name = "spring.cloud.aws.sns.enabled", havingValue = "true", matchIfMissing = true)
6060
public class SnsAutoConfiguration {
6161

62+
6263
@ConditionalOnMissingBean
6364
@Bean
64-
public SnsClient snsClient(SnsProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer,
65-
ObjectProvider<AwsClientCustomizer<SnsClientBuilder>> configurer,
66-
ObjectProvider<MetricPublisher> metricPublisher) {
65+
public SnsClientBuilder snsClientBuilder(SnsProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer,
66+
ObjectProvider<AwsClientCustomizer<SnsClientBuilder>> configurer,
67+
ObjectProvider<MetricPublisher> metricPublisher) {
6768
return awsClientBuilderConfigurer.configure(SnsClient.builder(), properties, configurer.getIfAvailable(),
68-
metricPublisher.getIfAvailable()).build();
69+
metricPublisher.getIfAvailable());
70+
}
71+
72+
@ConditionalOnMissingBean
73+
@Bean
74+
public SnsClient snsClient(SnsClientBuilder snsClientBuilder) {
75+
return snsClientBuilder.build();
6976
}
7077

7178
@ConditionalOnMissingBean

spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/dynamodb/DynamoDbAutoConfigurationTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.time.Duration;
3030
import org.junit.jupiter.api.Test;
3131
import org.springframework.boot.autoconfigure.AutoConfigurations;
32+
import org.springframework.boot.test.context.FilteredClassLoader;
3233
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3334
import org.springframework.context.annotation.Bean;
3435
import org.springframework.context.annotation.Configuration;
@@ -38,8 +39,11 @@
3839
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
3940
import software.amazon.awssdk.http.SdkHttpClient;
4041
import software.amazon.awssdk.http.apache.ApacheHttpClient;
42+
import software.amazon.awssdk.metrics.MetricPublisher;
43+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
4144
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
4245
import software.amazon.awssdk.services.dynamodb.DynamoDbClientBuilder;
46+
import software.amazon.awssdk.services.s3.S3ClientBuilder;
4347

4448
/**
4549
*
@@ -104,7 +108,23 @@ void customTableResolverResolverCanBeConfigured() {
104108

105109
});
106110
}
111+
@Test
112+
void usesMetricsPublisherIfAvailable() {
113+
this.contextRunner.run(context -> {
114+
assertThat(context).hasSingleBean(MetricPublisher.class);
115+
assertThat(context).hasSingleBean(DynamoDbClientBuilder.class);
116+
assertThat(context.getBean(DynamoDbClientBuilder.class).overrideConfiguration().metricPublishers().size()).isEqualTo(1);
117+
});
118+
}
107119

120+
@Test
121+
void doesNotUseMetricsPublisherIfNotAvailable() {
122+
this.contextRunner.withClassLoader(new FilteredClassLoader(CloudWatchMetricPublisher.class)).run(context -> {
123+
assertThat(context).doesNotHaveBean(MetricPublisher.class);
124+
assertThat(context).hasSingleBean(DynamoDbClientBuilder.class);
125+
assertThat(context.getBean(DynamoDbClientBuilder.class).overrideConfiguration().metricPublishers().size()).isEqualTo(0);
126+
});
127+
}
108128
@Test
109129
void customDynamoDbClientConfigurer() {
110130
this.contextRunner.withUserConfiguration(DynamoDbAutoConfigurationTest.CustomAwsClientConfig.class)

spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/metrics/CloudWatchExportAutoConfigurationTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,21 @@
2929
import java.time.Duration;
3030
import org.junit.jupiter.api.Test;
3131
import org.springframework.boot.autoconfigure.AutoConfigurations;
32+
import org.springframework.boot.test.context.FilteredClassLoader;
3233
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3334
import org.springframework.context.annotation.Bean;
3435
import org.springframework.context.annotation.Configuration;
3536
import org.springframework.lang.Nullable;
3637
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
3738
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
3839
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
40+
import software.amazon.awssdk.metrics.MetricPublisher;
41+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
3942
import software.amazon.awssdk.regions.Region;
4043
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
4144
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClientBuilder;
45+
import software.amazon.awssdk.services.cloudwatch.CloudWatchClientBuilder;
46+
import software.amazon.awssdk.services.ses.SesClientBuilder;
4247

4348
/**
4449
* Test for the {@link CloudWatchExportAutoConfiguration}.
@@ -134,6 +139,24 @@ void useAwsConfigurerClient() {
134139
});
135140
}
136141

142+
@Test
143+
void usesMetricsPublisherIfAvailable() {
144+
this.contextRunner.withPropertyValues("management.metrics.export.cloudwatch.namespace:test").run(context -> {
145+
assertThat(context).hasSingleBean(MetricPublisher.class);
146+
assertThat(context).getBean(CloudWatchAsyncClientBuilder.class);
147+
assertThat(context.getBean(CloudWatchAsyncClientBuilder.class).overrideConfiguration().metricPublishers().size()).isEqualTo(1);
148+
});
149+
}
150+
151+
@Test
152+
void doesNotUseMetricsPublisherIfNotAvailable() {
153+
this.contextRunner.withClassLoader(new FilteredClassLoader(CloudWatchMetricPublisher.class)).withPropertyValues("management.metrics.export.cloudwatch.namespace:test").run(context -> {
154+
assertThat(context).doesNotHaveBean(MetricPublisher.class);
155+
assertThat(context).hasSingleBean(CloudWatchAsyncClientBuilder.class);
156+
assertThat(context.getBean(CloudWatchAsyncClientBuilder.class).overrideConfiguration().metricPublishers().size()).isEqualTo(0);
157+
});
158+
}
159+
137160
@Configuration(proxyBeanMethods = false)
138161
static class CustomAwsConfigurerClient {
139162

spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/s3/S3AutoConfigurationTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
import software.amazon.awssdk.core.client.config.SdkClientOption;
5252
import software.amazon.awssdk.http.SdkHttpClient;
5353
import software.amazon.awssdk.http.apache.ApacheHttpClient;
54+
import software.amazon.awssdk.metrics.MetricPublisher;
55+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
5456
import software.amazon.awssdk.services.s3.S3Client;
5557
import software.amazon.awssdk.services.s3.S3ClientBuilder;
5658

@@ -88,6 +90,24 @@ void s3AutoConfigurationIsDisabled() {
8890
});
8991
}
9092

93+
@Test
94+
void usesMetricsPublisherIfAvailable() {
95+
this.contextRunner.run(context -> {
96+
assertThat(context).hasSingleBean(MetricPublisher.class);
97+
assertThat(context).hasSingleBean(S3ClientBuilder.class);
98+
assertThat(context.getBean(S3ClientBuilder.class).overrideConfiguration().metricPublishers().size()).isEqualTo(1);
99+
});
100+
}
101+
102+
@Test
103+
void doesNotUseMetricsPublisherIfNotAvailable() {
104+
this.contextRunner.withClassLoader(new FilteredClassLoader(CloudWatchMetricPublisher.class)).run(context -> {
105+
assertThat(context).doesNotHaveBean(MetricPublisher.class);
106+
assertThat(context).hasSingleBean(S3ClientBuilder.class);
107+
assertThat(context.getBean(S3ClientBuilder.class).overrideConfiguration().metricPublishers().size()).isEqualTo(0);
108+
});
109+
}
110+
91111
@Test
92112
void autoconfigurationIsNotTriggeredWhenS3ModuleIsNotOnClasspath() {
93113
this.contextRunner.withClassLoader(new FilteredClassLoader(S3OutputStreamProvider.class)).run(context -> {

spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfigurationTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
3636
import software.amazon.awssdk.http.SdkHttpClient;
3737
import software.amazon.awssdk.http.apache.ApacheHttpClient;
38+
import software.amazon.awssdk.metrics.MetricPublisher;
39+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
3840
import software.amazon.awssdk.services.ses.SesClient;
3941
import software.amazon.awssdk.services.ses.SesClientBuilder;
4042

@@ -86,6 +88,24 @@ void sesAutoConfigurationIsDisabled() {
8688
});
8789
}
8890

91+
@Test
92+
void usesMetricsPublisherIfAvailable() {
93+
this.contextRunner.run(context -> {
94+
assertThat(context).hasSingleBean(MetricPublisher.class);
95+
assertThat(context).hasSingleBean(SesClientBuilder.class);
96+
assertThat(context.getBean(SesClientBuilder.class).overrideConfiguration().metricPublishers().size()).isEqualTo(1);
97+
});
98+
}
99+
100+
@Test
101+
void doesNotUseMetricsPublisherIfNotAvailable() {
102+
this.contextRunner.withClassLoader(new FilteredClassLoader(CloudWatchMetricPublisher.class)).run(context -> {
103+
assertThat(context).doesNotHaveBean(MetricPublisher.class);
104+
assertThat(context).hasSingleBean(SesClientBuilder.class);
105+
assertThat(context.getBean(SesClientBuilder.class).overrideConfiguration().metricPublishers().size()).isEqualTo(0);
106+
});
107+
}
108+
89109
@Test
90110
void withCustomEndpoint() {
91111
this.contextRunner.withPropertyValues("spring.cloud.aws.ses.endpoint:http://localhost:8090").run(context -> {

0 commit comments

Comments
 (0)