summaryrefslogtreecommitdiff
path: root/common/src/leap/soledad/common/tests/test_sync.py
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/leap/soledad/common/tests/test_sync.py')
-rw-r--r--common/src/leap/soledad/common/tests/test_sync.py153
1 files changed, 57 insertions, 96 deletions
diff --git a/common/src/leap/soledad/common/tests/test_sync.py b/common/src/leap/soledad/common/tests/test_sync.py
index 0433fac9..893df56b 100644
--- a/common/src/leap/soledad/common/tests/test_sync.py
+++ b/common/src/leap/soledad/common/tests/test_sync.py
@@ -16,43 +16,35 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import mock
-import os
import json
import tempfile
import threading
import time
+
from urlparse import urljoin
+from twisted.internet import defer
+
+from testscenarios import TestWithScenarios
from leap.soledad.common import couch
+from leap.soledad.client import target
+from leap.soledad.client import sync
+from leap.soledad.server import SoledadApp
-from leap.soledad.common.tests import BaseSoledadTest
-from leap.soledad.common.tests import test_sync_target
from leap.soledad.common.tests import u1db_tests as tests
-from leap.soledad.common.tests.u1db_tests import (
- TestCaseWithServer,
- simple_doc,
- test_backends,
- test_sync
-)
-from leap.soledad.common.tests.test_couch import CouchDBTestCase
-from leap.soledad.common.tests.test_target_soledad import (
- make_token_soledad_app,
- make_leap_document_for_test,
-)
-from leap.soledad.common.tests.test_sync_target import token_leap_sync_target
-from leap.soledad.client import (
- Soledad,
- target,
-)
+from leap.soledad.common.tests.u1db_tests import TestCaseWithServer
+from leap.soledad.common.tests.u1db_tests import simple_doc
+from leap.soledad.common.tests.u1db_tests import test_sync
+from leap.soledad.common.tests.util import make_token_soledad_app
+from leap.soledad.common.tests.util import make_soledad_document_for_test
+from leap.soledad.common.tests.util import token_soledad_sync_target
+from leap.soledad.common.tests.util import BaseSoledadTest
from leap.soledad.common.tests.util import SoledadWithCouchServerMixin
-from leap.soledad.client.sync import SoledadSynchronizer
-from leap.soledad.server import SoledadApp
-
+from leap.soledad.common.tests.test_couch import CouchDBTestCase
class InterruptableSyncTestCase(
- CouchDBTestCase, TestCaseWithServer):
+ BaseSoledadTest, CouchDBTestCase, TestCaseWithServer):
"""
Tests for encrypted sync using Soledad server backed by a couch database.
"""
@@ -61,47 +53,9 @@ class InterruptableSyncTestCase(
def make_app_with_state(state):
return make_token_soledad_app(state)
- make_document_for_test = make_leap_document_for_test
-
- sync_target = token_leap_sync_target
+ make_document_for_test = make_soledad_document_for_test
- def _soledad_instance(self, user='user-uuid', passphrase=u'123',
- prefix='',
- secrets_path=Soledad.STORAGE_SECRETS_FILE_NAME,
- local_db_path='soledad.u1db', server_url='',
- cert_file=None, auth_token=None, secret_id=None):
- """
- Instantiate Soledad.
- """
-
- # this callback ensures we save a document which is sent to the shared
- # db.
- def _put_doc_side_effect(doc):
- self._doc_put = doc
-
- # we need a mocked shared db or else Soledad will try to access the
- # network to find if there are uploaded secrets.
- class MockSharedDB(object):
-
- get_doc = mock.Mock(return_value=None)
- put_doc = mock.Mock(side_effect=_put_doc_side_effect)
- lock = mock.Mock(return_value=('atoken', 300))
- unlock = mock.Mock()
-
- def __call__(self):
- return self
-
- Soledad._shared_db = MockSharedDB()
- return Soledad(
- user,
- passphrase,
- secrets_path=os.path.join(self.tempdir, prefix, secrets_path),
- local_db_path=os.path.join(
- self.tempdir, prefix, local_db_path),
- server_url=server_url,
- cert_file=cert_file,
- auth_token=auth_token,
- secret_id=secret_id)
+ sync_target = token_soledad_sync_target
def make_app(self):
self.request_state = couch.CouchServerState(
@@ -135,7 +89,8 @@ class InterruptableSyncTestCase(
def run(self):
while db._get_generation() < 2:
- time.sleep(1)
+ #print "WAITING %d" % db._get_generation()
+ time.sleep(0.1)
self._soledad.stop_sync()
time.sleep(1)
@@ -143,16 +98,7 @@ class InterruptableSyncTestCase(
self.startServer()
# instantiate soledad and create a document
- sol = self._soledad_instance(
- # token is verified in test_target.make_token_soledad_app
- auth_token='auth-token'
- )
- _, doclist = sol.get_all_docs()
- self.assertEqual([], doclist)
-
- # create many small files
- for i in range(0, number_of_docs):
- sol.create_doc(json.loads(simple_doc))
+ sol = self._soledad_instance(user='user-uuid', server_url=self.getURL())
# ensure remote db exists before syncing
db = couch.CouchDatabase.open_database(
@@ -164,21 +110,35 @@ class InterruptableSyncTestCase(
t = _SyncInterruptor(sol, db)
t.start()
- # sync with server
- sol._server_url = self.getURL()
- sol.sync() # this will be interrupted when couch db gen >= 2
- t.join()
+ d = sol.get_all_docs()
+ d.addCallback(lambda results: self.assertEqual([], results[1]))
- # recover the sync process
- sol.sync()
+ def _create_docs(results):
+ # create many small files
+ deferreds = []
+ for i in range(0, number_of_docs):
+ deferreds.append(sol.create_doc(json.loads(simple_doc)))
+ return defer.DeferredList(deferreds)
- gen, doclist = db.get_all_docs()
- self.assertEqual(number_of_docs, len(doclist))
-
- # delete remote database
- db.delete_database()
- db.close()
- sol.close()
+ # sync with server
+ d.addCallback(_create_docs)
+ d.addCallback(lambda _: sol.get_all_docs())
+ d.addCallback(lambda results: self.assertEqual(number_of_docs, len(results[1])))
+ d.addCallback(lambda _: sol.sync())
+ d.addCallback(lambda _: t.join())
+ d.addCallback(lambda _: db.get_all_docs())
+ d.addCallback(lambda results: self.assertNotEqual(number_of_docs, len(results[1])))
+ d.addCallback(lambda _: sol.sync())
+ d.addCallback(lambda _: db.get_all_docs())
+ d.addCallback(lambda results: self.assertEqual(number_of_docs, len(results[1])))
+
+ def _tear_down(results):
+ db.delete_database()
+ db.close()
+ sol.close()
+
+ d.addCallback(_tear_down)
+ return d
def make_soledad_app(state):
@@ -186,6 +146,7 @@ def make_soledad_app(state):
class TestSoledadDbSync(
+ TestWithScenarios,
SoledadWithCouchServerMixin,
test_sync.TestDbSync):
"""
@@ -198,7 +159,7 @@ class TestSoledadDbSync(
'make_database_for_test': tests.make_memory_database_for_test,
}),
('py-token-http', {
- 'make_app_with_state': test_sync_target.make_token_soledad_app,
+ 'make_app_with_state': make_token_soledad_app,
'make_database_for_test': tests.make_memory_database_for_test,
'token': True
}),
@@ -211,10 +172,11 @@ class TestSoledadDbSync(
"""
Need to explicitely invoke inicialization on all bases.
"""
- tests.TestCaseWithServer.setUp(self)
- self.main_test_class = test_sync.TestDbSync
+ #tests.TestCaseWithServer.setUp(self)
+ #self.main_test_class = test_sync.TestDbSync
SoledadWithCouchServerMixin.setUp(self)
self.startServer()
+ self.db = self.make_database_for_test(self, 'test1')
self.db2 = couch.CouchDatabase.open_database(
urljoin(
'http://localhost:' + str(self.wrapper.port), 'test'),
@@ -227,7 +189,7 @@ class TestSoledadDbSync(
"""
self.db2.delete_database()
SoledadWithCouchServerMixin.tearDown(self)
- tests.TestCaseWithServer.tearDown(self)
+ #tests.TestCaseWithServer.tearDown(self)
def do_sync(self, target_name):
"""
@@ -240,7 +202,7 @@ class TestSoledadDbSync(
'token': 'auth-token',
}})
target_url = self.getURL(target_name)
- return SoledadSynchronizer(
+ return sync.SoledadSynchronizer(
self.db,
target.SoledadSyncTarget(
target_url,
@@ -254,8 +216,10 @@ class TestSoledadDbSync(
Adapted to check for encrypted content.
"""
+
doc1 = self.db.create_doc_from_json(tests.simple_doc)
doc2 = self.db2.create_doc_from_json(tests.nested_doc)
+
local_gen_before_sync = self.do_sync('test')
gen, _, changes = self.db.whats_changed(local_gen_before_sync)
self.assertEqual(1, len(changes))
@@ -287,6 +251,3 @@ class TestSoledadDbSync(
s_gen, _ = db3._get_replica_gen_and_trans_id('test1')
self.assertEqual(1, t_gen)
self.assertEqual(1, s_gen)
-
-
-load_tests = tests.load_with_scenarios