Add to scenario a test that exercises clocks that go backwards. */
| 577 | |
| 578 | /** Add to scenario a test that exercises clocks that go backwards. */ |
| 579 | void 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. */ |
| 625 | void TxRequestTest::BuildWeirdRequestsTest(Scenario& scenario) |
nothing calls this directly
no test coverage detected