summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authordrebs <drebs@riseup.net>2017-10-25 15:58:56 -0200
committerdrebs <drebs@riseup.net>2017-10-31 16:52:59 -0200
commit3306ea69ee33cdafa8803f9c717b60b9f3d3b4a0 (patch)
tree3897a29e0d7c2fddc262eca71779e46bae43313c /tests
parentf1c010fc4119d6348d0bd823e4a9f6da310149bd (diff)
[feat] improve speed of server startup
To avoid corrupting data, Soledad Server checks all user databases during startup to make sure all of them use the correct schema version. This was done synchronously, so when there are many databases startup would take a long time. This commit makes that verification asynchronous, thus speeding up server startup.
Diffstat (limited to 'tests')
-rw-r--r--tests/couch/test_command.py7
-rw-r--r--tests/couch/test_state.py47
2 files changed, 43 insertions, 11 deletions
diff --git a/tests/couch/test_command.py b/tests/couch/test_command.py
index 9fb2c153..52719065 100644
--- a/tests/couch/test_command.py
+++ b/tests/couch/test_command.py
@@ -10,7 +10,7 @@ class CommandBasedDBCreationTest(unittest.TestCase):
def test_ensure_db_using_custom_command(self):
state = couch_state.CouchServerState(
- "url", create_cmd="/bin/echo", check_schema_versions=False)
+ "url", create_cmd="/bin/echo")
mock_db = Mock()
mock_db.replica_uid = 'replica_uid'
state.open_database = Mock(return_value=mock_db)
@@ -20,12 +20,11 @@ class CommandBasedDBCreationTest(unittest.TestCase):
def test_raises_unauthorized_on_failure(self):
state = couch_state.CouchServerState(
- "url", create_cmd="inexistent", check_schema_versions=False)
+ "url", create_cmd="inexistent")
self.assertRaises(u1db_errors.Unauthorized,
state.ensure_database, "user-1337")
def test_raises_unauthorized_by_default(self):
- state = couch_state.CouchServerState("url",
- check_schema_versions=False)
+ state = couch_state.CouchServerState("url")
self.assertRaises(u1db_errors.Unauthorized,
state.ensure_database, "user-1337")
diff --git a/tests/couch/test_state.py b/tests/couch/test_state.py
index e5ac3704..673d9c41 100644
--- a/tests/couch/test_state.py
+++ b/tests/couch/test_state.py
@@ -1,14 +1,21 @@
+import mock
import pytest
+
from leap.soledad.common.couch import CONFIG_DOC_ID
from leap.soledad.common.couch import SCHEMA_VERSION
from leap.soledad.common.couch import SCHEMA_VERSION_KEY
-from leap.soledad.common.couch.state import CouchServerState
+from leap.soledad.common.couch.state import _check_db_schema_version
+from leap.soledad.common.couch.state import check_schema_versions
from uuid import uuid4
from leap.soledad.common.errors import WrongCouchSchemaVersionError
from leap.soledad.common.errors import MissingCouchConfigDocumentError
from test_soledad.util import CouchDBTestCase
+from twisted.internet import defer
+from twisted.internet import reactor
+from twisted.web.client import HTTPConnectionPool, Agent
+
class CouchDesignDocsTests(CouchDBTestCase):
@@ -16,17 +23,43 @@ class CouchDesignDocsTests(CouchDBTestCase):
CouchDBTestCase.setUp(self)
self.db = self.couch_server.create('user-' + uuid4().hex)
self.addCleanup(self.delete_db, self.db.name)
+ self.pool = HTTPConnectionPool(reactor, persistent=False)
+ self.agent = Agent(reactor, pool=self.pool)
+
+ @defer.inlineCallbacks
+ def tearDown(self):
+ yield self.pool.closeCachedConnections()
- def test_wrong_couch_version_raises(self):
+ @defer.inlineCallbacks
+ def test__check_db_schema_version_wrong_schema_version_raises(self):
wrong_schema_version = SCHEMA_VERSION + 1
self.db.create(
{'_id': CONFIG_DOC_ID, SCHEMA_VERSION_KEY: wrong_schema_version})
with pytest.raises(WrongCouchSchemaVersionError):
- CouchServerState(self.couch_url, create_cmd='/bin/echo',
- check_schema_versions=True)
+ yield _check_db_schema_version(
+ self.couch_url, self.db.name, None, agent=self.agent)
- def test_missing_config_doc_raises(self):
+ @defer.inlineCallbacks
+ def test_check_schema_versions_wrong_schema_version_stops_reactor(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)
+ self.assertTrue(mocked_reactor.stop.call_count == 1)
+
+ @defer.inlineCallbacks
+ def test__check_db_schema_version_missing_config_doc_raises(self):
self.db.create({})
with pytest.raises(MissingCouchConfigDocumentError):
- CouchServerState(self.couch_url, create_cmd='/bin/echo',
- check_schema_versions=True)
+ yield _check_db_schema_version(
+ self.couch_url, self.db.name, None, agent=self.agent)
+
+ @defer.inlineCallbacks
+ def test_check_schema_versions_missing_config_doc_stops_reactor(self):
+ self.db.create({})
+ mocked_reactor = mock.Mock()
+ yield check_schema_versions(
+ self.couch_url, agent=self.agent, reactor=mocked_reactor)
+ self.assertTrue(mocked_reactor.stop.call_count == 1)