contrib: force (de)serialization to create params section incase there is none.

Co-authored-by: Boog900 <boog900@tutanota.com>
This commit is contained in:
0xFFFC0000 2024-12-13 19:49:55 +00:00
parent 58a1d54a4f
commit 13df862535
2 changed files with 75 additions and 0 deletions

View File

@ -171,6 +171,13 @@
epee::serialization::store_t_to_json(static_cast<epee::json_rpc::error_response&>(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"

View File

@ -29,8 +29,11 @@
#include <cstdint>
#include <gtest/gtest.h>
#include <vector>
#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<typename t_param>
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<ObjWithOptChild> 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<ObjWithOptChild> 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<ObjWithOptChild> 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<ObjWithOptChild> o4;
std::string o4_json = "{\"params\": {}}";
EXPECT_TRUE(epee::serialization::load_t_from_json(o4, o4_json));
EXPECT_TRUE(o4.params.test_value);
}