Skip to content

Commit

Permalink
contrib: force (de)serialization to create params section incase ther…
Browse files Browse the repository at this point in the history
…e is none.

Co-authored-by: Boog900 <[email protected]>
  • Loading branch information
0xFFFC0000 committed Dec 13, 2024
1 parent 58a1d54 commit 4dde708
Show file tree
Hide file tree
Showing 2 changed files with 155 additions and 0 deletions.
7 changes: 7 additions & 0 deletions contrib/epee/include/net/http_server_handlers_map2.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"


Expand Down
148 changes: 148 additions & 0 deletions tests/unit_tests/epee_serialization.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -54,3 +57,148 @@ TEST(epee_binary, duplicate_key)
epee::serialization::portable_storage storage{};
EXPECT_FALSE(storage.load_from_binary(data));
}

namespace
{
struct ObjOfObjs
{
std::vector<ObjOfObjs> x;

BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(x)
END_KV_SERIALIZE_MAP()
};

struct ObjOfInts
{
std::list<int> x;

BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(x)
END_KV_SERIALIZE_MAP()
};

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);
}

TEST(epee_binary, any_empty_seq)
{
// Test that any c++ sequence type (std::vector, std::list, etc) can deserialize without error
// from an *empty* epee binary array of any type. This property is useful for other projects who
// maintain code which serializes epee binary but don't know the type of arrays until runtime.
// Without any elements to actually serialize, they don't know what type code to use for arrays
// and should be able to choose a default typecode.

static constexpr const std::uint8_t data_empty_bool[] = {
0x01, 0x11, 0x01, 0x1, 0x01, 0x01, 0x02, 0x1, 0x1, 0x04, 0x01, 'x', 0x8B /*array of bools*/, 0x00 /*length 0*/
};

static constexpr const std::uint8_t data_empty_double[] = {
0x01, 0x11, 0x01, 0x1, 0x01, 0x01, 0x02, 0x1, 0x1, 0x04, 0x01, 'x', 0x89 /*array of doubles*/, 0x00 /*length 0*/
};

static constexpr const std::uint8_t data_empty_string[] = {
0x01, 0x11, 0x01, 0x1, 0x01, 0x01, 0x02, 0x1, 0x1, 0x04, 0x01, 'x', 0x8A /*array of strings*/, 0x00 /*length 0*/
};

static constexpr const std::uint8_t data_empty_int64[] = {
0x01, 0x11, 0x01, 0x1, 0x01, 0x01, 0x02, 0x1, 0x1, 0x04, 0x01, 'x', 0x81 /*array of int64s*/, 0x00 /*length 0*/
};

static constexpr const std::uint8_t data_empty_object[] = {
0x01, 0x11, 0x01, 0x1, 0x01, 0x01, 0x02, 0x1, 0x1, 0x04, 0x01, 'x', 0x8C /*array of objects*/, 0x00 /*length 0*/
};

ObjOfObjs o;

EXPECT_TRUE(epee::serialization::load_t_from_binary(o, epee::span<const std::uint8_t>(data_empty_bool)));
EXPECT_EQ(0, o.x.size());

EXPECT_TRUE(epee::serialization::load_t_from_binary(o, epee::span<const std::uint8_t>(data_empty_double)));
EXPECT_EQ(0, o.x.size());

EXPECT_TRUE(epee::serialization::load_t_from_binary(o, epee::span<const std::uint8_t>(data_empty_string)));
EXPECT_EQ(0, o.x.size());

EXPECT_TRUE(epee::serialization::load_t_from_binary(o, epee::span<const std::uint8_t>(data_empty_int64)));
EXPECT_EQ(0, o.x.size());

EXPECT_TRUE(epee::serialization::load_t_from_binary(o, epee::span<const std::uint8_t>(data_empty_object)));
EXPECT_EQ(0, o.x.size());

ObjOfInts i;

EXPECT_TRUE(epee::serialization::load_t_from_binary(i, epee::span<const std::uint8_t>(data_empty_bool)));
EXPECT_EQ(0, i.x.size());

EXPECT_TRUE(epee::serialization::load_t_from_binary(i, epee::span<const std::uint8_t>(data_empty_double)));
EXPECT_EQ(0, i.x.size());

EXPECT_TRUE(epee::serialization::load_t_from_binary(i, epee::span<const std::uint8_t>(data_empty_string)));
EXPECT_EQ(0, i.x.size());

EXPECT_TRUE(epee::serialization::load_t_from_binary(i, epee::span<const std::uint8_t>(data_empty_int64)));
EXPECT_EQ(0, i.x.size());

EXPECT_TRUE(epee::serialization::load_t_from_binary(i, epee::span<const std::uint8_t>(data_empty_object)));
EXPECT_EQ(0, i.x.size());
}

0 comments on commit 4dde708

Please sign in to comment.