Skip to content

Commit a77dc20

Browse files
committed
tests: enhance recovery log validation and server handshake reliability
1 parent b09bdce commit a77dc20

2 files changed

Lines changed: 74 additions & 40 deletions

File tree

tests/recovery_tests.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,20 +121,26 @@ TEST(RecoveryTests, LogRecordVariants) {
121121
rec.serialize(buf.data());
122122
auto d = LogRecord::deserialize(buf.data());
123123
EXPECT_EQ(d.type_, LogRecordType::BEGIN);
124+
EXPECT_EQ(d.txn_id_, 1);
125+
EXPECT_EQ(d.prev_lsn_, -1);
124126
}
125127
{
126-
LogRecord rec(1, 10, LogRecordType::COMMIT);
128+
LogRecord rec(2, 10, LogRecordType::COMMIT);
127129
std::vector<char> buf(rec.get_size());
128130
rec.serialize(buf.data());
129131
auto d = LogRecord::deserialize(buf.data());
130132
EXPECT_EQ(d.type_, LogRecordType::COMMIT);
133+
EXPECT_EQ(d.txn_id_, 2);
134+
EXPECT_EQ(d.prev_lsn_, 10);
131135
}
132136
{
133-
LogRecord rec(1, 20, LogRecordType::ABORT);
137+
LogRecord rec(3, 20, LogRecordType::ABORT);
134138
std::vector<char> buf(rec.get_size());
135139
rec.serialize(buf.data());
136140
auto d = LogRecord::deserialize(buf.data());
137141
EXPECT_EQ(d.type_, LogRecordType::ABORT);
142+
EXPECT_EQ(d.txn_id_, 3);
143+
EXPECT_EQ(d.prev_lsn_, 20);
138144
}
139145
}
140146

tests/server_tests.cpp

Lines changed: 66 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ constexpr uint16_t PORT_STATUS = 6001;
3333
constexpr uint16_t PORT_CONNECT = 6002;
3434
constexpr uint16_t PORT_STARTUP = 6003;
3535
constexpr uint16_t PORT_SSL = 6004;
36+
constexpr uint16_t PORT_INVALID = 6005;
3637
constexpr size_t STARTUP_PKT_LEN = 8;
3738

3839
TEST(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) {
125135
TEST(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) {
157176
TEST(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

Comments
 (0)