Commit ff277dce authored by Jakob Otto's avatar Jakob Otto

Refactor ipv6_endpoint tests

parent 558571e5
......@@ -64,7 +64,7 @@ struct fixture {
if (auto err = sink(x))
CAF_FAIL("serialization failed: " << sys.render(err));
binary_deserializer source(sys, make_span(buf));
ipv4_endpoint y;
T y;
if (auto err = source(y))
CAF_FAIL("deserialization failed: " << sys.render(err));
return y;
......
......@@ -22,6 +22,7 @@
#include "caf/test/unit_test.hpp"
#include <cassert>
#include <vector>
#include "caf/actor_system.hpp"
......@@ -36,91 +37,90 @@ using namespace caf;
namespace {
struct test_data {
using comparison_testcase = std::pair<ipv6_endpoint, ipv6_endpoint>;
using to_string_testcase = std::pair<ipv6_endpoint, std::string>;
using addr_bytes = ipv6_address::array_type;
test_data() {
// different ip but same port
add(make_ipv6_endpoint({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
8888),
make_ipv6_endpoint({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
8888));
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 0, 13, 0, 0, 0, 237, 0, 0, 0, 0, 1},
8888),
make_ipv6_endpoint({1, 0, 0, 0, 9, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 2},
8888));
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 255, 13, 0, 0, 0, 237, 0, 0, 0, 0,
17},
8888),
make_ipv6_endpoint({1, 0, 0, 0, 9, 0, 0, 0, 0, 27, 0, 0, 0, 255, 0, 3},
8888));
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 0, 13, 0, 0, 0, 237, 0, 0, 0, 0, 1},
8888),
make_ipv6_endpoint({1, 0, 0, 0, 9, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 2},
8888));
// same ip but different port
add(make_ipv6_endpoint({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
1111),
make_ipv6_endpoint({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
8888));
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 0, 13, 0, 0, 0, 237, 0, 0, 0, 0, 1},
1234),
make_ipv6_endpoint({0, 78, 0, 0, 0, 0, 13, 0, 0, 0, 237, 0, 0, 0, 0, 1},
5678));
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 255, 13, 0, 0, 0, 237, 0, 0, 0, 0,
17},
5678),
make_ipv6_endpoint({0, 78, 0, 0, 0, 255, 13, 0, 0, 0, 237, 0, 0, 0, 0,
17},
12345));
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 0, 13, 0, 0, 0, 237, 0, 0, 0, 0, 1},
8888),
make_ipv6_endpoint({0, 78, 0, 0, 0, 0, 13, 0, 0, 0, 237, 0, 0, 0, 0, 1},
9999));
// String test-data
add(make_ipv6_endpoint({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
1111),
"[::1]:1111");
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 0, 13, 0, 0, 0, 237, 0, 0, 0, 0, 1},
1234),
"[4e::d00:0:ed00:0:1]:1234");
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 255, 13, 0, 0, 0, 237, 0, 0, 0, 0,
17},
2345),
"[4e:0:ff:d00:0:ed00:0:11]:2345");
add(make_ipv6_endpoint({0, 78, 0, 0, 0, 0, 13, 0, 0, 0, 237, 0, 0, 0, 0, 1},
1234),
"[4e::d00:0:ed00:0:1]:1234");
ipv6_endpoint operator"" _ep(const char* str, size_t) {
union {
std::array<uint8_t, 16> xs_bytes;
std::array<uint16_t, 8> xs;
};
union {
std::array<uint8_t, 16> ys_bytes;
std::array<uint16_t, 8> ys;
};
memset(xs_bytes.data(), 0, xs_bytes.size());
memset(ys_bytes.data(), 0, xs_bytes.size());
assert(*str == '[');
++str;
char* next = nullptr;
auto pull = [&] {
auto x = static_cast<uint16_t>(strtol(str, &next, 16));
return detail::to_network_order(x);
};
size_t n = 0;
do {
xs[n++] = pull();
assert(next != nullptr);
str = next + 1;
} while (*str != ':' && *str != ']');
if (*str == ':') {
++str;
do {
ys[0] = pull();
std::rotate(ys.begin(), ys.begin() + 1, ys.end());
assert(next != nullptr);
str = next + 1;
} while (*next != ']');
}
assert(*next == ']');
assert(*str == ':');
++str;
auto port = static_cast<uint16_t>(strtol(str, nullptr, 10));
std::array<uint8_t, 16> bytes;
for (size_t i = 0; i < 16; ++i)
bytes[i] = xs_bytes[i] | ys_bytes[i];
return ipv6_endpoint{ipv6_address{bytes}, port};
}
// First endpoint is always smaller than the second.
std::vector<comparison_testcase> comparison_testdata;
std::vector<to_string_testcase> to_string_testdata;
struct fixture {
actor_system_config cfg;
actor_system sys{cfg};
ipv6_endpoint make_ipv6_endpoint(addr_bytes bytes, uint16_t port) {
return ipv6_endpoint{ipv6_address{bytes}, port};
template <class T>
T roundtrip(T x) {
using container_type = std::vector<byte>;
container_type buf;
serializer_impl<container_type> sink(sys, buf);
if (auto err = sink(x))
CAF_FAIL("serialization failed: " << sys.render(err));
binary_deserializer source(sys, make_span(buf));
T y;
if (auto err = source(y))
CAF_FAIL("deserialization failed: " << sys.render(err));
return y;
}
};
private:
// Convenience functions for adding testcases.
void add(ipv6_endpoint ep1, ipv6_endpoint ep2) {
comparison_testdata.emplace_back(comparison_testcase{ep1, ep2});
}
#define CHECK_TO_STRING(addr) CAF_CHECK_EQUAL(addr, to_string(addr##_ep))
void add(ipv6_endpoint ep, const std::string& str) {
to_string_testdata.emplace_back(to_string_testcase{ep, str});
}
};
#define CHECK_COMPARISON(addr1, addr2) \
CAF_CHECK_GREATER(addr2##_ep, addr1##_ep); \
CAF_CHECK_GREATER_OR_EQUAL(addr2##_ep, addr1##_ep); \
CAF_CHECK_GREATER_OR_EQUAL(addr1##_ep, addr1##_ep); \
CAF_CHECK_GREATER_OR_EQUAL(addr2##_ep, addr2##_ep); \
CAF_CHECK_EQUAL(addr1##_ep, addr1##_ep); \
CAF_CHECK_EQUAL(addr2##_ep, addr2##_ep); \
CAF_CHECK_LESS_OR_EQUAL(addr1##_ep, addr2##_ep); \
CAF_CHECK_LESS_OR_EQUAL(addr1##_ep, addr1##_ep); \
CAF_CHECK_LESS_OR_EQUAL(addr2##_ep, addr2##_ep); \
CAF_CHECK_NOT_EQUAL(addr1##_ep, addr2##_ep); \
CAF_CHECK_NOT_EQUAL(addr2##_ep, addr1##_ep);
struct test_fixture : public test_data {
actor_system_config cfg;
actor_system sys{cfg};
};
#define CHECK_SERIALIZATION(addr) \
CAF_CHECK_EQUAL(addr##_ep, roundtrip(addr##_ep))
} // namespace
CAF_TEST_FIXTURE_SCOPE(comparison_scope, fixture)
CAF_TEST(constructing assigning and hash_code) {
const uint16_t port = 8888;
ipv6_address::array_type bytes{0, 0, 0, 0, 0, 0, 0, 0,
......@@ -138,45 +138,47 @@ CAF_TEST(constructing assigning and hash_code) {
CAF_CHECK_EQUAL(ep1.hash_code(), ep2.hash_code());
}
CAF_TEST_FIXTURE_SCOPE(comparison_scope, test_fixture)
CAF_TEST(to_string) {
for (auto& testcase : to_string_testdata)
CAF_CHECK_EQUAL(to_string(testcase.first), testcase.second);
CHECK_TO_STRING("[::1]:8888");
CHECK_TO_STRING("[4e::d00:0:ed00:0:1]:1234");
CHECK_TO_STRING("[::1]:1111");
CHECK_TO_STRING("[4432::33:1]:8732");
CHECK_TO_STRING("[::2]:8888");
CHECK_TO_STRING("[4f::d00:12:ed00:0:1]:1234");
CHECK_TO_STRING("[4f::1]:2222");
CHECK_TO_STRING("[4432:8d::33:1]:8732");
CHECK_TO_STRING("[4e::d00:0:ed00:0:1]:5678");
CHECK_TO_STRING("[::1]:2221");
CHECK_TO_STRING("[::1]:2222");
CHECK_TO_STRING("[4432::33:1]:872");
CHECK_TO_STRING("[4432::33:1]:999");
}
CAF_TEST(comparison) {
for (auto testcase : comparison_testdata) {
// First member of this pair is always smaller than the second one.
auto ep1 = testcase.first;
auto ep2 = testcase.second;
CAF_CHECK_GREATER(ep2, ep1);
CAF_CHECK_GREATER_OR_EQUAL(ep2, ep1);
CAF_CHECK_GREATER_OR_EQUAL(ep1, ep1);
CAF_CHECK_GREATER_OR_EQUAL(ep2, ep2);
CAF_CHECK_EQUAL(ep1, ep1);
CAF_CHECK_EQUAL(ep2, ep2);
CAF_CHECK_LESS_OR_EQUAL(ep1, ep2);
CAF_CHECK_LESS_OR_EQUAL(ep1, ep1);
CAF_CHECK_LESS_OR_EQUAL(ep2, ep2);
CAF_CHECK_NOT_EQUAL(ep1, ep2);
CAF_CHECK_NOT_EQUAL(ep2, ep1);
}
CHECK_COMPARISON("[::1]:8888", "[::2]:8888");
CHECK_COMPARISON("[4e::d00:0:ed00:0:1]:1234", "[4f::d00:12:ed00:0:1]:1234");
CHECK_COMPARISON("[::1]:1111", "[4f::1]:2222");
CHECK_COMPARISON("[4432::33:1]:8732", "[4432:8d::33:1]:8732");
CHECK_COMPARISON("[::1]:1111", "[::1]:8888");
CHECK_COMPARISON("[4e::d00:0:ed00:0:1]:1234", "[4e::d00:0:ed00:0:1]:5678");
CHECK_COMPARISON("[::1]:2221", "[::1]:2222");
CHECK_COMPARISON("[4432::33:1]:872", "[4432::33:1]:999");
}
CAF_TEST(serialization) {
using container_type = std::vector<byte>;
for (auto& testcase : comparison_testdata) {
container_type buf;
serializer_impl<container_type> sink(sys, buf);
if (auto err = sink(testcase.first))
CAF_FAIL("serialization failed: " << sys.render(err));
binary_deserializer source(sys, make_span(buf));
ipv6_endpoint deserialized_data;
if (auto err = source(deserialized_data))
CAF_FAIL("deserialization failed: " << sys.render(err));
CAF_CHECK_EQUAL(testcase.first, deserialized_data);
}
CHECK_SERIALIZATION("[::1]:8888");
CHECK_SERIALIZATION("[4e::d00:0:ed00:0:1]:1234");
CHECK_SERIALIZATION("[::1]:1111");
CHECK_SERIALIZATION("[4432::33:1]:8732");
CHECK_SERIALIZATION("[::2]:8888");
CHECK_SERIALIZATION("[4f::d00:12:ed00:0:1]:1234");
CHECK_SERIALIZATION("[4f::1]:2222");
CHECK_SERIALIZATION("[4432:8d::33:1]:8732");
CHECK_SERIALIZATION("[4e::d00:0:ed00:0:1]:5678");
CHECK_SERIALIZATION("[::1]:2221");
CHECK_SERIALIZATION("[::1]:2222");
CHECK_SERIALIZATION("[4432::33:1]:872");
CHECK_SERIALIZATION("[4432::33:1]:999");
}
CAF_TEST_FIXTURE_SCOPE_END()
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment