diff options
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/functional_tests/cold_signing.py | 5 | ||||
-rwxr-xr-x | tests/functional_tests/multisig.py | 2 | ||||
-rwxr-xr-x | tests/functional_tests/transfer.py | 34 | ||||
-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/node_server.cpp (renamed from tests/unit_tests/ban.cpp) | 37 |
6 files changed, 177 insertions, 19 deletions
diff --git a/tests/functional_tests/cold_signing.py b/tests/functional_tests/cold_signing.py index f915df77a..698217436 100755 --- a/tests/functional_tests/cold_signing.py +++ b/tests/functional_tests/cold_signing.py @@ -94,7 +94,6 @@ class ColdSigningTest(): print("Creating transaction in hot wallet") dst = {'address': '42ey1afDFnn4886T7196doS9GPMzexD9gXpsZJDwVjeRVdFCSoHnv7KPbBeGpzJBzHRCAs9UxqeoyFQMYbqSWYTfJJQAWDm', 'amount': 1000000000000} - payment_id = '1234500000012345abcde00000abcdeff1234500000012345abcde00000abcde' self.hot_wallet.refresh() res = self.hot_wallet.export_outputs() @@ -102,7 +101,7 @@ class ColdSigningTest(): res = self.cold_wallet.export_key_images(True) self.hot_wallet.import_key_images(res.signed_key_images, offset = res.offset) - res = self.hot_wallet.transfer([dst], ring_size = 11, payment_id = payment_id, get_tx_key = False) + res = self.hot_wallet.transfer([dst], ring_size = 11, get_tx_key = False) assert len(res.tx_hash) == 32*2 txid = res.tx_hash assert len(res.tx_key) == 0 @@ -124,7 +123,7 @@ class ColdSigningTest(): assert desc.amount_out == desc.amount_in - fee assert desc.ring_size == 11 assert desc.unlock_time == 0 - assert desc.payment_id == payment_id + assert desc.payment_id in ['', '0000000000000000'] assert desc.change_amount == desc.amount_in - 1000000000000 - fee assert desc.change_address == '42ey1afDFnn4886T7196doS9GPMzexD9gXpsZJDwVjeRVdFCSoHnv7KPbBeGpzJBzHRCAs9UxqeoyFQMYbqSWYTfJJQAWDm' assert desc.fee == fee diff --git a/tests/functional_tests/multisig.py b/tests/functional_tests/multisig.py index e0d8b06a4..e4e908aa1 100755 --- a/tests/functional_tests/multisig.py +++ b/tests/functional_tests/multisig.py @@ -272,7 +272,7 @@ class MultisigTest(): assert desc.amount_out == desc.amount_in - fee assert desc.ring_size == 11 assert desc.unlock_time == 0 - assert desc.payment_id == '0000000000000000' + assert not 'payment_id' in desc or desc.payment_id in ['', '0000000000000000'] assert desc.change_amount == desc.amount_in - 1000000000000 - fee assert desc.change_address == self.wallet_address assert desc.fee == fee diff --git a/tests/functional_tests/transfer.py b/tests/functional_tests/transfer.py index b4264f72d..0c942f48b 100755 --- a/tests/functional_tests/transfer.py +++ b/tests/functional_tests/transfer.py @@ -114,13 +114,19 @@ class TransferTest(): except: ok = True assert ok + print ('Checking long payment IDs are rejected') + ok = False + try: self.wallet[0].transfer([dst], ring_size = 11, payment_id = payment_id, get_tx_key = False, get_tx_hex = True) + except: ok = True + assert ok + print ('Checking empty destination is rejected') ok = False try: self.wallet[0].transfer([], ring_size = 11, get_tx_key = False) except: ok = True assert ok - res = self.wallet[0].transfer([dst], ring_size = 11, payment_id = payment_id, get_tx_key = False, get_tx_hex = True) + res = self.wallet[0].transfer([dst], ring_size = 11, get_tx_key = False, get_tx_hex = True) assert len(res.tx_hash) == 32*2 txid = res.tx_hash assert len(res.tx_key) == 0 @@ -156,7 +162,7 @@ class TransferTest(): assert e.type == 'block' e = res.pending[0] assert e.txid == txid - assert e.payment_id == payment_id + assert e.payment_id in ['', '0000000000000000'] assert e.type == 'pending' assert e.unlock_time == 0 assert e.subaddr_index.major == 0 @@ -189,7 +195,7 @@ class TransferTest(): assert e.type == 'block' e = res.out[0] assert e.txid == txid - assert e.payment_id == payment_id + assert e.payment_id in ['', '0000000000000000'] assert e.type == 'out' assert e.unlock_time == 0 assert e.subaddr_index.major == 0 @@ -205,7 +211,7 @@ class TransferTest(): assert res.transfers[0] == res.transfer t = res.transfer assert t.txid == txid - assert t.payment_id == payment_id + assert t.payment_id in ['', '0000000000000000'] assert t.height == wallet_height - 1 assert t.timestamp > 0 assert t.amount == 0 # to self, so it's just "pay a fee" really @@ -227,7 +233,7 @@ class TransferTest(): print("Creating transfer to another, manual relay") dst = {'address': '44Kbx4sJ7JDRDV5aAhLJzQCjDz2ViLRduE3ijDZu3osWKBjMGkV1XPk4pfDUMqt1Aiezvephdqm6YD19GKFD9ZcXVUTp6BW', 'amount': 1000000000000} - res = self.wallet[0].transfer([dst], ring_size = 11, payment_id = payment_id, get_tx_key = True, do_not_relay = True, get_tx_hex = True) + res = self.wallet[0].transfer([dst], ring_size = 11, get_tx_key = True, do_not_relay = True, get_tx_hex = True) assert len(res.tx_hash) == 32*2 txid = res.tx_hash assert len(res.tx_key) == 32*2 @@ -269,7 +275,7 @@ class TransferTest(): assert not 'failed' in res or len(res.failed) == 0 e = res.pool[0] assert e.txid == txid - assert e.payment_id == payment_id + assert e.payment_id in ["", "0000000000000000"] # long payment IDs are now ignored assert e.type == 'pool' assert e.unlock_time == 0 assert e.subaddr_index.major == 0 @@ -295,7 +301,7 @@ class TransferTest(): assert not 'failed' in res or len(res.failed) == 0 e = res['in'][0] assert e.txid == txid - assert e.payment_id == payment_id + assert e.payment_id in ["", "0000000000000000"] # long payment IDs are now ignored assert e.type == 'in' assert e.unlock_time == 0 assert e.subaddr_index.major == 0 @@ -318,7 +324,7 @@ class TransferTest(): dst0 = {'address': '42ey1afDFnn4886T7196doS9GPMzexD9gXpsZJDwVjeRVdFCSoHnv7KPbBeGpzJBzHRCAs9UxqeoyFQMYbqSWYTfJJQAWDm', 'amount': 1000000000000} dst1 = {'address': '44Kbx4sJ7JDRDV5aAhLJzQCjDz2ViLRduE3ijDZu3osWKBjMGkV1XPk4pfDUMqt1Aiezvephdqm6YD19GKFD9ZcXVUTp6BW', 'amount': 1100000000000} dst2 = {'address': '46r4nYSevkfBUMhuykdK3gQ98XDqDTYW1hNLaXNvjpsJaSbNtdXh1sKMsdVgqkaihChAzEy29zEDPMR3NHQvGoZCLGwTerK', 'amount': 1200000000000} - res = self.wallet[0].transfer([dst0, dst1, dst2], ring_size = 11, payment_id = payment_id, get_tx_key = True) + res = self.wallet[0].transfer([dst0, dst1, dst2], ring_size = 11, get_tx_key = True) assert len(res.tx_hash) == 32*2 txid = res.tx_hash assert len(res.tx_key) == 32*2 @@ -357,7 +363,7 @@ class TransferTest(): assert len(e) == 1 e = e[0] assert e.txid == txid - assert e.payment_id == payment_id + assert e.payment_id in ["", "0000000000000000"] # long payment IDs are now ignored assert e.type == 'out' assert e.unlock_time == 0 assert e.subaddr_index.major == 0 @@ -385,7 +391,7 @@ class TransferTest(): assert len(e) == 1 e = e[0] assert e.txid == txid - assert e.payment_id == payment_id + assert e.payment_id in ["", "0000000000000000"] # long payment IDs are now ignored assert e.type == 'in' assert e.unlock_time == 0 assert e.subaddr_index.major == 0 @@ -412,7 +418,7 @@ class TransferTest(): assert len(e) == 1 e = e[0] assert e.txid == txid - assert e.payment_id == payment_id + assert e.payment_id in ["", "0000000000000000"] # long payment IDs are now ignored assert e.type == 'in' assert e.unlock_time == 0 assert e.subaddr_index.major == 0 @@ -521,7 +527,7 @@ class TransferTest(): res = self.wallet[1].get_bulk_payments() assert len(res.payments) >= 3 # two txes to standard address were sent, plus one to integrated address res = self.wallet[1].get_bulk_payments(payment_ids = ['1234500000012345abcde00000abcdeff1234500000012345abcde00000abcde']) - assert len(res.payments) >= 2 # two txes were sent with that payment id + assert not 'payments' in res or len(res.payments) == 0 # long payment IDs are now ignored on receipt res = self.wallet[1].get_bulk_payments(payment_ids = ['ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff']) assert 'payments' not in res or len(res.payments) == 0 # none with that payment id res = self.wallet[1].get_bulk_payments(payment_ids = ['1111111122222222' + '0'*48]) @@ -531,7 +537,7 @@ class TransferTest(): res = self.wallet[2].get_bulk_payments() assert len(res.payments) >= 1 # one tx was sent res = self.wallet[2].get_bulk_payments(payment_ids = ['1'*64, '1234500000012345abcde00000abcdeff1234500000012345abcde00000abcde', '2'*64]) - assert len(res.payments) >= 1 # one tx was sent + assert not 'payments' in res or len(res.payments) == 0 # long payment IDs are now ignored res = self.wallet[1].get_bulk_payments(["1111111122222222"]) assert len(res.payments) >= 1 # we have one of these @@ -550,7 +556,7 @@ class TransferTest(): assert 'payments' not in res or len(res.payments) == 0 res = self.wallet[1].get_payments('1234500000012345abcde00000abcdeff1234500000012345abcde00000abcde') - assert len(res.payments) >= 2 + assert 'payments' not in res or len(res.payments) == 0 res = self.wallet[1].get_payments('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff') assert 'payments' not in res or len(res.payments) == 0 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/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>; } |