Skip to content

Commit f1968a0

Browse files
authored
Add integration test using connetion string as auth method for App Configuration (Azure#36276)
* add test case for connection string auth method. * use authMethod property to select which client should use * use environment credential * add comments for authMethod property.
1 parent b2c7678 commit f1968a0

File tree

7 files changed

+136
-30
lines changed

7 files changed

+136
-30
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.azure.spring.cloud.config;
22

3+
import com.azure.spring.cloud.config.aad.CustomClient;
4+
import com.azure.spring.cloud.config.connectionstring.CustomSecretClient;
5+
import org.springframework.beans.factory.annotation.Value;
36
import org.springframework.context.annotation.Bean;
47
import org.springframework.context.annotation.Configuration;
58
import org.springframework.core.env.Environment;
@@ -9,13 +12,21 @@
912
@Configuration
1013
public class AppConfiguration {
1114

15+
/**
16+
* Define the authentication method to App Configuration store, it should be set by properties in test case.
17+
* When set to "AzureActiveDirectory", need to customize token credential using ConfigurationClientBuilder.
18+
* When set to "ConnectionString", no need to customize token credential using ConfigurationClientBuilder.
19+
*/
20+
@Value("${authMethod}")
21+
private String authMethod;
22+
1223
@Bean
13-
public CustomClient azureCredentials(Environment environment) {
14-
return new CustomClient(environment);
24+
public BaseCustomClient azureCredentials(Environment environment) {
25+
return Constants.AZURE_ACTIVE_DIRECTORY.equals(authMethod) ? new CustomClient(environment) : new CustomSecretClient(environment);
1526
}
16-
27+
1728
@Bean
1829
public PercentageFilter percentageFilter() {
1930
return new PercentageFilter();
2031
}
21-
}
32+
}

sdk/spring/spring-cloud-azure-integration-test-appconfiguration-config/src/test/java/com/azure/spring/cloud/config/CustomClient.java renamed to sdk/spring/spring-cloud-azure-integration-test-appconfiguration-config/src/test/java/com/azure/spring/cloud/config/BaseCustomClient.java

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
11
package com.azure.spring.cloud.config;
22

3-
import org.springframework.core.env.Environment;
4-
import org.springframework.util.StringUtils;
5-
63
import com.azure.core.credential.TokenCredential;
7-
import com.azure.data.appconfiguration.ConfigurationClientBuilder;
84
import com.azure.identity.AzureAuthorityHosts;
95
import com.azure.identity.EnvironmentCredentialBuilder;
10-
import com.azure.security.keyvault.secrets.SecretClientBuilder;
11-
import com.azure.spring.cloud.appconfiguration.config.ConfigurationClientCustomizer;
12-
import com.azure.spring.cloud.appconfiguration.config.SecretClientCustomizer;
6+
import org.springframework.core.env.Environment;
7+
import org.springframework.util.StringUtils;
8+
9+
public class BaseCustomClient {
1310

14-
public class CustomClient implements ConfigurationClientCustomizer, SecretClientCustomizer {
15-
1611
private final Environment environment;
17-
18-
public CustomClient(Environment environment) {
12+
13+
public BaseCustomClient(Environment environment) {
1914
this.environment = environment;
2015
}
2116

22-
TokenCredential buildCredential() {
17+
protected TokenCredential buildCredential() {
2318
EnvironmentCredentialBuilder cred = new EnvironmentCredentialBuilder();
2419
String authorityHost = environment.getProperty("AZURE_AUTHORITY_HOST");
2520
if (StringUtils.hasText(authorityHost)) {
@@ -29,18 +24,7 @@ TokenCredential buildCredential() {
2924
cred.authorityHost(AzureAuthorityHosts.AZURE_CHINA);
3025
}
3126
}
32-
33-
return cred.build();
34-
}
35-
36-
@Override
37-
public void customize(ConfigurationClientBuilder builder, String endpoint) {
38-
builder.credential(buildCredential());
39-
}
4027

41-
@Override
42-
public void customize(SecretClientBuilder builder, String endpoint) {
43-
builder.credential(buildCredential());
28+
return cred.build();
4429
}
45-
46-
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.azure.spring.cloud.config;
2+
3+
public class Constants {
4+
public static final String CONNECTION_STRING = "ConnectionString";
5+
public static final String AZURE_ACTIVE_DIRECTORY = "AzureActiveDirectory";
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.azure.spring.cloud.config.aad;
2+
3+
import com.azure.spring.cloud.config.BaseCustomClient;
4+
import org.springframework.core.env.Environment;
5+
6+
import com.azure.data.appconfiguration.ConfigurationClientBuilder;
7+
import com.azure.security.keyvault.secrets.SecretClientBuilder;
8+
import com.azure.spring.cloud.appconfiguration.config.ConfigurationClientCustomizer;
9+
import com.azure.spring.cloud.appconfiguration.config.SecretClientCustomizer;
10+
11+
public class CustomClient extends BaseCustomClient implements ConfigurationClientCustomizer, SecretClientCustomizer {
12+
13+
public CustomClient(Environment environment) {
14+
super(environment);
15+
}
16+
17+
@Override
18+
public void customize(ConfigurationClientBuilder builder, String endpoint) {
19+
builder.credential(buildCredential());
20+
}
21+
22+
@Override
23+
public void customize(SecretClientBuilder builder, String endpoint) {
24+
builder.credential(buildCredential());
25+
}
26+
27+
}

sdk/spring/spring-cloud-azure-integration-test-appconfiguration-config/src/test/java/com/azure/spring/cloud/config/LoadConfigsTest.java renamed to sdk/spring/spring-cloud-azure-integration-test-appconfiguration-config/src/test/java/com/azure/spring/cloud/config/aad/LoadConfigsTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
package com.azure.spring.cloud.config;
1+
package com.azure.spring.cloud.config.aad;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertTrue;
55

6+
import com.azure.spring.cloud.config.Constants;
7+
import com.azure.spring.cloud.config.MessageProperties;
68
import org.junit.jupiter.api.Test;
79
import org.springframework.beans.factory.annotation.Autowired;
810
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -17,6 +19,9 @@
1719

1820
@SpringBootTest(classes = LoadConfigsTest.class)
1921
@TestPropertySource(properties = {
22+
// When the endpoint of an App Configuration store is specified, need to set "authMethod" as "AzureActiveDirectory".
23+
// So that ConfigurationClientBuilder and SecretClientBuilder are both customized.
24+
"authMethod=" + Constants.AZURE_ACTIVE_DIRECTORY,
2025
"spring.cloud.azure.appconfiguration.stores[0].endpoint= ${STORE_NAME}",
2126
"spring.cloud.azure.appconfiguration.stores[0].feature-flags.enabled= true" })
2227
@Configuration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.azure.spring.cloud.config.connectionstring;
2+
3+
import com.azure.security.keyvault.secrets.SecretClientBuilder;
4+
import com.azure.spring.cloud.appconfiguration.config.SecretClientCustomizer;
5+
import com.azure.spring.cloud.config.BaseCustomClient;
6+
import org.springframework.core.env.Environment;
7+
8+
public class CustomSecretClient extends BaseCustomClient implements SecretClientCustomizer {
9+
public CustomSecretClient(Environment environment) {
10+
super(environment);
11+
}
12+
13+
@Override
14+
public void customize(SecretClientBuilder builder, String endpoint) {
15+
builder.credential(buildCredential());
16+
}
17+
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.azure.spring.cloud.config.connectionstring;
2+
3+
import com.azure.spring.cloud.config.Constants;
4+
import com.azure.spring.cloud.config.MessageProperties;
5+
import com.azure.spring.cloud.feature.management.FeatureManager;
6+
import com.azure.spring.cloud.feature.management.web.FeatureManagerSnapshot;
7+
import org.junit.jupiter.api.Test;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
10+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
11+
import org.springframework.boot.test.context.SpringBootTest;
12+
import org.springframework.context.annotation.Configuration;
13+
import org.springframework.core.env.Environment;
14+
import org.springframework.test.context.TestPropertySource;
15+
16+
import static org.junit.jupiter.api.Assertions.assertEquals;
17+
import static org.junit.jupiter.api.Assertions.assertTrue;
18+
19+
@SpringBootTest(classes = LoadConfigsTest.class)
20+
@TestPropertySource(properties = {
21+
// When the connection-string of an App Configuration store is specified, need to set "authMethod" as "ConnectionString".
22+
// So that only SecretClientBuilder is customized.
23+
"authMethod=" + Constants.CONNECTION_STRING,
24+
"spring.cloud.azure.appconfiguration.stores[0].connection-string=${APP_CONFIGURATION_CONNECTION_STRING}",
25+
"spring.cloud.azure.appconfiguration.stores[0].feature-flags.enabled= true" })
26+
@Configuration
27+
@EnableConfigurationProperties(value = MessageProperties.class)
28+
@EnableAutoConfiguration
29+
public class LoadConfigsTest {
30+
31+
@Autowired
32+
private MessageProperties properties;
33+
34+
@Autowired
35+
private Environment env;
36+
37+
@Autowired
38+
private FeatureManager featureManager;
39+
40+
@Autowired
41+
private FeatureManagerSnapshot featureManagerSnapshot;
42+
43+
@Test
44+
public void sampleTest() {
45+
assertEquals("Test", properties.getMessage());
46+
assertEquals("From Key Vault", properties.getSecret());
47+
assertTrue(env.getProperty("feature-management.Alpha", Boolean.class));
48+
49+
assertTrue(featureManager.isEnabled("Alpha"));
50+
Boolean random = featureManagerSnapshot.isEnabled("Random");
51+
for (int i = 0; i < 1000; i++) {
52+
assertEquals(random, featureManagerSnapshot.isEnabled("Random"));
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)