diff --git a/contrib/epee/include/net/http_server_handlers_map2.h b/contrib/epee/include/net/http_server_handlers_map2.h index ffb3f3b7ea5..8d68f041b0c 100644 --- a/contrib/epee/include/net/http_server_handlers_map2.h +++ b/contrib/epee/include/net/http_server_handlers_map2.h @@ -171,6 +171,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 f466306155f..5e5b6e40fac 100644 --- a/tests/unit_tests/epee_serialization.cpp +++ b/tests/unit_tests/epee_serialization.cpp @@ -29,8 +29,11 @@ #include #include +#include +#include "serialization/keyvalue_serialization.h" #include "storages/portable_storage.h" +#include "storages/portable_storage_template_helper.h" #include "span.h" TEST(epee_binary, two_keys) @@ -54,3 +57,68 @@ TEST(epee_binary, duplicate_key) epee::serialization::portable_storage storage{}; EXPECT_FALSE(storage.load_from_binary(data)); } + +namespace +{ + +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); +}