Skip to content

Commit 8e7a796

Browse files
committed
added test harness
1 parent b2692a3 commit 8e7a796

File tree

7 files changed

+262
-0
lines changed

7 files changed

+262
-0
lines changed

client-v2/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@
129129
<version>1.18.36</version>
130130
<scope>test</scope>
131131
</dependency>
132+
<dependency>
133+
<groupId>org.slf4j</groupId>
134+
<artifactId>slf4j-simple</artifactId>
135+
<version>2.0.16</version>
136+
</dependency>
132137
</dependencies>
133138

134139
<build>
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package com.clickhouse.client;
2+
3+
import org.testcontainers.containers.GenericContainer;
4+
import org.testcontainers.containers.wait.strategy.Wait;
5+
import org.testcontainers.utility.MountableFile;
6+
import org.testng.Assert;
7+
import org.testng.annotations.AfterClass;
8+
import org.testng.annotations.BeforeClass;
9+
import org.testng.annotations.DataProvider;
10+
import org.testng.annotations.Test;
11+
12+
import javax.net.ssl.SNIHostName;
13+
import javax.net.ssl.SSLContext;
14+
import javax.net.ssl.SSLParameters;
15+
import javax.net.ssl.SSLSession;
16+
import javax.net.ssl.SSLSocket;
17+
import javax.net.ssl.SSLSocketFactory;
18+
import javax.net.ssl.TrustManager;
19+
import javax.net.ssl.X509TrustManager;
20+
import java.security.cert.X509Certificate;
21+
import java.util.Collections;
22+
23+
@Test(groups = {"integration"})
24+
public class NetworkTests {
25+
private static final String NGINX_IMAGE = "nginx:alpine";
26+
private static final int NGINX_SSL_PORT = 8443;
27+
private static final String NODE1_HOST = "node1.test";
28+
private static final String NODE2_HOST = "node2.test";
29+
30+
private GenericContainer<?> nginxContainer;
31+
32+
@BeforeClass
33+
public void setUp() throws Exception {
34+
35+
// Create Nginx container with custom configuration
36+
nginxContainer = new GenericContainer<>(NGINX_IMAGE)
37+
.withCopyFileToContainer(
38+
MountableFile.forClasspathResource("nginx.conf"),
39+
"/etc/nginx/nginx.conf"
40+
)
41+
.withCopyFileToContainer(
42+
MountableFile.forClasspathResource("certs"),
43+
"/etc/nginx/certs/"
44+
)
45+
.withExposedPorts(NGINX_SSL_PORT)
46+
.waitingFor(Wait.forListeningPort());
47+
48+
nginxContainer.start();
49+
}
50+
51+
@AfterClass
52+
public void tearDown() {
53+
if (nginxContainer != null) {
54+
nginxContainer.stop();
55+
}
56+
}
57+
58+
private String getNginxHost() {
59+
return nginxContainer.getHost();
60+
}
61+
62+
private int getNginxPort() {
63+
return nginxContainer.getMappedPort(NGINX_SSL_PORT);
64+
}
65+
66+
@Test
67+
public void testSNI() {
68+
// Test will be implemented here
69+
String host = getNginxHost();
70+
int port = getNginxPort();
71+
System.out.println("Nginx container running at: " + host + ":" + port);
72+
}
73+
74+
@Test(dataProvider = "testSNINodesDP")
75+
void testSNINodes(String host) throws Exception {
76+
int port = nginxContainer.getMappedPort(NGINX_SSL_PORT);
77+
SSLSocket socket = createSniSocket(host, "localhost", port);
78+
socket.startHandshake();
79+
80+
SSLSession session = socket.getSession();
81+
X509Certificate cert = (X509Certificate) session.getPeerCertificates()[0];
82+
Assert.assertTrue(cert.getSubjectX500Principal().getName().contains("CN=" + host));
83+
}
84+
85+
@DataProvider
86+
static Object[][] testSNINodesDP() {
87+
return new Object[][] {
88+
{NODE1_HOST},
89+
{NODE2_HOST}
90+
};
91+
}
92+
93+
private SSLSocket createSniSocket(String sniHost, String serverHost, int port) throws Exception {
94+
SSLContext context = SSLContext.getInstance("TLS");
95+
context.init(null, new TrustManager[] { new X509TrustManager() {
96+
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
97+
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
98+
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
99+
} }, null);
100+
101+
SSLSocketFactory factory = context.getSocketFactory();
102+
SSLSocket socket = (SSLSocket) factory.createSocket(serverHost, port);
103+
104+
SSLParameters sslParams = socket.getSSLParameters();
105+
sslParams.setServerNames(Collections.singletonList(new SNIHostName(sniHost)));
106+
socket.setSSLParameters(sslParams);
107+
108+
return socket;
109+
}
110+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDIjCCAgqgAwIBAgIUPgsC1txpblBP8ybZlyOE/iwm3GAwDQYJKoZIhvcNAQEL
3+
BQAwFTETMBEGA1UEAwwKbm9kZTEudGVzdDAeFw0yNTA2MDYyMTI4NDJaFw0yNjA2
4+
MDYyMTI4NDJaMBUxEzARBgNVBAMMCm5vZGUxLnRlc3QwggEiMA0GCSqGSIb3DQEB
5+
AQUAA4IBDwAwggEKAoIBAQC16EcQY0+5s2sF4WDFcQgExmuIDn3v8gxqklv4BTXV
6+
1B4MqOFhwKytLiAXHL8wyILZJXfCzSQb+75gnm7nDd/5yCEbuhOGjHZcKWLx0ff7
7+
MBunje4b3t4LzKMtYmrPGSS540LLpsh+1VhJaHyDQRbK3Uu896K3wm5YC8FArj83
8+
XAV7UmEOjS4JeTWmFgfXcH04e6tSfZ9TrhyxMWaviFVHk9Lvvj8ajrJQ6nyFNOYL
9+
hTxSU3hrEixJ/Y8h7PPEfUFjVBixCjh93XbrGFu6bstL0V6MeAFV7u+oE6uaJpzw
10+
23qgKq8q93niq4MLhv+sfUX5j5mHF4OookY4uxNztVhtAgMBAAGjajBoMB0GA1Ud
11+
DgQWBBSFVEPrB2BgUiQ2VuyBbpcASR+HujAfBgNVHSMEGDAWgBSFVEPrB2BgUiQ2
12+
VuyBbpcASR+HujAPBgNVHRMBAf8EBTADAQH/MBUGA1UdEQQOMAyCCm5vZGUxLnRl
13+
c3QwDQYJKoZIhvcNAQELBQADggEBACDcZV0fYLyWHcY2lRRp+XfCC9pku2QCLKtb
14+
UYF2sAzMm/ND5U6MFu5BB9EcveFVDDe00DgdkSTC/7LgljhZvTLFxaqmcHO6bz9N
15+
woh1sljzlxDWymPCFg812lTt+KF6dvRswVYVY8ZkF9mrf0oVTYFNeX29G65/GlWQ
16+
ykN8VvjtnMZpphJYTaMNzOsAvEWLxSppVYYIhNqjwIifJjiWGptqtmeycQrInJp0
17+
5KgecVqEffxm1NcZyTlcoDvcm2ayQblpq17rcQ6H5Y1LF9vVffA1UwAgLPQmSNO2
18+
5hbfGo2ySmRzBv5goYdhR4/KVj+IXL0ASgzp6lHh+UhSLFeTFWY=
19+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC16EcQY0+5s2sF
3+
4WDFcQgExmuIDn3v8gxqklv4BTXV1B4MqOFhwKytLiAXHL8wyILZJXfCzSQb+75g
4+
nm7nDd/5yCEbuhOGjHZcKWLx0ff7MBunje4b3t4LzKMtYmrPGSS540LLpsh+1VhJ
5+
aHyDQRbK3Uu896K3wm5YC8FArj83XAV7UmEOjS4JeTWmFgfXcH04e6tSfZ9Trhyx
6+
MWaviFVHk9Lvvj8ajrJQ6nyFNOYLhTxSU3hrEixJ/Y8h7PPEfUFjVBixCjh93Xbr
7+
GFu6bstL0V6MeAFV7u+oE6uaJpzw23qgKq8q93niq4MLhv+sfUX5j5mHF4OookY4
8+
uxNztVhtAgMBAAECggEADi6hV7w+a357AhbbuhkBZInpuU5T8EChSi/F/tS9KUIj
9+
453JEJt6evgFJXgmydFgLjjXGPdwcMQUSCkiAV6aDznUpvo/anaKBc5uOedCW7GY
10+
/lu47DBYhHf8Yt3w8NuHevymaQVETWspunNsfbk14zQUoxN1erksbC3ib74GDLU8
11+
U6c08y1A+xFgybIUqTwyKLjBk6rUSwcXBwkmVPCvpoeY1b7jpDK71uMQsuA9Y0Fn
12+
Ks7i5n3868nUe46SwR3aaZMz1ca1UGsQNTX1ZXr6rYB6PbsOBi7GCPaUKKBmzhtZ
13+
pvQBRDESXvTgZ3uL1NUxgBYlpunTdyu8sCKhnoTZsQKBgQD/Aopz/CmB7Jm7Yr81
14+
Jw1fOUMCQlzVDFkXRgbGqDruQhvrgx1eNVhIUJGX1VffW1xFyut6G9h8eBQ5Na/g
15+
XQC9Ea/B4HeovhIF1/n0owhBfVmBMWf5GOngguXPDVScehZY/58t2CM4C4wBs7hP
16+
whJlPss40Ftox5X63ZRVO/CECQKBgQC2nRQm+K0qR8sEkWfj4iviWpAZjCmCkFAI
17+
fl89WL5UWObwQBNrRlfOQDuncHYgfcRitxnyqqsfr4DbmkSGh+XBmSIAVqUx+b6i
18+
VkXtq6LA/uJ/BuALyKQmR+UH9C3kyCEOkqialy1pcfQF5ZnDT7/CoPtaheknR5kj
19+
6BMKN1gyRQKBgQCRNhovN81PDbLw8KcfFlDYA5xzweRo8TIePaMIJq4AFKcfcjcb
20+
+VZ/P1nY0wTJzJV7rLRwgUDCiAJEHZ08LtmH0HV7+l1JOoq6xySvuNKvsDhyh/bD
21+
8vri/MbuI5Il1KO7JDy5d1V+yZx9L6Dp0gJ1os9IV+VlghmWk+yuqIYqOQKBgQCP
22+
55bi4yKq5+p/jgpdlXTZql5WE5L+lbTMDLIGyPErzOcoOoZTChrVqN6Zo1EjZ5ij
23+
5gCnr4CstoQICjin/126Q2987sq9aD6m9O+kTJY0GmfojEVwY8ufcxZ0PyMPX/pU
24+
3pPJRwr9RlRzdSzHsge+W1fYTSCf2JdAqXifm1+ANQKBgBVU0Z8Eeeab7RslPiDJ
25+
kPd1okVJMMSI1jLANsla4WWL93lHDTQ/c6yhO6as3j4f4Bp13k6vtWypolnhCDWc
26+
OTNPZYHPD9qQYevQlpFK2pERIEWH5BgeYLCy2YLWlKpUprHGyOUW3Ji9Gukha3pk
27+
KVkxTzYFuXegiqZyKWFimVrs
28+
-----END PRIVATE KEY-----
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDIjCCAgqgAwIBAgIUbBm4zP62LDBki+SOV7K/a3RGoQQwDQYJKoZIhvcNAQEL
3+
BQAwFTETMBEGA1UEAwwKbm9kZTIudGVzdDAeFw0yNTA2MDYyMTI4NDJaFw0yNjA2
4+
MDYyMTI4NDJaMBUxEzARBgNVBAMMCm5vZGUyLnRlc3QwggEiMA0GCSqGSIb3DQEB
5+
AQUAA4IBDwAwggEKAoIBAQDXZDmSiRTjmVNMOF3p58Fg34+SvCoohYO0pB9LaY5d
6+
H/iPHssTm/spD15sGMTwmnFKNgLKOCHCDgltTPJTCiVteddh944K+9drxnfck9Eb
7+
FQDCA+OQodNCoj3qvTZ5CvUSjPeWpdOo8yxT4Hq0Tj37awIEPYcT2gjMrbsbXjAZ
8+
nyWEh76vx3ydMN5VxJAUk4V0V8IpEUJWPyA6tjJWbfgWy1DsdPuTadJAAaaa35CA
9+
CgAVO+aM8OFdSYw1SDmjgrgyBV9MU/XZN2eaYx9Y8K3MqM4KouMeykO9CX04+3pg
10+
bDJDy5CywGsWzqsdMNH3M++z9P7iBAyDL2Yh8CRz2dmPAgMBAAGjajBoMB0GA1Ud
11+
DgQWBBQAsXC8lOD5OjHgmNpWYYbAjI+1EjAfBgNVHSMEGDAWgBQAsXC8lOD5OjHg
12+
mNpWYYbAjI+1EjAPBgNVHRMBAf8EBTADAQH/MBUGA1UdEQQOMAyCCm5vZGUyLnRl
13+
c3QwDQYJKoZIhvcNAQELBQADggEBAKzBUiof/5yrmebVf+Arrur2/96QnEQJkGQm
14+
1RwcClGOwhUtdbxcdoXgYqOLtQSiTGNAKcVyOKATOz6tc7qU5BkIga9d2FSGSV9c
15+
6gU/Ij9+Y2AAHpElnHBGkjiuBAugv5Tt4NxnJXss5raML9/ATi0y4wcRSAeSCnDy
16+
wFX66SEoWVkQcti7/TrxJRgstubWplTPtGQK/lcgWFNIKJDHft0nlXNsUK0CrfLq
17+
wdWtmhWuadg66JuKvJABVtJIr2RQ5rYVWPyuS3sbSVIA9CB9dPjb/3/lSwmdSBbL
18+
0WesfGryPK4aZXFlUEzzr/P/euwHhss0KUYjIpdGNQ7sBdwcFKg=
19+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDXZDmSiRTjmVNM
3+
OF3p58Fg34+SvCoohYO0pB9LaY5dH/iPHssTm/spD15sGMTwmnFKNgLKOCHCDglt
4+
TPJTCiVteddh944K+9drxnfck9EbFQDCA+OQodNCoj3qvTZ5CvUSjPeWpdOo8yxT
5+
4Hq0Tj37awIEPYcT2gjMrbsbXjAZnyWEh76vx3ydMN5VxJAUk4V0V8IpEUJWPyA6
6+
tjJWbfgWy1DsdPuTadJAAaaa35CACgAVO+aM8OFdSYw1SDmjgrgyBV9MU/XZN2ea
7+
Yx9Y8K3MqM4KouMeykO9CX04+3pgbDJDy5CywGsWzqsdMNH3M++z9P7iBAyDL2Yh
8+
8CRz2dmPAgMBAAECggEAUvRaSgn6nheooaPZ46Kq8xzXBlvq3rVhPrqxBNHQDySn
9+
jbN94f0Ck9ND+dzmSIYq2LqJg4lv0vWmAs8OSxYOySWSYrw9nBRXaL5E3pKdh9Ek
10+
fBSUWdlBbJngv94Es0SZk33wQzh1ls2lBl7f0z6JF6IkYi6yLd6c4fuNIuK5IrxX
11+
0ahgqfiHrNizm8rfnIuHVQh/wBQk3cseXFMSnq5Y9/ZaFzqVKKauhLr8vFYRHK0Y
12+
UCcLFCMZxvOpdVlOa8Ej4kZWQNd5yuvmEaaTcFgxkADmHF53jFjNVYluT16KQeVr
13+
hzylv+rdrXgTpSb+uXmYzff1JTC7i8Jk9NQ5CaVCmQKBgQD3Gdn7rRU85aNkwaA5
14+
k2ykOP0ixQyLvYA0h8ajlidbxbfFm1IbrDmcOGgDIRwkwpD8GfZoKc41cjgaP9Fq
15+
tWjdXNJaf0ogTWT9mcJFX1KGLU0yk3c8VPgtbhYf67u08H05ZF2O9TszBdxqy7lb
16+
cfMIgiQXJ9gn86HMdL+t1hrZSQKBgQDfJgcZHHTCSW1o+wwWnPNrGjM5/vxUw293
17+
6d93m8nsUnZtYsRfqOpZKKyvuCbFhLlF5QkfpR19WUbCfqSRd2Ibq03CTN8MBa+0
18+
7yleHyDTYe48OGXyKzW0SdyM9T6oy7C0Fx1s4mB2Pa/iEovyZThxBPf3tINiU7QI
19+
aMgo8mG0FwKBgQCTMVwPNpBDIUvOliSah34c6TGpB5Ysm6qGICcshSJW4ZVR6e7k
20+
OxhqPZN/4bZBE4GIGvMUI2sJnUtcH43gscWQr11CuTZvvYqeInx+FIU1FkE5Emzh
21+
jH/1l/En/KVo6CTADlBI+z3Ta/dbypVUqrEp7VQQUxTI37EO+LDBnZuKuQKBgQCo
22+
2MhkKtD6Nb8wwUzbS3UwZEnAp3zc0mhkzrUFdv7p71em2yYFz/VK82j/KRNFP3FF
23+
PtGRfUl8EHJnNpZlb3TvxMX4sFvRZ/gUqyadDmazK5WtQWt6O1HOkljs26DG7iFN
24+
k3PzcLNWpMSSBkCYcBiuA/lxF8iWPQmrl0VlHknpjwKBgQCEPI+tuaw0fHsiHAK2
25+
w8rTB8KO5Qh7p5d1BSGmefM2HfJGialT5cCKABQX/kK4TxtLX7Pi1LPhJuGuJoi+
26+
AAwlznz2O1PUPCnBEc8mB/8p8ZrY89q0+xaqoyW1hnsNi20nXe6eHXlGu+J3zLlX
27+
rEDrZRwY7ldkYFWh467fqFEl1w==
28+
-----END PRIVATE KEY-----
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# nginx.conf
2+
events {}
3+
4+
http {
5+
server {
6+
listen 8443 ssl;
7+
server_name node1.test;
8+
9+
ssl_certificate /etc/nginx/certs/node1.crt;
10+
ssl_certificate_key /etc/nginx/certs/node1.key;
11+
12+
location = /default {
13+
if ($request_method != POST) {
14+
return 405;
15+
}
16+
17+
if ($arg_query = "SELECT hostName()") {
18+
return 200 "node1.test\n";
19+
}
20+
21+
return 400 "Unsupported query\n";
22+
}
23+
24+
location / {
25+
return 200 "node1.test served\n";
26+
}
27+
}
28+
29+
server {
30+
listen 8443 ssl;
31+
server_name node2.test;
32+
33+
ssl_certificate /etc/nginx/certs/node2.crt;
34+
ssl_certificate_key /etc/nginx/certs/node2.key;
35+
36+
location = /default {
37+
if ($request_method != POST) {
38+
return 405;
39+
}
40+
41+
if ($arg_query = "SELECT hostName()") {
42+
return 200 "node2.test\n";
43+
}
44+
45+
return 400 "Unsupported query\n";
46+
}
47+
48+
location / {
49+
return 200 "node2.test served\n";
50+
}
51+
}
52+
}
53+

0 commit comments

Comments
 (0)