class TestSqliteCacheDB(TriblerCoreTest): FILE_DIR = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) SQLITE_SCRIPTS_DIR = os.path.abspath( os.path.join(FILE_DIR, u"data/sqlite_scripts/")) @blocking_call_on_reactor_thread @inlineCallbacks def setUp(self): yield super(TestSqliteCacheDB, self).setUp() db_path = u":memory:" self.sqlite_test = SQLiteCacheDB(db_path) self.sqlite_test.set_show_sql(True) self.sqlite_test.initialize() import Tribler self.tribler_db_script = os.path.join( os.path.dirname(Tribler.__file__), DB_SCRIPT_NAME) def tearDown(self): super(TestSqliteCacheDB, self).tearDown() self.sqlite_test.close() self.sqlite_test = None @blocking_call_on_reactor_thread def test_create_db(self): sql = u"CREATE TABLE person(lastname, firstname);" self.sqlite_test.execute(sql) self.assertIsInstance(self.sqlite_test.version, int) @blocking_call_on_reactor_thread @raises(OSError) def test_no_file_db_error(self): file_dir = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) sqlite_test_2 = SQLiteCacheDB(file_dir) sqlite_test_2.initialize() @blocking_call_on_reactor_thread def test_open_db_new_file(self): db_path = os.path.join(self.session_base_dir, "test_db.db") sqlite_test_2 = SQLiteCacheDB(db_path) sqlite_test_2.initialize() self.assertTrue(os.path.isfile(db_path)) @blocking_call_on_reactor_thread @raises(OSError) def test_open_db_script_file_invalid_location(self): sqlite_test_2 = SQLiteCacheDB( os.path.join(self.session_base_dir, "test_db.db"), u'myfakelocation') sqlite_test_2.initialize() @blocking_call_on_reactor_thread @raises(OSError) def test_open_db_script_file_directory(self): file_dir = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) sqlite_test_2 = SQLiteCacheDB( os.path.join(self.session_base_dir, "test_db.db"), file_dir) sqlite_test_2.initialize() @blocking_call_on_reactor_thread def test_open_db_script_file(self): sqlite_test_2 = SQLiteCacheDB( os.path.join(self.session_base_dir, "test_db.db"), self.tribler_db_script) sqlite_test_2.initialize() sqlite_test_2.initial_begin() sqlite_test_2.write_version(4) self.assertEqual(sqlite_test_2.version, 4) @blocking_call_on_reactor_thread def test_initial_begin(self): self.sqlite_test.initial_begin() @blocking_call_on_reactor_thread @raises(SQLError) def test_failed_commit(self): sqlite_test_2 = SQLiteCacheDB( os.path.join(self.session_base_dir, "test_db.db"), self.tribler_db_script) sqlite_test_2.initialize() sqlite_test_2.write_version(4) @blocking_call_on_reactor_thread @raises(Exception) def test_initial_begin_no_connection(self): db_path = os.path.join(self.session_base_dir, "test_db.db") sqlite_test_2 = SQLiteCacheDB(db_path) sqlite_test_2.initial_begin() @blocking_call_on_reactor_thread @skipIf(sys.platform == "win32", "chmod does not work on Windows") @raises(IOError) def test_no_permission_on_script(self): db_path = os.path.join(self.session_base_dir, "test_db.db") new_script_path = os.path.join(self.session_base_dir, "script.sql") shutil.copyfile(self.tribler_db_script, new_script_path) os.chmod(new_script_path, 0) sqlite_test_2 = SQLiteCacheDB(db_path, new_script_path) sqlite_test_2.initialize() @blocking_call_on_reactor_thread @raises(CorruptedDatabaseError) def test_no_version_info_in_database(self): sqlite_test_2 = SQLiteCacheDB( os.path.join(self.session_base_dir, "test_db.db"), os.path.join(self.SQLITE_SCRIPTS_DIR, "script1.sql")) sqlite_test_2.initialize() @blocking_call_on_reactor_thread @raises(CorruptedDatabaseError) def test_integrity_check_failed(self): sqlite_test_2 = SQLiteCacheDB( os.path.join(self.session_base_dir, "test_db.db"), os.path.join(self.SQLITE_SCRIPTS_DIR, "script1.sql")) def execute(sql): if sql == u"PRAGMA quick_check": db_response = MockObject() db_response.next = lambda: ( "Error: database disk image is malformed", ) return db_response sqlite_test_2.execute = execute sqlite_test_2.initialize() @blocking_call_on_reactor_thread def test_clean_db(self): sqlite_test_2 = SQLiteCacheDB( os.path.join(self.session_base_dir, "test_db.db"), self.tribler_db_script) sqlite_test_2.initialize() sqlite_test_2.initial_begin() sqlite_test_2.clean_db(vacuum=True, exiting=True) @blocking_call_on_reactor_thread @skipIf(sys.platform == "win32", "chmod does not work on Windows") @raises(CantOpenError) def test_open_db_connection_no_permission(self): os.chmod(os.path.join(self.session_base_dir), 0) sqlite_test_2 = SQLiteCacheDB( os.path.join(self.session_base_dir, "test_db.db")) sqlite_test_2.initialize() @blocking_call_on_reactor_thread def test_insert(self): self.test_create_db() self.sqlite_test.insert('person', lastname='a', firstname='b') self.assertEqual(self.sqlite_test.size('person'), 1) @blocking_call_on_reactor_thread def test_fetchone(self): self.test_insert() one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('a', 'b')) one = self.sqlite_test.fetchone( u"SELECT lastname FROM person WHERE firstname == 'b'") self.assertEqual(one, 'a') one = self.sqlite_test.fetchone( u"SELECT lastname FROM person WHERE firstname == 'c'") self.assertIsNone(one) @blocking_call_on_reactor_thread def test_insertmany(self): self.test_create_db() values = [] for i in range(100): value = (str(i), str(i**2)) values.append(value) self.sqlite_test.insertMany('person', values) self.assertEqual(self.sqlite_test.size('person'), 100) @blocking_call_on_reactor_thread def test_fetchall(self): self.test_insertmany() all = self.sqlite_test.fetchall('select * from person') self.assertEqual(len(all), 100) all = self.sqlite_test.fetchall( "select * from person where lastname=='101'") self.assertEqual(all, []) @blocking_call_on_reactor_thread def test_insertorder(self): self.test_insertmany() self.sqlite_test.insert('person', lastname='1', firstname='abc') one = self.sqlite_test.fetchone( "select firstname from person where lastname == '1'") self.assertTrue(one == '1' or one == 'abc') all = self.sqlite_test.fetchall( "select firstname from person where lastname == '1'") self.assertEqual(len(all), 2) @blocking_call_on_reactor_thread def test_update(self): self.test_insertmany() self.sqlite_test.update('person', "lastname == '2'", firstname='56') one = self.sqlite_test.fetchone( "select firstname from person where lastname == '2'") self.assertEqual(one, '56') self.sqlite_test.update('person', "lastname == '3'", firstname=65) one = self.sqlite_test.fetchone( "select firstname from person where lastname == '3'") self.assertEqual(one, 65) self.sqlite_test.update('person', "lastname == '4'", firstname=654, lastname=44) one = self.sqlite_test.fetchone( "select firstname from person where lastname == 44") self.assertEqual(one, 654) @blocking_call_on_reactor_thread def test_delete_single_element(self): """ This test tests whether deleting using a single element as value works. """ self.test_insert() self.sqlite_test.insert('person', lastname='x', firstname='z') one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('a', 'b')) self.sqlite_test.delete("person", lastname="a") one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('x', 'z')) @blocking_call_on_reactor_thread def test_delete_tuple(self): """ This test tests whether deleting using a tuple as value works. """ self.test_insert() self.sqlite_test.insert('person', lastname='x', firstname='z') one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('a', 'b')) self.sqlite_test.delete("person", lastname=("LIKE", "a")) one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('x', 'z'))
class TestSqliteCacheDB(AbstractServer): def setUp(self): super(TestSqliteCacheDB, self).setUp() self.config = SessionStartupConfig() self.config.set_state_dir(self.getStateDir()) self.config.set_torrent_checking(False) self.config.set_multicast_local_peer_discovery(False) self.config.set_megacache(False) self.config.set_dispersy(False) self.config.set_mainline_dht(False) self.config.set_torrent_collecting(False) self.config.set_libtorrent(False) self.config.set_dht_torrent_collecting(False) self.config.set_videoplayer(False) self.session = Session(self.config, ignore_singleton=True) self.sqlite_test = SQLiteCacheDB(self.session) self.db_path = u":memory:" self.sqlite_test.initialize(self.db_path) def tearDown(self): super(TestSqliteCacheDB, self).tearDown() self.sqlite_test.close() self.sqlite_test = None self.session.del_instance() self.session = None @blocking_call_on_reactor_thread def test_create_db(self): sql = u"CREATE TABLE person(lastname, firstname);" self.sqlite_test.execute(sql) @blocking_call_on_reactor_thread def test_insert(self): self.test_create_db() self.sqlite_test.insert('person', lastname='a', firstname='b') assert self.sqlite_test.size('person') == 1 @blocking_call_on_reactor_thread def test_fetchone(self): self.test_insert() one = self.sqlite_test.fetchone(u"SELECT * FROM person") assert one == ('a', 'b') one = self.sqlite_test.fetchone(u"SELECT lastname FROM person WHERE firstname == 'b'") assert one == 'a' one = self.sqlite_test.fetchone(u"SELECT lastname FROM person WHERE firstname == 'c'") assert one is None @blocking_call_on_reactor_thread def test_insertmany(self): self.test_create_db() values = [] for i in range(100): value = (str(i), str(i ** 2)) values.append(value) self.sqlite_test.insertMany('person', values) assert self.sqlite_test.size('person') == 100 @blocking_call_on_reactor_thread def test_fetchall(self): self.test_insertmany() all = self.sqlite_test.fetchall('select * from person') assert len(all) == 100 all = self.sqlite_test.fetchall("select * from person where lastname=='101'") assert all == [] @blocking_call_on_reactor_thread def test_insertorder(self): self.test_insertmany() self.sqlite_test.insert('person', lastname='1', firstname='abc') one = self.sqlite_test.fetchone("select firstname from person where lastname == '1'") assert one == '1' or one == 'abc' all = self.sqlite_test.fetchall("select firstname from person where lastname == '1'") assert len(all) == 2 @blocking_call_on_reactor_thread def test_update(self): self.test_insertmany() self.sqlite_test.update('person', "lastname == '2'", firstname='56') one = self.sqlite_test.fetchone("select firstname from person where lastname == '2'") assert one == '56', one self.sqlite_test.update('person', "lastname == '3'", firstname=65) one = self.sqlite_test.fetchone("select firstname from person where lastname == '3'") assert one == 65, one self.sqlite_test.update('person', "lastname == '4'", firstname=654, lastname=44) one = self.sqlite_test.fetchone("select firstname from person where lastname == 44") assert one == 654, one
class TestSqliteCacheDB(TriblerCoreTest): FILE_DIR = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) SQLITE_SCRIPTS_DIR = os.path.abspath(os.path.join(FILE_DIR, u"data/sqlite_scripts/")) @inlineCallbacks def setUp(self): yield super(TestSqliteCacheDB, self).setUp() db_path = u":memory:" self.sqlite_test = SQLiteCacheDB(db_path) self.sqlite_test.set_show_sql(True) def tearDown(self): self.sqlite_test.close() self.sqlite_test = None super(TestSqliteCacheDB, self).tearDown() def test_create_db(self): sql = u"CREATE TABLE person(lastname, firstname);" self.sqlite_test.execute(sql) self.assertIsInstance(self.sqlite_test.version, int) @raises(OSError) def test_no_file_db_error(self): file_dir = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) sqlite_test_2 = SQLiteCacheDB(file_dir) def test_open_db_new_file(self): db_path = os.path.join(self.session_base_dir, "test_db.db") sqlite_test_2 = SQLiteCacheDB(db_path) self.assertTrue(os.path.isfile(db_path)) @raises(OSError) def test_open_db_script_file_invalid_location(self): sqlite_test_2 = SQLiteCacheDB(os.path.join(self.session_base_dir, "test_db.db"), u'myfakelocation') @raises(OSError) def test_open_db_script_file_directory(self): file_dir = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) sqlite_test_2 = SQLiteCacheDB(os.path.join(self.session_base_dir, "test_db.db"), file_dir) def test_open_db_script_file(self): sqlite_test_2 = SQLiteCacheDB(os.path.join(self.session_base_dir, "test_db.db"), DB_SCRIPT_ABSOLUTE_PATH) sqlite_test_2.write_version(4) self.assertEqual(sqlite_test_2.version, 4) @raises(SQLError) def test_failed_commit(self): sqlite_test_2 = SQLiteCacheDB(os.path.join(self.session_base_dir, "test_db.db"), DB_SCRIPT_ABSOLUTE_PATH) sqlite_test_2.initial_begin() sqlite_test_2.write_version(4) @skipIf(sys.platform == "win32", "chmod does not work on Windows") @raises(IOError) def test_no_permission_on_script(self): db_path = os.path.join(self.session_base_dir, "test_db.db") new_script_path = os.path.join(self.session_base_dir, "script.sql") shutil.copyfile(DB_SCRIPT_ABSOLUTE_PATH, new_script_path) os.chmod(new_script_path, 0) sqlite_test_2 = SQLiteCacheDB(db_path, new_script_path) @raises(CorruptedDatabaseError) def test_no_version_info_in_database(self): sqlite_test_2 = SQLiteCacheDB(os.path.join(self.session_base_dir, "test_db.db"), os.path.join(self.SQLITE_SCRIPTS_DIR, "script1.sql")) @raises(CorruptedDatabaseError) def test_integrity_check_failed(self): sqlite_test_2 = SQLiteCacheDB(os.path.join(self.session_base_dir, "test_db.db"), os.path.join(self.SQLITE_SCRIPTS_DIR, "script1.sql")) def execute(sql): if sql == u"PRAGMA quick_check": db_response = MockObject() db_response.next = lambda: ("Error: database disk image is malformed", ) return db_response sqlite_test_2.execute = execute def test_integrity_check_triggered(self): """ Tests if integrity check is triggered if temporary rollback files are present.""" def do_integrity_check(_): do_integrity_check.called = True db_path = os.path.join(self.session_base_dir, "test_db.db") sqlite_test = SQLiteCacheDB(db_path) sqlite_test.do_quick_integrity_check = do_integrity_check do_integrity_check.called = False self.assertFalse(do_integrity_check.called) db_path2 = os.path.join(self.session_base_dir, "test_db2.db") wal_file = open(os.path.join(self.session_base_dir, "test_db2.db-shm"), 'w') wal_file.close() do_integrity_check.called = False SQLiteCacheDB.do_quick_integrity_check = do_integrity_check sqlite_test_2 = SQLiteCacheDB(db_path2) self.assertTrue(do_integrity_check.called) def test_clean_db(self): sqlite_test_2 = SQLiteCacheDB(os.path.join(self.session_base_dir, "test_db.db"), DB_SCRIPT_ABSOLUTE_PATH) sqlite_test_2.clean_db(vacuum=True, exiting=False) sqlite_test_2.close() @skipIf(sys.platform == "win32", "chmod does not work on Windows") @raises(CantOpenError) def test_open_db_connection_no_permission(self): os.chmod(os.path.join(self.session_base_dir), 0) sqlite_test_2 = SQLiteCacheDB(os.path.join(self.session_base_dir, "test_db.db")) def test_insert(self): self.test_create_db() self.sqlite_test.insert('person', lastname='a', firstname='b') self.assertEqual(self.sqlite_test.size('person'), 1) def test_fetchone(self): self.test_insert() one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('a', 'b')) one = self.sqlite_test.fetchone(u"SELECT lastname FROM person WHERE firstname == 'b'") self.assertEqual(one, 'a') one = self.sqlite_test.fetchone(u"SELECT lastname FROM person WHERE firstname == 'c'") self.assertIsNone(one) def test_insertmany(self): self.test_create_db() values = [] for i in range(100): value = (str(i), str(i ** 2)) values.append(value) self.sqlite_test.insertMany('person', values) self.assertEqual(self.sqlite_test.size('person'), 100) def test_fetchall(self): self.test_insertmany() all = self.sqlite_test.fetchall('select * from person') self.assertEqual(len(all), 100) all = self.sqlite_test.fetchall("select * from person where lastname=='101'") self.assertEqual(all, []) def test_insertorder(self): self.test_insertmany() self.sqlite_test.insert('person', lastname='1', firstname='abc') one = self.sqlite_test.fetchone("select firstname from person where lastname == '1'") self.assertTrue(one == '1' or one == 'abc') all = self.sqlite_test.fetchall("select firstname from person where lastname == '1'") self.assertEqual(len(all), 2) def test_update(self): self.test_insertmany() self.sqlite_test.update('person', "lastname == '2'", firstname='56') one = self.sqlite_test.fetchone("select firstname from person where lastname == '2'") self.assertEqual(one, '56') self.sqlite_test.update('person', "lastname == '3'", firstname=65) one = self.sqlite_test.fetchone("select firstname from person where lastname == '3'") self.assertEqual(one, 65) self.sqlite_test.update('person', "lastname == '4'", firstname=654, lastname=44) one = self.sqlite_test.fetchone("select firstname from person where lastname == 44") self.assertEqual(one, 654) def test_delete_single_element(self): """ This test tests whether deleting using a single element as value works. """ self.test_insert() self.sqlite_test.insert('person', lastname='x', firstname='z') one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('a', 'b')) self.sqlite_test.delete("person", lastname="a") one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('x', 'z')) def test_delete_tuple(self): """ This test tests whether deleting using a tuple as value works. """ self.test_insert() self.sqlite_test.insert('person', lastname='x', firstname='z') one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('a', 'b')) self.sqlite_test.delete("person", lastname=("LIKE", "a")) one = self.sqlite_test.fetchone(u"SELECT * FROM person") self.assertEqual(one, ('x', 'z'))
class TestSqliteCacheDB(AbstractServer): def setUp(self): super(TestSqliteCacheDB, self).setUp() self.config = SessionStartupConfig() self.config.set_state_dir(self.getStateDir()) self.config.set_torrent_checking(False) self.config.set_multicast_local_peer_discovery(False) self.config.set_megacache(False) self.config.set_dispersy(False) self.config.set_mainline_dht(False) self.config.set_torrent_collecting(False) self.config.set_libtorrent(False) self.config.set_dht_torrent_collecting(False) self.config.set_videoplayer(False) self.session = Session(self.config, ignore_singleton=True) self.sqlite_test = SQLiteCacheDB(self.session) self.db_path = u":memory:" self.sqlite_test.initialize(self.db_path) def tearDown(self): super(TestSqliteCacheDB, self).tearDown() self.sqlite_test.close() self.sqlite_test = None self.session.del_instance() self.session = None @blocking_call_on_reactor_thread def test_create_db(self): sql = u"CREATE TABLE person(lastname, firstname);" self.sqlite_test.execute(sql) @blocking_call_on_reactor_thread def test_insert(self): self.test_create_db() self.sqlite_test.insert('person', lastname='a', firstname='b') assert self.sqlite_test.size('person') == 1 @blocking_call_on_reactor_thread def test_fetchone(self): self.test_insert() one = self.sqlite_test.fetchone(u"SELECT * FROM person") assert one == ('a', 'b') one = self.sqlite_test.fetchone( u"SELECT lastname FROM person WHERE firstname == 'b'") assert one == 'a' one = self.sqlite_test.fetchone( u"SELECT lastname FROM person WHERE firstname == 'c'") assert one is None @blocking_call_on_reactor_thread def test_insertmany(self): self.test_create_db() values = [] for i in range(100): value = (str(i), str(i**2)) values.append(value) self.sqlite_test.insertMany('person', values) assert self.sqlite_test.size('person') == 100 @blocking_call_on_reactor_thread def test_fetchall(self): self.test_insertmany() all = self.sqlite_test.fetchall('select * from person') assert len(all) == 100 all = self.sqlite_test.fetchall( "select * from person where lastname=='101'") assert all == [] @blocking_call_on_reactor_thread def test_insertorder(self): self.test_insertmany() self.sqlite_test.insert('person', lastname='1', firstname='abc') one = self.sqlite_test.fetchone( "select firstname from person where lastname == '1'") assert one == '1' or one == 'abc' all = self.sqlite_test.fetchall( "select firstname from person where lastname == '1'") assert len(all) == 2 @blocking_call_on_reactor_thread def test_update(self): self.test_insertmany() self.sqlite_test.update('person', "lastname == '2'", firstname='56') one = self.sqlite_test.fetchone( "select firstname from person where lastname == '2'") assert one == '56', one self.sqlite_test.update('person', "lastname == '3'", firstname=65) one = self.sqlite_test.fetchone( "select firstname from person where lastname == '3'") assert one == 65, one self.sqlite_test.update('person', "lastname == '4'", firstname=654, lastname=44) one = self.sqlite_test.fetchone( "select firstname from person where lastname == 44") assert one == 654, one