diff --git a/acceptance/pool.txn b/acceptance/pool.txn new file mode 100644 index 000000000..918bac229 --- /dev/null +++ b/acceptance/pool.txn @@ -0,0 +1,4 @@ +{"data":{"alias":"Node1","client_ip":"127.0.0.1","client_port":9702,"node_ip":"127.0.0.1","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv","identifier":"Th7MpTaRZVRYnPiabds81Y","txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62","type":"0"} +{"data":{"alias":"Node2","client_ip":"127.0.0.1","client_port":9704,"node_ip":"127.0.0.1","node_port":9703,"services":["VALIDATOR"]},"dest":"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb","identifier":"EbP4aYNeTHL6q385GuVpRV","txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc","type":"0"} +{"data":{"alias":"Node3","client_ip":"127.0.0.1","client_port":9706,"node_ip":"127.0.0.1","node_port":9705,"services":["VALIDATOR"]},"dest":"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya","identifier":"4cU41vWW82ArfxJxHkzXPG","txnId":"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4","type":"0"} +{"data":{"alias":"Node4","client_ip":"127.0.0.1","client_port":9708,"node_ip":"127.0.0.1","node_port":9707,"services":["VALIDATOR"]},"dest":"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA","identifier":"TWwCRQRZ2ZHMJFn9TzLp7W","txnId":"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008","type":"0"} diff --git a/acceptance/setup.py b/acceptance/setup.py new file mode 100644 index 000000000..3c5bb0937 --- /dev/null +++ b/acceptance/setup.py @@ -0,0 +1,14 @@ +from setuptools import setup + +setup( + name='indy-node-acceptance', + version='0.0.1', + description='Acceptance tests for Hyperledger Indy-Node', + url='https://github.com/hyperledger/indy-node/tree/master/acceptance', + author='Nikita Spivachuk', + author_email='nikita.spivachuk@dsr-company.com', + license='MIT/Apache-2.0', + install_requires=['python3-indy==1.0.0-dev-177', 'pytest', 'pytest-asyncio', + 'pytest-runner'], + setup_requires=['pytest-runner'] +) diff --git a/acceptance/sovrin_acceptance/__init__.py b/acceptance/sovrin_acceptance/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/acceptance/sovrin_acceptance/test/__init__.py b/acceptance/sovrin_acceptance/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/acceptance/sovrin_acceptance/test/client.py b/acceptance/sovrin_acceptance/test/client.py new file mode 100644 index 000000000..6d84bcd3c --- /dev/null +++ b/acceptance/sovrin_acceptance/test/client.py @@ -0,0 +1,60 @@ +import json + +from indy import ledger, signus + + +class Client: + def __init__(self, pool_handle, wallet_handle): + self._pool_handle = pool_handle + self._wallet_handle = wallet_handle + self._active_did = None + + async def use_did(self, did): + self._active_did = did + + async def new_did(self, did=None, seed=None): + did_params = {} + if did: + did_params['did'] = did + if seed: + did_params['seed'] = seed + + did, verkey, _ = \ + await signus.create_and_store_my_did(self._wallet_handle, + json.dumps(did_params)) + + await self.use_did(did) + + return did, verkey + + async def send_nym(self, dest, verkey=None, role=None): + nym_req_json = await ledger.build_nym_request(self._active_did, + dest, verkey, None, role) + await self._sign_and_submit_request(nym_req_json) + + async def send_get_nym(self, dest): + get_nym_req_json = await ledger.build_get_nym_request(self._active_did, + dest) + return await self._submit_request(get_nym_req_json) + + async def _sign_and_submit_request(self, request_json): + response_json = \ + await ledger.sign_and_submit_request(self._pool_handle, + self._wallet_handle, + self._active_did, + request_json) + return Client._extract_result(response_json) + + async def _submit_request(self, request_json): + response_json = await ledger.submit_request(self._pool_handle, + request_json) + return Client._extract_result(response_json) + + @staticmethod + def _extract_result(response_json): + response = json.loads(response_json) + + if 'result' in response and 'data' in response['result']: + return json.loads(response['result']['data']) + else: + return None diff --git a/acceptance/sovrin_acceptance/test/conftest.py b/acceptance/sovrin_acceptance/test/conftest.py new file mode 100644 index 000000000..8e6bb1413 --- /dev/null +++ b/acceptance/sovrin_acceptance/test/conftest.py @@ -0,0 +1,85 @@ +import json +import os +from shutil import rmtree + +import pytest +from indy import pool, wallet + +from sovrin_acceptance.test.client import Client + + +@pytest.fixture +def pool_name(): + return 'acceptance' + + +@pytest.fixture +def wallet_name(): + return 'default' + + +@pytest.fixture +def base_dir_created(): + base_dir = os.path.join(os.path.expanduser('~'), '.indy') + + if os.path.isdir(base_dir): + rmtree(base_dir) + elif os.path.isfile(base_dir): + os.remove(base_dir) + + os.makedirs(base_dir) + yield + rmtree(base_dir) + + +@pytest.fixture +def pool_genesis_txn_path(): + test_dir = os.path.dirname(os.path.realpath(__file__)) + acceptance_dir = os.path.join(test_dir, os.pardir, os.pardir) + return os.path.join(acceptance_dir, 'pool.txn') + + +# noinspection PyUnusedLocal +@pytest.fixture +def pool_ledger_created(base_dir_created, pool_name, pool_genesis_txn_path, + event_loop): + event_loop.run_until_complete(pool.create_pool_ledger_config( + pool_name, + json.dumps({ + 'genesis_txn': str(pool_genesis_txn_path) + }))) + yield + event_loop.run_until_complete(pool.delete_pool_ledger_config(pool_name)) + + +# noinspection PyUnusedLocal +@pytest.fixture +def pool_handle(pool_ledger_created, pool_name, event_loop): + pool_handle = event_loop.run_until_complete( + pool.open_pool_ledger(pool_name, None)) + yield pool_handle + event_loop.run_until_complete(pool.close_pool_ledger(pool_handle)) + + +# noinspection PyUnusedLocal +@pytest.fixture +def wallet_created(base_dir_created, pool_ledger_created, + pool_name, wallet_name, event_loop): + event_loop.run_until_complete( + wallet.create_wallet(pool_name, wallet_name, 'default', None, None)) + yield + event_loop.run_until_complete(wallet.delete_wallet(wallet_name, None)) + + +# noinspection PyUnusedLocal +@pytest.fixture +def wallet_handle(wallet_created, wallet_name, event_loop): + wallet_handle = event_loop.run_until_complete( + wallet.open_wallet(wallet_name, None, None)) + yield wallet_handle + event_loop.run_until_complete(wallet.close_wallet(wallet_handle)) + + +@pytest.fixture +def client(pool_handle, wallet_handle): + return Client(pool_handle, wallet_handle) diff --git a/acceptance/sovrin_acceptance/test/constants.py b/acceptance/sovrin_acceptance/test/constants.py new file mode 100644 index 000000000..849af490a --- /dev/null +++ b/acceptance/sovrin_acceptance/test/constants.py @@ -0,0 +1,5 @@ +NO_ROLE_CODE = '' +TRUSTEE_CODE = '0' +STEWARD_CODE = '2' +TGB_CODE = '100' +TRUST_ANCHOR_CODE = '101' diff --git a/acceptance/sovrin_acceptance/test/test_remove_add_roles.py b/acceptance/sovrin_acceptance/test/test_remove_add_roles.py new file mode 100644 index 000000000..99c864e47 --- /dev/null +++ b/acceptance/sovrin_acceptance/test/test_remove_add_roles.py @@ -0,0 +1,223 @@ +import pytest +from indy import IndyError +from indy.error import ErrorCode +from pytest import raises + +from sovrin_acceptance.test.constants import TRUSTEE_CODE, STEWARD_CODE,\ + TGB_CODE, TRUST_ANCHOR_CODE, NO_ROLE_CODE + + +@pytest.mark.skip(reason='IS-347') +@pytest.mark.asyncio +async def test_remove_add_roles(client): + + # GENERATE DIDS AND VERKEYS + + test_trustee1_did, test_trustee1_verkey = \ + await client.new_did(seed='TestTrustee100000000000000000000') + test_trustee2_did, test_trustee2_verkey = \ + await client.new_did(seed='TestTrustee200000000000000000000') + test_steward1_did, test_steward1_verkey = \ + await client.new_did(seed='TestSteward100000000000000000000') + test_steward2_did, test_steward2_verkey = \ + await client.new_did(seed='TestSteward200000000000000000000') + test_steward3_did, test_steward3_verkey = \ + await client.new_did(seed='TestSteward300000000000000000000') + test_tgb1_did, test_tgb1_verkey = \ + await client.new_did(seed='TestTGB1000000000000000000000000') + test_trust_anchor1_did, test_trust_anchor1_verkey = \ + await client.new_did(seed='TestTrustAnchor10000000000000000') + test_trust_anchor2_did, test_trust_anchor2_verkey = \ + await client.new_did(seed='TestTrustAnchor20000000000000000') + test_trust_anchor3_did, test_trust_anchor3_verkey = \ + await client.new_did(seed='TestTrustAnchor30000000000000000') + random_user1_did, random_user1_verkey = \ + await client.new_did(seed='RandomUser1000000000000000000000') + random_user2_did, random_user2_verkey = \ + await client.new_did(seed='RandomUser2000000000000000000000') + random_user3_did, random_user3_verkey = \ + await client.new_did(seed='RandomUser3000000000000000000000') + random_user4_did, random_user4_verkey = \ + await client.new_did(seed='RandomUser4000000000000000000000') + random_user5_did, random_user5_verkey = \ + await client.new_did(seed='RandomUser5000000000000000000000') + random_user6_did, random_user6_verkey = \ + await client.new_did(seed='RandomUser6000000000000000000000') + + # TEST ROLE PERMISSIONS + + # ========================================================================== + await client.new_did(seed='000000000000000000000000Trustee1') + + await client.send_nym(dest=test_trustee1_did, + verkey=test_trustee1_verkey, + role='TRUSTEE') + test_trustee1_nym = await client.send_get_nym(test_trustee1_did) + assert test_trustee1_nym['dest'] == test_trustee1_did + assert test_trustee1_nym['verkey'] == test_trustee1_verkey + assert test_trustee1_nym['role'] == TRUSTEE_CODE + + # ========================================================================== + await client.use_did(test_trustee1_did) + + await client.send_nym(dest=test_steward1_did, + verkey=test_steward1_verkey, + role='STEWARD') + test_steward1_nym = await client.send_get_nym(test_steward1_did) + assert test_steward1_nym['dest'] == test_steward1_did + assert test_steward1_nym['verkey'] == test_steward1_verkey + assert test_steward1_nym['role'] == STEWARD_CODE + + await client.send_nym(dest=random_user3_did, + verkey=random_user3_verkey) + random_user3_nym = await client.send_get_nym(random_user3_did) + assert random_user3_nym['dest'] == random_user3_did + assert random_user3_nym['verkey'] == random_user3_verkey + assert random_user3_nym['role'] == NO_ROLE_CODE + + await client.send_nym(dest=test_tgb1_did, + verkey=test_tgb1_verkey, + role='TGB') + test_tgb1_nym = await client.send_get_nym(test_tgb1_did) + assert test_tgb1_nym['dest'] == test_tgb1_did + assert test_tgb1_nym['verkey'] == test_tgb1_verkey + assert test_tgb1_nym['role'] == TGB_CODE + + # ========================================================================== + await client.use_did(test_steward1_did) + + await client.send_nym(dest=test_trust_anchor1_did, + verkey=test_trust_anchor1_verkey, + role='TRUST_ANCHOR') + test_trust_anchor1_nym = await client.send_get_nym(test_trust_anchor1_did) + assert test_trust_anchor1_nym['dest'] == test_trust_anchor1_did + assert test_trust_anchor1_nym['verkey'] == test_trust_anchor1_verkey + assert test_trust_anchor1_nym['role'] == TRUST_ANCHOR_CODE + + await client.send_nym(dest=random_user4_did, + verkey=random_user4_verkey) + random_user4_nym = await client.send_get_nym(random_user4_did) + assert random_user4_nym['dest'] == random_user4_did + assert random_user4_nym['verkey'] == random_user4_verkey + assert random_user4_nym['role'] == NO_ROLE_CODE + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_steward2_did, + verkey=test_steward2_verkey, + role='STEWARD') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_trustee2_did, + verkey=test_trustee2_verkey, + role='TRUSTEE') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + # ========================================================================== + await client.use_did(test_trust_anchor1_did) + + await client.send_nym(dest=random_user1_did, + verkey=random_user1_verkey) + random_user1_nym = await client.send_get_nym(random_user1_did) + assert random_user1_nym['dest'] == random_user1_did + assert random_user1_nym['verkey'] == random_user1_verkey + assert random_user1_nym['role'] == NO_ROLE_CODE + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_trust_anchor2_did, + verkey=test_trust_anchor2_verkey, + role='TRUST_ANCHOR') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + # TEST REMOVING ROLES + + # ========================================================================== + await client.new_did(seed='000000000000000000000000Trustee1') + + await client.send_nym(dest=test_trustee1_did, + role='') + await client.send_nym(dest=test_steward1_did, + role='') + await client.send_nym(dest=test_tgb1_did, + role='') + await client.send_nym(dest=test_trust_anchor1_did, + role='') + + # ========================================================================== + await client.use_did(test_trustee1_did) + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_trustee2_did, + verkey=test_trustee2_verkey, + role='TRUSTEE') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_steward2_did, + verkey=test_steward2_verkey, + role='STEWARD') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + # ========================================================================== + await client.use_did(test_steward1_did) + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_trust_anchor2_did, + verkey=test_trust_anchor2_verkey, + role='TRUST_ANCHOR') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + # TEST ADDING ROLES + + # ========================================================================== + await client.new_did(seed='000000000000000000000000Trustee1') + + await client.send_nym(dest=test_trustee1_did, + role='TRUSTEE') + + # ========================================================================== + await client.use_did(test_trustee1_did) + + await client.send_nym(dest=test_steward1_did, + role='STEWARD') + await client.send_nym(dest=test_tgb1_did, + role='TGB') + + # ========================================================================== + await client.use_did(test_steward1_did) + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_trust_anchor1_did, + role='TRUST_ANCHOR') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_trustee1_did, + role='') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + # ========================================================================== + await client.use_did(test_trustee1_did) + + await client.send_nym(dest=test_steward3_did, + verkey=test_steward3_verkey, + role='STEWARD') + + await client.send_nym(dest=test_steward2_did, + verkey=test_steward2_verkey, + role='STEWARD') + + # ========================================================================== + await client.use_did(test_steward1_did) + + with raises(IndyError) as exInfo: + await client.send_nym(dest=test_steward2_did, + role='') + assert exInfo.value.error_code == ErrorCode.LedgerInvalidTransaction + + # ========================================================================== + await client.use_did(test_steward2_did) + + await client.send_nym(dest=test_trust_anchor3_did, + verkey=test_trust_anchor3_verkey, + role='TRUST_ANCHOR')