Keep fixtures up to date with registry changes; Deprecate or relocate some test utilities.

pull/328/head
Kieran Prasch 2018-06-23 13:45:52 -07:00
parent c3970ebf2b
commit 4c69809af9
4 changed files with 75 additions and 75 deletions

View File

@ -0,0 +1,68 @@
import os
import tempfile
import pkg_resources
from eth_tester import PyEVMBackend
from eth_tester.backends import is_pyevm_available
from eth_tester.backends.pyevm.main import get_default_genesis_params, get_default_account_keys, generate_genesis_state
from nucypher.blockchain.eth.interfaces import EthereumContractRegistry
class TemporaryEthereumContractRegistry(EthereumContractRegistry):
def __init__(self):
_, self.temp_filepath = tempfile.mkstemp()
super().__init__(registry_filepath=self.temp_filepath)
def clear(self):
with open(self.registry_filepath, 'w') as registry_file:
registry_file.write('')
def reset(self):
os.remove(self.temp_filepath) # remove registrar tempfile
class OverridablePyEVMBackend(PyEVMBackend):
def __init__(self, genesis_overrides=None):
"""
Example overrides
---------------------------------
coinbase: address_bytes
difficulty: int(default: 131072)
extra_data: bytes
gas_limit: int(default: 3141592)
gas_used: int(default: 0)
nonce: bytes
block_number: int
timestamp: int(epoch)
"""
self.fork_config = dict()
if not is_pyevm_available():
raise pkg_resources.DistributionNotFound(
"The `py-evm` package is not available. The "
"`PyEVMBackend` requires py-evm to be installed and importable. "
"Please install the `py-evm` library."
)
self.reset_to_genesis(overrides=genesis_overrides)
def reset_to_genesis(self, overrides=None):
from evm.chains.tester import MainnetTesterChain
from evm.db import get_db_backend
base_db = get_db_backend()
genesis_params = get_default_genesis_params()
# Genesis params overrides
if overrides is not None:
genesis_params.update(overrides)
account_keys = get_default_account_keys()
genesis_state = generate_genesis_state(account_keys)
chain = MainnetTesterChain.from_genesis(base_db, genesis_params, genesis_state)
self.account_keys, self.chain = account_keys, chain

View File

@ -36,6 +36,8 @@ def test_token_deployer_and_agent(testerchain):
assert token_agent.contract_address == same_token_agent.contract_address
assert token_agent == same_token_agent # __eq__
testerchain.interface._registry.clear()
@pytest.mark.slow()
def test_deploy_ethereum_contracts(testerchain):

View File

@ -1,15 +1,11 @@
import random
from typing import List
import pkg_resources
from constant_sorrow import constants
from eth_tester import PyEVMBackend
from eth_tester.backends import is_pyevm_available
from eth_tester.backends.pyevm.main import get_default_genesis_params, get_default_account_keys, generate_genesis_state
from umbral import keys
from web3 import Web3
from nucypher.blockchain.eth.agents import MinerAgent, NucypherTokenAgent
from nucypher.blockchain.eth.agents import MinerAgent
from nucypher.blockchain.eth.deployers import MinerEscrowDeployer, NucypherTokenDeployer
@ -73,64 +69,3 @@ def generate_accounts(w3: Web3, quantity: int) -> List[str]:
w3.personal.unlockAccount(address, passphrase=insecure_passphrase)
addresses.append(addresses)
return addresses
class TesterPyEVMBackend(PyEVMBackend):
def __init__(self, genesis_overrides=None):
"""
Example overrides
---------------------------------
coinbase: address_bytes
difficulty: int(default: 131072)
extra_data: bytes
gas_limit: int(default: 3141592)
gas_used: int(default: 0)
nonce: bytes
block_number: int
timestamp: int(epoch)
"""
self.fork_config = dict()
if not is_pyevm_available():
raise pkg_resources.DistributionNotFound(
"The `py-evm` package is not available. The "
"`PyEVMBackend` requires py-evm to be installed and importable. "
"Please install the `py-evm` library."
)
self.reset_to_genesis(overrides=genesis_overrides)
def reset_to_genesis(self, overrides=None):
from evm.chains.tester import MainnetTesterChain
from evm.db import get_db_backend
base_db = get_db_backend()
genesis_params = get_default_genesis_params()
# Genesis params overrides
if overrides is not None:
genesis_params.update(overrides)
account_keys = get_default_account_keys()
genesis_state = generate_genesis_state(account_keys)
chain = MainnetTesterChain.from_genesis(base_db, genesis_params, genesis_state)
self.account_keys, self.chain = account_keys, chain
def token_airdrop(token_agent, amount: int, origin: str, addresses: List[str]):
"""Airdrops tokens from creator address to all other addresses!"""
def txs():
for address in addresses:
txhash = token_agent.contract.functions.transfer(address, amount).transact({'from': origin,
'gas': 2000000})
yield txhash
receipts = list()
for tx in txs(): # One at a time
receipt = token_agent.blockchain.wait_for_receipt(tx)
receipts.append(receipt)
return receipts

View File

@ -118,22 +118,18 @@ def testerchain(solidity_compiler):
https: // github.com / ethereum / eth - tester # available-backends
"""
# create a temporary registrar for the tester blockchain
_, filepath = tempfile.mkstemp()
test_registrar = EthereumContractRegistry(registry_filepath=filepath)
temp_registrar = TemporaryEthereumContractRegistry()
# Configure a custom provider
overrides = {'gas_limit': 4626271}
pyevm_backend = TesterPyEVMBackend(genesis_overrides=overrides)
# pyevm_backend = PyEVMBackend() # TODO: Remove custom overrides?
pyevm_backend = OverridablePyEVMBackend(genesis_overrides=overrides)
eth_tester = EthereumTester(backend=pyevm_backend, auto_mine_transactions=True)
pyevm_provider = EthereumTesterProvider(ethereum_tester=eth_tester)
# Use the the custom provider and registrar to init an interface
circumflex = DeployerCircumflex(compiler=solidity_compiler, # freshly recompile
registry=test_registrar, # use temporary registrar
registry=temp_registrar, # use temporary registrar
providers=(pyevm_provider, )) # use custom test provider
# Create the blockchain
@ -143,8 +139,7 @@ def testerchain(solidity_compiler):
yield testerchain
testerchain.sever_connection() # Destroy the blockchin singelton cache
os.remove(filepath) # remove registrar tempfile
testerchain.sever_connection()
#