def test_publish(self, args=sys.argv[1:]): gossip = MockNetwork() LOGGER.info(self.blocks) publisher = BlockPublisher( consensus=TestModePublisher(), transaction_executor=MockTransactionExecutor(), send_message=gossip.send_message, squash_handler=None) LOGGER.info("1") # initial load of existing state publisher.on_chain_updated(self.blocks.chain_head.block, [], []) LOGGER.info("2") # repeat as necessary batch = Batch() publisher.on_batch_received(batch) LOGGER.info("3") # current dev_mode consensus always claims blocks when asked. # this will be called on a polling every so often or possibly triggered # by events in the consensus it's self ... TBD publisher.on_check_publish_block() LOGGER.info("4") LOGGER.info(self.blocks) # repeat as necessary batch = Batch() publisher.on_batch_received(batch) publisher.on_check_publish_block() LOGGER.info(self.blocks)
def setUp(self): self.block_tree_manager = BlockTreeManager(with_genesis=False) self.gossip = MockNetwork() self.executor = SynchronousExecutor() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() self.chain_id_manager = MockChainIdManager() self.state_delta_processor = MockStateDeltaProcessor() self.chain_head_lock = RLock() def chain_updated(head, committed_batches=None, uncommitted_batches=None): pass self.chain_ctrl = ChainController( block_cache=self.block_tree_manager.block_cache, state_view_factory=MockStateViewFactory( self.block_tree_manager.state_db), block_sender=self.block_sender, executor=self.executor, transaction_executor=MockTransactionExecutor(), chain_head_lock=self.chain_head_lock, on_chain_updated=chain_updated, squash_handler=None, chain_id_manager=self.chain_id_manager, state_delta_processor=self.state_delta_processor, identity_signing_key=self.block_tree_manager.identity_signing_key, data_dir=None, config_dir=None) self.assertIsNone(self.chain_ctrl.chain_head)
def setUp(self): self.block_tree_manager = BlockTreeManager() self.gossip = MockNetwork() self.executor = SynchronousExecutor() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() self.chain_id_manager = MockChainIdManager() def chain_updated(head, committed_batches=None, uncommitted_batches=None): pass self.chain_ctrl = ChainController( block_cache=self.block_tree_manager.block_cache, state_view_factory=MockStateViewFactory( self.block_tree_manager.state_db), block_sender=self.block_sender, executor=self.executor, transaction_executor=MockTransactionExecutor(), on_chain_updated=chain_updated, squash_handler=None, chain_id_manager=self.chain_id_manager, identity_signing_key=self.block_tree_manager.identity_signing_key, data_dir=None) init_root = self.chain_ctrl.chain_head self.assert_is_chain_head(init_root) # create a chain of length 5 extending the root _, head = self.generate_chain(init_root, 5) self.receive_and_process_blocks(head) self.assert_is_chain_head(head) self.init_head = head
def setUp(self): self.gossip = MockNetwork() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() self.batch_sender = MockBatchSender() self.state_delta_processor = MockStateDeltaProcessor() self.permission_verifier = MockPermissionVerifier()
def setUp(self): self.blocks = BlockTreeManager() self.gossip = MockNetwork() self.executor = SynchronousExecutor() self.txn_executor = MockTransactionExecutor() def chain_updated(head): pass self.chain_ctrl = ChainController( consensus=TestModeVerifier(), block_store=self.blocks.block_store, send_message=self.gossip.send_message, executor=self.executor, transaction_executor=MockTransactionExecutor(), on_chain_updated=chain_updated, squash_handler=None)
def __init__(self): self.block_tree_manager = BlockTreeManager() self.gossip = MockNetwork() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() self.chain_id_manager = MockChainIdManager() self._chain_head_lock = RLock() self.permission_verifier = MockPermissionVerifier() self.state_view_factory = MockStateViewFactory( self.block_tree_manager.state_db) self.transaction_executor = MockTransactionExecutor( batch_execution_result=None) self.executor = SynchronousExecutor() self.block_validator = BlockValidator( state_view_factory=self.state_view_factory, block_cache=self.block_tree_manager.block_cache, transaction_executor=self.transaction_executor, squash_handler=None, identity_signer=self.block_tree_manager.identity_signer, data_dir=None, config_dir=None, permission_verifier=self.permission_verifier, thread_pool=self.executor) def chain_updated(head, committed_batches=None, uncommitted_batches=None): pass self.chain_ctrl = ChainController( block_cache=self.block_tree_manager.block_cache, block_validator=self.block_validator, state_view_factory=self.state_view_factory, chain_head_lock=self._chain_head_lock, on_chain_updated=chain_updated, chain_id_manager=self.chain_id_manager, data_dir=None, config_dir=None, chain_observers=[]) init_root = self.chain_ctrl.chain_head self.assert_is_chain_head(init_root) # create a chain of length 5 extending the root _, head = self.generate_chain(init_root, 5) self.receive_and_process_blocks(head) self.assert_is_chain_head(head) self.init_head = head
def __init__(self): self.block_tree_manager = BlockTreeManager(with_genesis=False) self.gossip = MockNetwork() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() self.chain_id_manager = MockChainIdManager() self.chain_head_lock = RLock() self.permission_verifier = MockPermissionVerifier() self.state_view_factory = MockStateViewFactory( self.block_tree_manager.state_db) self.transaction_executor = MockTransactionExecutor( batch_execution_result=None) self.executor = SynchronousExecutor() self.block_validator = BlockValidator( state_view_factory=self.state_view_factory, block_cache=self.block_tree_manager.block_cache, transaction_executor=self.transaction_executor, squash_handler=None, identity_signer=self.block_tree_manager.identity_signer, data_dir=None, config_dir=None, permission_verifier=self.permission_verifier, thread_pool=self.executor) def chain_updated(head, committed_batches=None, uncommitted_batches=None): pass self.chain_ctrl = ChainController( block_cache=self.block_tree_manager.block_cache, block_validator=self.block_validator, state_view_factory=self.state_view_factory, chain_head_lock=self.chain_head_lock, on_chain_updated=chain_updated, chain_id_manager=self.chain_id_manager, data_dir=None, config_dir=None, chain_observers=[]) self.assertIsNone(self.chain_ctrl.chain_head)
def setUp(self): self.blocks = BlockTreeManager() self.gossip = MockNetwork() self.executor = SynchronousExecutor() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() def chain_updated(head, committed_batches=None, uncommitted_batches=None): pass self.chain_ctrl = ChainController( consensus=TestModeVerifier(), block_cache=self.blocks.block_cache, block_sender=self.block_sender, executor=self.executor, transaction_executor=MockTransactionExecutor(), on_chain_updated=chain_updated, squash_handler=None)
def setUp(self): self.blocks = BlockTreeManager() self.gossip = MockNetwork() self.executor = SynchronousExecutor() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() self.state_view_factory = MockStateViewFactory() def chain_updated(head, committed_batches=None, uncommitted_batches=None): pass self.chain_ctrl = ChainController( consensus_module=mock_consensus, block_cache=self.blocks.block_cache, state_view_factory=self.state_view_factory, block_sender=self.block_sender, executor=self.executor, transaction_executor=MockTransactionExecutor(), on_chain_updated=chain_updated, squash_handler=None)
def __init__(self): self.gossip = MockNetwork() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() self.batch_sender = MockBatchSender() self.permission_verifier = MockPermissionVerifier()
def setUp(self): self.gossip = MockNetwork() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() self.batch_sender = MockBatchSender()
class TestJournal(unittest.TestCase): def setUp(self): self.gossip = MockNetwork() self.txn_executor = MockTransactionExecutor() self.block_sender = MockBlockSender() def test_publish_block(self): """ Test that the Journal will produce blocks and consume those blocks to extend the chain. :return: """ # construction and wire the journal to the # gossip layer. LOGGER.info("test_publish_block") block_store = { 'chain_head_id': 'genesis', 'genesis': BlockState( block_wrapper=_generate_genesis_block(), weight=0, status=BlockStatus.Valid) } journal = None try: journal = Journal( consensus=test_mode_consensus, block_store=block_store, block_sender=self.block_sender, transaction_executor=self.txn_executor, squash_handler=None ) self.gossip.on_batch_received = \ journal.on_batch_received self.gossip.on_block_received = \ journal.on_block_received self.gossip.on_block_request = \ journal.on_block_request journal.start() # feed it a batch batch = Batch() journal.on_batch_received(batch) # wait for a block message to arrive should be soon to = TimeOut(2) while (self.block_sender.new_block is None): time.sleep(0.1) self.assertTrue(self.block_sender.new_block is not None) self.gossip.messages.append(self.block_sender.new_block) block = self.gossip.messages[0] # dispatch the message self.gossip.dispatch_messages() # wait for the chain_head to be updated. to = TimeOut(2) while block_store['chain_head_id'] != block.header_signature: time.sleep(0.1) self.assertTrue(block_store['chain_head_id'] == block.header_signature) finally: if journal is not None: journal.stop()
class TestChainController(unittest.TestCase): def setUp(self): self.blocks = BlockTreeManager() self.gossip = MockNetwork() self.executor = SynchronousExecutor() self.txn_executor = MockTransactionExecutor() def chain_updated(head): pass self.chain_ctrl = ChainController( consensus=TestModeVerifier(), block_store=self.blocks.block_store, send_message=self.gossip.send_message, executor=self.executor, transaction_executor=MockTransactionExecutor(), on_chain_updated=chain_updated, squash_handler=None) def test_simple_case(self): # TEST Run the simple case block_1 = self.blocks.generate_block(self.blocks.chain_head) self.chain_ctrl.on_block_received(block_1.get_block()) self.executor.process_all() assert (self.chain_ctrl.chain_head.block.header_signature == block_1.header_signature) def test_alternate_genesis(self): # TEST Run generate and alternate genesis block head = self.chain_ctrl.chain_head other_genesis = self.blocks.generate_block(add_to_store=True) for b in self.blocks.generate_chain(other_genesis, 5): self.chain_ctrl.on_block_received(b.get_block()) self.executor.process_all() assert (self.chain_ctrl.chain_head.block.header_signature == head.block.header_signature) def test_bad_block_signature(self): # TEST Bad block extending current chain # Bad due to signature head = self.blocks.chain_head block_bad = self.blocks.generate_block(self.blocks.chain_head.block, invalid_signature=True) self.chain_ctrl.on_block_received(block_bad.get_block()) assert (self.chain_ctrl.chain_head.block.header_signature == head.block.header_signature) def test_bad_block_consensus(self): # Bad due to consensus pass def test_bad_block_transaction(self): # Bad due to transaction pass def test_missing_block(self): # TEST Missing block G->missing->B head = self.blocks.chain_head new_blocks = self.blocks.generate_chain(head, 2) self.chain_ctrl.on_block_received(new_blocks[1].get_block()) self.executor.process_all() assert (len(self.gossip.messages) == 1) block_id = self.gossip.messages[0] assert (block_id == new_blocks[0].header_signature) self.gossip.clear() self.chain_ctrl.on_block_received(new_blocks[0].get_block()) self.executor.process_all() assert (self.chain_ctrl.chain_head.block.header_signature == new_blocks[1].header_signature) def test_missing_block_invalid_head(self): # TEST Missing block G->missing->B # B is invalid but Missing is valid head = self.blocks.chain_head new_blocks_def = self.blocks.generate_chain_definition(2) new_blocks_def[1]["invalid_signature"] = True new_blocks = self.blocks.generate_chain(head, new_blocks_def) self.chain_ctrl.on_block_received(new_blocks[1].get_block()) self.executor.process_all() assert (len(self.gossip.messages) == 1) block_id = self.gossip.messages[0] assert (block_id == new_blocks[0].header_signature) self.gossip.clear() self.chain_ctrl.on_block_received(new_blocks[0].get_block()) self.executor.process_all() pp.pprint(new_blocks) pp.pprint(self.blocks.block_store)
def setUp(self): self.gossip = MockNetwork() self.txn_executor = MockTransactionExecutor()
class TestJournal(unittest.TestCase): def setUp(self): self.gossip = MockNetwork() self.txn_executor = MockTransactionExecutor() def test_publish_block(self): """ Test that the Journal will produce blocks and consume those blocks to extend the chain. :return: """ # construction and wire the journal to the # gossip layer. LOGGER.info("test_publish_block") block_store = {} journal = None try: journal = Journal(consensus=test_mode_consensus, block_store=block_store, send_message=self.gossip.send_message, transaction_executor=self.txn_executor, squash_handler=None, first_state_root="000000") self.gossip.on_batch_received = \ journal.on_batch_received self.gossip.on_block_received = \ journal.on_block_received self.gossip.on_block_request = \ journal.on_block_request journal.start() # feed it a batch batch = Batch() journal.on_batch_received(batch) # wait for a block message to arrive should be soon to = TimeOut(2) while len(self.gossip.messages) == 0: time.sleep(0.1) LOGGER.info("Batches: %s", self.gossip.messages) self.assertTrue(len(self.gossip.messages) != 0) block = self.gossip.messages[0] # dispatch the message self.gossip.dispatch_messages() # wait for the chain_head to be updated. to = TimeOut(2) while block_store['chain_head_id'] != block.header_signature: time.sleep(0.1) self.assertTrue( block_store['chain_head_id'] == block.header_signature) finally: if journal is not None: journal.stop()