From 4fa10253527d67ab687d8f44a1c72ab6975a9778 Mon Sep 17 00:00:00 2001 From: Victor Shyba Date: Fri, 15 Sep 2017 20:05:07 -0300 Subject: [feature] filter out unavailable blobs on listing -- Related: #8822 --- src/leap/soledad/client/_db/blobs.py | 6 ++++++ tests/blobs/test_blob_manager.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/leap/soledad/client/_db/blobs.py b/src/leap/soledad/client/_db/blobs.py index ab9de8dd..4b90f8f2 100644 --- a/src/leap/soledad/client/_db/blobs.py +++ b/src/leap/soledad/client/_db/blobs.py @@ -72,6 +72,7 @@ class SyncStatus: PENDING_DOWNLOAD = 3 FAILED_UPLOAD = 4 FAILED_DOWNLOAD = 5 + UNAVAILABLE_STATUSES = (3, 5) class ConnectionPool(adbapi.ConnectionPool): @@ -573,6 +574,11 @@ class SQLiteBlobBackend(object): if sync_status: query += ' and sync_status = ?' values += (sync_status,) + else: + avoid_values = SyncStatus.UNAVAILABLE_STATUSES + query += ' AND sync_status NOT IN (%s)' + query %= ','.join(['?' for _ in avoid_values]) + values += avoid_values result = yield self.dbpool.runQuery(query, values) if result: defer.returnValue([b_id[0] for b_id in result]) diff --git a/tests/blobs/test_blob_manager.py b/tests/blobs/test_blob_manager.py index 995a1989..0fcfff72 100644 --- a/tests/blobs/test_blob_manager.py +++ b/tests/blobs/test_blob_manager.py @@ -174,3 +174,22 @@ class BlobManagerTestCase(unittest.TestCase): failed_upload = SyncStatus.FAILED_UPLOAD local_list = yield self.manager.local_list(sync_status=failed_upload) self.assertIn(blob_id, local_list) + + @defer.inlineCallbacks + @pytest.mark.usefixtures("method_tmpdir") + def test_local_list_doesnt_include_unavailable_blobs(self): + local = self.manager.local + unavailable_ids, deferreds = [], [] + for unavailable_status in SyncStatus.UNAVAILABLE_STATUSES: + current_blob_id = uuid4().hex + deferreds.append(local.put(current_blob_id, BytesIO(''), 0, + status=unavailable_status)) + unavailable_ids.append(current_blob_id) + available_blob_id = uuid4().hex + content, length = self.cleartext, len(self.cleartext.getvalue()) + deferreds.append(local.put(available_blob_id, content, length)) + yield defer.gatherResults(deferreds) + local_list = yield local.list() + message = 'Unavailable blob showing up on listing!' + for blob_id in unavailable_ids: + self.assertNotIn(blob_id, local_list, message) -- cgit v1.2.3