Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
test_container_protocol.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕ðŸŒĨ 🌊
3// See the LICENSE file in the project root for full license information.
4
5#ifdef USE_CONTAINER_SYSTEM
6
7#include <gtest/gtest.h>
10#include <string>
11#include <vector>
12
13using namespace database::protocol;
14
25class ContainerProtocolTest : public ::testing::Test {
26protected:
27 void SetUp() override {
28 // Setup common test data
29 }
30
31 void TearDown() override {
32 // Cleanup
33 }
34};
35
39TEST_F(ContainerProtocolTest, SerializeBasicQueryRequest) {
40 query_request request;
41 request.operation = query_operation::SELECT;
42 request.query_string = "SELECT * FROM users";
43 request.parameters = {};
44
45 // Serialize using container system
46 auto serialized = container_protocol_serializer::serialize_container(request);
47
48 // Verify serialization produces data
49 EXPECT_GT(serialized.size(), 0u);
50
51 std::cout << "Serialized " << request.query_string << " to "
52 << serialized.size() << " bytes" << std::endl;
53}
54
58TEST_F(ContainerProtocolTest, SerializeQueryRequestWithParameters) {
59 query_request request;
60 request.operation = query_operation::SELECT;
61 request.query_string = "SELECT * FROM users WHERE id = ? AND name = ?";
62 request.parameters = {"123", "John Doe"};
63
64 auto serialized = container_protocol_serializer::serialize_container(request);
65
66 EXPECT_GT(serialized.size(), 0u);
67
68 std::cout << "Serialized query with " << request.parameters.size()
69 << " parameters to " << serialized.size() << " bytes" << std::endl;
70}
71
75TEST_F(ContainerProtocolTest, DeserializeBasicQueryRequest) {
76 // Create request
77 query_request original;
78 original.operation = query_operation::INSERT;
79 original.query_string = "INSERT INTO users VALUES (?, ?)";
80 original.parameters = {};
81
82 // Serialize
83 auto serialized =
84 container_protocol_serializer::serialize_container(original);
85
86 // Deserialize
87 auto result =
88 container_protocol_serializer::deserialize_container_query_request(
89 serialized);
90
91 // Verify success
92 ASSERT_TRUE(result.is_ok());
93
94 auto deserialized = result.unwrap();
95 EXPECT_EQ(deserialized.operation, original.operation);
96 EXPECT_EQ(deserialized.query_string, original.query_string);
97 EXPECT_EQ(deserialized.parameters.size(), original.parameters.size());
98
99 std::cout << "Successfully deserialized: " << deserialized.query_string
100 << std::endl;
101}
102
106TEST_F(ContainerProtocolTest, DeserializeQueryRequestWithParameters) {
107 query_request original;
108 original.operation = query_operation::UPDATE;
109 original.query_string = "UPDATE users SET name = ? WHERE id = ?";
110 original.parameters = {"Alice", "456"};
111
112 auto serialized =
113 container_protocol_serializer::serialize_container(original);
114 auto result =
115 container_protocol_serializer::deserialize_container_query_request(
116 serialized);
117
118 ASSERT_TRUE(result.is_ok());
119
120 auto deserialized = result.unwrap();
121 EXPECT_EQ(deserialized.operation, original.operation);
122 EXPECT_EQ(deserialized.query_string, original.query_string);
123 ASSERT_EQ(deserialized.parameters.size(), original.parameters.size());
124
125 for (size_t i = 0; i < original.parameters.size(); ++i) {
126 EXPECT_EQ(deserialized.parameters[i], original.parameters[i]);
127 }
128
129 std::cout << "Successfully deserialized query with "
130 << deserialized.parameters.size() << " parameters" << std::endl;
131}
132
136TEST_F(ContainerProtocolTest, RoundTripSimple) {
137 query_request original;
138 original.operation = query_operation::SELECT;
139 original.query_string = "SELECT COUNT(*) FROM orders";
140 original.parameters = {};
141
142 // Round-trip
143 auto serialized =
144 container_protocol_serializer::serialize_container(original);
145 auto result =
146 container_protocol_serializer::deserialize_container_query_request(
147 serialized);
148
149 ASSERT_TRUE(result.is_ok());
150 auto recovered = result.unwrap();
151
152 // Verify exact match
153 EXPECT_EQ(recovered.operation, original.operation);
154 EXPECT_EQ(recovered.query_string, original.query_string);
155 EXPECT_EQ(recovered.parameters.size(), original.parameters.size());
156
157 std::cout << "✓ Round-trip integrity verified (simple)" << std::endl;
158}
159
163TEST_F(ContainerProtocolTest, RoundTripComplex) {
164 query_request original;
165 original.operation = query_operation::INSERT;
166 original.query_string = "INSERT INTO products (id, name, price, category, "
167 "stock) VALUES (?, ?, ?, ?, ?)";
168 original.parameters = {"1001", "Laptop", "999.99", "Electronics", "42"};
169
170 auto serialized =
171 container_protocol_serializer::serialize_container(original);
172 auto result =
173 container_protocol_serializer::deserialize_container_query_request(
174 serialized);
175
176 ASSERT_TRUE(result.is_ok());
177 auto recovered = result.unwrap();
178
179 EXPECT_EQ(recovered.operation, original.operation);
180 EXPECT_EQ(recovered.query_string, original.query_string);
181 ASSERT_EQ(recovered.parameters.size(), original.parameters.size());
182
183 for (size_t i = 0; i < original.parameters.size(); ++i) {
184 EXPECT_EQ(recovered.parameters[i], original.parameters[i])
185 << "Parameter mismatch at index " << i;
186 }
187
188 std::cout << "✓ Round-trip integrity verified (complex, "
189 << original.parameters.size() << " parameters)" << std::endl;
190}
191
195TEST_F(ContainerProtocolTest, RoundTripSpecialCharacters) {
196 query_request original;
197 original.operation = query_operation::SELECT;
198 original.query_string = "SELECT * FROM users WHERE name LIKE ?";
199 original.parameters = {"O'Brien", "50%", "tab\tchar", "quote\"char"};
200
201 auto serialized =
202 container_protocol_serializer::serialize_container(original);
203 auto result =
204 container_protocol_serializer::deserialize_container_query_request(
205 serialized);
206
207 ASSERT_TRUE(result.is_ok());
208 auto recovered = result.unwrap();
209
210 ASSERT_EQ(recovered.parameters.size(), original.parameters.size());
211 for (size_t i = 0; i < original.parameters.size(); ++i) {
212 EXPECT_EQ(recovered.parameters[i], original.parameters[i])
213 << "Special character parameter mismatch at index " << i;
214 }
215
216 std::cout << "✓ Special characters handled correctly" << std::endl;
217}
218
222TEST_F(ContainerProtocolTest, EmptyQueryString) {
223 query_request original;
224 original.operation = query_operation::SELECT;
225 original.query_string = "";
226 original.parameters = {};
227
228 auto serialized =
229 container_protocol_serializer::serialize_container(original);
230 auto result =
231 container_protocol_serializer::deserialize_container_query_request(
232 serialized);
233
234 ASSERT_TRUE(result.is_ok());
235 auto recovered = result.unwrap();
236
237 EXPECT_EQ(recovered.query_string, "");
238 std::cout << "✓ Empty query string handled" << std::endl;
239}
240
244TEST_F(ContainerProtocolTest, ManyParameters) {
245 query_request original;
246 original.operation = query_operation::SELECT;
247 original.query_string = "BULK INSERT";
248
249 // Create 100 parameters
250 for (int i = 0; i < 100; ++i) {
251 original.parameters.push_back("param_" + std::to_string(i));
252 }
253
254 auto serialized =
255 container_protocol_serializer::serialize_container(original);
256 auto result =
257 container_protocol_serializer::deserialize_container_query_request(
258 serialized);
259
260 ASSERT_TRUE(result.is_ok());
261 auto recovered = result.unwrap();
262
263 EXPECT_EQ(recovered.parameters.size(), 100u);
264 for (size_t i = 0; i < 100; ++i) {
265 EXPECT_EQ(recovered.parameters[i], "param_" + std::to_string(i));
266 }
267
268 std::cout << "✓ 100 parameters handled correctly" << std::endl;
269}
270
274TEST_F(ContainerProtocolTest, JSONSerialization) {
275 query_request request;
276 request.operation = query_operation::SELECT;
277 request.query_string = "SELECT * FROM test";
278 request.parameters = {"value1", "value2"};
279
280 auto json = container_protocol_serializer::serialize_to_json(request);
281
282 // Verify JSON is not empty and contains expected elements
283 EXPECT_GT(json.size(), 0u);
284 EXPECT_NE(json.find("query_request"), std::string::npos);
285 EXPECT_NE(json.find("query_string"), std::string::npos);
286
287 std::cout << "JSON output:\n" << json << std::endl;
288}
289
293TEST_F(ContainerProtocolTest, DeserializeInvalidData) {
294 std::vector<uint8_t> invalid_data = {0x00, 0x01, 0x02, 0x03};
295
296 auto result =
297 container_protocol_serializer::deserialize_container_query_request(
298 invalid_data);
299
300 // Should return error
301 EXPECT_TRUE(result.is_err());
302
303 if (result.is_err()) {
304 std::cout << "✓ Invalid data correctly rejected: " << result.error().message
305 << std::endl;
306 }
307}
308
312TEST_F(ContainerProtocolTest, AllQueryOperations) {
313 std::vector<query_operation> operations = {
314 query_operation::SELECT, query_operation::INSERT, query_operation::UPDATE,
315 query_operation::DELETE};
316
317 for (auto op : operations) {
318 query_request original;
319 original.operation = op;
320 original.query_string = "TEST QUERY";
321 original.parameters = {};
322
323 auto serialized =
324 container_protocol_serializer::serialize_container(original);
325 auto result =
326 container_protocol_serializer::deserialize_container_query_request(
327 serialized);
328
329 ASSERT_TRUE(result.is_ok());
330 EXPECT_EQ(result.unwrap().operation, op);
331 }
332
333 std::cout << "✓ All query operations verified" << std::endl;
334}
335
339TEST_F(ContainerProtocolTest, PerformanceIndicator) {
340 query_request request;
341 request.operation = query_operation::SELECT;
342 request.query_string = "SELECT * FROM performance_test WHERE id = ?";
343 request.parameters = {"test_value"};
344
345 const int iterations = 10000;
346
347 auto start = std::chrono::high_resolution_clock::now();
348
349 for (int i = 0; i < iterations; ++i) {
350 auto serialized =
351 container_protocol_serializer::serialize_container(request);
352 // Don't optimize away
353 volatile size_t size = serialized.size();
354 (void)size;
355 }
356
357 auto end = std::chrono::high_resolution_clock::now();
358 auto duration =
359 std::chrono::duration_cast<std::chrono::microseconds>(end - start);
360
361 double ops_per_sec = (iterations * 1000000.0) / duration.count();
362 double us_per_op = duration.count() / static_cast<double>(iterations);
363
364 std::cout << "Container serialization performance:" << std::endl;
365 std::cout << " " << iterations << " iterations in " << duration.count()
366 << " Ξs" << std::endl;
367 std::cout << " " << static_cast<int>(ops_per_sec) << " ops/sec" << std::endl;
368 std::cout << " " << us_per_op << " Ξs/op" << std::endl;
369
370 // Performance expectation: should be > 100K ops/sec
371#ifdef NDEBUG
372 EXPECT_GT(ops_per_sec, 100000.0) << "Performance below expectations";
373#else
374 EXPECT_GT(ops_per_sec, 10000.0)
375 << "Performance below expectations (Debug build)";
376#endif
377}
378
379#endif // USE_CONTAINER_SYSTEM
std::vector< std::string > parameters
TEST_F(AsyncResultTest, ConstructsFromFuture)
#define ASSERT_EQ(expected, actual, message)
#define ASSERT_TRUE(condition, message)