12#ifdef USE_CONTAINER_SYSTEM
27#define TEST_ASSERT(condition, message) \
29 std::cerr << "❌ FAILED: " << message << std::endl; \
33#define TEST_SUCCESS(message) \
34 std::cout << "✓ " << message << std::endl;
36bool test_basic_serialization() {
38 request.
operation = query_operation::SELECT;
42 auto serialized = container_protocol_serializer::serialize_container(request);
43 TEST_ASSERT(serialized.size() > 0,
"Serialized data should not be empty");
45 TEST_SUCCESS(
"Basic serialization: " << serialized.size() <<
" bytes");
49bool test_serialization_with_parameters() {
51 request.
operation = query_operation::SELECT;
52 request.
query_string =
"SELECT * FROM users WHERE id = ? AND name = ?";
55 auto serialized = container_protocol_serializer::serialize_container(request);
56 TEST_ASSERT(serialized.size() > 0,
"Serialized data should not be empty");
58 TEST_SUCCESS(
"Serialization with parameters: " << serialized.size() <<
" bytes");
62bool test_round_trip_simple() {
64 original.
operation = query_operation::INSERT;
65 original.
query_string =
"INSERT INTO users VALUES (?, ?)";
68 auto serialized = container_protocol_serializer::serialize_container(original);
69 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
71 TEST_ASSERT(result.is_ok(),
"Deserialization should succeed");
73 auto recovered = result.value();
76 TEST_ASSERT(recovered.parameters.size() == original.
parameters.size(),
"Parameter count should match");
78 TEST_SUCCESS(
"Round-trip (simple)");
82bool test_round_trip_with_parameters() {
84 original.
operation = query_operation::SELECT;
85 original.
query_string =
"UPDATE users SET name = ? WHERE id = ?";
88 auto serialized = container_protocol_serializer::serialize_container(original);
89 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
91 TEST_ASSERT(result.is_ok(),
"Deserialization should succeed");
93 auto recovered = result.value();
96 TEST_ASSERT(recovered.parameters.size() == original.
parameters.size(),
"Parameter count should match");
98 for (
size_t i = 0; i < original.
parameters.size(); ++i) {
100 "Parameter " << i <<
" should match");
103 TEST_SUCCESS(
"Round-trip (with parameters)");
107bool test_special_characters() {
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"};
113 auto serialized = container_protocol_serializer::serialize_container(original);
114 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
116 TEST_ASSERT(result.is_ok(),
"Deserialization with special chars should succeed");
118 auto recovered = result.value();
119 for (
size_t i = 0; i < original.
parameters.size(); ++i) {
121 "Special character parameter " << i <<
" should match");
124 TEST_SUCCESS(
"Special characters handled correctly");
128bool test_many_parameters() {
130 original.
operation = query_operation::SELECT;
133 for (
int i = 0; i < 100; ++i) {
134 original.
parameters.push_back(
"param_" + std::to_string(i));
137 auto serialized = container_protocol_serializer::serialize_container(original);
138 auto result = container_protocol_serializer::deserialize_container_query_request(serialized);
140 TEST_ASSERT(result.is_ok(),
"Deserialization with 100 params should succeed");
142 auto recovered = result.value();
143 TEST_ASSERT(recovered.parameters.size() == 100,
"Should have 100 parameters");
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");
150 TEST_SUCCESS(
"100 parameters handled correctly");
154bool test_json_serialization() {
156 request.
operation = query_operation::SELECT;
160 auto json = container_protocol_serializer::serialize_to_json(request);
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");
166 std::cout <<
"JSON output sample:\n" << json.substr(0, 200) <<
"..." << std::endl;
167 TEST_SUCCESS(
"JSON serialization");
171bool test_invalid_data() {
172 std::vector<uint8_t> invalid_data = {0x00, 0x01, 0x02, 0x03};
174 auto result = container_protocol_serializer::deserialize_container_query_request(invalid_data);
176 TEST_ASSERT(result.is_err(),
"Invalid data should return error");
177 TEST_SUCCESS(
"Invalid data correctly rejected");
181void performance_test() {
182 std::cout <<
"\n=== Performance Test ===" << std::endl;
185 request.
operation = query_operation::SELECT;
186 request.
query_string =
"SELECT * FROM performance_test WHERE id = ?";
189 const int iterations = 10000;
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();
198 auto end = std::chrono::high_resolution_clock::now();
199 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
201 double ops_per_sec = (iterations * 1000000.0) / duration.count();
202 double us_per_op = duration.count() /
static_cast<double>(iterations);
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;
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();
217 end = std::chrono::high_resolution_clock::now();
218 duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
220 ops_per_sec = (iterations * 1000000.0) / duration.count();
221 us_per_op = duration.count() /
static_cast<double>(iterations);
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;
230 std::cout <<
"=== Container Protocol Phase 1 POC Validation ===" << std::endl;
231 std::cout << std::endl;
236 #define RUN_TEST(test_func) \
242 std::cerr << "Test failed: " #test_func << std::endl; \
247 RUN_TEST(test_serialization_with_parameters);
249 RUN_TEST(test_round_trip_with_parameters);
255 std::cout <<
"\n=== Test Summary ===" << std::endl;
256 std::cout <<
"Passed: " << passed <<
"/" << total << std::endl;
258 if (passed == total) {
259 std::cout <<
"✅ All tests passed!" << std::endl;
263 std::cout <<
"❌ Some tests failed" << std::endl;
270 std::cerr <<
"Container system not enabled. Compile with -DUSE_CONTAINER_SYSTEM=ON" << std::endl;
query_operation operation
std::vector< std::string > parameters
int main()
Standalone test for container protocol (Phase 1 POC Validation)
#define TEST_ASSERT(condition, message)