diff options
Diffstat (limited to 'common/src/leap/soledad/common/tests/test_sync.py')
-rw-r--r-- | common/src/leap/soledad/common/tests/test_sync.py | 153 |
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 |