From 787f5360b801eecbebb4d28128c343832b29df57 Mon Sep 17 00:00:00 2001
From: drebs <drebs@riseup.net>
Date: Tue, 21 Nov 2017 19:34:34 -0200
Subject: [PATCH] [bug] fix logging while checking CouchDB schema versions on
 server startup

---
 src/leap/soledad/common/couch/check.py | 29 +++++++++++++-------------
 tests/couch/test_state.py              | 23 ++++++++++----------
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/src/leap/soledad/common/couch/check.py b/src/leap/soledad/common/couch/check.py
index f55dd6f6..93fc1d66 100644
--- a/src/leap/soledad/common/couch/check.py
+++ b/src/leap/soledad/common/couch/check.py
@@ -18,7 +18,6 @@
 Database schema version verification
 """
 
-import os
 import treq
 
 from six.moves.urllib.parse import urljoin
@@ -84,13 +83,6 @@ def _check_db_schema_version(url, db, auth, agent=None):
             raise WrongCouchSchemaVersionError(db)
 
 
-def _stop(failure, reactor):
-    logger.error("Failure while checking schema versions: %r - %s"
-                 % (failure, failure.message))
-    reactor.addSystemEventTrigger('after', 'shutdown', os._exit, 1)
-    reactor.stop()
-
-
 @defer.inlineCallbacks
 def check_schema_versions(couch_url, agent=None, reactor=reactor):
     """
@@ -107,17 +99,26 @@ def check_schema_versions(couch_url, agent=None, reactor=reactor):
     url = urlsplit(couch_url)
     auth = (url.username, url.password) if url.username else None
     url = "%s://%s:%d" % (url.scheme, url.hostname, url.port)
-    res = yield treq.get(urljoin(url, '_all_dbs'), auth=auth, agent=agent)
-    dbs = yield res.json()
+    try:
+        res = yield treq.get(urljoin(url, '_all_dbs'), auth=auth, agent=agent)
+        dbs = yield res.json()
+    except Exception as e:
+        logger.error('Error trying to get list of dbs from %s: %r'
+                     % (url, e))
+        raise e
     deferreds = []
     semaphore = defer.DeferredSemaphore(20)
-    logger.info('Starting schema versions check...')
+    logger.info('Starting CouchDB schema versions check...')
     for db in dbs:
         if not db.startswith('user-'):
             continue
         d = semaphore.run(_check_db_schema_version, url, db, auth, agent=agent)
-        d.addErrback(_stop, reactor=reactor)
         deferreds.append(d)
     d = defer.gatherResults(deferreds, consumeErrors=True)
-    d.addCallback(lambda _: logger.info('Finished schema versions check.'))
-    yield d
+    try:
+        yield d
+        logger.info('Finished CouchDB schema versions check.')
+    except Exception as e:
+        msg = 'Error checking CouchDB schema versions: %r' % e
+        logger.error(msg)
+        raise Exception(msg)
diff --git a/tests/couch/test_state.py b/tests/couch/test_state.py
index d978fe56..8b06676d 100644
--- a/tests/couch/test_state.py
+++ b/tests/couch/test_state.py
@@ -1,4 +1,3 @@
-import mock
 import pytest
 
 from leap.soledad.common.couch import CONFIG_DOC_ID
@@ -17,7 +16,7 @@ from twisted.internet import reactor
 from twisted.web.client import HTTPConnectionPool, Agent
 
 
-class CouchDesignDocsTests(CouchDBTestCase):
+class CouchStateTests(CouchDBTestCase):
 
     def setUp(self):
         CouchDBTestCase.setUp(self)
@@ -40,14 +39,14 @@ class CouchDesignDocsTests(CouchDBTestCase):
                 self.couch_url, self.db.name, None, agent=self.agent)
 
     @defer.inlineCallbacks
-    def test_check_schema_versions_wrong_schema_version_stops_reactor(self):
+    def test_check_schema_versions_wrong_schema_version_raises(self):
         wrong_schema_version = SCHEMA_VERSION + 1
         self.db.create(
             {'_id': CONFIG_DOC_ID, SCHEMA_VERSION_KEY: wrong_schema_version})
-        mocked_reactor = mock.Mock()
-        yield check_schema_versions(
-            self.couch_url, agent=self.agent, reactor=mocked_reactor)
-        mocked_reactor.stop.assert_called()
+        expected_msg = 'Error checking CouchDB schema versions: ' \
+                       'FirstError.*WrongCouchSchemaVersionError()'
+        with pytest.raises(Exception, match=expected_msg):
+            yield check_schema_versions(self.couch_url, agent=self.agent)
 
     @defer.inlineCallbacks
     def test__check_db_schema_version_missing_config_doc_raises(self):
@@ -57,9 +56,9 @@ class CouchDesignDocsTests(CouchDBTestCase):
                 self.couch_url, self.db.name, None, agent=self.agent)
 
     @defer.inlineCallbacks
-    def test_check_schema_versions_missing_config_doc_stops_reactor(self):
+    def test_check_schema_versions_missing_config_doc_raises(self):
         self.db.create({})
-        mocked_reactor = mock.Mock()
-        yield check_schema_versions(
-            self.couch_url, agent=self.agent, reactor=mocked_reactor)
-        mocked_reactor.stop.assert_called()
+        expected_msg = 'Error checking CouchDB schema versions: ' \
+                       'FirstError.*MissingCouchConfigDocumentError()'
+        with pytest.raises(Exception, match=expected_msg):
+            yield check_schema_versions(self.couch_url, agent=self.agent)
-- 
GitLab