def test_hot_start_db(tmpdir): tmp_val = tmpdir block_store = LMDBLockStore(str(tmp_val)) chain_factory = ChainFactory() dbms = DBManager(chain_factory, block_store) test_block = FakeBlock() packed_block = test_block.pack() dbms.add_block(packed_block, test_block) tx_blob = test_block.transaction assert dbms.get_tx_blob_by_dot(test_block.com_id, test_block.com_dot) == tx_blob assert ( dbms.get_block_blob_by_dot(test_block.com_id, test_block.com_dot) == packed_block ) front = dbms.get_chain(test_block.com_id).frontier dbms.close() block_store2 = LMDBLockStore(str(tmp_val)) chain_factory2 = ChainFactory() dbms2 = DBManager(chain_factory2, block_store2) assert dbms2.get_tx_blob_by_dot(test_block.com_id, test_block.com_dot) == tx_blob assert ( dbms2.get_block_blob_by_dot(test_block.com_id, test_block.com_dot) == packed_block ) assert dbms2.get_chain(test_block.com_id).frontier == front dbms2.close() tmp_val.remove()
class TestIntegrationDBManager: @pytest.fixture(autouse=True) def setUp(self, tmpdir) -> None: tmp_val = tmpdir self.block_store = LMDBLockStore(str(tmp_val)) self.chain_factory = ChainFactory() self.dbms = DBManager(self.chain_factory, self.block_store) yield self.dbms.close() @pytest.fixture(autouse=True) def setUp2(self, tmpdir) -> None: tmp_val = tmpdir self.block_store2 = LMDBLockStore(str(tmp_val)) self.chain_factory2 = ChainFactory() self.dbms2 = DBManager(self.chain_factory2, self.block_store2) yield try: self.dbms2.close() tmp_val.remove() except FileNotFoundError: pass def test_get_tx_blob(self): self.test_block = FakeBlock() packed_block = self.test_block.pack() self.dbms.add_block(packed_block, self.test_block) self.tx_blob = self.test_block.transaction assert ( self.dbms.get_tx_blob_by_dot( self.test_block.com_id, self.test_block.com_dot ) == self.tx_blob ) assert ( self.dbms.get_block_blob_by_dot( self.test_block.com_id, self.test_block.com_dot ) == packed_block ) def test_add_notify_block_one_chain(self, create_batches, insert_function): self.val_dots = [] def chain_dots_tester(chain_id, dots): for dot in dots: assert (len(self.val_dots) == 0 and dot[0] == 1) or dot[ 0 ] == self.val_dots[-1][0] + 1 self.val_dots.append(dot) blks = create_batches(num_batches=1, num_blocks=100) com_id = blks[0][0].com_id self.dbms.add_observer(com_id, chain_dots_tester) wrap_iterate(insert_function(self.dbms, blks[0])) assert len(self.val_dots) == 100 def test_add_notify_block_with_conflicts(self, create_batches, insert_function): self.val_dots = [] def chain_dots_tester(chain_id, dots): for dot in dots: self.val_dots.append(dot) blks = create_batches(num_batches=2, num_blocks=100) com_id = blks[0][0].com_id self.dbms.add_observer(com_id, chain_dots_tester) wrap_iterate(insert_function(self.dbms, blks[0][:20])) wrap_iterate(insert_function(self.dbms, blks[1][:40])) wrap_iterate(insert_function(self.dbms, blks[0][20:60])) wrap_iterate(insert_function(self.dbms, blks[1][40:])) wrap_iterate(insert_function(self.dbms, blks[0][60:])) assert len(self.val_dots) == 200 def test_blocks_by_frontier_diff(self, create_batches, insert_function): # init chain blks = create_batches(num_batches=2, num_blocks=100) com_id = blks[0][0].com_id wrap_iterate(insert_function(self.dbms, blks[0][:50])) wrap_iterate(insert_function(self.dbms2, blks[1][:50])) front = self.dbms.get_chain(com_id).frontier front_diff = self.dbms2.get_chain(com_id).reconcile(front) vals_request = set() blobs = self.dbms.get_block_blobs_by_frontier_diff( com_id, front_diff, vals_request ) assert len(blobs) == 41 def reconcile_round(self, com_id): front = self.dbms.get_chain(com_id).frontier front_diff = self.dbms2.get_chain(com_id).reconcile(front) vals_request = set() blobs = self.dbms.get_block_blobs_by_frontier_diff( com_id, front_diff, vals_request ) return blobs def test_blocks_by_fdiff_with_holes(self, create_batches, insert_function): # init chain blks = create_batches(num_batches=2, num_blocks=100) com_id = blks[0][0].com_id self.val_dots = [] def chain_dots_tester(chain_id, dots): for dot in dots: self.val_dots.append(dot) self.dbms2.add_observer(com_id, chain_dots_tester) wrap_iterate(insert_function(self.dbms, blks[0][:50])) wrap_iterate(insert_function(self.dbms2, blks[1][:20])) wrap_iterate(insert_function(self.dbms2, blks[1][40:60])) assert len(self.val_dots) == 20 blobs = self.reconcile_round(com_id) assert len(blobs) == 41 for b in blobs: self.dbms2.add_block(b, FakeBlock.unpack(b, blks[0][0].serializer)) assert len(self.val_dots) == 20 blobs2 = self.reconcile_round(com_id) assert len(blobs2) == 8 for b in blobs2: self.dbms2.add_block(b, FakeBlock.unpack(b, blks[0][0].serializer)) assert len(self.val_dots) == 20 blobs2 = self.reconcile_round(com_id) assert len(blobs2) == 1 for b in blobs2: self.dbms2.add_block(b, FakeBlock.unpack(b, blks[0][0].serializer)) assert len(self.val_dots) == 70