Changeset View
Changeset View
Standalone View
Standalone View
src/test/fuzz/txrequest.cpp
Show First 20 Lines • Show All 256 Lines • ▼ Show 20 Lines | void ReceivedResponse(int peer, int txid) { | ||||
m_tracker.ReceivedResponse(peer, TXIDS[txid]); | m_tracker.ReceivedResponse(peer, TXIDS[txid]); | ||||
} | } | ||||
void GetRequestable(int peer) { | void GetRequestable(int peer) { | ||||
// Implement using naive structure: | // Implement using naive structure: | ||||
//! list of (sequence number, txid) tuples. | //! list of (sequence number, txid) tuples. | ||||
std::vector<std::tuple<uint64_t, int>> result; | std::vector<std::tuple<uint64_t, int>> result; | ||||
std::vector<std::pair<NodeId, TxId>> expected_expired; | |||||
for (int txid = 0; txid < MAX_TXIDS; ++txid) { | for (int txid = 0; txid < MAX_TXIDS; ++txid) { | ||||
// Mark any expired REQUESTED announcements as COMPLETED. | // Mark any expired REQUESTED announcements as COMPLETED. | ||||
for (int peer2 = 0; peer2 < MAX_PEERS; ++peer2) { | for (int peer2 = 0; peer2 < MAX_PEERS; ++peer2) { | ||||
Announcement &ann2 = m_announcements[txid][peer2]; | Announcement &ann2 = m_announcements[txid][peer2]; | ||||
if (ann2.m_state == State::REQUESTED && ann2.m_time <= m_now) { | if (ann2.m_state == State::REQUESTED && ann2.m_time <= m_now) { | ||||
expected_expired.emplace_back(peer2, TXIDS[txid]); | |||||
ann2.m_state = State::COMPLETED; | ann2.m_state = State::COMPLETED; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
// And delete txids with only COMPLETED announcements left. | // And delete txids with only COMPLETED announcements left. | ||||
Cleanup(txid); | Cleanup(txid); | ||||
// CANDIDATEs for which this announcement has the highest priority | // CANDIDATEs for which this announcement has the highest priority | ||||
// get returned. | // get returned. | ||||
const Announcement &ann = m_announcements[txid][peer]; | const Announcement &ann = m_announcements[txid][peer]; | ||||
if (ann.m_state == State::CANDIDATE && GetSelected(txid) == peer) { | if (ann.m_state == State::CANDIDATE && GetSelected(txid) == peer) { | ||||
result.emplace_back(ann.m_sequence, txid); | result.emplace_back(ann.m_sequence, txid); | ||||
} | } | ||||
} | } | ||||
// Sort the results by sequence number. | // Sort the results by sequence number. | ||||
std::sort(result.begin(), result.end()); | std::sort(result.begin(), result.end()); | ||||
std::sort(expected_expired.begin(), expected_expired.end()); | |||||
// Compare with TxRequestTracker's implementation. | // Compare with TxRequestTracker's implementation. | ||||
const auto actual = m_tracker.GetRequestable(peer, m_now); | std::vector<std::pair<NodeId, TxId>> expired; | ||||
const auto actual = m_tracker.GetRequestable(peer, m_now, &expired); | |||||
std::sort(expired.begin(), expired.end()); | |||||
assert(expired == expected_expired); | |||||
m_tracker.PostGetRequestableSanityCheck(m_now); | m_tracker.PostGetRequestableSanityCheck(m_now); | ||||
assert(result.size() == actual.size()); | assert(result.size() == actual.size()); | ||||
for (size_t pos = 0; pos < actual.size(); ++pos) { | for (size_t pos = 0; pos < actual.size(); ++pos) { | ||||
assert(TXIDS[std::get<1>(result[pos])] == actual[pos]); | assert(TXIDS[std::get<1>(result[pos])] == actual[pos]); | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 105 Lines • Show Last 20 Lines |