@@ -33,6 +33,7 @@ constexpr uint16_t PORT_STATUS = 6001;
3333constexpr uint16_t PORT_CONNECT = 6002 ;
3434constexpr uint16_t PORT_STARTUP = 6003 ;
3535constexpr uint16_t PORT_SSL = 6004 ;
36+ constexpr uint16_t PORT_INVALID = 6005 ;
3637constexpr size_t STARTUP_PKT_LEN = 8 ;
3738
3839TEST (ServerTests, StatusStrings) {
@@ -100,23 +101,32 @@ TEST(ServerTests, Handshake) {
100101 addr.sin_port = htons (port);
101102 inet_pton (AF_INET, " 127.0.0.1" , &addr.sin_addr );
102103
103- if (connect (sock, reinterpret_cast <struct sockaddr *>(&addr), sizeof (addr)) == 0 ) {
104- // Send startup packet
105- const std::array<uint32_t , 2 > startup = {htonl (static_cast <uint32_t >(STARTUP_PKT_LEN)),
106- htonl (196608 )};
107- send (sock, startup.data (), startup.size () * 4 , 0 );
108-
109- // Receive Auth OK
110- std::array<char , 9 > buffer{};
111- ssize_t n = recv (sock, buffer.data (), 9 , 0 );
112- EXPECT_EQ (n, 9 );
113- EXPECT_EQ (buffer[0 ], ' R' );
114-
115- // Receive ReadyForQuery
116- n = recv (sock, buffer.data (), 6 , 0 );
117- EXPECT_EQ (n, 6 );
118- EXPECT_EQ (buffer[0 ], ' Z' );
104+ // Wait for server to be ready
105+ bool connected = false ;
106+ for (int i = 0 ; i < 5 ; ++i) {
107+ if (connect (sock, reinterpret_cast <struct sockaddr *>(&addr), sizeof (addr)) == 0 ) {
108+ connected = true ;
109+ break ;
110+ }
111+ std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
119112 }
113+ ASSERT_TRUE (connected);
114+
115+ // Send startup packet
116+ const std::array<uint32_t , 2 > startup = {htonl (static_cast <uint32_t >(STARTUP_PKT_LEN)),
117+ htonl (196608 )};
118+ send (sock, startup.data (), startup.size () * 4 , 0 );
119+
120+ // Receive Auth OK
121+ std::array<char , 9 > buffer{};
122+ ssize_t n = recv (sock, buffer.data (), 9 , 0 );
123+ EXPECT_EQ (n, 9 );
124+ EXPECT_EQ (buffer[0 ], ' R' );
125+
126+ // Receive ReadyForQuery
127+ n = recv (sock, buffer.data (), 6 , 0 );
128+ EXPECT_EQ (n, 6 );
129+ EXPECT_EQ (buffer[0 ], ' Z' );
120130
121131 close (sock);
122132 static_cast <void >(server->stop ());
@@ -125,7 +135,7 @@ TEST(ServerTests, Handshake) {
125135TEST (ServerTests, SSLHandshake) {
126136 auto catalog = Catalog::create ();
127137 StorageManager disk_manager (" ./test_data" );
128- storage::BufferPoolManager sm (128 , disk_manager);
138+ storage::BufferPoolManager sm (config::Config::DEFAULT_BUFFER_POOL_SIZE , disk_manager);
129139 config::Config cfg;
130140 uint16_t port = PORT_SSL;
131141
@@ -138,17 +148,26 @@ TEST(ServerTests, SSLHandshake) {
138148 addr.sin_port = htons (port);
139149 inet_pton (AF_INET, " 127.0.0.1" , &addr.sin_addr );
140150
141- if (connect (sock, reinterpret_cast <struct sockaddr *>(&addr), sizeof (addr)) == 0 ) {
142- // Send SSL Request: length=8, code=80877103
143- const std::array<uint32_t , 2 > ssl_req = {htonl (8 ), htonl (80877103 )};
144- send (sock, ssl_req.data (), 8 , 0 );
145-
146- // Server should reply with 'N' (SSL not supported)
147- char reply = 0 ;
148- ssize_t n = recv (sock, &reply, 1 , 0 );
149- EXPECT_EQ (n, 1 );
150- EXPECT_EQ (reply, ' N' );
151+ // Wait for server to be ready
152+ bool connected = false ;
153+ for (int i = 0 ; i < 5 ; ++i) {
154+ if (connect (sock, reinterpret_cast <struct sockaddr *>(&addr), sizeof (addr)) == 0 ) {
155+ connected = true ;
156+ break ;
157+ }
158+ std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
151159 }
160+ ASSERT_TRUE (connected);
161+
162+ // Send SSL Request: length=8, code=80877103
163+ const std::array<uint32_t , 2 > ssl_req = {htonl (8 ), htonl (80877103 )};
164+ send (sock, ssl_req.data (), 8 , 0 );
165+
166+ // Server should reply with 'N' (SSL not supported)
167+ char reply = 0 ;
168+ ssize_t n = recv (sock, &reply, 1 , 0 );
169+ EXPECT_EQ (n, 1 );
170+ EXPECT_EQ (reply, ' N' );
152171
153172 close (sock);
154173 static_cast <void >(server->stop ());
@@ -157,9 +176,9 @@ TEST(ServerTests, SSLHandshake) {
157176TEST (ServerTests, InvalidHandshake) {
158177 auto catalog = Catalog::create ();
159178 StorageManager disk_manager (" ./test_data" );
160- storage::BufferPoolManager sm (128 , disk_manager);
179+ storage::BufferPoolManager sm (config::Config::DEFAULT_BUFFER_POOL_SIZE , disk_manager);
161180 config::Config cfg;
162- uint16_t port = 6005 ;
181+ uint16_t port = PORT_INVALID ;
163182
164183 auto server = Server::create (port, *catalog, sm, cfg, nullptr );
165184 ASSERT_TRUE (server->start ());
@@ -170,16 +189,25 @@ TEST(ServerTests, InvalidHandshake) {
170189 addr.sin_port = htons (port);
171190 inet_pton (AF_INET, " 127.0.0.1" , &addr.sin_addr );
172191
173- if (connect (sock, reinterpret_cast <struct sockaddr *>(&addr), sizeof (addr)) == 0 ) {
174- // Send invalid length
175- const uint32_t invalid_len = htonl (3 );
176- send (sock, &invalid_len, 4 , 0 );
177-
178- // Server should close connection due to invalid length
179- char buf;
180- ssize_t n = recv (sock, &buf, 1 , 0 );
181- EXPECT_LE (n, 0 );
192+ // Wait for server to be ready
193+ bool connected = false ;
194+ for (int i = 0 ; i < 5 ; ++i) {
195+ if (connect (sock, reinterpret_cast <struct sockaddr *>(&addr), sizeof (addr)) == 0 ) {
196+ connected = true ;
197+ break ;
198+ }
199+ std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
182200 }
201+ ASSERT_TRUE (connected);
202+
203+ // Send invalid length
204+ const uint32_t invalid_len = htonl (3 );
205+ send (sock, &invalid_len, 4 , 0 );
206+
207+ // Server should close connection due to invalid length
208+ char buf;
209+ ssize_t n = recv (sock, &buf, 1 , 0 );
210+ EXPECT_LE (n, 0 );
183211
184212 close (sock);
185213 static_cast <void >(server->stop ());
0 commit comments