Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion include/bitcoin/database/types/multisig_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ struct BCD_API multisig_view
void to_data(system::bytewriter& sink) const NOEXCEPT;

private:
uint8_t pair_;
const system::ec_compressed& point_;
const system::ec_signature& signature_;
uint8_t pair_;
};

using multisig_views = std::vector<multisig_view>;
Expand Down
70 changes: 69 additions & 1 deletion test/mocks/blocks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,6 @@ const block block1b
}
}
};

const block block1c
{
header
Expand Down Expand Up @@ -691,6 +690,75 @@ const block block_spend_genesis
tx_spend_genesis
}
};
const block block_coinbase_spend_1a
{
// Coinbase and one spending tx, so to_spending_txs is non-empty.
header
{
0x31323334, // version
block1a.hash(), // previous_block_hash
hash_digest{ 0x4a },// merkle_root
0x41424344, // timestamp
0x51525354, // bits
0x61626364 // nonce
},
transactions
{
transaction // coinbase
{
0x01,
inputs
{
input
{
point{},
script{},
witness{},
0xffffffff
}
},
outputs
{
output
{
0x10,
script{ { { opcode::pick } } }
}
},
0x00
},
transaction // spends both block1a outputs
{
0x02,
inputs
{
input
{
point{ block1a.transactions_ptr()->front()->hash(false), 0x00 },
script{ { { opcode::pick } } },
witness{},
0xffffffff
},
input
{
point{ block1a.transactions_ptr()->front()->hash(false), 0x01 },
script{ { { opcode::roll } } },
witness{},
0xffffffff
}
},
outputs
{
output
{
0x20,
script{ { { opcode::pick } } }
}
},
0x00
}
}
};
const block block_spend_internal_2b
{
header
Expand Down
1 change: 1 addition & 0 deletions test/mocks/blocks.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ extern const system::chain::transaction tx2b;
extern const system::chain::block block_spend_1a;
extern const system::chain::transaction tx_spend_genesis;
extern const system::chain::block block_spend_genesis;
extern const system::chain::block block_coinbase_spend_1a;
extern const system::chain::block block_spend_internal_2b;
extern const system::chain::block block_missing_prevout_2b;
extern const system::chain::block block_valid_spend_internal_2b;
Expand Down
10 changes: 10 additions & 0 deletions test/mocks/map_store.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ class map_store
return restore([](auto, auto) {});
}

inline void set_current_(bool current) NOEXCEPT
{
return set_current(current);
}

inline bool is_current_() const NOEXCEPT
{
return is_current();
}

inline const settings& configuration() const NOEXCEPT
{
return configuration_;
Expand Down
25 changes: 25 additions & 0 deletions test/query/batch/silent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,29 @@

BOOST_FIXTURE_TEST_SUITE(query_batch_silent_tests, test::directory_setup_fixture)

// set_silent
// ----------------------------------------------------------------------------

BOOST_AUTO_TEST_CASE(query_batch_silent__set_silent__coinbase_only__true)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(query.set_silent(0, test::genesis));
}

BOOST_AUTO_TEST_CASE(query_batch_silent__set_silent__unarchived_block__false)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(!query.set_silent(1, test::block_coinbase_spend_1a));
}

BOOST_AUTO_TEST_SUITE_END()
97 changes: 97 additions & 0 deletions test/query/consensus/consensus_prevouts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,101 @@

BOOST_FIXTURE_TEST_SUITE(query_consensus_tests, test::directory_setup_fixture)

// set_prevouts
// ----------------------------------------------------------------------------

BOOST_AUTO_TEST_CASE(query_consensus__set_prevouts__coinbase_only__true)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(query.set(test::block1, context{ 0, 1, 0 }, false, false));
BOOST_REQUIRE(query.set_prevouts(1, test::block1));
}

BOOST_AUTO_TEST_CASE(query_consensus__set_prevouts__spending_block__true)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(query.set(test::block1a, context{ 0, 1, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(1));
BOOST_REQUIRE(query.set(test::block_spend_1a, context{ 0, 2, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(2));
BOOST_REQUIRE(query.set_prevouts(2, test::block_spend_1a));
}

BOOST_AUTO_TEST_CASE(query_consensus__set_prevouts__coinbase_and_spend__true)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(query.set(test::block1a, context{ 0, 1, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(1));
BOOST_REQUIRE(query.set(test::block_coinbase_spend_1a, context{ 0, 2, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(2));
BOOST_REQUIRE(!query.to_spending_txs(2).empty());
BOOST_REQUIRE(query.set_prevouts(2, test::block_coinbase_spend_1a));
}

// get_prevouts (via block_confirmable)
// ----------------------------------------------------------------------------

BOOST_AUTO_TEST_CASE(query_consensus__get_prevouts__cached__success)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(query.set(test::block1a, context{ 0, 1, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(1));
BOOST_REQUIRE(query.set(test::block_coinbase_spend_1a, context{ 0, 2, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(2));
BOOST_REQUIRE(query.set_prevouts(2, test::block_coinbase_spend_1a));
BOOST_REQUIRE_EQUAL(query.block_confirmable(2), error::success);
}

BOOST_AUTO_TEST_CASE(query_consensus__get_prevouts__populated_metadata__success)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(query.set(test::block1a, context{ 0, 1, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(1));
BOOST_REQUIRE(query.set(test::block_coinbase_spend_1a, context{ 0, 2, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(2));
BOOST_REQUIRE(query.populate_with_metadata(test::block_coinbase_spend_1a));
BOOST_REQUIRE(query.set_prevouts(2, test::block_coinbase_spend_1a));
BOOST_REQUIRE_EQUAL(query.block_confirmable(2), error::success);
}

BOOST_AUTO_TEST_CASE(query_consensus__get_prevouts__not_cached__integrity_get_prevouts)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(query.set(test::block1a, context{ 0, 1, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(1));
BOOST_REQUIRE(query.set(test::block_coinbase_spend_1a, context{ 0, 2, 0 }, false, false));
BOOST_REQUIRE(query.set_strong(2));
BOOST_REQUIRE_EQUAL(query.block_confirmable(2), error::integrity_get_prevouts);
}

BOOST_AUTO_TEST_SUITE_END()
88 changes: 88 additions & 0 deletions test/query/consensus/consensus_work.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,92 @@

BOOST_FIXTURE_TEST_SUITE(query_consensus_tests, test::directory_setup_fixture)

// get_work
// ----------------------------------------------------------------------------

BOOST_AUTO_TEST_CASE(query_consensus__get_work__empty_states__zero)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
uint256_t work{};
const header_states states{};
BOOST_REQUIRE(query.get_work(work, states));
BOOST_REQUIRE_EQUAL(work, 0u);
}

BOOST_AUTO_TEST_CASE(query_consensus__get_work__genesis__proof_of_bits)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
uint32_t bits{};
BOOST_REQUIRE(query.get_bits(bits, 0));
const header_states states{ { 0, code{} } };
uint256_t work{};
BOOST_REQUIRE(query.get_work(work, states));
BOOST_REQUIRE_EQUAL(work, system::chain::header::proof(bits));
}

BOOST_AUTO_TEST_CASE(query_consensus__get_work__terminal_link__false)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
uint256_t work{};
const header_states states{ { header_link::terminal, code{} } };
BOOST_REQUIRE(!query.get_work(work, states));
}

// get_branch
// ----------------------------------------------------------------------------

BOOST_AUTO_TEST_CASE(query_consensus__get_branch__candidate_hash__empty_branch)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
header_states branch{};
BOOST_REQUIRE(query.get_branch(branch, test::genesis.hash()));
BOOST_REQUIRE(branch.empty());
}

BOOST_AUTO_TEST_CASE(query_consensus__get_branch__unknown_hash__false)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
header_states branch{};
BOOST_REQUIRE(!query.get_branch(branch, test::block1.hash()));
}

BOOST_AUTO_TEST_CASE(query_consensus__get_branch__uncandidate_header__branch_of_one)
{
settings settings{};
settings.path = TEST_DIRECTORY;
test::chunk_store store{ settings };
test::query_accessor query{ store };
BOOST_REQUIRE(!store.create(test::events_handler));
BOOST_REQUIRE(query.initialize(test::genesis));
BOOST_REQUIRE(query.set(test::block1, context{ 0, 1, 0 }, false, false));
header_states branch{};
BOOST_REQUIRE(query.get_branch(branch, test::block1.hash()));
BOOST_REQUIRE_EQUAL(branch.size(), 1u);
}

BOOST_AUTO_TEST_SUITE_END()
Loading
Loading