/tests_python/tests_012/test_voting.py

https://gitlab.com/hugxbox955/tezos
Python | 249 lines | 204 code | 30 blank | 15 comment | 3 complexity | 28e3e84c26f5eb1dc20aaeb3a2edf318 MD5 | raw file
  1. import copy
  2. import shutil
  3. import pytest
  4. from client.client import Client
  5. from tools import constants, paths, utils
  6. from . import protocol
  7. @pytest.fixture(scope="class")
  8. def client(sandbox):
  9. """One node, 4 blocks per voting period."""
  10. proto_params = dict(protocol.PARAMETERS)
  11. parameters = copy.deepcopy(proto_params)
  12. parameters["blocks_per_voting_period"] = 4
  13. parameters['consensus_threshold'] = 0
  14. sandbox.add_node(0, params=constants.NODE_PARAMS)
  15. protocol.activate(sandbox.client(0), parameters, activate_in_the_past=True)
  16. yield sandbox.client(0)
  17. @pytest.mark.vote
  18. @pytest.mark.incremental
  19. class TestManualBaking:
  20. """Test voting protocol with manual baking, 4 blocks per voting period."""
  21. def test_current_period(self, client: Client):
  22. period_info = client.get_current_period()
  23. level = client.get_current_level()
  24. assert level["level_position"] == 0
  25. assert period_info["voting_period"]["index"] == 0
  26. assert period_info["voting_period"]["kind"] == "proposal"
  27. assert period_info["voting_period"]["start_position"] == 0
  28. assert period_info["position"] == 0
  29. assert period_info["remaining"] == 3
  30. def test_succ_period(self, client: Client):
  31. period_info = client.get_succ_period()
  32. assert period_info["voting_period"]["index"] == 0
  33. assert period_info["voting_period"]["kind"] == "proposal"
  34. assert period_info["voting_period"]["start_position"] == 0
  35. assert period_info["position"] == 1
  36. assert period_info["remaining"] == 2
  37. def test_level_info_offset(self, client: Client):
  38. level = client.get_current_level(offset=1)
  39. assert level["level_position"] == 1
  40. level = client.get_current_level(offset=4)
  41. assert level["level_position"] == 4
  42. level = client.get_current_level(offset=10)
  43. assert level["level_position"] == 10
  44. def test_bake_two_blocks(self, client: Client):
  45. utils.bake(client)
  46. utils.bake(client)
  47. period_info = client.get_current_period()
  48. level = client.get_current_level()
  49. assert level["level_position"] == 2
  50. assert period_info["voting_period"]["index"] == 0
  51. assert period_info["voting_period"]["kind"] == "proposal"
  52. assert period_info["voting_period"]["start_position"] == 0
  53. assert period_info["position"] == 2
  54. assert period_info["remaining"] == 1
  55. def test_last_block_of_proposal_period(self, client: Client):
  56. # last block of voting period 0
  57. utils.bake(client)
  58. period_info = client.get_current_period()
  59. assert period_info["voting_period"]["index"] == 0
  60. assert period_info["voting_period"]["kind"] == "proposal"
  61. assert period_info["voting_period"]["start_position"] == 0
  62. assert period_info["position"] == 3
  63. assert period_info["remaining"] == 0
  64. def test_listing_is_not_empty(self, client: Client):
  65. assert client.get_listings() != []
  66. def test_inject_proto1(self, client: Client, tmpdir):
  67. proto_fp = (
  68. f'{paths.TEZOS_HOME}/src/bin_client/test/proto_test_injection'
  69. )
  70. for i in range(1, 4):
  71. proto = f'{tmpdir}/proto{i}'
  72. shutil.copytree(proto_fp, proto)
  73. main = f'{proto}/main.ml'
  74. print(main)
  75. with open(main, "a") as file:
  76. file.write(f'(* {i} *)')
  77. client.inject_protocol(proto)
  78. # this is maybe useless because the protocol already knows more than 4
  79. # protocol
  80. def test_known_protocol(self, client: Client, session: dict):
  81. protos = client.list_protocols()
  82. assert len(protos) >= 4
  83. session['protos'] = protos[:4]
  84. def test_proposals_is_empty(self, client: Client):
  85. assert client.get_proposals() == []
  86. def test_show_voting_period2(self, client: Client):
  87. client.show_voting_period()
  88. def test_bake_first_block_of_proposal_period(self, client: Client):
  89. # using the client it's not possible to add voting operation on the
  90. # first block of a voting period. This is to be fixed in a future
  91. # protocol
  92. utils.bake(client)
  93. period_info = client.get_current_period()
  94. assert period_info["voting_period"]["index"] == 1
  95. assert period_info["voting_period"]["kind"] == "proposal"
  96. assert period_info["voting_period"]["start_position"] == 4
  97. assert period_info["position"] == 0
  98. assert period_info["remaining"] == 3
  99. def test_submit_proposals(self, client: Client, session: dict):
  100. protos = session['protos']
  101. client.submit_proposals('bootstrap1', [protos[0]])
  102. client.submit_proposals('bootstrap2', [protos[0], protos[1]])
  103. client.submit_proposals('bootstrap3', [protos[1]])
  104. client.submit_proposals('bootstrap4', [protos[2]])
  105. def test_bake_one_block(self, client: Client):
  106. utils.bake(client)
  107. period_info = client.get_current_period()
  108. assert period_info["voting_period"]["index"] == 1
  109. assert period_info["voting_period"]["kind"] == "proposal"
  110. assert period_info["voting_period"]["start_position"] == 4
  111. assert period_info["position"] == 1
  112. assert period_info["remaining"] == 2
  113. def test_proposals_is_not_empty(self, client: Client):
  114. assert client.get_proposals() != []
  115. def test_bake_until_prev_last_block_of_voting_period(self, client: Client):
  116. utils.bake(client)
  117. period_info = client.get_current_period()
  118. assert period_info["position"] == 2
  119. assert period_info["remaining"] == 1
  120. def test_break_proposal_tie(self, client: Client, session: dict):
  121. protos = session['protos']
  122. client.submit_proposals('bootstrap4', [protos[1]])
  123. def test_bake_last_block_of_proposal_period(self, client: Client):
  124. utils.bake(client)
  125. period_info = client.get_current_period()
  126. metadata = client.get_metadata()
  127. level = client.get_current_level()
  128. level_info = metadata["level_info"]
  129. meta_period_info = metadata["voting_period_info"]
  130. expected_commitment = level["expected_commitment"]
  131. assert level["level"] == level_info["level"]
  132. assert level["level_position"] == level_info["level_position"]
  133. assert level["cycle"] == level_info["cycle"]
  134. assert level["cycle_position"] == level_info["cycle_position"]
  135. assert expected_commitment == level_info["expected_commitment"]
  136. assert level["level_position"] == 7
  137. assert period_info["voting_period"]["index"] == 1
  138. assert period_info["voting_period"]["kind"] == "proposal"
  139. assert period_info["voting_period"]["start_position"] == 4
  140. assert period_info["position"] == 3
  141. assert period_info["remaining"] == 0
  142. assert meta_period_info == period_info
  143. def test_listing_is_not_empty2(self, client: Client):
  144. assert client.get_listings() != []
  145. def test_current_proposal(self, client: Client, session: dict):
  146. expected = session['protos'][1]
  147. assert expected == client.get_current_proposal()
  148. def test_bake_first_block_of_cooldown_vote_period(self, client: Client):
  149. # using the client it's not possible to add voting operation on the
  150. # first block of a voting period. This is to be fixed in a future
  151. # protocol
  152. utils.bake(client)
  153. period_info = client.get_current_period()
  154. assert period_info["voting_period"]["index"] == 2
  155. assert period_info["voting_period"]["kind"] == "exploration"
  156. assert period_info["voting_period"]["start_position"] == 8
  157. assert period_info["position"] == 0
  158. assert period_info["remaining"] == 3
  159. def test_submit_ballot(self, client: Client, session: dict):
  160. # next block is going to be of 'exploration' kind
  161. proto = session['protos'][1]
  162. for i in range(1, 4):
  163. client.submit_ballot(f'bootstrap{i}', proto, 'yay')
  164. def test_bake_until_prev_last_block_of_voting_period2(self, client: Client):
  165. utils.bake(client)
  166. utils.bake(client)
  167. period_info = client.get_current_period()
  168. level = client.get_current_level()
  169. assert level["level_position"] == 10
  170. assert period_info["voting_period"]["index"] == 2
  171. assert period_info["voting_period"]["kind"] == "exploration"
  172. assert period_info["voting_period"]["start_position"] == 8
  173. assert period_info["position"] == 2
  174. assert period_info["remaining"] == 1
  175. def test_submit_failing_ballot(self, client: Client, session: dict):
  176. proto = session['protos'][1]
  177. client.submit_ballot(f'bootstrap{4}', proto, 'nay')
  178. def test_level_info_offset2(self, client: Client):
  179. level = client.get_current_level(block='head~1')
  180. assert level["level_position"] == 9
  181. level = client.get_current_level(block='head~4')
  182. assert level["level_position"] == 6
  183. level = client.get_current_level(block='head~10')
  184. assert level["level_position"] == 0
  185. def test_bake_first_block_of_new_proposal_period(self, client: Client):
  186. utils.bake(client)
  187. # Because of the current hack in proposal here we make sure we get the
  188. # correct value
  189. level = client.get_current_level()
  190. period_info = client.get_current_period()
  191. metadata = client.get_metadata()
  192. level_info = metadata["level_info"]
  193. meta_period_info = metadata["voting_period_info"]
  194. expected_commitment = level["expected_commitment"]
  195. assert level["level"] == level_info["level"]
  196. assert level["level_position"] == level_info["level_position"]
  197. assert level["cycle"] == level_info["cycle"]
  198. assert level["cycle_position"] == level_info["cycle_position"]
  199. assert expected_commitment == level_info["expected_commitment"]
  200. assert level["level_position"] == 11
  201. assert period_info["voting_period"]["index"] == 2
  202. assert period_info["voting_period"]["kind"] == "exploration"
  203. assert period_info["voting_period"]["start_position"] == 8
  204. assert period_info["position"] == 3
  205. assert period_info["remaining"] == 0
  206. assert meta_period_info == period_info
  207. utils.bake(client)
  208. period_info = client.get_current_period()
  209. level = client.get_current_level()
  210. assert level["level_position"] == 12
  211. assert period_info["voting_period"]["index"] == 3
  212. assert period_info["voting_period"]["kind"] == "proposal"
  213. assert period_info["voting_period"]["start_position"] == 12
  214. assert period_info["position"] == 0
  215. assert period_info["remaining"] == 3
  216. assert client.get_listings() != '[]'
  217. # strange behavior here, RPC returns 'null' on stderr
  218. assert client.get_current_proposal() is None
  219. assert client.get_ballot_list() == []