Skip to content

Commit e9e363a

Browse files
committed
DBZ-9440- Added test classes.
1 parent 68131d4 commit e9e363a

6 files changed

Lines changed: 704 additions & 0 deletions

File tree

debezium-platform-conductor/src/main/java/io/debezium/platform/environment/connection/destination/MilvusConnectionValidator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import java.util.Map;
99

10+
import jakarta.enterprise.context.ApplicationScoped;
1011
import jakarta.inject.Named;
1112

1213
import org.eclipse.microprofile.config.inject.ConfigProperty;
@@ -39,6 +40,7 @@
3940
*
4041
* @author Pranav Tiwari
4142
*/
43+
@ApplicationScoped
4244
@Named("MILVUS")
4345
public class MilvusConnectionValidator implements ConnectionValidator {
4446

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
/*
2+
* Copyright Debezium Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package io.debezium.platform.environment.connection;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.junit.jupiter.api.Assertions.assertFalse;
10+
import static org.junit.jupiter.api.Assertions.assertTrue;
11+
12+
import java.util.Map;
13+
import java.util.concurrent.TimeUnit;
14+
15+
import jakarta.inject.Inject;
16+
17+
import org.junit.jupiter.api.DisplayName;
18+
import org.junit.jupiter.api.Test;
19+
import org.testcontainers.containers.GenericContainer;
20+
import org.testcontainers.shaded.org.awaitility.Awaitility;
21+
22+
import io.debezium.platform.data.dto.ConnectionValidationResult;
23+
import io.debezium.platform.data.model.ConnectionEntity;
24+
import io.debezium.platform.domain.views.Connection;
25+
import io.debezium.platform.environment.connection.destination.MilvusConnectionValidator;
26+
import io.debezium.platform.environment.database.db.MilvusTestResourceAuthenticated;
27+
import io.quarkus.test.common.QuarkusTestResource;
28+
import io.quarkus.test.junit.QuarkusTest;
29+
30+
/**
31+
* Integration tests for {@link MilvusConnectionValidator} with authentication.
32+
* <p>
33+
* These tests use a real Milvus container (via Testcontainers) configured with
34+
* authentication to verify connection validation against an authenticated Milvus instance.
35+
* </p>
36+
*
37+
* @author Pranav Tiwari
38+
*/
39+
@QuarkusTest
40+
@QuarkusTestResource(MilvusTestResourceAuthenticated.class)
41+
class MilvusConnectionValidatorAuthIT {
42+
43+
@Inject
44+
MilvusConnectionValidator connectionValidator;
45+
46+
@Test
47+
@DisplayName("Should successfully connect with username and password")
48+
void shouldConnectWithUsernamePassword() {
49+
GenericContainer<?> container = MilvusTestResourceAuthenticated.getContainer();
50+
51+
Awaitility.await()
52+
.atMost(300, TimeUnit.SECONDS)
53+
.until(container::isRunning);
54+
55+
String uri = String.format("http://%s:%d",
56+
container.getHost(),
57+
container.getMappedPort(19530));
58+
59+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
60+
"uri", uri,
61+
"username", MilvusTestResourceAuthenticated.DEFAULT_USERNAME,
62+
"password", MilvusTestResourceAuthenticated.DEFAULT_PASSWORD));
63+
64+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
65+
66+
assertTrue(result.valid(), "Connection validation should succeed with correct credentials");
67+
}
68+
69+
@Test
70+
@DisplayName("Should successfully connect with token authentication")
71+
void shouldConnectWithToken() {
72+
GenericContainer<?> container = MilvusTestResourceAuthenticated.getContainer();
73+
74+
Awaitility.await()
75+
.atMost(300, TimeUnit.SECONDS)
76+
.until(container::isRunning);
77+
78+
String uri = String.format("http://%s:%d",
79+
container.getHost(),
80+
container.getMappedPort(19530));
81+
82+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
83+
"uri", uri,
84+
"token", MilvusTestResourceAuthenticated.DEFAULT_TOKEN));
85+
86+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
87+
88+
assertTrue(result.valid(), "Connection validation should succeed with token");
89+
}
90+
91+
@Test
92+
@DisplayName("Should successfully connect with database and authentication")
93+
void shouldConnectWithDatabaseAndAuth() {
94+
GenericContainer<?> container = MilvusTestResourceAuthenticated.getContainer();
95+
96+
Awaitility.await()
97+
.atMost(300, TimeUnit.SECONDS)
98+
.until(container::isRunning);
99+
100+
String uri = String.format("http://%s:%d",
101+
container.getHost(),
102+
container.getMappedPort(19530));
103+
104+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
105+
"uri", uri,
106+
"database", "default",
107+
"username", MilvusTestResourceAuthenticated.DEFAULT_USERNAME,
108+
"password", MilvusTestResourceAuthenticated.DEFAULT_PASSWORD));
109+
110+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
111+
112+
assertTrue(result.valid(), "Connection validation should succeed with database and auth");
113+
}
114+
115+
@Test
116+
@DisplayName("Should fail with incorrect password")
117+
void shouldFailWithIncorrectPassword() {
118+
GenericContainer<?> container = MilvusTestResourceAuthenticated.getContainer();
119+
120+
Awaitility.await()
121+
.atMost(300, TimeUnit.SECONDS)
122+
.until(container::isRunning);
123+
124+
String uri = String.format("http://%s:%d",
125+
container.getHost(),
126+
container.getMappedPort(19530));
127+
128+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
129+
"uri", uri,
130+
"username", MilvusTestResourceAuthenticated.DEFAULT_USERNAME,
131+
"password", "wrong-password"));
132+
133+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
134+
135+
assertFalse(result.valid(), "Connection validation should fail with incorrect password");
136+
assertThat(result.message()).containsAnyOf("auth", "Authentication", "permission", "Unauthenticated");
137+
}
138+
139+
@Test
140+
@DisplayName("Should fail with incorrect username")
141+
void shouldFailWithIncorrectUsername() {
142+
GenericContainer<?> container = MilvusTestResourceAuthenticated.getContainer();
143+
144+
Awaitility.await()
145+
.atMost(300, TimeUnit.SECONDS)
146+
.until(container::isRunning);
147+
148+
String uri = String.format("http://%s:%d",
149+
container.getHost(),
150+
container.getMappedPort(19530));
151+
152+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
153+
"uri", uri,
154+
"username", "wrong-user",
155+
"password", MilvusTestResourceAuthenticated.DEFAULT_PASSWORD));
156+
157+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
158+
159+
assertFalse(result.valid(), "Connection validation should fail with incorrect username");
160+
assertThat(result.message()).containsAnyOf("auth", "Authentication", "permission", "Unauthenticated");
161+
}
162+
163+
@Test
164+
@DisplayName("Should fail with incorrect token")
165+
void shouldFailWithIncorrectToken() {
166+
GenericContainer<?> container = MilvusTestResourceAuthenticated.getContainer();
167+
168+
Awaitility.await()
169+
.atMost(300, TimeUnit.SECONDS)
170+
.until(container::isRunning);
171+
172+
String uri = String.format("http://%s:%d",
173+
container.getHost(),
174+
container.getMappedPort(19530));
175+
176+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
177+
"uri", uri,
178+
"token", "wrong:token"));
179+
180+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
181+
182+
assertFalse(result.valid(), "Connection validation should fail with incorrect token");
183+
assertThat(result.message()).containsAnyOf("auth", "Authentication", "permission", "Unauthenticated");
184+
}
185+
186+
@Test
187+
@DisplayName("Should fail when authentication is required but not provided")
188+
void shouldFailWithoutAuthWhenRequired() {
189+
GenericContainer<?> container = MilvusTestResourceAuthenticated.getContainer();
190+
191+
Awaitility.await()
192+
.atMost(300, TimeUnit.SECONDS)
193+
.until(container::isRunning);
194+
195+
String uri = String.format("http://%s:%d",
196+
container.getHost(),
197+
container.getMappedPort(19530));
198+
199+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
200+
"uri", uri));
201+
202+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
203+
204+
assertFalse(result.valid(), "Connection validation should fail without authentication");
205+
assertThat(result.message()).containsAnyOf("auth", "Authentication", "permission", "Unauthenticated");
206+
}
207+
}
208+
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
* Copyright Debezium Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package io.debezium.platform.environment.connection;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.junit.jupiter.api.Assertions.assertFalse;
10+
import static org.junit.jupiter.api.Assertions.assertTrue;
11+
12+
import java.util.Map;
13+
import java.util.concurrent.TimeUnit;
14+
15+
import jakarta.inject.Inject;
16+
17+
import org.junit.jupiter.api.DisplayName;
18+
import org.junit.jupiter.api.Test;
19+
import org.testcontainers.containers.GenericContainer;
20+
import org.testcontainers.shaded.org.awaitility.Awaitility;
21+
22+
import io.debezium.platform.data.dto.ConnectionValidationResult;
23+
import io.debezium.platform.data.model.ConnectionEntity;
24+
import io.debezium.platform.domain.views.Connection;
25+
import io.debezium.platform.environment.connection.destination.MilvusConnectionValidator;
26+
import io.debezium.platform.environment.database.db.MilvusTestResource;
27+
import io.quarkus.test.common.QuarkusTestResource;
28+
import io.quarkus.test.junit.QuarkusTest;
29+
30+
/**
31+
* Integration tests for {@link MilvusConnectionValidator} without authentication.
32+
* <p>
33+
* These tests use a real Milvus container (via Testcontainers) to verify
34+
* connection validation against an actual Milvus instance without authentication.
35+
* </p>
36+
*
37+
* @author Pranav Tiwari
38+
*/
39+
@QuarkusTest
40+
@QuarkusTestResource(MilvusTestResource.class)
41+
class MilvusConnectionValidatorIT {
42+
43+
@Inject
44+
MilvusConnectionValidator connectionValidator;
45+
46+
@Test
47+
@DisplayName("Should successfully connect to Milvus without authentication")
48+
void shouldConnectWithoutAuth() {
49+
GenericContainer<?> container = MilvusTestResource.getContainer();
50+
51+
Awaitility.await()
52+
.atMost(300, TimeUnit.SECONDS)
53+
.until(container::isRunning);
54+
55+
String uri = String.format("http://%s:%d",
56+
container.getHost(),
57+
container.getMappedPort(19530));
58+
59+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
60+
"uri", uri));
61+
62+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
63+
64+
assertTrue(result.valid(), "Connection validation should succeed");
65+
}
66+
67+
@Test
68+
@DisplayName("Should successfully connect with database parameter")
69+
void shouldConnectWithDatabase() {
70+
GenericContainer<?> container = MilvusTestResource.getContainer();
71+
72+
Awaitility.await()
73+
.atMost(300, TimeUnit.SECONDS)
74+
.until(container::isRunning);
75+
76+
String uri = String.format("http://%s:%d",
77+
container.getHost(),
78+
container.getMappedPort(19530));
79+
80+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
81+
"uri", uri,
82+
"database", "default"));
83+
84+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
85+
86+
assertTrue(result.valid(), "Connection validation with database should succeed");
87+
}
88+
89+
@Test
90+
@DisplayName("Should fail with invalid host")
91+
void shouldFailWithInvalidHost() {
92+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
93+
"uri", "http://invalid-host-12345:19530"));
94+
95+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
96+
97+
assertFalse(result.valid(), "Connection validation should fail");
98+
assertThat(result.message()).containsAnyOf("connect", "UNAVAILABLE", "unreachable", "timeout");
99+
}
100+
101+
@Test
102+
@DisplayName("Should fail with invalid port")
103+
void shouldFailWithInvalidPort() {
104+
GenericContainer<?> container = MilvusTestResource.getContainer();
105+
106+
Awaitility.await()
107+
.atMost(300, TimeUnit.SECONDS)
108+
.until(container::isRunning);
109+
110+
String uri = String.format("http://%s:%d",
111+
container.getHost(),
112+
99999); // Invalid port
113+
114+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
115+
"uri", uri));
116+
117+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
118+
119+
assertFalse(result.valid(), "Connection validation should fail");
120+
assertThat(result.message()).containsAnyOf("connect", "refused", "UNAVAILABLE");
121+
}
122+
123+
@Test
124+
@DisplayName("Should handle timeout gracefully")
125+
void shouldHandleTimeout() {
126+
// Use a non-routable IP address to simulate timeout
127+
Connection connectionConfig = new TestConnectionView(ConnectionEntity.Type.MILVUS, Map.of(
128+
"uri", "http://10.255.255.1:19530"));
129+
130+
ConnectionValidationResult result = connectionValidator.validate(connectionConfig);
131+
132+
assertFalse(result.valid(), "Connection validation should fail");
133+
assertThat(result.message()).containsAnyOf("timeout", "connect", "Connection timeout");
134+
}
135+
}
136+

0 commit comments

Comments
 (0)