Skip to content

Commit 51bbffc

Browse files
committed
test(springboot cloudconfig): Implemented integration test for secret and config store
Signed-off-by: lony2003 <[email protected]>
1 parent 1239f14 commit 51bbffc

11 files changed

+282
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"value1": {
3+
"dapr": {
4+
"spring": {
5+
"demo-config-secret": {
6+
"multivalue": {
7+
"v4": "config"
8+
}
9+
}
10+
}
11+
}
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"dapr.spring.demo-config-secret.singlevalue": "testvalue",
3+
"multivalue-properties": "dapr.spring.demo-config-secret.multivalue.v1=spring\ndapr.spring.demo-config-secret.multivalue.v2=dapr",
4+
"multivalue-yaml": "dapr:\n spring:\n demo-config-secret:\n multivalue:\n v3: cloud"
5+
}

sdk-tests/components/secret.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{}
1+
{"94022f35-25ab-4ffa-a4a0-9b45b602b50c":{"name":"Jon Doe"},"e1f219a2-2689-4689-a18d-372bdf989b05":{"year":"2020","title":"The Metrics IV"}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: dapr.io/v1alpha1
2+
kind: Component
3+
metadata:
4+
name: democonfigMultivalued
5+
spec:
6+
type: secretstores.local.file
7+
version: v1
8+
metadata:
9+
- name: secretsFile
10+
value: "./components/secret-spring/multivalued.json"
11+
- name: nestedSeparator
12+
value: "."
13+
- name: multiValued
14+
value: "true"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: dapr.io/v1alpha1
2+
kind: Component
3+
metadata:
4+
name: democonfig
5+
spec:
6+
type: secretstores.local.file
7+
version: v1
8+
metadata:
9+
- name: secretsFile
10+
value: "./components/secret-spring/singlevalued.json"
11+
- name: multiValued
12+
value: "false"

sdk-tests/pom.xml

+11
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@
4949
</dependencyManagement>
5050

5151
<dependencies>
52+
<dependency>
53+
<groupId>redis.clients</groupId>
54+
<artifactId>jedis</artifactId>
55+
<version>5.2.0</version>
56+
</dependency>
5257
<dependency>
5358
<groupId>io.grpc</groupId>
5459
<artifactId>grpc-protobuf</artifactId>
@@ -208,6 +213,12 @@
208213
<version>${testcontainers-test.version}</version>
209214
<scope>test</scope>
210215
</dependency>
216+
<dependency>
217+
<groupId>com.redis</groupId>
218+
<artifactId>testcontainers-redis</artifactId>
219+
<version>2.2.4</version>
220+
<scope>test</scope>
221+
</dependency>
211222
<dependency>
212223
<groupId>jakarta.annotation</groupId>
213224
<artifactId>jakarta.annotation-api</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package io.dapr.it.spring.cloudconfig;
2+
3+
import com.github.dockerjava.api.command.InspectContainerResponse;
4+
import com.redis.testcontainers.RedisContainer;
5+
import io.dapr.testcontainers.Component;
6+
import io.dapr.testcontainers.DaprContainer;
7+
import io.dapr.testcontainers.DaprLogLevel;
8+
import org.junit.jupiter.api.Tag;
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.extension.ExtendWith;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
import org.springframework.beans.factory.annotation.Value;
14+
import org.springframework.boot.test.context.SpringBootTest;
15+
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
16+
import org.springframework.test.context.ContextConfiguration;
17+
import org.springframework.test.context.junit.jupiter.SpringExtension;
18+
import org.testcontainers.containers.Network;
19+
import org.testcontainers.junit.jupiter.Container;
20+
import org.testcontainers.junit.jupiter.Testcontainers;
21+
import redis.clients.jedis.Jedis;
22+
23+
import java.util.Map;
24+
25+
import static io.dapr.it.testcontainers.DaprContainerConstants.IMAGE_TAG;
26+
import static org.junit.jupiter.api.Assertions.assertEquals;
27+
28+
@SpringBootTest(properties = {
29+
"spring.config.import[0]=dapr:config:" + DaprCloudConfigIT.CONFIG_STORE_NAME
30+
+ "/" + DaprCloudConfigIT.CONFIG_MULTI_NAME + "?type=doc&doc-type=yaml",
31+
"spring.config.import[1]=dapr:config:" + DaprCloudConfigIT.CONFIG_STORE_NAME
32+
+ "/" + DaprCloudConfigIT.CONFIG_SINGLE_NAME + "?type=value",
33+
})
34+
@ContextConfiguration(classes = TestDaprCloudConfigConfiguration.class)
35+
@ExtendWith(SpringExtension.class)
36+
@Testcontainers
37+
@Tag("testcontainers")
38+
public class DaprCloudConfigIT {
39+
public static final String CONFIG_STORE_NAME = "democonfigconf";
40+
public static final String CONFIG_MULTI_NAME = "multivalue-yaml";
41+
public static final String CONFIG_SINGLE_NAME = "dapr.spring.demo-config-config.singlevalue";
42+
43+
private static final Map<String, String> STORE_PROPERTY = generateStoreProperty();
44+
45+
private static final Network DAPR_NETWORK = Network.newNetwork();
46+
47+
private static final RedisContainer REDIS_CONTAINER = new RedisContainer(
48+
RedisContainer.DEFAULT_IMAGE_NAME.withTag(RedisContainer.DEFAULT_TAG)) {
49+
@Override
50+
protected void containerIsStarted(InspectContainerResponse containerInfo) {
51+
super.containerIsStarted(containerInfo);
52+
53+
String address = getHost();
54+
Integer port = getMappedPort(6379);
55+
56+
Logger logger = LoggerFactory.getLogger(DaprCloudConfigIT.class);
57+
// Put values using Jedis
58+
try (Jedis jedis = new Jedis(address, port)) {
59+
logger.info("Putting Dapr Cloud config to {}:{}", address, port);
60+
jedis.set(DaprCloudConfigIT.CONFIG_MULTI_NAME, DaprConfigurationStores.YAML_CONFIG);
61+
jedis.set(DaprCloudConfigIT.CONFIG_SINGLE_NAME, "testvalue");
62+
}
63+
}
64+
}
65+
.withNetworkAliases("redis")
66+
.withCommand()
67+
.withNetwork(DAPR_NETWORK);
68+
69+
@Container
70+
@ServiceConnection
71+
private static final DaprContainer DAPR_CONTAINER = new DaprContainer(IMAGE_TAG)
72+
.withAppName("secret-store-dapr-app")
73+
.withNetwork(DAPR_NETWORK)
74+
.withComponent(new Component(CONFIG_STORE_NAME, "configuration.redis", "v1", STORE_PROPERTY))
75+
.withDaprLogLevel(DaprLogLevel.DEBUG)
76+
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
77+
.dependsOn(REDIS_CONTAINER);
78+
79+
private static Map<String, String> generateStoreProperty() {
80+
return Map.of("redisHost", "redis:6379",
81+
"redisPassword", "");
82+
}
83+
84+
@Value("${dapr.spring.demo-config-config.singlevalue}")
85+
String valueConfig;
86+
87+
@Value("${dapr.spring.demo-config-config.multivalue.v3}")
88+
String yamlConfig;
89+
90+
@Test
91+
public void configTest() {
92+
assertEquals("testvalue", valueConfig);
93+
assertEquals("cloud", yamlConfig);
94+
}
95+
96+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.dapr.it.spring.cloudconfig;
2+
3+
public class DaprConfigurationStores {
4+
public static final String YAML_CONFIG = "dapr:\\n spring:\\n demo-config-config:\\n multivalue:\\n v3: cloud";
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package io.dapr.it.spring.cloudconfig;
2+
3+
import io.dapr.testcontainers.Component;
4+
import io.dapr.testcontainers.DaprContainer;
5+
import io.dapr.testcontainers.DaprLogLevel;
6+
import org.junit.jupiter.api.Tag;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.extension.ExtendWith;
9+
import org.springframework.beans.factory.annotation.Value;
10+
import org.springframework.boot.test.context.SpringBootTest;
11+
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
12+
import org.springframework.test.context.ContextConfiguration;
13+
import org.springframework.test.context.junit.jupiter.SpringExtension;
14+
import org.testcontainers.containers.Network;
15+
import org.testcontainers.images.builder.Transferable;
16+
import org.testcontainers.junit.jupiter.Container;
17+
import org.testcontainers.junit.jupiter.Testcontainers;
18+
19+
import java.util.Map;
20+
21+
import static io.dapr.it.testcontainers.DaprContainerConstants.IMAGE_TAG;
22+
import static org.junit.jupiter.api.Assertions.assertEquals;
23+
24+
@SpringBootTest(properties = {
25+
"spring.config.import[0]=dapr:secret:" + DaprSecretStoreIT.SECRET_STORE_NAME
26+
+ "/" + DaprSecretStoreIT.SECRET_MULTI_NAME + "?type=doc",
27+
"spring.config.import[1]=dapr:secret:" + DaprSecretStoreIT.SECRET_STORE_NAME
28+
+ "/" + DaprSecretStoreIT.SECRET_SINGLE_NAME + "?type=value",
29+
"spring.config.import[2]=dapr:secret:" + DaprSecretStoreIT.SECRET_STORE_NAME_MULTI
30+
+ "?type=value",
31+
})
32+
@ContextConfiguration(classes = TestDaprCloudConfigConfiguration.class)
33+
@ExtendWith(SpringExtension.class)
34+
@Testcontainers
35+
@Tag("testcontainers")
36+
public class DaprSecretStoreIT {
37+
public static final String SECRET_STORE_NAME = "democonfig";
38+
public static final String SECRET_MULTI_NAME = "multivalue-properties";
39+
public static final String SECRET_SINGLE_NAME = "dapr.spring.demo-config-secret.singlevalue";
40+
41+
public static final String SECRET_STORE_NAME_MULTI = "democonfigMultivalued";
42+
43+
private static final Map<String, String> SINGLE_VALUE_PROPERTY = generateSingleValueProperty();
44+
private static final Map<String, String> MULTI_VALUE_PROPERTY = generateMultiValueProperty();
45+
46+
private static final Network DAPR_NETWORK = Network.newNetwork();
47+
48+
@Container
49+
@ServiceConnection
50+
private static final DaprContainer DAPR_CONTAINER = new DaprContainer(IMAGE_TAG)
51+
.withAppName("secret-store-dapr-app")
52+
.withComponent(new Component(SECRET_STORE_NAME, "secretstores.local.file", "v1", SINGLE_VALUE_PROPERTY))
53+
.withComponent(new Component(SECRET_STORE_NAME_MULTI, "secretstores.local.file", "v1", MULTI_VALUE_PROPERTY))
54+
.withNetwork(DAPR_NETWORK)
55+
.withDaprLogLevel(DaprLogLevel.DEBUG)
56+
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
57+
.withCopyToContainer(Transferable.of(DaprSecretStores.SINGLE_VALUED_SECRET), "/dapr-secrets/singlevalued.json")
58+
.withCopyToContainer(Transferable.of(DaprSecretStores.MULTI_VALUED_SECRET), "/dapr-secrets/multivalued.json");
59+
60+
private static Map<String, String> generateSingleValueProperty() {
61+
return Map.of("secretsFile", "/dapr-secrets/singlevalued.json",
62+
"multiValued", "false");
63+
}
64+
65+
private static Map<String, String> generateMultiValueProperty() {
66+
return Map.of("secretsFile", "/dapr-secrets/multivalued.json",
67+
"nestedSeparator", ".",
68+
"multiValued", "true");
69+
}
70+
71+
@Value("${dapr.spring.demo-config-secret.singlevalue}")
72+
String singleValue;
73+
74+
@Value("${dapr.spring.demo-config-secret.multivalue.v1}")
75+
String multiV1;
76+
77+
@Value("${dapr.spring.demo-config-secret.multivalue.v2}")
78+
String multiV2;
79+
80+
@Value("${dapr.spring.demo-config-secret.multivalue.v4}")
81+
String multiV4;
82+
83+
@Test
84+
public void testSecretStore() {
85+
assertEquals("testvalue", singleValue);
86+
assertEquals("spring", multiV1);
87+
assertEquals("dapr", multiV2);
88+
assertEquals("config", multiV4);
89+
}
90+
91+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.dapr.it.spring.cloudconfig;
2+
3+
public class DaprSecretStores {
4+
public static final String SINGLE_VALUED_SECRET = "{\n" +
5+
" \"dapr.spring.democonfigsecret.singlevalue\": \"testvalue\",\n" +
6+
" \"multivalue-properties\": \"dapr.spring.demo-config-secret.multivalue.v1=spring\\ndapr.spring.demo-config-secret.multivalue.v2=dapr\",\n" +
7+
" \"multivalue-yaml\": \"dapr:\\n spring:\\n demo-config-secret:\\n multivalue:\\n v3: cloud\"\n" +
8+
"}";
9+
10+
public static final String MULTI_VALUED_SECRET = "{\n" +
11+
" \"value1\": {\n" +
12+
" \"dapr\": {\n" +
13+
" \"spring\": {\n" +
14+
" \"demo-config-secret\": {\n" +
15+
" \"multivalue\": {\n" +
16+
" \"v4\": \"config\"\n" +
17+
" }\n" +
18+
" }\n" +
19+
" }\n" +
20+
" }\n" +
21+
" }\n" +
22+
"}";
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.dapr.it.spring.cloudconfig;
2+
3+
import io.dapr.spring.boot.autoconfigure.client.DaprClientAutoConfiguration;
4+
import io.dapr.spring.boot.cloudconfig.autoconfigure.DaprCloudConfigAutoConfiguration;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.context.annotation.Import;
7+
8+
@Configuration
9+
@Import({DaprClientAutoConfiguration.class, DaprCloudConfigAutoConfiguration.class})
10+
public class TestDaprCloudConfigConfiguration {
11+
}

0 commit comments

Comments
 (0)