def test_address_index_event(self): context = ContextContainer._get_context() address = Address.from_data(AddressPrefix.EOA, os.urandom(20)) # Tests simple event emit self._mock_score.AddressIndexEvent(address) self.assertEqual(1, len(context.event_logs)) event_log = context.event_logs[0] self.assertEqual(2, len(event_log.indexed)) self.assertEqual(0, len(event_log.data)) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) # Asserts whether the SCORE address is included in the bloom self.assert_score_address_in_bloom(logs_bloom) event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'AddressIndexEvent(Address)'.encode('utf-8') self.assertIn(event_bloom_data, logs_bloom) indexed_bloom_data = int(1).to_bytes(1, DATA_BYTE_ORDER) + \ address.prefix.value.to_bytes(1, DATA_BYTE_ORDER) + address.body self.assertEqual(ICON_ADDRESS_BYTES_SIZE + 1, len(indexed_bloom_data)) self.assertIn(indexed_bloom_data, logs_bloom)
def test_bytes_index_event(self): context = ContextContainer._get_context() data = b'0123456789abc' # Tests simple event emit self._mock_score.BytesIndexEvent(data) self.assertEqual(len(context.event_logs), 1) event_log = context.event_logs[0] self.assertEqual(2, len(event_log.indexed)) self.assertEqual(0, len(event_log.data)) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) # Asserts whether the SCORE address is included in the bloom self.assert_score_address_in_bloom(logs_bloom) event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'BytesIndexEvent(bytes)'.encode('utf-8') self.assertIn(event_bloom_data, logs_bloom) indexed_bloom_data = \ int(1).to_bytes(1, DATA_BYTE_ORDER) + data self.assertIn(indexed_bloom_data, logs_bloom)
def test_call_event_kwarg(self): context = ContextContainer._get_context() name = "name" address = Address.from_data(AddressPrefix.EOA, b'address') age = 10 # Call with ordered arguments self._mock_score.OneIndexEvent(name, address, age) self.assertEqual(len(context.event_logs), 1) event_log_ordered_args = context.event_logs[0] # Call with ordered arguments and keyword arguments self._mock_score.OneIndexEvent(name, age=age, address=address) self.assertEqual(len(context.event_logs), 2) event_log_keyword_args = context.event_logs[1] self.assertEqual(event_log_ordered_args.score_address, event_log_keyword_args.score_address) self.assertEqual(event_log_ordered_args.indexed, event_log_keyword_args.indexed) self.assertEqual(event_log_ordered_args.data, event_log_keyword_args.data) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) one_event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'OneIndexEvent(str,Address,int)'.encode('utf-8') self.assertIn(one_event_bloom_data, logs_bloom) name_bloom_data = int(1).to_bytes( 1, DATA_BYTE_ORDER) + name.encode('utf-8') self.assertIn(name_bloom_data, logs_bloom)
def test_base_transaction_has_logs_bloom_after_revision_10(self): self._init_decentralized() # TEST: Before 'ADD_LOGS_BLOOM_ON_BASE_TX' revision, base transaction should not have logs bloom tx_list = [ self._create_dummy_tx() ] prev_block, hash_list = self._make_and_req_block_for_issue_test(tx_list, is_block_editable=True) self._write_precommit_state(prev_block) base_tx_result: 'TransactionResult' = self.get_tx_results(hash_list)[0] expected_logs_bloom = None self.assertEqual(expected_logs_bloom, base_tx_result.logs_bloom) # TEST: After 'ADD_LOGS_BLOOM_ON_BASE_TX' revision, base transaction should have logs bloom self.set_revision(Revision.ADD_LOGS_BLOOM_ON_BASE_TX.value) tx_list = [ self._create_dummy_tx() ] prev_block, hash_list = self._make_and_req_block_for_issue_test(tx_list, is_block_editable=True) self._write_precommit_state(prev_block) base_tx_result: 'TransactionResult' = self.get_tx_results(hash_list)[0] expected_logs_bloom = IconServiceEngine._generate_logs_bloom(base_tx_result.event_logs) self.assertEqual(expected_logs_bloom.value, base_tx_result.logs_bloom.value)
def test_call_event(self): context = ContextContainer._get_context() name = "name" address = Address.from_data(AddressPrefix.EOA, os.urandom(20)) age = 10 phone_number = "000" # Tests simple event emit self._mock_score.ZeroIndexEvent(name, address, age) self.assertEqual(len(context.event_logs), 1) event_log = context.event_logs[0] self.assertEqual(1, len(event_log.indexed)) self.assertEqual(3, len(event_log.data)) # This event has a indexed parameter, # so the list of indexed Should have 2 items self._mock_score.OneIndexEvent(name, address, age) self.assertEqual(len(context.event_logs), 2) event_log = context.event_logs[1] self.assertEqual(2, len(event_log.indexed)) self.assertEqual(2, len(event_log.data)) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) # Asserts whether the SCORE address is included in the bloom self.assert_score_address_in_bloom(logs_bloom) zero_event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'ZeroIndexEvent(str,Address,int)'.encode('utf-8') self.assertIn(zero_event_bloom_data, logs_bloom) one_event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'OneIndexEvent(str,Address,int)'.encode('utf-8') self.assertIn(one_event_bloom_data, logs_bloom) name_bloom_data = int(1).to_bytes( 1, DATA_BYTE_ORDER) + name.encode('utf-8') self.assertIn(name_bloom_data, logs_bloom)
def test_call_event_mismatch_arg(self): context = ContextContainer._get_context() name = "name" address = Address.from_data(AddressPrefix.EOA, b'address') age = "10" # The hint of 'age' is int type but argument is str type self.assertRaises(ScoreErrorException, self._mock_score.OneIndexEvent, name, address, age) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) one_event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'OneIndexEvent(str,Address,int)'.encode('utf-8') self.assertNotIn(one_event_bloom_data, logs_bloom) name_bloom_data = int(1).to_bytes( 1, DATA_BYTE_ORDER) + name.encode('utf-8') self.assertNotIn(name_bloom_data, logs_bloom)
def test_int_index_event(self): context = ContextContainer._get_context() amount = 123456789 # Tests simple event emit self._mock_score.IntIndexEvent(amount) self.assertEqual(len(context.event_logs), 1) event_log = context.event_logs[0] self.assertEqual(2, len(event_log.indexed)) self.assertEqual(0, len(event_log.data)) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'IntIndexEvent(int)'.encode('utf-8') self.assertIn(event_bloom_data, logs_bloom) indexed_bloom_data = \ int(1).to_bytes(1, DATA_BYTE_ORDER) + int_to_bytes(amount) self.assertIn(indexed_bloom_data, logs_bloom)
def test_bool_index_event(self): context = ContextContainer._get_context() yes_no = True # Tests simple event emit self._mock_score.BoolIndexEvent(yes_no) self.assertEqual(len(context.event_logs), 1) event_log = context.event_logs[0] self.assertEqual(2, len(event_log.indexed)) self.assertEqual(0, len(event_log.data)) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'BoolIndexEvent(bool)'.encode('utf-8') self.assertIn(event_bloom_data, logs_bloom) indexed_bloom_data = \ int(1).to_bytes(1, DATA_BYTE_ORDER) + int_to_bytes(yes_no) self.assertIn(indexed_bloom_data, logs_bloom)
def test_address_index_event(self): context = ContextContainer._get_context() address = Address.from_data(AddressPrefix.EOA, b'address') # Tests simple event emit self._mock_score.AddressIndexEvent(address) self.assertEqual(len(context.event_logs), 1) event_log = context.event_logs[0] self.assertEqual(2, len(event_log.indexed)) self.assertEqual(0, len(event_log.data)) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'AddressIndexEvent(Address)'.encode('utf-8') self.assertIn(event_bloom_data, logs_bloom) indexed_bloom_data = \ int(1).to_bytes(1, DATA_BYTE_ORDER) + address.body self.assertIn(indexed_bloom_data, logs_bloom)
def test_call_event_mismatch_arg(self): context = ContextContainer._get_context() name = "name" address = Address.from_data(AddressPrefix.EOA, os.urandom(20)) age = "10" # The hint of 'age' is int type but argument is str type self.assertRaises(InvalidEventLogException, self._mock_score.OneIndexEvent, name, address, age) logs_bloom = IconServiceEngine._generate_logs_bloom(context.event_logs) # Asserts whether the SCORE address is not included in the bloom self.assert_score_address_not_in_bloom(logs_bloom) one_event_bloom_data = \ int(0).to_bytes(1, DATA_BYTE_ORDER) + \ 'OneIndexEvent(str,Address,int)'.encode('utf-8') self.assertNotIn(one_event_bloom_data, logs_bloom) name_bloom_data = int(1).to_bytes( 1, DATA_BYTE_ORDER) + name.encode('utf-8') self.assertNotIn(name_bloom_data, logs_bloom)