2424#define SSL_VERIFY_PEER_DNS_ABSOLUTE_HOSTNAME SSL_VERIFY_PEER_DNS_RELATIVE_HOSTNAME " ."
2525#define SSL_VERIFY_PEER_DNS_IP_ADDRESS " 127.254.254.254"
2626
27+ using mockssandra::internal::ClientConnection;
28+ using mockssandra::internal::ClientConnectionFactory;
29+ using mockssandra::internal::ServerConnection;
30+
31+ class CloseConnection : public ClientConnection {
32+ public:
33+ CloseConnection (ServerConnection* server)
34+ : ClientConnection(server) {}
35+
36+ virtual int on_accept () {
37+ int rc = accept ();
38+ if (rc != 0 ) {
39+ return rc;
40+ }
41+ close ();
42+ return rc;
43+ }
44+ };
45+
46+ class CloseConnectionFactory : public ClientConnectionFactory {
47+ public:
48+ virtual ClientConnection* create (ServerConnection* server) const {
49+ return new CloseConnection (server);
50+ }
51+ };
52+
53+ class SniServerNameConnection : public ClientConnection {
54+ public:
55+ SniServerNameConnection (ServerConnection* server)
56+ : ClientConnection(server) {}
57+
58+ virtual void on_read (const char * data, size_t len) {
59+ const char * server_name = sni_server_name ();
60+ if (server_name) {
61+ write (String (server_name) + " - Closed" );
62+ } else {
63+ write (" <unknown> - Closed" );
64+ }
65+ }
66+ };
67+
68+ class SniServerNameConnectionFactory : public ClientConnectionFactory {
69+ public:
70+ virtual ClientConnection* create (ServerConnection* server) const {
71+ return new SniServerNameConnection (server);
72+ }
73+ };
74+
2775using namespace datastax ;
2876using namespace datastax ::internal;
2977using namespace datastax ::internal::core;
@@ -88,13 +136,16 @@ class SocketUnitTest : public LoopTest {
88136 return settings;
89137 }
90138
91- void listen () { ASSERT_EQ (server_. listen (), 0 ); }
92-
93- void reset ( const Address& address) { server_. reset (address); }
139+ void listen (const Address& address = Address( " 127.0.0.1 " , 8888 )) {
140+ ASSERT_EQ (server_. listen (address), 0 );
141+ }
94142
95143 void close () { server_.close (); }
96144
97- void use_close_immediately () { server_.use_close_immediately (); }
145+ void use_close_immediately () { server_.use_connection_factory (new CloseConnectionFactory ()); }
146+ void use_sni_server_name () {
147+ server_.use_connection_factory (new SniServerNameConnectionFactory ());
148+ }
98149
99150 virtual void TearDown () {
100151 LoopTest::TearDown ();
@@ -167,10 +218,10 @@ TEST_F(SocketUnitTest, Simple) {
167218}
168219
169220TEST_F (SocketUnitTest, Ssl) {
170- listen ();
171-
172221 SocketSettings settings (use_ssl ());
173222
223+ listen ();
224+
174225 String result;
175226 SocketConnector::Ptr connector (
176227 new SocketConnector (Address (" 127.0.0.1" , 8888 ), bind_callback (on_socket_connected, &result)));
@@ -182,6 +233,24 @@ TEST_F(SocketUnitTest, Ssl) {
182233 EXPECT_EQ (result, " The socket is successfully connected and wrote data - Closed" );
183234}
184235
236+ TEST_F (SocketUnitTest, SslSniServerName) {
237+ SocketSettings settings (use_ssl ());
238+
239+ use_sni_server_name ();
240+ listen ();
241+
242+ String result;
243+ SocketConnector::Ptr connector (
244+ new SocketConnector (Address (" 127.0.0.1" , 8888 , " TestSniServerName" ),
245+ bind_callback (on_socket_connected, &result)));
246+
247+ connector->with_settings (settings)->connect (loop ());
248+
249+ uv_run (loop (), UV_RUN_DEFAULT);
250+
251+ EXPECT_EQ (result, " TestSniServerName - Closed" );
252+ }
253+
185254TEST_F (SocketUnitTest, Refused) {
186255 bool is_refused = false ;
187256 SocketConnector::Ptr connector (new SocketConnector (
@@ -194,11 +263,11 @@ TEST_F(SocketUnitTest, Refused) {
194263}
195264
196265TEST_F (SocketUnitTest, SslClose) {
266+ SocketSettings settings (use_ssl ());
267+
197268 use_close_immediately ();
198269 listen ();
199270
200- SocketSettings settings (use_ssl ());
201-
202271 Vector<SocketConnector::Ptr> connectors;
203272
204273 bool is_closed = false ;
@@ -241,10 +310,10 @@ TEST_F(SocketUnitTest, Cancel) {
241310}
242311
243312TEST_F (SocketUnitTest, SslCancel) {
244- listen ();
245-
246313 SocketSettings settings (use_ssl ());
247314
315+ listen ();
316+
248317 Vector<SocketConnector::Ptr> connectors;
249318
250319 bool is_canceled = false ;
@@ -268,9 +337,10 @@ TEST_F(SocketUnitTest, SslCancel) {
268337}
269338
270339TEST_F (SocketUnitTest, SslVerifyIdentity) {
340+ SocketSettings settings (use_ssl (" 127.0.0.1" ));
341+
271342 listen ();
272343
273- SocketSettings settings (use_ssl (" 127.0.0.1" ));
274344 settings.ssl_context ->set_verify_flags (CASS_SSL_VERIFY_PEER_IDENTITY);
275345
276346 String result;
@@ -295,11 +365,11 @@ TEST_F(SocketUnitTest, SslVerifyIdentityDns) {
295365 return ;
296366 }
297367
298- reset (Address (SSL_VERIFY_PEER_DNS_IP_ADDRESS,
299- 8888 )); // Ensure the echo server is listening on the correct address
300- listen ();
301-
302368 SocketSettings settings (use_ssl (SSL_VERIFY_PEER_DNS_RELATIVE_HOSTNAME));
369+
370+ listen (Address (SSL_VERIFY_PEER_DNS_IP_ADDRESS,
371+ 8888 )); // Ensure the echo server is listening on the correct address
372+
303373 settings.ssl_context ->set_verify_flags (CASS_SSL_VERIFY_PEER_IDENTITY_DNS);
304374
305375 String result;
0 commit comments