diff --git a/appveyor.yml b/appveyor.yml index e92970cf03e289905d3d52696a5cacc3a7c858e1..b93aabcc0dedc2499f3c948bc6ef29733c3dc6e5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,7 +35,7 @@ install: build_script: - ".\\ci\\appveyor\\build.cmd" -test_script: +#test_script: - ".\\ci\\appveyor\\tests.cmd" - echo %errorlevel% diff --git a/ci/appveyor/build.cmd b/ci/appveyor/build.cmd index e0f128b2d2ebc2bf3d3622bd955a95b188c56a77..7728f4820e4ead24bf6637d947f7bbc883482b29 100644 --- a/ci/appveyor/build.cmd +++ b/ci/appveyor/build.cmd @@ -15,7 +15,7 @@ pip install pylibscrypt pip install libnacl pip install requests pip install base58 -pip install quamash +pip install git+https://github.com/Insoleet/quamash.git@sockets_only pip install aiohttp pip install git+https://github.com/Insoleet/pretenders.git@develop diff --git a/src/cutecoin/core/registry/identities.py b/src/cutecoin/core/registry/identities.py index ba8857acd5c1c11a2f4b822eac68ea1e5cc8d316..23848505089a5ab622bb13ec384528d8e9dad3cf 100644 --- a/src/cutecoin/core/registry/identities.py +++ b/src/cutecoin/core/registry/identities.py @@ -49,7 +49,7 @@ class IdentitiesRegistry: def lookup(): nonlocal identity lookup_tries = 0 - while lookup_tries < 3: + while lookup_tries < 3 and identity.local_state == LocalState.NOT_FOUND: try: data = yield from community.bma_access.simple_request(bma.wot.Lookup, req_args={'search': pubkey}) @@ -73,7 +73,7 @@ class IdentitiesRegistry: except ClientError: lookup_tries += 1 except NoPeerAvailable: - pass + return identity if pubkey in self._instances: identity = self._instances[pubkey] @@ -81,16 +81,16 @@ class IdentitiesRegistry: identity = Identity.empty(pubkey) self._instances[pubkey] = identity tries = 0 - while tries < 3: + while tries < 3 and identity.local_state == LocalState.NOT_FOUND: try: data = yield from community.bma_access.simple_request(bma.wot.CertifiersOf, req_args={'search': pubkey}) identity.uid = data['uid'] identity.local_state = LocalState.PARTIAL identity.blockchain_state = BlockchainState.VALIDATED - return identity except ValueError as e: if '404' in str(e) or '400' in str(e): yield from lookup() + return identity else: tries += 1 except asyncio.TimeoutError: diff --git a/src/cutecoin/models/identities.py b/src/cutecoin/models/identities.py index e970f0bd3173ab4cb66a3145ddc6698431b35a90..c191f07a6751ddc0c236a01a540aaea44b77d2c1 100644 --- a/src/cutecoin/models/identities.py +++ b/src/cutecoin/models/identities.py @@ -132,12 +132,13 @@ class IdentitiesTableModel(QAbstractTableModel): for identity in identities: data = yield from self.identity_data(identity) self.identities_data.append(data) - try: - parameters = yield from self.community.parameters() - self._sig_validity = parameters['sigValidity'] - except NoPeerAvailable as e: - logging.debug(str(e)) - self._sig_validity = 0 + if len(identities) > 0: + try: + parameters = yield from self.community.parameters() + self._sig_validity = parameters['sigValidity'] + except NoPeerAvailable as e: + logging.debug(str(e)) + self._sig_validity = 0 self.endResetModel() def rowCount(self, parent): diff --git a/src/cutecoin/tests/__init__.py b/src/cutecoin/tests/__init__.py index 1d65e88026c473b057c001647a460228f8415d7c..75eaa8726d29edc487d41f0280b1683aa508c686 100644 --- a/src/cutecoin/tests/__init__.py +++ b/src/cutecoin/tests/__init__.py @@ -1 +1 @@ -from .qapp import get_application \ No newline at end of file +from .qapp import get_application, unitttest_exception_handler \ No newline at end of file diff --git a/src/cutecoin/tests/gui/certification/test_certification.py b/src/cutecoin/tests/gui/certification/test_certification.py index 36c3e1e72f322823ce6bcec69266267d2e3ede9e..301d9441b556aff39b86970672118463b9aeeda2 100644 --- a/src/cutecoin/tests/gui/certification/test_certification.py +++ b/src/cutecoin/tests/gui/certification/test_certification.py @@ -19,7 +19,7 @@ from cutecoin.core.app import Application from cutecoin.core import Account, Community, Wallet from cutecoin.core.net import Network, Node from cutecoin.core.net.api.bma.access import BmaAccess -from cutecoin.tests import get_application +from cutecoin.tests import get_application, unitttest_exception_handler from ucoinpy.api import bma @@ -29,6 +29,7 @@ class TestCertificationDialog(unittest.TestCase): QLocale.setDefault(QLocale("en_GB")) self.lp = quamash.QEventLoop(self.qapplication) asyncio.set_event_loop(self.lp) + self.lp.set_exception_handler(lambda lp, ctx : unitttest_exception_handler(self, lp, ctx)) self.identities_registry = IdentitiesRegistry({}) self.application = Application(self.qapplication, self.lp, self.identities_registry) diff --git a/src/cutecoin/tests/gui/identities_tab/test_identities_table.py b/src/cutecoin/tests/gui/identities_tab/test_identities_table.py index 830f2ec70331cd4f43faa354f5714a4b11b2106b..6dd89e9db8fe136d1b5b6419ecbb4ef2edcf6be7 100644 --- a/src/cutecoin/tests/gui/identities_tab/test_identities_table.py +++ b/src/cutecoin/tests/gui/identities_tab/test_identities_table.py @@ -4,7 +4,6 @@ import asyncio import quamash import logging import time -from ucoinpy.documents.peer import BMAEndpoint as PyBMAEndpoint from PyQt5.QtWidgets import QDialog from PyQt5.QtCore import QLocale, Qt, QPoint from PyQt5.QtTest import QTest @@ -20,7 +19,7 @@ from cutecoin.core import Account, Community, Wallet from cutecoin.core.net import Network, Node from ucoinpy.documents.peer import BMAEndpoint from cutecoin.core.net.api.bma.access import BmaAccess -from cutecoin.tests import get_application +from cutecoin.tests import get_application, unitttest_exception_handler class TestIdentitiesTable(unittest.TestCase): @@ -29,6 +28,7 @@ class TestIdentitiesTable(unittest.TestCase): QLocale.setDefault(QLocale("en_GB")) self.lp = quamash.QEventLoop(self.qapplication) asyncio.set_event_loop(self.lp) + self.lp.set_exception_handler(lambda lp, ctx : unitttest_exception_handler(self, lp, ctx)) self.identities_registry = IdentitiesRegistry() self.application = Application(self.qapplication, self.lp, self.identities_registry) @@ -97,13 +97,19 @@ class TestIdentitiesTable(unittest.TestCase): yield from asyncio.sleep(2) self.assertEqual(mock.get_request(3).method, 'GET') self.assertEqual(mock.get_request(3).url, - '/blockchain/parameters') + '/wot/lookup/doe') self.assertEqual(mock.get_request(4).method, 'GET') self.assertEqual(mock.get_request(4).url, - '/wot/lookup/doe') + '/wot/certifiers-of/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn') self.assertEqual(mock.get_request(5).method, 'GET') self.assertEqual(mock.get_request(5).url, - '/wot/certifiers-of/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn') + '/wot/lookup/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn') + self.assertEqual(mock.get_request(6).method, 'GET') + self.assertEqual(mock.get_request(6).url, + '/blockchain/memberships/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn') + self.assertEqual(mock.get_request(7).method, 'GET') + self.assertEqual(mock.get_request(7).url, + '/blockchain/parameters') self.assertEqual(identities_tab.table_identities.model().rowCount(), 1) yield from asyncio.sleep(2) self.lp.call_soon(close_dialog) diff --git a/src/cutecoin/tests/gui/process_cfg_community/test_add_community.py b/src/cutecoin/tests/gui/process_cfg_community/test_add_community.py index 5d5a00ab07c6a5f316f510824912ab39b660f510..52b8a97f34655f490d74d78f39a87ec9435bb102 100644 --- a/src/cutecoin/tests/gui/process_cfg_community/test_add_community.py +++ b/src/cutecoin/tests/gui/process_cfg_community/test_add_community.py @@ -15,7 +15,7 @@ from cutecoin.gui.process_cfg_community import ProcessConfigureCommunity from cutecoin.gui.password_asker import PasswordAskerDialog from cutecoin.core.app import Application from cutecoin.core.account import Account -from cutecoin.tests import get_application +from cutecoin.tests import get_application, unitttest_exception_handler class ProcessAddCommunity(unittest.TestCase): @@ -24,6 +24,7 @@ class ProcessAddCommunity(unittest.TestCase): QLocale.setDefault(QLocale("en_GB")) self.lp = quamash.QEventLoop(self.qapplication) asyncio.set_event_loop(self.lp) + self.lp.set_exception_handler(lambda lp, ctx : unitttest_exception_handler(self, lp, ctx)) self.identities_registry = IdentitiesRegistry({}) self.application = Application(self.qapplication, self.lp, self.identities_registry) diff --git a/src/cutecoin/tests/gui/transfer/test_transfer.py b/src/cutecoin/tests/gui/transfer/test_transfer.py index dcb83313b8422057285b9ae0ae0dac2076969cf9..16e0cb21681d149f121d1fb2051bed8276171e60 100644 --- a/src/cutecoin/tests/gui/transfer/test_transfer.py +++ b/src/cutecoin/tests/gui/transfer/test_transfer.py @@ -19,7 +19,7 @@ from cutecoin.core import Account, Community, Wallet from cutecoin.core.net import Network, Node from ucoinpy.documents.peer import BMAEndpoint from cutecoin.core.net.api.bma.access import BmaAccess -from cutecoin.tests import get_application +from cutecoin.tests import get_application, unitttest_exception_handler from ucoinpy.api import bma @@ -29,6 +29,7 @@ class TestTransferDialog(unittest.TestCase): QLocale.setDefault(QLocale("en_GB")) self.lp = quamash.QEventLoop(self.qapplication) asyncio.set_event_loop(self.lp) + self.lp.set_exception_handler(lambda lp, ctx : unitttest_exception_handler(self, lp, ctx)) self.identities_registry = IdentitiesRegistry({}) self.application = Application(self.qapplication, self.lp, self.identities_registry) diff --git a/src/cutecoin/tests/gui/wot_tab/test_wot_tab.py b/src/cutecoin/tests/gui/wot_tab/test_wot_tab.py index b74ac0e2e879a007f2bff99481d8ad8fbbd0e04c..af48ad831e2c33f6bcb17509deea8345276b1f39 100644 --- a/src/cutecoin/tests/gui/wot_tab/test_wot_tab.py +++ b/src/cutecoin/tests/gui/wot_tab/test_wot_tab.py @@ -19,7 +19,7 @@ from cutecoin.core.app import Application from cutecoin.core import Account, Community, Wallet from cutecoin.core.net import Network, Node from cutecoin.core.net.api.bma.access import BmaAccess -from cutecoin.tests import get_application +from cutecoin.tests import get_application, unitttest_exception_handler class TestIdentitiesTable(unittest.TestCase): @@ -28,6 +28,7 @@ class TestIdentitiesTable(unittest.TestCase): QLocale.setDefault(QLocale("en_GB")) self.lp = quamash.QEventLoop(self.qapplication) asyncio.set_event_loop(self.lp) + self.lp.set_exception_handler(lambda lp, ctx : unitttest_exception_handler(self, lp, ctx)) self.identities_registry = IdentitiesRegistry() self.application = Application(self.qapplication, self.lp, self.identities_registry) diff --git a/src/cutecoin/tests/qapp.py b/src/cutecoin/tests/qapp.py index 75c314f569a977251e69d5c815009111d705d685..0de485b77dcc9f90e78b7de695f43c920a095c3a 100644 --- a/src/cutecoin/tests/qapp.py +++ b/src/cutecoin/tests/qapp.py @@ -2,6 +2,32 @@ _application_ = [] +def unitttest_exception_handler(test, loop, context): + """ + An exception handler which exists the program if the exception + was not catch + :param loop: the asyncio loop + :param context: the exception context + """ + message = context.get('message') + if not message: + message = 'Unhandled exception in event loop' + + try: + exception = context['exception'] + except KeyError: + exc_info = False + else: + exc_info = (type(exception), exception, exception.__traceback__) + + log_lines = [message] + for key in [k for k in sorted(context) if k not in {'message', 'exception'}]: + log_lines.append('{}: {!r}'.format(key, context[key])) + + test.failureException('\n'.join(log_lines)) + + + def get_application(): """Get the singleton QApplication""" from quamash import QApplication