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

Method BuildTimeBackwardsTest

src/test/txrequest_tests.cpp:579–622  ·  view source on GitHub ↗

Add to scenario a test that exercises clocks that go backwards. */

Source from the content-addressed store, hash-verified

577
578/** Add to scenario a test that exercises clocks that go backwards. */
579void TxRequestTest::BuildTimeBackwardsTest(Scenario& scenario)
580{
581 auto peer1 = scenario.NewPeer();
582 auto peer2 = scenario.NewPeer();
583 auto gtxid = scenario.NewGTxid({{peer1, peer2}});
584
585 // Announce from peer2.
586 auto reqtime = scenario.Now() + RandomTime8s();
587 scenario.ReceivedInv(peer2, gtxid, true, reqtime);
588 scenario.Check(peer2, {}, 1, 0, 0, "r1");
589 scenario.AdvanceTime(reqtime - scenario.Now());
590 scenario.Check(peer2, {gtxid}, 1, 0, 0, "r2");
591 // Check that if the clock goes backwards by 1us, the transaction would stop being requested.
592 scenario.Check(peer2, {}, 1, 0, 0, "r3", -MICROSECOND);
593 // But it reverts to being requested if time goes forward again.
594 scenario.Check(peer2, {gtxid}, 1, 0, 0, "r4");
595
596 // Announce from peer1.
597 if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
598 scenario.ReceivedInv(peer1, gtxid, true, MAX_TIME);
599 scenario.Check(peer2, {gtxid}, 1, 0, 0, "r5");
600 scenario.Check(peer1, {}, 1, 0, 0, "r6");
601
602 // Request from peer1.
603 if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
604 auto expiry = scenario.Now() + RandomTime8s();
605 scenario.RequestedTx(peer1, gtxid.ToUint256(), expiry);
606 scenario.Check(peer1, {}, 0, 1, 0, "r7");
607 scenario.Check(peer2, {}, 1, 0, 0, "r8");
608
609 // Expiration passes.
610 scenario.AdvanceTime(expiry - scenario.Now());
611 scenario.Check(peer1, {}, 0, 0, 1, "r9");
612 scenario.Check(peer2, {gtxid}, 1, 0, 0, "r10"); // Request goes back to peer2.
613 scenario.CheckExpired(peer1, gtxid);
614 scenario.Check(peer1, {}, 0, 0, 1, "r11", -MICROSECOND); // Going back does not unexpire.
615 scenario.Check(peer2, {gtxid}, 1, 0, 0, "r12", -MICROSECOND);
616
617 // Peer2 goes offline, meaning no viable announcements remain.
618 if (m_rng.randbool()) scenario.AdvanceTime(RandomTime8s());
619 scenario.DisconnectedPeer(peer2);
620 scenario.Check(peer1, {}, 0, 0, 0, "r13");
621 scenario.Check(peer2, {}, 0, 0, 0, "r14");
622}
623
624/** Add to scenario a test that involves RequestedTx() calls for txhashes not returned by GetRequestable. */
625void TxRequestTest::BuildWeirdRequestsTest(Scenario& scenario)

Callers

nothing calls this directly

Calls 10

NewPeerMethod · 0.80
NewGTxidMethod · 0.80
randboolMethod · 0.80
CheckExpiredMethod · 0.80
NowMethod · 0.45
ReceivedInvMethod · 0.45
CheckMethod · 0.45
AdvanceTimeMethod · 0.45
RequestedTxMethod · 0.45
DisconnectedPeerMethod · 0.45

Tested by

no test coverage detected