|
| 1 | +#!/usr/bin/env python3 |
| 2 | + |
| 3 | +import json |
| 4 | +import signal |
| 5 | + |
| 6 | +from TestHarness import Account, Cluster, Node, ReturnType, TestHelper, Utils, WalletMgr |
| 7 | +from TestHarness.TestHelper import AppArgs |
| 8 | + |
| 9 | +############################################################### |
| 10 | +# pause_at_block_test |
| 11 | +# |
| 12 | +# Verify /v1/producer/pause_at_block pauses node in all read modes |
| 13 | +# |
| 14 | +############################################################### |
| 15 | + |
| 16 | +# Parse command line arguments |
| 17 | +args = TestHelper.parse_args({"-v","--dump-error-details","--leave-running","--keep-logs","--unshared"}) |
| 18 | +Utils.Debug = args.v |
| 19 | +dumpErrorDetails=args.dump_error_details |
| 20 | +dontKill=args.leave_running |
| 21 | +keepLogs=args.keep_logs |
| 22 | + |
| 23 | +walletMgr=WalletMgr(True) |
| 24 | +cluster=Cluster(unshared=args.unshared, keepRunning=args.leave_running, keepLogs=args.keep_logs) |
| 25 | +cluster.setWalletMgr(walletMgr) |
| 26 | + |
| 27 | +testSuccessful = False |
| 28 | +try: |
| 29 | + TestHelper.printSystemInfo("BEGIN") |
| 30 | + |
| 31 | + specificNodeosArgs = { |
| 32 | + 0 : "--enable-stale-production", |
| 33 | + |
| 34 | + 3 : "--read-mode head", |
| 35 | + 4 : "--read-mode speculative", |
| 36 | + 5 : "--read-mode irreversible" |
| 37 | + } |
| 38 | + assert cluster.launch( |
| 39 | + pnodes=3, |
| 40 | + prodCount=3, |
| 41 | + totalProducers=3, |
| 42 | + totalNodes=6, |
| 43 | + loadSystemContract=False, |
| 44 | + activateIF=True) |
| 45 | + |
| 46 | + prodNode = cluster.getNode(0) |
| 47 | + prodNode2 = cluster.getNode(1) |
| 48 | + headNode = cluster.getNode(3) |
| 49 | + specNode = cluster.getNode(4) |
| 50 | + irrvNode = cluster.getNode(5) |
| 51 | + |
| 52 | + prodNode.waitForProducer("defproducerb"); |
| 53 | + prodNode.waitForProducer("defproducera"); |
| 54 | + |
| 55 | + blockNum = prodNode.getHeadBlockNum() |
| 56 | + |
| 57 | + blockNum += 5 |
| 58 | + |
| 59 | + Utils.Print(f"Pausing at block {blockNum}") |
| 60 | + prodNode2.processUrllibRequest("producer", "pause_at_block", {"block_num":blockNum}), |
| 61 | + headNode.processUrllibRequest("producer", "pause_at_block", {"block_num":blockNum}), |
| 62 | + specNode.processUrllibRequest("producer", "pause_at_block", {"block_num":blockNum}), |
| 63 | + irrvNode.processUrllibRequest("producer", "pause_at_block", {"block_num":blockNum}), |
| 64 | + |
| 65 | + assert prodNode.waitForLibToAdvance(), "LIB did not advance with paused nodes" |
| 66 | + assert prodNode2.waitForBlock(blockNum), f"Block {blockNum} did not arrive after pausing" |
| 67 | + |
| 68 | + Utils.Print(f"Verify paused at block {blockNum}") |
| 69 | + assert prodNode2.getHeadBlockNum() == blockNum, "Prod Node_01 did not pause at block" |
| 70 | + assert headNode.getHeadBlockNum() == blockNum, "Head Node_03 did not pause at block" |
| 71 | + assert specNode.getHeadBlockNum() == blockNum, "Speculative Node_04 did not pause at block" |
| 72 | + assert irrvNode.getHeadBlockNum() == blockNum, "Irreversible Node_05 did not pause at block" |
| 73 | + |
| 74 | + Utils.Print(f"Verify prod node still producing blocks") |
| 75 | + assert prodNode.waitForLibToAdvance(), "LIB did not advance with paused nodes" |
| 76 | + |
| 77 | + Utils.Print(f"Verify still paused at block {blockNum}") |
| 78 | + assert prodNode2.getHeadBlockNum() == blockNum, "Prod Node_01 did not pause at block" |
| 79 | + assert headNode.getHeadBlockNum() == blockNum, "Head Node_03 did not pause at block" |
| 80 | + assert specNode.getHeadBlockNum() == blockNum, "Speculative Node_04 did not pause at block" |
| 81 | + assert irrvNode.getHeadBlockNum() == blockNum, "Irreversible Node_05 did not pause at block" |
| 82 | + |
| 83 | + Utils.Print(f"Resume paused nodes") |
| 84 | + prodNode2.processUrllibRequest("producer", "resume", {}) |
| 85 | + headNode.processUrllibRequest("producer", "resume", {}) |
| 86 | + specNode.processUrllibRequest("producer", "resume",{}) |
| 87 | + irrvNode.processUrllibRequest("producer", "resume", {}) |
| 88 | + |
| 89 | + Utils.Print(f"Verify nodes resumed") |
| 90 | + assert prodNode2.waitForLibToAdvance(), "Prod Node_01 did not resume" |
| 91 | + assert headNode.waitForLibToAdvance(), "Head Node_03 did not resume" |
| 92 | + assert specNode.waitForLibToAdvance(), "Speculative Node_04 did not resume" |
| 93 | + assert irrvNode.waitForLibToAdvance(), "Irreversible Node_05 did not resume" |
| 94 | + |
| 95 | + testSuccessful = True |
| 96 | +finally: |
| 97 | + TestHelper.shutdown(cluster, walletMgr, testSuccessful, dumpErrorDetails) |
| 98 | + |
| 99 | +exitCode = 0 if testSuccessful else 1 |
| 100 | +exit(exitCode) |
0 commit comments