Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
test_container_protocol_standalone.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
12#ifdef USE_CONTAINER_SYSTEM
13
14#include <iostream>
15#include <vector>
16#include <string>
17#include <chrono>
18#include <cassert>
19
20// Include only necessary protocol headers
23
24using namespace database::protocol;
25
26// Simple assertion macro
27#define TEST_ASSERT(condition, message) \
28 if (!(condition)) { \
29 std::cerr << "❌ FAILED: " << message << std::endl; \
30 return false; \
31 }
32
33#define TEST_SUCCESS(message) \
34 std::cout << "✓ " << message << std::endl;
35
36bool test_basic_serialization() {
37 query_request request;
38 request.operation = query_operation::SELECT;
39 request.query_string = "SELECT * FROM users";
40 request.parameters = {};
41
42 auto serialized = container_protocol_serializer::serialize_container(request);
43 TEST_ASSERT(serialized.size() > 0, "Serialized data should not be empty");
44
45 TEST_SUCCESS("Basic serialization: " << serialized.size() << " bytes");
46 return true;
47}
48
49bool test_serialization_with_parameters() {
50 query_request request;
51 request.operation = query_operation::SELECT;
52 request.query_string = "SELECT * FROM users WHERE id = ? AND name = ?";
53 request.parameters = {"123", "John Doe"};
54
55 auto serialized = container_protocol_serializer::serialize_container(request);
56 TEST_ASSERT(serialized.size() > 0, "Serialized data should not be empty");
57
58 TEST_SUCCESS("Serialization with parameters: " << serialized.size() << " bytes");
59 return true;
60}
61
62bool test_round_trip_simple() {
63 query_request original;
64 original.operation = query_operation::INSERT;
65 original.query_string = "INSERT INTO users VALUES (?, ?)";
66 original.parameters = {};
67
68 auto serialized = container_protocol_serializer::serialize_container(original);
69 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
70
71 TEST_ASSERT(result.is_ok(), "Deserialization should succeed");
72
73 auto recovered = result.value();
74 TEST_ASSERT(recovered.operation == original.operation, "Operation should match");
75 TEST_ASSERT(recovered.query_string == original.query_string, "Query string should match");
76 TEST_ASSERT(recovered.parameters.size() == original.parameters.size(), "Parameter count should match");
77
78 TEST_SUCCESS("Round-trip (simple)");
79 return true;
80}
81
82bool test_round_trip_with_parameters() {
83 query_request original;
84 original.operation = query_operation::SELECT;
85 original.query_string = "UPDATE users SET name = ? WHERE id = ?";
86 original.parameters = {"Alice", "456"};
87
88 auto serialized = container_protocol_serializer::serialize_container(original);
89 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
90
91 TEST_ASSERT(result.is_ok(), "Deserialization should succeed");
92
93 auto recovered = result.value();
94 TEST_ASSERT(recovered.operation == original.operation, "Operation should match");
95 TEST_ASSERT(recovered.query_string == original.query_string, "Query string should match");
96 TEST_ASSERT(recovered.parameters.size() == original.parameters.size(), "Parameter count should match");
97
98 for (size_t i = 0; i < original.parameters.size(); ++i) {
99 TEST_ASSERT(recovered.parameters[i] == original.parameters[i],
100 "Parameter " << i << " should match");
101 }
102
103 TEST_SUCCESS("Round-trip (with parameters)");
104 return true;
105}
106
107bool test_special_characters() {
108 query_request original;
109 original.operation = query_operation::SELECT;
110 original.query_string = "SELECT * FROM users WHERE name LIKE ?";
111 original.parameters = {"O'Brien", "50%", "tab\tchar", "newline\nchar"};
112
113 auto serialized = container_protocol_serializer::serialize_container(original);
114 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
115
116 TEST_ASSERT(result.is_ok(), "Deserialization with special chars should succeed");
117
118 auto recovered = result.value();
119 for (size_t i = 0; i < original.parameters.size(); ++i) {
120 TEST_ASSERT(recovered.parameters[i] == original.parameters[i],
121 "Special character parameter " << i << " should match");
122 }
123
124 TEST_SUCCESS("Special characters handled correctly");
125 return true;
126}
127
128bool test_many_parameters() {
129 query_request original;
130 original.operation = query_operation::SELECT;
131 original.query_string = "BULK INSERT";
132
133 for (int i = 0; i < 100; ++i) {
134 original.parameters.push_back("param_" + std::to_string(i));
135 }
136
137 auto serialized = container_protocol_serializer::serialize_container(original);
138 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
139
140 TEST_ASSERT(result.is_ok(), "Deserialization with 100 params should succeed");
141
142 auto recovered = result.value();
143 TEST_ASSERT(recovered.parameters.size() == 100, "Should have 100 parameters");
144
145 for (size_t i = 0; i < 100; ++i) {
146 TEST_ASSERT(recovered.parameters[i] == "param_" + std::to_string(i),
147 "Parameter " << i << " should match");
148 }
149
150 TEST_SUCCESS("100 parameters handled correctly");
151 return true;
152}
153
154bool test_json_serialization() {
155 query_request request;
156 request.operation = query_operation::SELECT;
157 request.query_string = "SELECT * FROM test";
158 request.parameters = {"value1", "value2"};
159
160 auto json = container_protocol_serializer::serialize_to_json(request);
161
162 TEST_ASSERT(json.size() > 0, "JSON should not be empty");
163 TEST_ASSERT(json.find("query_request") != std::string::npos, "JSON should contain message type");
164 TEST_ASSERT(json.find("query_string") != std::string::npos, "JSON should contain query_string");
165
166 std::cout << "JSON output sample:\n" << json.substr(0, 200) << "..." << std::endl;
167 TEST_SUCCESS("JSON serialization");
168 return true;
169}
170
171bool test_invalid_data() {
172 std::vector<uint8_t> invalid_data = {0x00, 0x01, 0x02, 0x03};
173
174 auto result = container_protocol_serializer::deserialize_container_query_request(invalid_data);
175
176 TEST_ASSERT(result.is_err(), "Invalid data should return error");
177 TEST_SUCCESS("Invalid data correctly rejected");
178 return true;
179}
180
181void performance_test() {
182 std::cout << "\n=== Performance Test ===" << std::endl;
183
184 query_request request;
185 request.operation = query_operation::SELECT;
186 request.query_string = "SELECT * FROM performance_test WHERE id = ?";
187 request.parameters = {"test_value"};
188
189 const int iterations = 10000;
190
191 // Serialization performance
192 auto start = std::chrono::high_resolution_clock::now();
193 for (int i = 0; i < iterations; ++i) {
194 auto serialized = container_protocol_serializer::serialize_container(request);
195 volatile size_t size = serialized.size();
196 (void)size;
197 }
198 auto end = std::chrono::high_resolution_clock::now();
199 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
200
201 double ops_per_sec = (iterations * 1000000.0) / duration.count();
202 double us_per_op = duration.count() / static_cast<double>(iterations);
203
204 std::cout << "Container serialization:" << std::endl;
205 std::cout << " " << iterations << " iterations in " << duration.count() << " μs" << std::endl;
206 std::cout << " " << static_cast<int>(ops_per_sec) << " ops/sec" << std::endl;
207 std::cout << " " << us_per_op << " μs/op" << std::endl;
208
209 // Round-trip performance
210 start = std::chrono::high_resolution_clock::now();
211 for (int i = 0; i < iterations; ++i) {
212 auto serialized = container_protocol_serializer::serialize_container(request);
213 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
214 volatile bool ok = result.is_ok();
215 (void)ok;
216 }
217 end = std::chrono::high_resolution_clock::now();
218 duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
219
220 ops_per_sec = (iterations * 1000000.0) / duration.count();
221 us_per_op = duration.count() / static_cast<double>(iterations);
222
223 std::cout << "\nRound-trip (serialize + deserialize):" << std::endl;
224 std::cout << " " << iterations << " iterations in " << duration.count() << " μs" << std::endl;
225 std::cout << " " << static_cast<int>(ops_per_sec) << " ops/sec" << std::endl;
226 std::cout << " " << us_per_op << " μs/op" << std::endl;
227}
228
229int main() {
230 std::cout << "=== Container Protocol Phase 1 POC Validation ===" << std::endl;
231 std::cout << std::endl;
232
233 int passed = 0;
234 int total = 0;
235
236 #define RUN_TEST(test_func) \
237 do { \
238 total++; \
239 if (test_func()) { \
240 passed++; \
241 } else { \
242 std::cerr << "Test failed: " #test_func << std::endl; \
243 } \
244 } while(0)
245
246 RUN_TEST(test_basic_serialization);
247 RUN_TEST(test_serialization_with_parameters);
248 RUN_TEST(test_round_trip_simple);
249 RUN_TEST(test_round_trip_with_parameters);
250 RUN_TEST(test_special_characters);
251 RUN_TEST(test_many_parameters);
252 RUN_TEST(test_json_serialization);
253 RUN_TEST(test_invalid_data);
254
255 std::cout << "\n=== Test Summary ===" << std::endl;
256 std::cout << "Passed: " << passed << "/" << total << std::endl;
257
258 if (passed == total) {
259 std::cout << "✅ All tests passed!" << std::endl;
260 performance_test();
261 return 0;
262 } else {
263 std::cout << "❌ Some tests failed" << std::endl;
264 return 1;
265 }
266}
267
268#else
269int main() {
270 std::cerr << "Container system not enabled. Compile with -DUSE_CONTAINER_SYSTEM=ON" << std::endl;
271 return 1;
272}
273#endif // USE_CONTAINER_SYSTEM
bool is_ok() const
VoidResult ok()
std::vector< std::string > parameters
int main()
Standalone test for container protocol (Phase 1 POC Validation)
#define RUN_TEST(name)
#define TEST_ASSERT(condition, message)