diff options
| author | drebs <drebs@leap.se> | 2013-01-08 16:50:27 -0200 | 
|---|---|---|
| committer | drebs <drebs@leap.se> | 2013-01-08 16:50:27 -0200 | 
| commit | 0253ee7ad92efbdb20819683b44d3a815096cb42 (patch) | |
| tree | f8abc06d4cae6189929da5f7f69fffd8bebd9d6f | |
| parent | bb58713c0d30787b3b47a949e84a0338fa00e08a (diff) | |
SQLCipherDatabase passes u1db backends tests.
| -rw-r--r-- | src/leap/soledad/tests/test_sqlcipher.py | 51 | 
1 files changed, 50 insertions, 1 deletions
| diff --git a/src/leap/soledad/tests/test_sqlcipher.py b/src/leap/soledad/tests/test_sqlcipher.py index a7ba5284..f203dc66 100644 --- a/src/leap/soledad/tests/test_sqlcipher.py +++ b/src/leap/soledad/tests/test_sqlcipher.py @@ -13,18 +13,23 @@ from u1db import (      )  from leap.soledad.backends import sqlcipher as sqlite_backend  from leap.soledad.backends.leap_backend import LeapDocument -from leap.soledad.tests import u1db_tests +from leap.soledad.tests import u1db_tests as tests  from leap.soledad.tests.u1db_tests.test_sqlite_backend import (    TestSQLiteDatabase,    TestSQLitePartialExpandDatabase,  )  from leap.soledad.tests.u1db_tests.test_backends import TestAlternativeDocument +from leap.soledad.tests.u1db_tests.test_backends import AllDatabaseTests  PASSWORD = '123456'  class TestSQLCipherDatabase(TestSQLitePartialExpandDatabase): +    # The following tests had to be cloned from u1db because they all +    # instantiate the backend directly, so we need to change that in order to +    # our backend be instantiated in place. +      def setUp(self):          super(TestSQLitePartialExpandDatabase, self).setUp()          self.db = sqlite_backend.SQLCipherDatabase(':memory:', PASSWORD) @@ -97,9 +102,53 @@ class TestSQLCipherDatabase(TestSQLitePartialExpandDatabase):          self.assertEqual(TestAlternativeDocument, db2._factory)      def test_create_database_initializes_schema(self): +        # This test had to be cloned because our implementation of SQLCipher +        # backend is referenced with an index_storage_value that includes the +        # word "encrypted". See u1db's sqlite_backend and our +        # sqlcipher_backend for reference.          raw_db = self.db._get_sqlite_handle()          c = raw_db.cursor()          c.execute("SELECT * FROM u1db_config")          config = dict([(r[0], r[1]) for r in c.fetchall()])          self.assertEqual({'sql_schema': '0', 'replica_uid': 'test',                            'index_storage': 'expand referenced encrypted'}, config) + + +# The following tests come from u1db test_backends. + +def make_sqlcipher_database_for_test(test, replica_uid): +    db = sqlite_backend.SQLCipherDatabase(':memory:', PASSWORD) +    db._set_replica_uid(replica_uid) +    return db + + +def copy_sqlcipher_database_for_test(test, db): +    # DO NOT COPY OR REUSE THIS CODE OUTSIDE TESTS: COPYING U1DB DATABASES IS +    # THE WRONG THING TO DO, THE ONLY REASON WE DO SO HERE IS TO TEST THAT WE +    # CORRECTLY DETECT IT HAPPENING SO THAT WE CAN RAISE ERRORS RATHER THAN +    # CORRUPT USER DATA. USE SYNC INSTEAD, OR WE WILL SEND NINJA TO YOUR +    # HOUSE. +    new_db = sqlite_backend.SQLCipherDatabase(':memory:', PASSWORD) +    tmpfile = StringIO() +    for line in db._db_handle.iterdump(): +        if not 'sqlite_sequence' in line:  # work around bug in iterdump +            tmpfile.write('%s\n' % line) +    tmpfile.seek(0) +    new_db._db_handle = dbapi2.connect(':memory:') +    new_db._db_handle.cursor().executescript(tmpfile.read()) +    new_db._db_handle.commit() +    new_db._set_replica_uid(db._replica_uid) +    new_db._factory = db._factory +    return new_db + + +class SQLCipherTests(AllDatabaseTests): + +    scenarios = [ +        ('sqlcipher', {'make_database_for_test': make_sqlcipher_database_for_test, +                       'copy_database_for_test': copy_sqlcipher_database_for_test, +                       'make_document_for_test': tests.make_document_for_test,}), +        ] + + +load_tests = tests.load_with_scenarios | 
