Add to scenario a test that exercises clocks that go backwards. */
| 558 | |
| 559 | /** Add to scenario a test that exercises clocks that go backwards. */ |
| 560 | void BuildTimeBackwardsTest(Scenario& scenario) |
| 561 | { |
| 562 | auto peer1 = scenario.NewPeer(); |
| 563 | auto peer2 = scenario.NewPeer(); |
| 564 | auto gtxid = scenario.NewGTxid({{peer1, peer2}}); |
| 565 | |
| 566 | // Announce from peer2. |
| 567 | auto reqtime = scenario.Now() + RandomTime8s(); |
| 568 | scenario.ReceivedInv(peer2, gtxid, true, reqtime); |
| 569 | scenario.Check(peer2, {}, 1, 0, 0, "r1"); |
| 570 | scenario.AdvanceTime(reqtime - scenario.Now()); |
| 571 | scenario.Check(peer2, {gtxid}, 1, 0, 0, "r2"); |
| 572 | // Check that if the clock goes backwards by 1us, the transaction would stop being requested. |
| 573 | scenario.Check(peer2, {}, 1, 0, 0, "r3", -MICROSECOND); |
| 574 | // But it reverts to being requested if time goes forward again. |
| 575 | scenario.Check(peer2, {gtxid}, 1, 0, 0, "r4"); |
| 576 | |
| 577 | // Announce from peer1. |
| 578 | if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s()); |
| 579 | scenario.ReceivedInv(peer1, gtxid, true, MAX_TIME); |
| 580 | scenario.Check(peer2, {gtxid}, 1, 0, 0, "r5"); |
| 581 | scenario.Check(peer1, {}, 1, 0, 0, "r6"); |
| 582 | |
| 583 | // Request from peer1. |
| 584 | if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s()); |
| 585 | auto expiry = scenario.Now() + RandomTime8s(); |
| 586 | scenario.RequestedTx(peer1, gtxid.GetHash(), expiry); |
| 587 | scenario.Check(peer1, {}, 0, 1, 0, "r7"); |
| 588 | scenario.Check(peer2, {}, 1, 0, 0, "r8"); |
| 589 | |
| 590 | // Expiration passes. |
| 591 | scenario.AdvanceTime(expiry - scenario.Now()); |
| 592 | scenario.Check(peer1, {}, 0, 0, 1, "r9"); |
| 593 | scenario.Check(peer2, {gtxid}, 1, 0, 0, "r10"); // Request goes back to peer2. |
| 594 | scenario.CheckExpired(peer1, gtxid); |
| 595 | scenario.Check(peer1, {}, 0, 0, 1, "r11", -MICROSECOND); // Going back does not unexpire. |
| 596 | scenario.Check(peer2, {gtxid}, 1, 0, 0, "r12", -MICROSECOND); |
| 597 | |
| 598 | // Peer2 goes offline, meaning no viable announcements remain. |
| 599 | if (InsecureRandBool()) scenario.AdvanceTime(RandomTime8s()); |
| 600 | scenario.DisconnectedPeer(peer2); |
| 601 | scenario.Check(peer1, {}, 0, 0, 0, "r13"); |
| 602 | scenario.Check(peer2, {}, 0, 0, 0, "r14"); |
| 603 | } |
| 604 | |
| 605 | /** Add to scenario a test that involves RequestedTx() calls for txhashes not returned by GetRequestable. */ |
| 606 | void BuildWeirdRequestsTest(Scenario& scenario) |
no test coverage detected