From 38a67d60b834336fff7cd50a00c3c806898ae4eb Mon Sep 17 00:00:00 2001
From: Insoleet <insomniak.fr@gmail.com>
Date: Thu, 17 Sep 2015 15:00:39 +0200
Subject: [PATCH] Enhance exception catching + fix identities find

---
 src/cutecoin/core/registry/identities.py      |  3 ++-
 src/cutecoin/tests/__init__.py                |  2 +-
 .../gui/certification/test_certification.py   |  3 ++-
 .../identities_tab/test_identities_table.py   |  4 +--
 .../test_add_community.py                     |  3 ++-
 .../tests/gui/transfer/test_transfer.py       |  3 ++-
 .../tests/gui/wot_tab/test_wot_tab.py         |  3 ++-
 src/cutecoin/tests/qapp.py                    | 26 +++++++++++++++++++
 8 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/src/cutecoin/core/registry/identities.py b/src/cutecoin/core/registry/identities.py
index 409c4983..23848505 100644
--- a/src/cutecoin/core/registry/identities.py
+++ b/src/cutecoin/core/registry/identities.py
@@ -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]
@@ -90,6 +90,7 @@ class IdentitiesRegistry:
                 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/tests/__init__.py b/src/cutecoin/tests/__init__.py
index 1d65e880..75eaa872 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 36c3e1e7..301d9441 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 ec36d2d2..6dd89e9d 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)
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 5d5a00ab..52b8a97f 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 dcb83313..16e0cb21 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 b74ac0e2..af48ad83 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 75c314f5..0de485b7 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
-- 
GitLab