summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/src/leap/soledad/common/tests/test_sqlcipher_sync.py89
1 files changed, 69 insertions, 20 deletions
diff --git a/common/src/leap/soledad/common/tests/test_sqlcipher_sync.py b/common/src/leap/soledad/common/tests/test_sqlcipher_sync.py
index a9bab35b..3a92047f 100644
--- a/common/src/leap/soledad/common/tests/test_sqlcipher_sync.py
+++ b/common/src/leap/soledad/common/tests/test_sqlcipher_sync.py
@@ -28,6 +28,8 @@ from u1db import (
from testscenarios import TestWithScenarios
+from twisted.internet import defer
+
from leap.soledad.common.crypto import ENC_SCHEME_KEY
from leap.soledad.client.http_target import SoledadHTTPSyncTarget
from leap.soledad.client.crypto import decrypt_doc_dict
@@ -40,6 +42,7 @@ from leap.soledad.common.tests.u1db_tests import test_sync
from leap.soledad.common.tests.test_sqlcipher import SQLCIPHER_SCENARIOS
from leap.soledad.common.tests.util import (
make_soledad_app,
+ soledad_sync_target,
BaseSoledadTest,
SoledadWithCouchServerMixin,
)
@@ -71,7 +74,7 @@ for name, scenario in SQLCIPHER_SCENARIOS:
class SQLCipherDatabaseSyncTests(
TestWithScenarios,
- test_sync.DatabaseSyncTests,
+ tests.DatabaseBaseTests,
BaseSoledadTest):
"""
@@ -84,11 +87,12 @@ class SQLCipherDatabaseSyncTests(
scenarios = sync_scenarios
- # def setUp(self):
- # test_sync.DatabaseSyncTests.setUp(self)
+ def setUp(self):
+ self._use_tracking = {}
+ super(tests.DatabaseBaseTests, self).setUp()
def tearDown(self):
- test_sync.DatabaseSyncTests.tearDown(self)
+ super(tests.DatabaseBaseTests, self).tearDown()
if hasattr(self, 'db1') and isinstance(self.db1, SQLCipherDatabase):
self.db1.close()
if hasattr(self, 'db1_copy') \
@@ -104,6 +108,38 @@ class SQLCipherDatabaseSyncTests(
and isinstance(self.db3, SQLCipherDatabase):
self.db3.close()
+ def create_database(self, replica_uid, sync_role=None):
+ if replica_uid == 'test' and sync_role is None:
+ # created up the chain by base class but unused
+ return None
+ db = self.create_database_for_role(replica_uid, sync_role)
+ if sync_role:
+ self._use_tracking[db] = (replica_uid, sync_role)
+ return db
+
+ def create_database_for_role(self, replica_uid, sync_role):
+ # hook point for reuse
+ return tests.DatabaseBaseTests.create_database(self, replica_uid)
+
+ def sync(self, db_from, db_to, trace_hook=None,
+ trace_hook_shallow=None):
+ from_name, from_sync_role = self._use_tracking[db_from]
+ to_name, to_sync_role = self._use_tracking[db_to]
+ if from_sync_role not in ('source', 'both'):
+ raise Exception("%s marked for %s use but used as source" %
+ (from_name, from_sync_role))
+ if to_sync_role not in ('target', 'both'):
+ raise Exception("%s marked for %s use but used as target" %
+ (to_name, to_sync_role))
+ return self.do_sync(self, db_from, db_to, trace_hook,
+ trace_hook_shallow)
+
+ def assertLastExchangeLog(self, db, expected):
+ log = getattr(db, '_last_exchange_log', None)
+ if log is None:
+ return
+ self.assertEqual(expected, log)
+
def test_sync_autoresolves(self):
"""
Test for sync autoresolve remote.
@@ -298,18 +334,14 @@ class SQLCipherDatabaseSyncTests(
def _make_local_db_and_token_http_target(test, path='test'):
- test.startServer()
+ test.startTwistedServer()
db = test.request_state._create_database(os.path.basename(path))
- st = SoledadHTTPSyncTarget.connect(
- test.getURL(path), crypto=test._soledad._crypto)
- st.set_token_credentials('user-uuid', 'auth-token')
+ st = soledad_sync_target(test, test.getURL(path))
return db, st
-
target_scenarios = [
('leap', {
'create_db_and_target': _make_local_db_and_token_http_target,
- # 'make_app_with_state': tests.test_remote_sync_target.make_http_app,
'make_app_with_state': make_soledad_app,
'do_sync': sync_via_synchronizer_and_soledad}),
]
@@ -317,8 +349,9 @@ target_scenarios = [
class SQLCipherSyncTargetTests(
TestWithScenarios,
- SoledadWithCouchServerMixin,
- test_sync.DatabaseSyncTargetTests):
+ tests.DatabaseBaseTests,
+ tests.TestCaseWithServer,
+ SoledadWithCouchServerMixin):
scenarios = (tests.multiply_scenarios(SQLCIPHER_SCENARIOS,
target_scenarios))
@@ -326,9 +359,23 @@ class SQLCipherSyncTargetTests(
whitebox = False
def setUp(self):
- self.main_test_class = test_sync.DatabaseSyncTargetTests
- SoledadWithCouchServerMixin.setUp(self)
+ super(tests.DatabaseBaseTests, self).setUp()
+ self.db, self.st = self.create_db_and_target(self)
+
+ def tearDown(self):
+ super(tests.DatabaseBaseTests, self).tearDown()
+
+ def assertLastExchangeLog(self, db, expected):
+ log = getattr(db, '_last_exchange_log', None)
+ if log is None:
+ return
+ self.assertEqual(expected, log)
+
+ def receive_doc(self, doc, gen, trans_id):
+ self.other_changes.append(
+ (doc.doc_id, doc.rev, doc.get_json(), gen, trans_id))
+ @defer.inlineCallbacks
def test_sync_exchange(self):
"""
Modified to account for possibly receiving encrypted documents from
@@ -337,9 +384,9 @@ class SQLCipherSyncTargetTests(
docs_by_gen = [
(self.make_document('doc-id', 'replica:1', tests.simple_doc), 10,
'T-sid')]
- new_gen, trans_id = self.st.sync_exchange(
+ new_gen, trans_id = yield self.st.sync_exchange(
docs_by_gen, 'replica', last_known_generation=0,
- last_known_trans_id=None, return_doc_cb=self.receive_doc)
+ last_known_trans_id=None, insert_doc_cb=self.receive_doc)
self.assertGetEncryptedDoc(
self.db, 'doc-id', 'replica:1', tests.simple_doc, False)
self.assertTransactionLog(['doc-id'], self.db)
@@ -348,6 +395,7 @@ class SQLCipherSyncTargetTests(
(self.other_changes, new_gen, last_trans_id))
self.assertEqual(10, self.st.get_sync_info('replica')[3])
+ @defer.inlineCallbacks
def test_sync_exchange_push_many(self):
"""
Modified to account for possibly receiving encrypted documents from
@@ -358,9 +406,9 @@ class SQLCipherSyncTargetTests(
'doc-id', 'replica:1', tests.simple_doc), 10, 'T-1'),
(self.make_document('doc-id2', 'replica:1', tests.nested_doc), 11,
'T-2')]
- new_gen, trans_id = self.st.sync_exchange(
+ new_gen, trans_id = yield self.st.sync_exchange(
docs_by_gen, 'replica', last_known_generation=0,
- last_known_trans_id=None, return_doc_cb=self.receive_doc)
+ last_known_trans_id=None, insert_doc_cb=self.receive_doc)
self.assertGetEncryptedDoc(
self.db, 'doc-id', 'replica:1', tests.simple_doc, False)
self.assertGetEncryptedDoc(
@@ -371,6 +419,7 @@ class SQLCipherSyncTargetTests(
(self.other_changes, new_gen, trans_id))
self.assertEqual(11, self.st.get_sync_info('replica')[3])
+ @defer.inlineCallbacks
def test_sync_exchange_returns_many_new_docs(self):
"""
Modified to account for JSON serialization differences.
@@ -378,9 +427,9 @@ class SQLCipherSyncTargetTests(
doc = self.db.create_doc_from_json(tests.simple_doc)
doc2 = self.db.create_doc_from_json(tests.nested_doc)
self.assertTransactionLog([doc.doc_id, doc2.doc_id], self.db)
- new_gen, _ = self.st.sync_exchange(
+ new_gen, _ = yield self.st.sync_exchange(
[], 'other-replica', last_known_generation=0,
- last_known_trans_id=None, return_doc_cb=self.receive_doc)
+ last_known_trans_id=None, insert_doc_cb=self.receive_doc)
self.assertTransactionLog([doc.doc_id, doc2.doc_id], self.db)
self.assertEqual(2, new_gen)
self.assertEqual(