From e9adafa49e771a6f168f4d02627300d3f67e9cc6 Mon Sep 17 00:00:00 2001 From: 0xFFFC0000 <0xFFFC0000@proton.me> Date: Sat, 16 Nov 2024 20:22:14 +0000 Subject: [PATCH] contrib: force (de)serialization to create params section incase there is none. Co-authored-by: Boog900 --- .../include/net/http_server_handlers_map2.h | 7 +++ tests/unit_tests/epee_serialization.cpp | 61 +++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/contrib/epee/include/net/http_server_handlers_map2.h b/contrib/epee/include/net/http_server_handlers_map2.h index 848b8ffc4..92aaa9500 100644 --- a/contrib/epee/include/net/http_server_handlers_map2.h +++ b/contrib/epee/include/net/http_server_handlers_map2.h @@ -165,6 +165,13 @@ epee::serialization::store_t_to_json(static_cast(rsp), response_info.m_body); \ return true; \ } \ + epee::serialization::storage_entry params_; \ + params_ = epee::serialization::storage_entry(epee::serialization::section()); \ + if(!ps.get_value("params", params_, nullptr)) \ + { \ + epee::serialization::section params_section; \ + ps.set_value("params", std::move(params_section), nullptr); \ + } \ if(false) return true; //just a stub to have "else if" diff --git a/tests/unit_tests/epee_serialization.cpp b/tests/unit_tests/epee_serialization.cpp index e81f00cd7..2cafc0e80 100644 --- a/tests/unit_tests/epee_serialization.cpp +++ b/tests/unit_tests/epee_serialization.cpp @@ -77,6 +77,67 @@ struct ObjOfInts KV_SERIALIZE(x) END_KV_SERIALIZE_MAP() }; + +template +struct ParentObjWithOptChild +{ + t_param params; + + ParentObjWithOptChild(): params{} {} + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(params) + END_KV_SERIALIZE_MAP() +}; + +struct ObjWithOptChild +{ + bool test_value; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE_OPT(test_value, true); + END_KV_SERIALIZE_MAP() +}; +} + +TEST(epee_binary, serialize_deserialize) +{ + ParentObjWithOptChild o; + std::string o_json; + o.params.test_value = true; + + EXPECT_TRUE(epee::serialization::store_t_to_json(o, o_json)); + EXPECT_TRUE(o.params.test_value); + + EXPECT_TRUE(epee::serialization::load_t_from_json(o, o_json)); + EXPECT_TRUE(o.params.test_value); + + ParentObjWithOptChild o2; + std::string o2_json; + o.params.test_value = false; + + EXPECT_TRUE(epee::serialization::store_t_to_json(o2, o2_json)); + EXPECT_FALSE(o2.params.test_value); + + EXPECT_TRUE(epee::serialization::load_t_from_json(o2, o2_json)); + EXPECT_FALSE(o2.params.test_value); + + // compiler sets default value of test_value to false + ParentObjWithOptChild o3; + std::string o3_json; + + EXPECT_TRUE(epee::serialization::store_t_to_json(o3, o3_json)); + EXPECT_FALSE(o3.params.test_value); + + EXPECT_TRUE(epee::serialization::load_t_from_json(o3, o3_json)); + EXPECT_FALSE(o3.params.test_value); + + // test optional field default initialization. + ParentObjWithOptChild o4; + std::string o4_json = "{\"params\": {}}"; + + EXPECT_TRUE(epee::serialization::load_t_from_json(o4, o4_json)); + EXPECT_TRUE(o4.params.test_value); } TEST(epee_binary, any_empty_seq)