MCPcopy Create free account
hub / github.com/bitcoin/bitcoin / BuildBigPriorityTest

Method BuildBigPriorityTest

src/test/txrequest_tests.cpp:387–467  ·  view source on GitHub ↗

Add to scenario a randomized test in which N peers announce the same transaction, to verify * the order in which they are requested. */

Source from the content-addressed store, hash-verified

385/** Add to scenario a randomized test in which N peers announce the same transaction, to verify
386 * the order in which they are requested. */
387void TxRequestTest::BuildBigPriorityTest(Scenario& scenario, int peers)
388{
389 scenario.SetTestName(strprintf("BigPriority(peers=%i)", peers));
390
391 // We will have N peers announce the same transaction.
392 std::map<NodeId, bool> preferred;
393 std::vector<NodeId> pref_peers, npref_peers;
394 int num_pref = m_rng.randrange(peers + 1) ; // Some preferred, ...
395 int num_npref = peers - num_pref; // some not preferred.
396 for (int i = 0; i < num_pref; ++i) {
397 pref_peers.push_back(scenario.NewPeer());
398 preferred[pref_peers.back()] = true;
399 }
400 for (int i = 0; i < num_npref; ++i) {
401 npref_peers.push_back(scenario.NewPeer());
402 preferred[npref_peers.back()] = false;
403 }
404 // Make a list of all peers, in order of intended request order (concatenation of pref_peers and npref_peers).
405 std::vector<NodeId> request_order;
406 request_order.reserve(num_pref + num_npref);
407 for (int i = 0; i < num_pref; ++i) request_order.push_back(pref_peers[i]);
408 for (int i = 0; i < num_npref; ++i) request_order.push_back(npref_peers[i]);
409
410 // Determine the announcement order randomly.
411 std::vector<NodeId> announce_order = request_order;
412 std::shuffle(announce_order.begin(), announce_order.end(), m_rng);
413
414 // Find a gtxid whose txhash prioritization is consistent with the required ordering within pref_peers and
415 // within npref_peers.
416 auto gtxid = scenario.NewGTxid({pref_peers, npref_peers});
417
418 // Decide reqtimes in opposite order of the expected request order. This means that as time passes we expect the
419 // to-be-requested-from-peer will change every time a subsequent reqtime is passed.
420 std::map<NodeId, std::chrono::microseconds> reqtimes;
421 auto reqtime = scenario.Now();
422 for (int i = peers - 1; i >= 0; --i) {
423 reqtime += RandomTime8s();
424 reqtimes[request_order[i]] = reqtime;
425 }
426
427 // Actually announce from all peers simultaneously (but in announce_order).
428 for (const auto peer : announce_order) {
429 scenario.ReceivedInv(peer, gtxid, preferred[peer], reqtimes[peer]);
430 }
431 for (const auto peer : announce_order) {
432 scenario.Check(peer, {}, 1, 0, 0, "b1");
433 }
434
435 // Let time pass and observe the to-be-requested-from peer change, from nonpreferred to preferred, and from
436 // high priority to low priority within each class.
437 for (int i = peers - 1; i >= 0; --i) {
438 scenario.AdvanceTime(reqtimes[request_order[i]] - scenario.Now() - MICROSECOND);
439 scenario.Check(request_order[i], {}, 1, 0, 0, "b2");
440 scenario.AdvanceTime(MICROSECOND);
441 scenario.Check(request_order[i], {gtxid}, 1, 0, 0, "b3");
442 }
443
444 // Peers now in random order go offline, or send NOTFOUNDs. At every point in time the new to-be-requested-from

Callers

nothing calls this directly

Calls 15

SetTestNameMethod · 0.80
randrangeMethod · 0.80
NewPeerMethod · 0.80
NewGTxidMethod · 0.80
randboolMethod · 0.80
push_backMethod · 0.45
backMethod · 0.45
reserveMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
NowMethod · 0.45
ReceivedInvMethod · 0.45

Tested by

no test coverage detected