def test_score_invoke_failure(self): tx_hash = create_tx_hash() method = 'icx_sendTransaction' params = { 'from': self.from_, 'to': self._icon_score_address, 'value': 0, 'fee': 10**16, 'timestamp': 1234567890, 'txHash': tx_hash, 'dataType': 'call', 'data': { 'method': 'transfer', 'params': { 'to': self._to, 'value': 777 } } } context = _create_context(IconScoreContextType.INVOKE) context.tx = Transaction(tx_hash=params['txHash'], origin=params['from'], index=0, timestamp=params['timestamp'], nonce=params.get('nonce', None)) context.block = Mock(spec=Block) context.msg = Message(sender=params['from'], value=params['value']) context.cumulative_step_used = Mock(spec=int) context.cumulative_step_used.attach_mock(Mock(), '__add__') context.step_counter = Mock(spec=IconScoreStepCounter) context.event_logs = [] context.traces = Mock(spec=list) raise_exception_start_tag("test_score_invoke_failure") tx_result = self._engine._call(context, method, params) raise_exception_end_tag("test_score_invoke_failure") self.assertTrue(isinstance(tx_result, TransactionResult)) self.assertEqual(TransactionResult.FAILURE, tx_result.status) self.assertEqual(self._icon_score_address, tx_result.to) self.assertEqual(tx_hash, tx_result.tx_hash) self.assertIsNone(tx_result.score_address) context.traces.append.assert_called() context_factory.destroy(context)
def test_deploy_invalid_score(self): self.import_white_list_enable() deploy_list = [ 'import_test/test_score_import_in_top_level', 'import_test/test_score_import_in_method', 'import_test/test_score_import_in_function', 'import_test/test_score_import_in_class', 'import_test/import_in_submodule', 'import_test/import_in_indirect_submodule', 'import_test/import_in_indirect_submodule_method', 'import_test/test_score_exec_top_level', 'import_test/test_score_exec_function', 'import_test/test_score_exec_method', 'import_test/test_score_eval_function', 'import_test/test_score_eval_method', 'import_test/test_score_compile_function', 'import_test/test_score_compile_method', 'import_test/exec_in_submodule', 'import_test/exec_in_indirect_submodule', 'import_test/as_test/test_score_import_in_top_level', 'import_test/as_test/test_score_import_in_class', 'import_test/as_test/test_score_import_in_method', 'import_test/as_test/test_score_import_in_function', 'import_test/as_test/test_in_submodule', 'import_test/as_test/test_in_indirect_submodule', 'import_test/as_test/test_in_indirect_submodule_method', 'import_test/import_builtin', 'import_test/import_builtin2', 'import_test/import_builtin3' ] tx_list = [ self._make_deploy_tx('test_deploy_scores', deploy_name, self._addr_array[0], ZERO_SCORE_ADDRESS) for deploy_name in deploy_list ] raise_exception_start_tag("test_deploy_invalid_score") prev_block, tx_results = self._make_and_req_block(tx_list) raise_exception_end_tag("test_deploy_invalid_score") self._write_precommit_state(prev_block) for tx_result in tx_results: self.assertEqual(tx_result.status, int(False))
def test_throw(self, IconServiceEngine_charge_transaction_fee): context = ContextContainer._get_context() self._icon_service_engine = IconServiceEngine() self._icon_service_engine._icx_engine = Mock(spec=IcxEngine) self._icon_service_engine._icon_score_deploy_engine = \ Mock(spec=IconScoreDeployEngine) self._icon_service_engine._icon_pre_validator = Mock( spec=IconPreValidator) context.tx_batch = TransactionBatch() from_ = Mock(spec=Address) to_ = Mock(spec=Address) def intercept_charge_transaction_fee(*args, **kwargs): return Mock(spec=int), Mock(spec=int) IconServiceEngine_charge_transaction_fee.side_effect = \ intercept_charge_transaction_fee self._icon_service_engine._icon_score_deploy_engine.attach_mock( Mock(return_value=False), 'is_data_type_supported') error = Mock(spec=str) code = ExceptionCode.INVALID_PARAMETER mock_exception = Mock(side_effect=InvalidParamsException(error)) IconScoreEngine.invoke = Mock(side_effect=mock_exception) raise_exception_start_tag("test_throw") tx_result = self._icon_service_engine._handle_icx_send_transaction( context, { 'version': 3, 'from': from_, 'to': to_ }) raise_exception_end_tag("test_throw") self.assertEqual(0, tx_result.status) IconServiceEngine_charge_transaction_fee.assert_called() context.traces.append.assert_called() trace = context.traces.append.call_args[0][0] self.assertEqual(TraceType.THROW, trace.trace) self.assertEqual(code, trace.data[0]) self.assertEqual(error, trace.data[1])
def test_revert(self, IconServiceEngine_charge_transaction_fee): context = ContextContainer._get_context() self._icon_service_engine = IconServiceEngine() self._icon_service_engine._flag = 0 self._icon_service_engine._icx_engine = Mock(spec=IcxEngine) self._icon_service_engine._icon_score_deploy_engine = \ Mock(spec=IconScoreDeployEngine) self._icon_service_engine._icon_score_engine = Mock( spec=IconScoreEngine) self._icon_service_engine._icon_pre_validator = Mock( spec=IconPreValidator) context.tx_batch = TransactionBatch() from_ = Mock(spec=Address) to_ = Mock(spec=Address) def intercept_charge_transaction_fee(*args, **kwargs): return Mock(spec=int), Mock(spec=int) IconServiceEngine_charge_transaction_fee.side_effect = \ intercept_charge_transaction_fee self._icon_service_engine._icon_score_deploy_engine.attach_mock( Mock(return_value=False), 'is_data_type_supported') reason = Mock(spec=str) code = ExceptionCode.SCORE_ERROR mock_revert = Mock(side_effect=RevertException(reason)) self._icon_service_engine._icon_score_engine.attach_mock( mock_revert, "invoke") raise_exception_start_tag("test_revert") tx_result = self._icon_service_engine._handle_icx_send_transaction( context, {'version': 3, 'from': from_, 'to': to_}) raise_exception_end_tag("test_revert") self.assertEqual(0, tx_result.status) IconServiceEngine_charge_transaction_fee.assert_called() context.traces.append.assert_called() trace = context.traces.append.call_args[0][0] self.assertEqual(TraceType.REVERT, trace.trace) self.assertEqual(code, trace.data[0]) self.assertEqual(reason, trace.data[1])
def test_deploy_invalid_score(self): deploy_list = [ 'import_test/sample_score_import_in_top_level', 'import_test/sample_score_import_in_method', 'import_test/sample_score_import_in_function', 'import_test/sample_score_import_in_class', 'import_test/import_in_submodule', 'import_test/import_in_indirect_submodule', 'import_test/import_in_indirect_submodule_method', 'import_test/sample_score_exec_top_level', 'import_test/sample_score_exec_function', 'import_test/sample_score_exec_method', 'import_test/sample_score_eval_function', 'import_test/sample_score_eval_method', 'import_test/sample_score_compile_function', 'import_test/sample_score_compile_method', 'import_test/exec_in_submodule', 'import_test/exec_in_indirect_submodule', 'import_test/as_test/sample_score_import_in_top_level', 'import_test/as_test/sample_score_import_in_class', 'import_test/as_test/sample_score_import_in_method', 'import_test/as_test/sample_score_import_in_function', 'import_test/as_test/sample_in_submodule', 'import_test/as_test/sample_in_indirect_submodule', 'import_test/as_test/sample_in_indirect_submodule_method', 'import_test/import_builtin', 'import_test/import_builtin2', 'import_test/import_builtin3', 'import_test/import_package', 'import_test/import_system_score_package', ] tx_list = [ self.create_deploy_score_tx(score_root='sample_deploy_scores', score_name=deploy_name, from_=self._accounts[0], to_=SYSTEM_SCORE_ADDRESS) for deploy_name in deploy_list ] raise_exception_start_tag("sample_deploy_invalid_score") self.process_confirm_block_tx(tx_list, expected_status=False) self.make_and_req_block(tx_list) raise_exception_end_tag("sample_deploy_invalid_score")
def test_score_no_python(self): value1 = 1 * self._icx_factor tx1 = self._make_deploy_tx("test_deploy_scores", "install/test_score_no_python", self._addr_array[0], ZERO_SCORE_ADDRESS, deploy_params={'value': hex(value1)}) raise_exception_start_tag("test_score_no_python") prev_block, tx_results = self._make_and_req_block([tx1]) raise_exception_end_tag("test_score_no_python") self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(False)) self.assertEqual(tx_results[0].failure.code, ExceptionCode.SERVER_ERROR)
def test_score_no_external_func(self): self._update_governance() # 1. deploy same SCORE address (wait audit) value1 = 1 * self._icx_factor tx_result = self._deploy_score("install/test_score_no_external_func", value1) tx_hash1 = tx_result.tx_hash # 2. accept SCORE : tx_hash1 raise_exception_start_tag("test_score_no_external_func") tx_result = self._accept_score(tx_hash1) raise_exception_end_tag("test_score_no_external_func") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.ILLEGAL_FORMAT) self.assertEqual(tx_result.failure.message, "There is no external method in the SCORE")
def test_governance_call_about_add_remove_auditor_invalid_address(self): self._update_governance() raise_exception_start_tag("addAuditor") tx_result = self._external_call(self._admin, GOVERNANCE_SCORE_ADDRESS, 'addAuditor', {"address": str("")}) raise_exception_end_tag("addAuditor") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.INVALID_PARAMS) self.assertEqual(tx_result.failure.message, "Invalid address") raise_exception_start_tag("removeAuditor") tx_result = self._external_call(self._admin, GOVERNANCE_SCORE_ADDRESS, 'removeAuditor', {"address": str("")}) raise_exception_end_tag("removeAuditor") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.INVALID_PARAMS) self.assertEqual(tx_result.failure.message, "Invalid address")
def test_invalid_owner(self): params = {'serviceFlag': hex(IconServiceFlag.audit)} tx = self._make_score_call_tx(Address.from_prefix_and_int( AddressPrefix.CONTRACT, 2), GOVERNANCE_SCORE_ADDRESS, 'updateServiceConfig', params=params) raise_exception_start_tag("test_invalid_owner") prev_block, tx_results = self._make_and_req_block([tx]) raise_exception_end_tag("test_invalid_owner") self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(False)) self.assertEqual(tx_results[0].failure.code, ExceptionCode.SCORE_ERROR) self.assertEqual(tx_results[0].failure.message, f'Invalid sender: not owner')
def test_score_no_scorebase(self): self._update_governance() # 1. deploy same SCORE address (wait audit) value1 = 1 * self._icx_factor tx_result = self._deploy_score("install/test_score_no_scorebase", value1) tx_hash1 = tx_result.tx_hash # 2. accept SCORE : tx_hash1 raise_exception_start_tag("test_score_no_scorebase") tx_result = self._accept_score(tx_hash1) raise_exception_end_tag("test_score_no_scorebase") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.SYSTEM_ERROR) self.assertEqual(tx_result.failure.message, "'TestScore' object has no attribute 'owner'")
def test_score_with_korean_comments(self): self._update_governance_score() # 1. deploy same SCORE address (wait audit) value1 = 1 tx_results: List['TransactionResult'] = self._deploy_score( score_name="install/sample_score_with_korean_comments", value=value1) tx_hash1 = tx_results[0].tx_hash # 2. accept SCORE : tx_hash1 raise_exception_start_tag("sample_score_with_korean_comments") tx_results: List['TransactionResult'] = self.accept_score( tx_hash=tx_hash1, expected_status=False) raise_exception_end_tag("sample_score_with_korean_comments") self.assertEqual(tx_results[0].failure.code, ExceptionCode.SYSTEM_ERROR)
def test_normal_score_fail1_fix_update_governance(self): self._update_governance() # 1. deploy (wait audit) tx_result = self._deploy_score("install/test_score", 1) self.assertEqual(tx_result.status, int(True)) score_addr1 = tx_result.score_address tx_hash1 = tx_result.tx_hash expect_ret = {'next': {'status': 'pending', 'deployTxHash': tx_hash1}} # assert SCORE status self._assert_get_score_status(score_addr1, expect_ret) # 2. accpt SCORE : empty str raise_exception_start_tag("Invalid txHash") tx_result = self._accept_score("") raise_exception_end_tag("Invalid txHash") self.assertEqual(tx_result.status, int(False))
def test_score_address_already_in_use(self): self._update_governance() # 1. deploy timestamp = 1 value1 = 1 * self._icx_factor tx1 = self._make_deploy_tx("test_deploy_scores", "install/test_score", self._addr_array[0], ZERO_SCORE_ADDRESS, timestamp_us=timestamp, deploy_params={'value': hex(value1)}) value2 = 2 * self._icx_factor tx2 = self._make_deploy_tx("test_deploy_scores", "install/test_score", self._addr_array[0], ZERO_SCORE_ADDRESS, timestamp_us=timestamp, deploy_params={'value': hex(value2)}) raise_exception_start_tag("test_score_address_already_in_use") prev_block, tx_results = self._make_and_req_block([tx1, tx2]) raise_exception_end_tag("test_score_address_already_in_use") self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(True)) score_addr1 = tx_results[0].score_address self.assertEqual(tx_results[1].status, int(False)) self.assertEqual(tx_results[1].failure.code, ExceptionCode.ACCESS_DENIED) self.assertEqual(tx_results[1].failure.message, f'SCORE address already in use: {str(score_addr1)}') # 2. assert get value: value1 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value1) # 3. set value: value2 value2 = 2 * self._icx_factor self._set_value(self._addr_array[0], score_addr1, "set_value", {"value": hex(value2)}) # 4. assert get value: 2 * value2 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value2)
def test_score_no_external_func(self): self._update_governance() # 1. install done value1 = 1 * self._icx_factor score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1) print(f'tx_hash1: {tx_hash1.hex()}\ntx_hash2: {tx_hash2.hex()}') # 2. deploy update (wait audit) tx1 = self._make_deploy_tx("test_deploy_scores", "install/test_score_no_external_func", self._addr_array[0], score_addr1, deploy_params={'value': hex(value1)}) prev_block, tx_results = self._make_and_req_block([tx1]) self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(True)) tx_hash2 = tx_results[0].tx_hash print(f'tx_hash3: {tx_hash2.hex()}') # 3. accept SCORE : tx_hash2 raise_exception_start_tag("test_score_no_external_func") tx_result = self._accept_score(tx_hash2) raise_exception_end_tag("test_score_no_external_func") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.ILLEGAL_FORMAT) self.assertEqual(tx_result.failure.message, "There is no external method in the SCORE") # 4. assert get value: value1 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value1) # 5. set value: value3 value3 = 3 * self._icx_factor self._set_value(self._addr_array[0], score_addr1, "set_value", {"value": hex(value3)}) # 6. assert get value: value3 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value3)
def test_score_no_scorebase(self): self._update_governance_score() # 1. deploy same SCORE address (wait audit) value1 = 1 tx_results: List['TransactionResult'] = self._deploy_score( score_name="install/sample_score_no_scorebase", value=value1) tx_hash1 = tx_results[0].tx_hash # 2. accept SCORE : tx_hash1 raise_exception_start_tag("sample_score_no_scorebase") tx_results: List['TransactionResult'] = self.accept_score( tx_hash=tx_hash1, expected_status=False) raise_exception_end_tag("sample_score_no_scorebase") self.assertEqual(tx_results[0].failure.code, ExceptionCode.SYSTEM_ERROR) self.assertEqual(tx_results[0].failure.message, "'SampleScore' object has no attribute 'owner'")
def test_governance_call_about_remove_auditor_not_yourself(self): self._update_governance() eoa_addr = create_address() tx_result = self._external_call(self._admin, GOVERNANCE_SCORE_ADDRESS, 'addAuditor', {"address": str(self._addr_array[0])}) self.assertEqual(tx_result.status, int(True)) raise_exception_start_tag("removeAuditor") tx_result = self._external_call(eoa_addr, GOVERNANCE_SCORE_ADDRESS, 'removeAuditor', {"address": str(self._addr_array[0])}) raise_exception_end_tag("removeAuditor") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.SCORE_ERROR) self.assertEqual(tx_result.failure.message, f"Invalid sender: not yourself")
def test_invalid_owner_update_governance(self): self._update_governance() # 1. install done value1 = 1 * self._icx_factor score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1) # 2. deploy update (wait audit) value2 = 2 * self._icx_factor tx1 = self._make_deploy_tx("test_deploy_scores", "update/test_score", self._addr_array[1], score_addr1, deploy_params={'value': hex(value2)}) raise_exception_start_tag("test_invalid_owner1") prev_block, tx_results = self._make_and_req_block([tx1]) raise_exception_end_tag("test_invalid_owner1") self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(False)) self.assertEqual(tx_results[0].failure.code, ExceptionCode.SERVER_ERROR) self.assertEqual(tx_results[0].failure.message, f'Invalid owner: {str(self._addr_array[0])} != {str(self._addr_array[1])}') tx_hash2 = tx_results[0].tx_hash # 3. accept SCORE : tx_hash2 raise_exception_start_tag("test_invalid_owner2") tx_result = self._accept_score(tx_hash2) raise_exception_end_tag("test_invalid_owner2") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.SCORE_ERROR) self.assertEqual(tx_result.failure.message, "Invalid txHash: None") # 4. assert get value: value1 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value1) # 5. set value: value3 value3 = 3 * self._icx_factor self._set_value(self._addr_array[0], score_addr1, "set_value", {"value": hex(value3)}) # 6. assert get value: value3 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value3)
def test_score_tbears_mode(self): self._update_governance() # 1. deploy value1 = 1 * self._icx_factor tx1 = self._make_deploy_tx("test_deploy_scores", "install/test_score", self._addr_array[0], ZERO_SCORE_ADDRESS, deploy_params={'value': hex(value1)}, is_sys=True) raise_exception_start_tag("test_score_tbears_mode") prev_block, tx_results = self._make_and_req_block([tx1]) raise_exception_end_tag("test_score_tbears_mode") self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(False)) self.assertEqual(tx_results[0].failure.code, ExceptionCode.INVALID_PARAMETER) self.assertIsInstance(tx_results[0].failure.message, str)
def test_score_no_zip(self): self._update_governance() # 1. deploy value1 = 1 * self._icx_factor tx1 = self._make_deploy_tx("test_deploy_scores", "install/test_score", self._addr_array[0], ZERO_SCORE_ADDRESS, data=b'invalid', deploy_params={'value': hex(value1)}) raise_exception_start_tag("test_score_no_zip") prev_block, tx_results = self._make_and_req_block([tx1]) raise_exception_end_tag("test_score_no_zip") self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(False)) self.assertEqual(tx_results[0].failure.code, ExceptionCode.INVALID_PACKAGE) self.assertEqual(tx_results[0].failure.message, f'Bad zip file.')
def test_score_no_external_func(self): self._update_governance_score() # 1. deploy same SCORE address (wait audit) value1 = 1 tx_results: List['TransactionResult'] = self._deploy_score( score_name="install/sample_score_no_external_func", value=value1) tx_hash1 = tx_results[0].tx_hash # 2. accept SCORE : tx_hash1 raise_exception_start_tag("sample_score_no_external_func") tx_results: List['TransactionResult'] = self.accept_score( tx_hash=tx_hash1, expected_status=False) raise_exception_end_tag("sample_score_no_external_func") self.assertEqual(tx_results[0].failure.code, ExceptionCode.ILLEGAL_FORMAT) self.assertEqual(tx_results[0].failure.message, "There is no external method in the SCORE")
def test_apply_score_multiply_import(self): self.import_white_list_enable() # add import whitelist tx1 = self._make_score_call_tx( self._admin, GOVERNANCE_SCORE_ADDRESS, 'addImportWhiteList', {"importStmt": "{'struct': ['pack', 'unpack']}"}) tx2 = self._make_deploy_tx("test_deploy_scores", 'import_test/import_multiply', self._addr_array[0], ZERO_SCORE_ADDRESS) raise_exception_start_tag("test_apply_score_import_white_list") prev_block, tx_results = self._make_and_req_block([tx1, tx2]) raise_exception_end_tag("test_apply_score_import_white_list") self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(True)) self.assertEqual(tx_results[1].status, int(True))
def test_normal_score_fail1_fix_update_governance(self): self._update_governance_score() # 1. deploy (wait audit) tx_results: List['TransactionResult'] = self._deploy_score( "install/sample_score", 1) score_addr1: 'Address' = tx_results[0].score_address tx_hash1: bytes = tx_results[0].tx_hash expect_ret = {'next': {'status': 'pending', 'deployTxHash': tx_hash1}} # assert SCORE status self._assert_get_score_status(score_addr1, expect_ret) # 2. accpt SCORE : empty str raise_exception_start_tag( "test_normal_score_fail1_fix_update_governance") self.accept_score("", expected_status=False) raise_exception_end_tag( "test_normal_score_fail1_fix_update_governance")
def test_governance_call_about_remove_auditor_not_yourself(self): self._update_governance_score() self.score_call(from_=self._admin, to_=GOVERNANCE_SCORE_ADDRESS, func_name="addAuditor", params={"address": str(self._accounts[0].address)}) raise_exception_start_tag("removeAuditor") eoa_addr = create_address() tx_results: List['TransactionResult'] = self.score_call( from_=eoa_addr, to_=GOVERNANCE_SCORE_ADDRESS, func_name="removeAuditor", params={"address": str(self._accounts[0].address)}, expected_status=False) raise_exception_end_tag("removeAuditor") self.assertEqual(tx_results[0].failure.code, ExceptionCode.SCORE_ERROR) self.assertEqual(tx_results[0].failure.message, f"Invalid sender: not yourself")
def test_score_no_scorebase(self): self._update_governance() # 1. install done value1 = 1 * self._icx_factor score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1) # 2. deploy update (wait audit) tx1 = self._make_deploy_tx("test_deploy_scores", "install/test_score_no_scorebase", self._addr_array[0], score_addr1, deploy_params={'value': hex(value1)}) prev_block, tx_results = self._make_and_req_block([tx1]) self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(True)) tx_hash2 = tx_results[0].tx_hash # 3. accept SCORE : tx_hash2 raise_exception_start_tag("test_score_no_scorebase") tx_result = self._accept_score(tx_hash2) raise_exception_end_tag("test_score_no_scorebase") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.SYSTEM_ERROR) self.assertEqual(tx_result.failure.message, "'TestScore' object has no attribute 'owner'") # 4. assert get value: value1 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value1) # 5. set value: value3 value3 = 3 * self._icx_factor self._set_value(self._addr_array[0], score_addr1, "set_value", {"value": hex(value3)}) # 6. assert get value: value3 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value3)
def test_score_no_zip(self): self._update_governance() # 1. install done value1 = 1 * self._icx_factor score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1) # 2. deploy update (wait audit) tx1 = self._make_deploy_tx("test_deploy_scores", "update/test_score", self._addr_array[0], score_addr1, data=b'invalid', deploy_params={'value': hex(value1)}) prev_block, tx_results = self._make_and_req_block([tx1]) self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(True)) tx_hash2 = tx_results[0].tx_hash # 3. accept SCORE : tx_hash2 raise_exception_start_tag("test_score_no_zip") tx_result = self._accept_score(tx_hash2) raise_exception_end_tag("test_score_no_zip") self.assertEqual(tx_result.status, int(False)) self.assertEqual(tx_result.failure.code, ExceptionCode.INVALID_PACKAGE) self.assertEqual(tx_result.failure.message, f'Bad zip file.') # 4. assert get value: value1 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value1) # 5. set value: value3 value3 = 3 * self._icx_factor self._set_value(self._addr_array[0], score_addr1, "set_value", {"value": hex(value3)}) # 6. assert get value: value3 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value3)
def test_invalid_owner_update_governance(self): self._update_governance_score() # 1. install done value1 = 1 score_addr1, tx_hash1, tx_hash2 = self._install_normal_score(value1) # 2. deploy update (wait audit) value2 = 2 tx_results: List['TransactionResult'] = self.deploy_score(score_root="sample_deploy_scores", score_name="update/sample_score", from_=self._accounts[1], deploy_params={'value': hex(value2 * ICX_IN_LOOP)}, to_=score_addr1, expected_status=False) tx_hash3 = tx_results[0].tx_hash self.assertEqual(tx_results[0].failure.code, ExceptionCode.ACCESS_DENIED) self.assertEqual(tx_results[0].failure.message, f'Invalid owner: {str(self._accounts[0].address)} ' f'!= {str(self._accounts[1].address)}') # 3. accept SCORE : tx_hash3 raise_exception_start_tag("test_invalid_owner -2") tx_results: List['TransactionResult'] = self.accept_score(tx_hash=tx_hash3, expected_status=False) raise_exception_end_tag("test_invalid_owner -2") self.assertEqual(tx_results[0].failure.code, ExceptionCode.SCORE_ERROR) self.assertEqual(tx_results[0].failure.message, "Invalid txHash: None") # 4. assert get value: value1 self._assert_get_value(self._accounts[0], score_addr1, "get_value", value1) # 5. set value: value3 value3 = 3 self.score_call(from_=self._accounts[0], to_=score_addr1, func_name="set_value", params={"value": hex(value3 * ICX_IN_LOOP)}) # 6. assert get value: value3 self._assert_get_value(self._accounts[0], score_addr1, "get_value", value3)
def test_tx_failure(self, score_invoke): score_invoke.side_effect = Mock(side_effect=InvalidParamsException("error")) from_ = Address.from_data(AddressPrefix.EOA, os.urandom(20)) to_ = Address.from_data(AddressPrefix.CONTRACT, os.urandom(20)) tx_index = randrange(0, 100) self._mock_context.tx = Transaction(os.urandom(32), tx_index, from_, to_, 0) self._mock_context.msg = Message(from_) self._mock_context.tx_batch = TransactionBatch() raise_exception_start_tag("test_tx_failure") tx_result = self._icon_service_engine._handle_icx_send_transaction( self._mock_context, {'from': from_, 'to': to_}) raise_exception_end_tag("test_tx_failure") self._icon_service_engine._charge_transaction_fee.assert_called() self.assertEqual(0, tx_result.status) self.assertEqual(tx_index, tx_result.tx_index) self.assertIsNone(tx_result.score_address) camel_dict = tx_result.to_dict(to_camel_case) self.assertNotIn('scoreAddress', camel_dict)
def test_score_tbears_mode(self): self.update_governance() # 1. deploy value1 = 1 tx1 = self.create_deploy_score_tx("sample_deploy_scores", "install/sample_score", self._accounts[0], ZERO_SCORE_ADDRESS, deploy_params={'value': hex(value1)}, is_sys=True) raise_exception_start_tag("test_score_tbears_mode") prev_block, hash_list = self.make_and_req_block([tx1]) raise_exception_end_tag("test_score_tbears_mode") self._write_precommit_state(prev_block) tx_results: List['TransactionResult'] = self.get_tx_results(hash_list) self.assertEqual(tx_results[0].status, int(False)) self.assertEqual(tx_results[0].failure.code, ExceptionCode.INVALID_PARAMETER) self.assertIsInstance(tx_results[0].failure.message, str)
def test_invalid_owner(self): self._update_governance() # 1. install done value1 = 1 * self._icx_factor score_addr1, tx_hash1 = self._install_normal_score(value1) # 2. deploy update value2 = 2 * self._icx_factor tx1 = self._make_deploy_tx("test_deploy_scores", "update/test_score", self._addr_array[1], score_addr1, deploy_params={'value': hex(value2)}) raise_exception_start_tag("test_invalid_owner1") prev_block, tx_results = self._make_and_req_block([tx1]) raise_exception_end_tag("test_invalid_owner1") self._write_precommit_state(prev_block) self.assertEqual(tx_results[0].status, int(False)) self.assertEqual(tx_results[0].failure.code, ExceptionCode.ACCESS_DENIED) self.assertEqual( tx_results[0].failure.message, f'Invalid owner: {str(self._addr_array[0])} != {str(self._addr_array[1])}' ) # 3. assert get value: value1 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value1) # 4. set value: value3 value3 = 3 * self._icx_factor self._set_value(self._addr_array[0], score_addr1, "set_value", {"value": hex(value3)}) # 5. assert get value: value3 self._assert_get_value(self._addr_array[0], score_addr1, "get_value", value3)
def test_score_address_already_in_use(self): self.update_governance() # 1. deploy timestamp = 1 value1 = 1 tx1: dict = self._create_deploy_score_tx_with_timestamp( timestamp=timestamp, value=value1) tx2: dict = self._create_deploy_score_tx_with_timestamp( timestamp=timestamp, value=value1) raise_exception_start_tag("test_score_address_already_in_use") prev_block, hash_list = self.make_and_req_block([tx1, tx2]) raise_exception_end_tag("test_score_address_already_in_use") self._write_precommit_state(prev_block) tx_results: List['TransactionResult'] = self.get_tx_results(hash_list) self.assertEqual(tx_results[0].status, int(True)) score_addr1: 'Address' = tx_results[0].score_address self.assertEqual(tx_results[1].status, int(False)) self.assertEqual(tx_results[1].failure.code, ExceptionCode.ACCESS_DENIED) self.assertEqual(tx_results[1].failure.message, f'SCORE address already in use: {str(score_addr1)}') # 2. assert get value: value1 self._assert_get_value(self._accounts[0], score_addr1, "get_value", value1) # 3. set value: value2 value2 = 2 self.score_call(from_=self._accounts[0], to_=score_addr1, func_name="set_value", params={"value": hex(value2 * ICX_IN_LOOP)}) # 4. assert get value: 2 * value2 self._assert_get_value(self._accounts[0], score_addr1, "get_value", value2)