diff options
Diffstat (limited to 'common/src/leap/soledad/common/tests/test_sync_deferred.py')
-rw-r--r-- | common/src/leap/soledad/common/tests/test_sync_deferred.py | 150 |
1 files changed, 75 insertions, 75 deletions
diff --git a/common/src/leap/soledad/common/tests/test_sync_deferred.py b/common/src/leap/soledad/common/tests/test_sync_deferred.py index 07a9742b..26889aff 100644 --- a/common/src/leap/soledad/common/tests/test_sync_deferred.py +++ b/common/src/leap/soledad/common/tests/test_sync_deferred.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # test_sync_deferred.py # Copyright (C) 2014 LEAP # @@ -21,28 +20,31 @@ import time import os import random import string +import shutil + from urlparse import urljoin -from leap.soledad.common.tests import u1db_tests as tests, ADDRESS +from leap.soledad.common import couch +from leap.soledad.client.sqlcipher import ( + SQLCipherOptions, + SQLCipherDatabase, + SQLCipherU1DBSync, +) + +from testscenarios import TestWithScenarios + +from leap.soledad.common.tests import u1db_tests as tests from leap.soledad.common.tests.u1db_tests import test_sync +from leap.soledad.common.tests.util import ADDRESS +from leap.soledad.common.tests.util import SoledadWithCouchServerMixin +from leap.soledad.common.tests.util import make_soledad_app -from leap.soledad.common.document import SoledadDocument -from leap.soledad.common import couch -from leap.soledad.client import target -from leap.soledad.client.sync import SoledadSynchronizer # Just to make clear how this test is different... :) DEFER_DECRYPTION = True WAIT_STEP = 1 MAX_WAIT = 10 - - -from leap.soledad.client.sqlcipher import open as open_sqlcipher -from leap.soledad.common.tests.util import SoledadWithCouchServerMixin -from leap.soledad.common.tests.util import make_soledad_app - - DBPASS = "pass" @@ -54,8 +56,10 @@ class BaseSoledadDeferredEncTest(SoledadWithCouchServerMixin): defer_sync_encryption = True def setUp(self): + SoledadWithCouchServerMixin.setUp(self) # config info self.db1_file = os.path.join(self.tempdir, "db1.u1db") + os.unlink(self.db1_file) self.db_pass = DBPASS self.email = ADDRESS @@ -64,17 +68,21 @@ class BaseSoledadDeferredEncTest(SoledadWithCouchServerMixin): # each local db. self.rand_prefix = ''.join( map(lambda x: random.choice(string.ascii_letters), range(6))) - # initialize soledad by hand so we can control keys - self._soledad = self._soledad_instance( - prefix=self.rand_prefix, user=self.email) - - # open test dbs: db1 will be the local sqlcipher db - # (which instantiates a syncdb) - self.db1 = open_sqlcipher(self.db1_file, DBPASS, create=True, - document_factory=SoledadDocument, - crypto=self._soledad._crypto, - defer_encryption=True, - sync_db_key=DBPASS) + + # open test dbs: db1 will be the local sqlcipher db (which + # instantiates a syncdb). We use the self._soledad instance that was + # already created on some setUp method. + import binascii + tohex = binascii.b2a_hex + key = tohex(self._soledad.secrets.get_local_storage_key()) + sync_db_key = tohex(self._soledad.secrets.get_sync_db_key()) + dbpath = self._soledad._local_db_path + + self.opts = SQLCipherOptions( + dbpath, key, is_raw_key=True, create=False, + defer_encryption=True, sync_db_key=sync_db_key) + self.db1 = SQLCipherDatabase(self.opts) + self.db2 = couch.CouchDatabase.open_database( urljoin( 'http://localhost:' + str(self.wrapper.port), 'test'), @@ -87,20 +95,8 @@ class BaseSoledadDeferredEncTest(SoledadWithCouchServerMixin): self._soledad.close() # XXX should not access "private" attrs - import shutil shutil.rmtree(os.path.dirname(self._soledad._local_db_path)) - - -#SQLCIPHER_SCENARIOS = [ -# ('http', { -# #'make_app_with_state': test_sync_target.make_token_soledad_app, -# 'make_app_with_state': make_soledad_app, -# 'make_database_for_test': ts.make_sqlcipher_database_for_test, -# 'copy_database_for_test': ts.copy_sqlcipher_database_for_test, -# 'make_document_for_test': ts.make_document_for_test, -# 'token': True -# }), -#] + SoledadWithCouchServerMixin.tearDown(self) class SyncTimeoutError(Exception): @@ -111,8 +107,9 @@ class SyncTimeoutError(Exception): class TestSoledadDbSyncDeferredEncDecr( - BaseSoledadDeferredEncTest, - test_sync.TestDbSync): + TestWithScenarios, + test_sync.TestDbSync, + BaseSoledadDeferredEncTest): """ Test db.sync remote sync shortcut. Case with deferred encryption and decryption: using the intermediate @@ -129,13 +126,17 @@ class TestSoledadDbSyncDeferredEncDecr( oauth = False token = True + def make_app(self): + self.request_state = couch.CouchServerState( + self._couch_url, 'shared', 'tokens') + return self.make_app_with_state(self.request_state) + def setUp(self): """ Need to explicitely invoke inicialization on all bases. """ - tests.TestCaseWithServer.setUp(self) - self.main_test_class = test_sync.TestDbSync BaseSoledadDeferredEncTest.setUp(self) + self.server = self.server_thread = None self.startServer() self.syncer = None @@ -143,8 +144,10 @@ class TestSoledadDbSyncDeferredEncDecr( """ Need to explicitely invoke destruction on all bases. """ + dbsyncer = getattr(self, 'dbsyncer', None) + if dbsyncer: + dbsyncer.close() BaseSoledadDeferredEncTest.tearDown(self) - tests.TestCaseWithServer.tearDown(self) def do_sync(self, target_name): """ @@ -152,25 +155,20 @@ class TestSoledadDbSyncDeferredEncDecr( and Token auth. """ if self.token: - extra = dict(creds={'token': { + creds={'token': { 'uuid': 'user-uuid', 'token': 'auth-token', - }}) + }} target_url = self.getURL(target_name) - syncdb = getattr(self.db1, "_sync_db", None) - - syncer = SoledadSynchronizer( - self.db1, - target.SoledadSyncTarget( - target_url, - crypto=self._soledad._crypto, - sync_db=syncdb, - **extra)) - # Keep a reference to be able to know when the sync - # has finished. - self.syncer = syncer - return syncer.sync( - autocreate=True, defer_decryption=DEFER_DECRYPTION) + + # get a u1db syncer + crypto = self._soledad._crypto + replica_uid = self.db1._replica_uid + dbsyncer = SQLCipherU1DBSync(self.opts, crypto, replica_uid, + defer_encryption=True) + self.dbsyncer = dbsyncer + return dbsyncer.sync(target_url, creds=creds, + autocreate=True,defer_decryption=DEFER_DECRYPTION) else: return test_sync.TestDbSync.do_sync(self, target_name) @@ -195,28 +193,30 @@ class TestSoledadDbSyncDeferredEncDecr( """ doc1 = self.db1.create_doc_from_json(tests.simple_doc) doc2 = self.db2.create_doc_from_json(tests.nested_doc) + d = self.do_sync('test') - import time - # need to give time to the encryption to proceed - # TODO should implement a defer list to subscribe to the all-decrypted - # event - time.sleep(2) + def _assert_successful_sync(results): + import time + # need to give time to the encryption to proceed + # TODO should implement a defer list to subscribe to the all-decrypted + # event + time.sleep(2) + local_gen_before_sync = results + self.wait_for_sync() - local_gen_before_sync = self.do_sync('test') - self.wait_for_sync() + gen, _, changes = self.db1.whats_changed(local_gen_before_sync) + self.assertEqual(1, len(changes)) - gen, _, changes = self.db1.whats_changed(local_gen_before_sync) - self.assertEqual(1, len(changes)) + self.assertEqual(doc2.doc_id, changes[0][0]) + self.assertEqual(1, gen - local_gen_before_sync) - self.assertEqual(doc2.doc_id, changes[0][0]) - self.assertEqual(1, gen - local_gen_before_sync) + self.assertGetEncryptedDoc( + self.db2, doc1.doc_id, doc1.rev, tests.simple_doc, False) + self.assertGetEncryptedDoc( + self.db1, doc2.doc_id, doc2.rev, tests.nested_doc, False) - self.assertGetEncryptedDoc( - self.db2, doc1.doc_id, doc1.rev, tests.simple_doc, False) - self.assertGetEncryptedDoc( - self.db1, doc2.doc_id, doc2.rev, tests.nested_doc, False) + d.addCallback(_assert_successful_sync) + return d def test_db_sync_autocreate(self): pass - -load_tests = tests.load_with_scenarios |