5#ifdef USE_CONTAINER_SYSTEM
7#include <gtest/gtest.h>
25class ContainerProtocolTest :
public ::testing::Test {
27 void SetUp()
override {
31 void TearDown()
override {
39TEST_F(ContainerProtocolTest, SerializeBasicQueryRequest) {
41 request.
operation = query_operation::SELECT;
46 auto serialized = container_protocol_serializer::serialize_container(request);
49 EXPECT_GT(serialized.size(), 0u);
51 std::cout <<
"Serialized " << request.
query_string <<
" to "
52 << serialized.size() <<
" bytes" << std::endl;
58TEST_F(ContainerProtocolTest, SerializeQueryRequestWithParameters) {
60 request.
operation = query_operation::SELECT;
61 request.
query_string =
"SELECT * FROM users WHERE id = ? AND name = ?";
64 auto serialized = container_protocol_serializer::serialize_container(request);
66 EXPECT_GT(serialized.size(), 0u);
68 std::cout <<
"Serialized query with " << request.
parameters.size()
69 <<
" parameters to " << serialized.size() <<
" bytes" << std::endl;
75TEST_F(ContainerProtocolTest, DeserializeBasicQueryRequest) {
78 original.
operation = query_operation::INSERT;
79 original.
query_string =
"INSERT INTO users VALUES (?, ?)";
84 container_protocol_serializer::serialize_container(original);
88 container_protocol_serializer::deserialize_container_query_request(
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());
99 std::cout <<
"Successfully deserialized: " << deserialized.query_string
106TEST_F(ContainerProtocolTest, DeserializeQueryRequestWithParameters) {
108 original.
operation = query_operation::UPDATE;
109 original.
query_string =
"UPDATE users SET name = ? WHERE id = ?";
113 container_protocol_serializer::serialize_container(original);
115 container_protocol_serializer::deserialize_container_query_request(
120 auto deserialized = result.unwrap();
121 EXPECT_EQ(deserialized.operation, original.
operation);
122 EXPECT_EQ(deserialized.query_string, original.
query_string);
125 for (
size_t i = 0; i < original.
parameters.size(); ++i) {
126 EXPECT_EQ(deserialized.parameters[i], original.
parameters[i]);
129 std::cout <<
"Successfully deserialized query with "
130 << deserialized.parameters.size() <<
" parameters" << std::endl;
136TEST_F(ContainerProtocolTest, RoundTripSimple) {
138 original.
operation = query_operation::SELECT;
144 container_protocol_serializer::serialize_container(original);
146 container_protocol_serializer::deserialize_container_query_request(
150 auto recovered = result.unwrap();
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());
157 std::cout <<
"â Round-trip integrity verified (simple)" << std::endl;
163TEST_F(ContainerProtocolTest, RoundTripComplex) {
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"};
171 container_protocol_serializer::serialize_container(original);
173 container_protocol_serializer::deserialize_container_query_request(
177 auto recovered = result.unwrap();
179 EXPECT_EQ(recovered.operation, original.
operation);
180 EXPECT_EQ(recovered.query_string, original.
query_string);
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;
188 std::cout <<
"â Round-trip integrity verified (complex, "
189 << original.
parameters.size() <<
" parameters)" << std::endl;
195TEST_F(ContainerProtocolTest, RoundTripSpecialCharacters) {
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"};
202 container_protocol_serializer::serialize_container(original);
204 container_protocol_serializer::deserialize_container_query_request(
208 auto recovered = result.unwrap();
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;
216 std::cout <<
"â Special characters handled correctly" << std::endl;
222TEST_F(ContainerProtocolTest, EmptyQueryString) {
224 original.
operation = query_operation::SELECT;
229 container_protocol_serializer::serialize_container(original);
231 container_protocol_serializer::deserialize_container_query_request(
235 auto recovered = result.unwrap();
237 EXPECT_EQ(recovered.query_string,
"");
238 std::cout <<
"â Empty query string handled" << std::endl;
244TEST_F(ContainerProtocolTest, ManyParameters) {
246 original.
operation = query_operation::SELECT;
250 for (
int i = 0; i < 100; ++i) {
251 original.
parameters.push_back(
"param_" + std::to_string(i));
255 container_protocol_serializer::serialize_container(original);
257 container_protocol_serializer::deserialize_container_query_request(
261 auto recovered = result.unwrap();
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));
268 std::cout <<
"â 100 parameters handled correctly" << std::endl;
274TEST_F(ContainerProtocolTest, JSONSerialization) {
276 request.
operation = query_operation::SELECT;
280 auto json = container_protocol_serializer::serialize_to_json(request);
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);
287 std::cout <<
"JSON output:\n" << json << std::endl;
293TEST_F(ContainerProtocolTest, DeserializeInvalidData) {
294 std::vector<uint8_t> invalid_data = {0x00, 0x01, 0x02, 0x03};
297 container_protocol_serializer::deserialize_container_query_request(
301 EXPECT_TRUE(result.is_err());
303 if (result.is_err()) {
304 std::cout <<
"â Invalid data correctly rejected: " << result.error().message
312TEST_F(ContainerProtocolTest, AllQueryOperations) {
313 std::vector<query_operation> operations = {
314 query_operation::SELECT, query_operation::INSERT, query_operation::UPDATE,
315 query_operation::DELETE};
317 for (
auto op : operations) {
324 container_protocol_serializer::serialize_container(original);
326 container_protocol_serializer::deserialize_container_query_request(
330 EXPECT_EQ(result.unwrap().operation, op);
333 std::cout <<
"â All query operations verified" << std::endl;
339TEST_F(ContainerProtocolTest, PerformanceIndicator) {
341 request.
operation = query_operation::SELECT;
342 request.
query_string =
"SELECT * FROM performance_test WHERE id = ?";
345 const int iterations = 10000;
347 auto start = std::chrono::high_resolution_clock::now();
349 for (
int i = 0; i < iterations; ++i) {
351 container_protocol_serializer::serialize_container(request);
353 volatile size_t size = serialized.size();
357 auto end = std::chrono::high_resolution_clock::now();
359 std::chrono::duration_cast<std::chrono::microseconds>(end - start);
361 double ops_per_sec = (iterations * 1000000.0) / duration.count();
362 double us_per_op = duration.count() /
static_cast<double>(iterations);
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;
372 EXPECT_GT(ops_per_sec, 100000.0) <<
"Performance below expectations";
374 EXPECT_GT(ops_per_sec, 10000.0)
375 <<
"Performance below expectations (Debug build)";
query_operation operation
std::vector< std::string > parameters
TEST_F(AsyncResultTest, ConstructsFromFuture)
#define ASSERT_EQ(expected, actual, message)
#define ASSERT_TRUE(condition, message)