diff options
Diffstat (limited to 'tests/unit_tests')
-rw-r--r-- | tests/unit_tests/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/unit_tests/mul_div.cpp | 116 | ||||
-rw-r--r-- | tests/unit_tests/net.cpp | 9 | ||||
-rw-r--r-- | tests/unit_tests/node_server.cpp (renamed from tests/unit_tests/ban.cpp) | 37 |
4 files changed, 160 insertions, 4 deletions
diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt index cac1fa943..96825f54f 100644 --- a/tests/unit_tests/CMakeLists.txt +++ b/tests/unit_tests/CMakeLists.txt @@ -30,7 +30,6 @@ set(unit_tests_sources account.cpp apply_permutation.cpp address_from_url.cpp - ban.cpp base58.cpp blockchain_db.cpp block_queue.cpp @@ -68,6 +67,7 @@ set(unit_tests_sources multiexp.cpp multisig.cpp net.cpp + node_server.cpp notify.cpp output_distribution.cpp parse_amount.cpp diff --git a/tests/unit_tests/mul_div.cpp b/tests/unit_tests/mul_div.cpp index b11f715cd..e3f7c34f3 100644 --- a/tests/unit_tests/mul_div.cpp +++ b/tests/unit_tests/mul_div.cpp @@ -130,6 +130,19 @@ namespace // Division by zero is UB, so can be tested correctly } + TEST(div128_64, handles_zero) + { + uint64_t qhi, qlo, rhi, rlo; + + div128_64(0, 0, 7, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0); + ASSERT_EQ(qhi, 0); + ASSERT_EQ(qlo, 0); + + // Division by zero is UB, so can be tested correctly + } + TEST(div128_32, handles_one) { uint32_t reminder; @@ -147,6 +160,23 @@ namespace ASSERT_EQ(lo, 0); } + TEST(div128_64, handles_one) + { + uint64_t qhi, qlo, rhi, rlo; + + div128_64(0, 7, 1, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0); + ASSERT_EQ(qhi, 0); + ASSERT_EQ(qlo, 7); + + div128_64(7, 0, 1, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0); + ASSERT_EQ(qhi, 7); + ASSERT_EQ(qlo, 0); + } + TEST(div128_32, handles_if_dividend_less_divider) { uint32_t reminder; @@ -159,6 +189,17 @@ namespace ASSERT_EQ(lo, 0); } + TEST(div128_64, handles_if_dividend_less_divider) + { + uint64_t qhi, qlo, rhi, rlo; + + div128_64(0, 1383746, 1645825, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 1383746); + ASSERT_EQ(qhi, 0); + ASSERT_EQ(qlo, 0); + } + TEST(div128_32, handles_if_dividend_dwords_less_divider) { uint32_t reminder; @@ -171,6 +212,17 @@ namespace ASSERT_EQ(lo, 0x9084FC024383E48C); } + TEST(div128_64, handles_if_dividend_dwords_less_divider) + { + uint64_t qhi, qlo, rhi, rlo; + + div128_64(0x5AD629E441074F28, 0x0DBCAB2B231081F1, 0xFE735CD6, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0xB9C924E9); + ASSERT_EQ(qhi, 0x000000005B63C274); + ASSERT_EQ(qlo, 0x9084FC024383E48C); + } + TEST(div128_32, works_correctly) { uint32_t reminder; @@ -202,4 +254,68 @@ namespace ASSERT_EQ(hi, 0x00000000f812c1f8); ASSERT_EQ(lo, 0xddf2fdb09bc2e2e9); } + + TEST(div128_64, works_correctly) + { + uint64_t qhi, qlo, rhi, rlo; + + div128_64(2, 0, 2, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0); + ASSERT_EQ(qhi, 1); + ASSERT_EQ(qlo, 0); + + div128_64(0xffffffffffffffff, 0, 0xffffffff, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0); + ASSERT_EQ(qhi, 0x0000000100000001); + ASSERT_EQ(qlo, 0); + + div128_64(0xffffffffffffffff, 5846, 0xffffffff, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 5846); + ASSERT_EQ(qhi, 0x0000000100000001); + ASSERT_EQ(qlo, 0); + + div128_64(0xffffffffffffffff - 1, 0, 0xffffffff, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0xfffffffe); + ASSERT_EQ(qhi, 0x0000000100000000); + ASSERT_EQ(qlo, 0xfffffffefffffffe); + + div128_64(0x2649372534875028, 0xaedbfedc5adbc739, 0x27826534, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0x1a6dc2e5); + ASSERT_EQ(qhi, 0x00000000f812c1f8); + ASSERT_EQ(qlo, 0xddf2fdb09bc2e2e9); + } + + TEST(div128_64, divisor_above_32_bit) + { + uint64_t qhi, qlo, rhi, rlo; + + div128_64(0, 0xffffffff, (uint64_t)0x100000000, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0xffffffff); + ASSERT_EQ(qhi, 0); + ASSERT_EQ(qlo, 0); + + div128_64(0, 65, 4, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 1); + ASSERT_EQ(qhi, 0); + ASSERT_EQ(qlo, 16); + + div128_64(405997335029502627ull, 2552775575832427192ull, 489327483788363ull, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 198332080500810ull); + ASSERT_EQ(qhi, 829ull); + ASSERT_EQ(qlo, 13000245803763621514ull); + + div128_64(405997335029502627ull, 2552775575832427192ull, 1ull, &qhi, &qlo, &rhi, &rlo); + ASSERT_EQ(rhi, 0); + ASSERT_EQ(rlo, 0); + ASSERT_EQ(qhi, 405997335029502627ull); + ASSERT_EQ(qlo, 2552775575832427192ull); + } } diff --git a/tests/unit_tests/net.cpp b/tests/unit_tests/net.cpp index 253280d4d..262541bd2 100644 --- a/tests/unit_tests/net.cpp +++ b/tests/unit_tests/net.cpp @@ -893,7 +893,8 @@ TEST(dandelionpp_map, empty) TEST(dandelionpp_map, zero_stems) { std::vector<boost::uuids::uuid> connections{6}; - std::generate(connections.begin(), connections.end(), boost::uuids::random_generator{}); + for (auto &c: connections) + c = boost::uuids::random_generator{}(); net::dandelionpp::connection_map mapper{connections, 0}; EXPECT_EQ(mapper.begin(), mapper.end()); @@ -917,7 +918,8 @@ TEST(dandelionpp_map, zero_stems) TEST(dandelionpp_map, dropped_connection) { std::vector<boost::uuids::uuid> connections{6}; - std::generate(connections.begin(), connections.end(), boost::uuids::random_generator{}); + for (auto &c: connections) + c = boost::uuids::random_generator{}(); std::sort(connections.begin(), connections.end()); // select 3 of 6 outgoing connections @@ -953,7 +955,8 @@ TEST(dandelionpp_map, dropped_connection) } std::map<boost::uuids::uuid, boost::uuids::uuid> mapping; std::vector<boost::uuids::uuid> in_connections{9}; - std::generate(in_connections.begin(), in_connections.end(), boost::uuids::random_generator{}); + for (auto &c: in_connections) + c = boost::uuids::random_generator{}(); { std::map<boost::uuids::uuid, std::size_t> used; std::multimap<boost::uuids::uuid, boost::uuids::uuid> inverse_mapping; diff --git a/tests/unit_tests/ban.cpp b/tests/unit_tests/node_server.cpp index 86d546387..2c89323c7 100644 --- a/tests/unit_tests/ban.cpp +++ b/tests/unit_tests/node_server.cpp @@ -260,5 +260,42 @@ TEST(ban, ignores_port) ASSERT_FALSE(is_blocked(server,MAKE_IPV4_ADDRESS_PORT(1,2,3,4,6))); } +TEST(node_server, bind_same_p2p_port) +{ + const auto new_node = []() -> std::unique_ptr<Server> { + test_core pr_core; + cryptonote::t_cryptonote_protocol_handler<test_core> cprotocol(pr_core, NULL); + std::unique_ptr<Server> server(new Server(cprotocol)); + cprotocol.set_p2p_endpoint(server.get()); + + return server; + }; + + const auto init = [](const std::unique_ptr<Server>& server, const char* port) -> bool { + boost::program_options::options_description desc_options("Command line options"); + cryptonote::core::init_options(desc_options); + Server::init_options(desc_options); + + const char *argv[2] = {nullptr, nullptr}; + boost::program_options::variables_map vm; + boost::program_options::store(boost::program_options::parse_command_line(1, argv, desc_options), vm); + + vm.find(nodetool::arg_p2p_bind_port.name)->second = boost::program_options::variable_value(std::string(port), false); + + boost::program_options::notify(vm); + + return server->init(vm); + }; + + constexpr char port[] = "48080"; + constexpr char port_another[] = "58080"; + + const auto node = new_node(); + EXPECT_TRUE(init(node, port)); + + EXPECT_FALSE(init(new_node(), port)); + EXPECT_TRUE(init(new_node(), port_another)); +} + namespace nodetool { template class node_server<cryptonote::t_cryptonote_protocol_handler<test_core>>; } namespace cryptonote { template class t_cryptonote_protocol_handler<test_core>; } |