From d8c46679ec4e30badd7e188764be0c548479b32b Mon Sep 17 00:00:00 2001 From: 0xFFFC0000 <0xFFFC0000@proton.me> Date: Fri, 15 Nov 2024 22:25:15 +0000 Subject: [PATCH] contrib: fix serialization not calling load when only child is opt --- .../keyvalue_serialization_overloads.h | 1 - tests/unit_tests/epee_serialization.cpp | 61 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/contrib/epee/include/serialization/keyvalue_serialization_overloads.h b/contrib/epee/include/serialization/keyvalue_serialization_overloads.h index b637df5b097..dd416e46642 100644 --- a/contrib/epee/include/serialization/keyvalue_serialization_overloads.h +++ b/contrib/epee/include/serialization/keyvalue_serialization_overloads.h @@ -77,7 +77,6 @@ namespace epee static bool unserialize_t_obj(serializible_type& obj, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname) { typename t_storage::hsection hchild_section = stg.open_section(pname, hparent_section, false); - if(!hchild_section) return false; return obj._load(stg, hchild_section); } //------------------------------------------------------------------------------------------------------------------- diff --git a/tests/unit_tests/epee_serialization.cpp b/tests/unit_tests/epee_serialization.cpp index e81f00cd794..fbc50bab3da 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 case with empty json, to test default value initialization + ParentObjWithOptChild o4; + std::string o4_json = "{}"; + + EXPECT_TRUE(epee::serialization::load_t_from_json(o4, o4_json)); + EXPECT_TRUE(o4.params.test_value); } TEST(epee_binary, any_empty_seq)