mirror of
https://github.com/planetmint/planetmint.git
synced 2025-03-30 15:08:31 +00:00

* creating first github action Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * fix syntax error Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * renamed action, using black stable Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * updated checkout action on workflow black Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * formatted code with black Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * replaced lint with black service Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * removed black service added black check to makefile Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * replaced flake8 with black Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added pull_request to black actions trigger Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * replaced flake8 with black style checker (#212) * updated version number to 1.0.0 Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * creating first github action Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * fix syntax error Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * renamed action, using black stable Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * updated checkout action on workflow black Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * formatted code with black Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * version bumpt Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * removed some comments and unsused import Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * replaced lint with black service Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * removed black service added black check to makefile Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * replaced flake8 with black Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added pull_request to black actions trigger Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * started on unit test workflow Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * removed run step Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * fixed typo Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * testing docker-compose Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * check docker-compose Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * try running pytest Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * check out -f Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * changed path Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * increased health check retries, added job dependency Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added path to docker-compose.yml to test action Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * moved container startup to test step Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added checkout step to test job Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * different kind of execution Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * checking build step Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * fixed missing keyword Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added checkout to build step Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * storing artifacts Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added needs Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * changed Dockerfile-dev to python-slim Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added job matrix back in Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added abci to build job matrix Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * updated test job steps Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * fixed typo Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * replaced docker exec with docker-compose exec for abci test Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added first version of acceptance and integration test action Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added runs-on Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * fixed syntax error Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * reverted to docker exec Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added copyright notice and env to start container step Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * separated abci from non abci test job Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * renamed pytest workflow to unit-test Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added codecov workflow Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added pytest install to codecov step Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added pip install Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * moved codecov to unit-test Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * show files Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * changed paths Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * removed debug job steps Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * renamed black to lint, added audit workflow Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * checking if dc down is necessary Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * removed dc down step from acceptance and integration Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * fixed lint error Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added tox documentation to github acitons (#226) * added documentation job Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added docs dependency install to docs workflow Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * add more dependencies Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * install rapidjson manually Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added python-rapidjson to docs requirements text Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * changed gh config on tox.ini Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added base58 to docs require Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * changed docs require to dev Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * reversed changes to docs require Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * changed gh to gh-actions Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * increased verbosity for debugging Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added -e docsroot manually Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * removed verbosity Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * removed travis ci files Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * changed audit step to trigger on schedule Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> Co-authored-by: enesturk <enes.m.turk@gmail.com>
219 lines
7.2 KiB
Python
219 lines
7.2 KiB
Python
import pytest
|
|
|
|
from tests.utils import generate_election, generate_validators
|
|
|
|
from planetmint.lib import Block
|
|
from planetmint.transactions.types.elections.election import Election
|
|
from planetmint.transactions.types.elections.chain_migration_election import ChainMigrationElection
|
|
from planetmint.upsert_validator.validator_election import ValidatorElection
|
|
|
|
|
|
@pytest.mark.bdb
|
|
def test_process_block_concludes_all_elections(b):
|
|
validators = generate_validators([1] * 4)
|
|
b.store_validator_set(1, [v["storage"] for v in validators])
|
|
|
|
new_validator = generate_validators([1])[0]
|
|
|
|
public_key = validators[0]["public_key"]
|
|
private_key = validators[0]["private_key"]
|
|
voter_keys = [v["private_key"] for v in validators]
|
|
|
|
election, votes = generate_election(b, ChainMigrationElection, public_key, private_key, {}, voter_keys)
|
|
|
|
txs = [election]
|
|
total_votes = votes
|
|
|
|
election, votes = generate_election(
|
|
b, ValidatorElection, public_key, private_key, new_validator["election"], voter_keys
|
|
)
|
|
txs += [election]
|
|
total_votes += votes
|
|
|
|
b.store_abci_chain(1, "chain-X")
|
|
Election.process_block(b, 1, txs)
|
|
b.store_block(Block(height=1, transactions=[tx.id for tx in txs], app_hash="")._asdict())
|
|
b.store_bulk_transactions(txs)
|
|
|
|
Election.process_block(b, 2, total_votes)
|
|
|
|
validators = b.get_validators()
|
|
assert len(validators) == 5
|
|
assert new_validator["storage"] in validators
|
|
|
|
chain = b.get_latest_abci_chain()
|
|
assert chain
|
|
assert chain == {
|
|
"height": 2,
|
|
"is_synced": False,
|
|
"chain_id": "chain-X-migrated-at-height-1",
|
|
}
|
|
|
|
for tx in txs:
|
|
assert b.get_election(tx.id)["is_concluded"]
|
|
|
|
|
|
@pytest.mark.bdb
|
|
def test_process_block_approves_only_one_validator_update(b):
|
|
validators = generate_validators([1] * 4)
|
|
b.store_validator_set(1, [v["storage"] for v in validators])
|
|
|
|
new_validator = generate_validators([1])[0]
|
|
|
|
public_key = validators[0]["public_key"]
|
|
private_key = validators[0]["private_key"]
|
|
voter_keys = [v["private_key"] for v in validators]
|
|
|
|
election, votes = generate_election(
|
|
b, ValidatorElection, public_key, private_key, new_validator["election"], voter_keys
|
|
)
|
|
txs = [election]
|
|
total_votes = votes
|
|
|
|
another_validator = generate_validators([1])[0]
|
|
|
|
election, votes = generate_election(
|
|
b, ValidatorElection, public_key, private_key, another_validator["election"], voter_keys
|
|
)
|
|
txs += [election]
|
|
total_votes += votes
|
|
|
|
Election.process_block(b, 1, txs)
|
|
b.store_block(Block(height=1, transactions=[tx.id for tx in txs], app_hash="")._asdict())
|
|
b.store_bulk_transactions(txs)
|
|
|
|
Election.process_block(b, 2, total_votes)
|
|
|
|
validators = b.get_validators()
|
|
assert len(validators) == 5
|
|
assert new_validator["storage"] in validators
|
|
assert another_validator["storage"] not in validators
|
|
|
|
assert b.get_election(txs[0].id)["is_concluded"]
|
|
assert not b.get_election(txs[1].id)["is_concluded"]
|
|
|
|
|
|
@pytest.mark.bdb
|
|
def test_process_block_approves_after_pending_validator_update(b):
|
|
validators = generate_validators([1] * 4)
|
|
b.store_validator_set(1, [v["storage"] for v in validators])
|
|
|
|
new_validator = generate_validators([1])[0]
|
|
|
|
public_key = validators[0]["public_key"]
|
|
private_key = validators[0]["private_key"]
|
|
voter_keys = [v["private_key"] for v in validators]
|
|
|
|
election, votes = generate_election(
|
|
b, ValidatorElection, public_key, private_key, new_validator["election"], voter_keys
|
|
)
|
|
txs = [election]
|
|
total_votes = votes
|
|
|
|
another_validator = generate_validators([1])[0]
|
|
|
|
election, votes = generate_election(
|
|
b, ValidatorElection, public_key, private_key, another_validator["election"], voter_keys
|
|
)
|
|
txs += [election]
|
|
total_votes += votes
|
|
|
|
election, votes = generate_election(b, ChainMigrationElection, public_key, private_key, {}, voter_keys)
|
|
|
|
txs += [election]
|
|
total_votes += votes
|
|
|
|
b.store_abci_chain(1, "chain-X")
|
|
Election.process_block(b, 1, txs)
|
|
b.store_block(Block(height=1, transactions=[tx.id for tx in txs], app_hash="")._asdict())
|
|
b.store_bulk_transactions(txs)
|
|
|
|
Election.process_block(b, 2, total_votes)
|
|
|
|
validators = b.get_validators()
|
|
assert len(validators) == 5
|
|
assert new_validator["storage"] in validators
|
|
assert another_validator["storage"] not in validators
|
|
|
|
assert b.get_election(txs[0].id)["is_concluded"]
|
|
assert not b.get_election(txs[1].id)["is_concluded"]
|
|
assert b.get_election(txs[2].id)["is_concluded"]
|
|
|
|
assert b.get_latest_abci_chain() == {"height": 2, "chain_id": "chain-X-migrated-at-height-1", "is_synced": False}
|
|
|
|
|
|
@pytest.mark.bdb
|
|
def test_process_block_does_not_approve_after_validator_update(b):
|
|
validators = generate_validators([1] * 4)
|
|
b.store_validator_set(1, [v["storage"] for v in validators])
|
|
|
|
new_validator = generate_validators([1])[0]
|
|
|
|
public_key = validators[0]["public_key"]
|
|
private_key = validators[0]["private_key"]
|
|
voter_keys = [v["private_key"] for v in validators]
|
|
|
|
election, votes = generate_election(
|
|
b, ValidatorElection, public_key, private_key, new_validator["election"], voter_keys
|
|
)
|
|
txs = [election]
|
|
total_votes = votes
|
|
|
|
b.store_block(Block(height=1, transactions=[tx.id for tx in txs], app_hash="")._asdict())
|
|
Election.process_block(b, 1, txs)
|
|
b.store_bulk_transactions(txs)
|
|
|
|
second_election, second_votes = generate_election(
|
|
b, ChainMigrationElection, public_key, private_key, {}, voter_keys
|
|
)
|
|
|
|
Election.process_block(b, 2, total_votes + [second_election])
|
|
|
|
b.store_block(Block(height=2, transactions=[v.id for v in total_votes + [second_election]], app_hash="")._asdict())
|
|
|
|
b.store_abci_chain(1, "chain-X")
|
|
Election.process_block(b, 3, second_votes)
|
|
|
|
assert not b.get_election(second_election.id)["is_concluded"]
|
|
assert b.get_latest_abci_chain() == {"height": 1, "chain_id": "chain-X", "is_synced": True}
|
|
|
|
|
|
@pytest.mark.bdb
|
|
def test_process_block_applies_only_one_migration(b):
|
|
validators = generate_validators([1] * 4)
|
|
b.store_validator_set(1, [v["storage"] for v in validators])
|
|
|
|
public_key = validators[0]["public_key"]
|
|
private_key = validators[0]["private_key"]
|
|
voter_keys = [v["private_key"] for v in validators]
|
|
|
|
election, votes = generate_election(b, ChainMigrationElection, public_key, private_key, {}, voter_keys)
|
|
txs = [election]
|
|
total_votes = votes
|
|
|
|
election, votes = generate_election(b, ChainMigrationElection, public_key, private_key, {}, voter_keys)
|
|
|
|
txs += [election]
|
|
total_votes += votes
|
|
|
|
b.store_abci_chain(1, "chain-X")
|
|
Election.process_block(b, 1, txs)
|
|
b.store_block(Block(height=1, transactions=[tx.id for tx in txs], app_hash="")._asdict())
|
|
b.store_bulk_transactions(txs)
|
|
|
|
Election.process_block(b, 1, total_votes)
|
|
chain = b.get_latest_abci_chain()
|
|
assert chain
|
|
assert chain == {
|
|
"height": 2,
|
|
"is_synced": False,
|
|
"chain_id": "chain-X-migrated-at-height-1",
|
|
}
|
|
|
|
assert b.get_election(txs[0].id)["is_concluded"]
|
|
assert not b.get_election(txs[1].id)["is_concluded"]
|
|
|
|
|
|
def test_process_block_gracefully_handles_empty_block(b):
|
|
Election.process_block(b, 1, [])
|