osrm-backend/unit_tests/util/serialization.cpp
2024-06-20 21:44:28 +02:00

120 lines
4.2 KiB
C++

#include "util/serialization.hpp"
#include "../common/range_tools.hpp"
#include "../common/temporary_file.hpp"
#include <boost/test/unit_test.hpp>
#include <filesystem>
BOOST_AUTO_TEST_SUITE(serialization)
using namespace osrm;
using namespace osrm::util;
BOOST_AUTO_TEST_CASE(tar_serialize_range_table)
{
TemporaryFile tmp;
{
constexpr unsigned BLOCK_SIZE = 16;
using TestRangeTable = RangeTable<BLOCK_SIZE, osrm::storage::Ownership::Container>;
std::vector<std::vector<unsigned>> data = {std::vector<unsigned>{0, 10, 24, 100, 2, 100},
std::vector<unsigned>{1, 12, 15},
std::vector<unsigned>{10, 10, 10}};
for (const auto &v : data)
{
TestRangeTable reference{v};
{
storage::tar::FileWriter writer(tmp.path,
storage::tar::FileWriter::GenerateFingerprint);
util::serialization::write(writer, "my_range_table", reference);
}
TestRangeTable result;
storage::tar::FileReader reader(tmp.path, storage::tar::FileReader::VerifyFingerprint);
util::serialization::read(reader, "my_range_table", result);
for (auto index : util::irange<std::size_t>(0, v.size()))
{
CHECK_EQUAL_COLLECTIONS(result.GetRange(index), reference.GetRange(index));
}
}
}
}
BOOST_AUTO_TEST_CASE(tar_serialize_packed_vector)
{
TemporaryFile tmp;
{
using TestPackedVector = PackedVector<std::uint64_t, 33>;
std::vector<TestPackedVector> data = {{1597322404,
1939964443,
2112255763,
1432114613,
1067854538,
352118606,
1782436840,
1909002904,
165344818},
{0, 1, 2, 3}};
for (const auto &v : data)
{
{
storage::tar::FileWriter writer(tmp.path,
storage::tar::FileWriter::GenerateFingerprint);
util::serialization::write(writer, "my_packed_vector", v);
}
TestPackedVector result;
storage::tar::FileReader reader(tmp.path, storage::tar::FileReader::VerifyFingerprint);
util::serialization::read(reader, "my_packed_vector", result);
CHECK_EQUAL_COLLECTIONS(result, v);
}
}
}
BOOST_AUTO_TEST_CASE(tar_serialize_variable_indexed_data)
{
TemporaryFile tmp;
{
using TestIndexedData = IndexedData<VariableGroupBlock<16, std::string>>;
std::vector<std::vector<unsigned>> offset_data = {
{5, 8, 8},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}};
std::vector<std::string> char_data = {
"HalloFoo",
"ABCDEFGHIJKLMNOPQR",
"ABCDEFGHIJKLMNOP",
};
for (const auto i : util::irange<std::size_t>(0, offset_data.size()))
{
TestIndexedData indexed{
offset_data[i].begin(), offset_data[i].end(), char_data[i].begin()};
{
storage::tar::FileWriter writer(tmp.path,
storage::tar::FileWriter::GenerateFingerprint);
util::serialization::write(writer, "my_indexed_data", indexed);
}
TestIndexedData result;
storage::tar::FileReader reader(tmp.path, storage::tar::FileReader::VerifyFingerprint);
util::serialization::read(reader, "my_indexed_data", result);
for (auto j : util::irange<std::size_t>(0, offset_data[i].size() - 1))
{
BOOST_CHECK_EQUAL(indexed.at(j), result.at(j));
}
}
}
}
BOOST_AUTO_TEST_SUITE_END()