From 96dff026a7b58d116543b4f181c93946e04894b0 Mon Sep 17 00:00:00 2001 From: drebs Date: Fri, 8 Dec 2017 22:16:11 -0200 Subject: [refactor] make count() return a deferred --- src/leap/soledad/server/_blobs.py | 8 ++++++-- src/leap/soledad/server/interfaces.py | 6 +++--- tests/blobs/test_fs_backend.py | 29 ++++++++++++++++++++++++----- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/leap/soledad/server/_blobs.py b/src/leap/soledad/server/_blobs.py index 21becbf3..42c00841 100644 --- a/src/leap/soledad/server/_blobs.py +++ b/src/leap/soledad/server/_blobs.py @@ -159,7 +159,7 @@ class FilesystemBlobsBackend(object): count = 0 for _, _, filenames in os.walk(base_path): count += len(filter(lambda i: not i.endswith('.flags'), filenames)) - return json.dumps({"count": count}) + return defer.succeed(count) def list_blobs(self, user, namespace='', order_by=None, deleted=False, filter_flag=False): @@ -279,7 +279,11 @@ class BlobsResource(resource.Resource): logger.info("http get: %s" % request.path) user, blob_id, namespace = self._validate(request) if not blob_id and request.args.get('only_count', [False])[0]: - return self._handler.count(user, namespace) + d = self._handler.count(user, namespace) + d.addCallback(lambda count: json.dumps({"count": count})) + d.addCallback(lambda count: request.write(count)) + d.addCallback(lambda _: request.finish()) + return NOT_DONE_YET elif not blob_id: order = request.args.get('order_by', [None])[0] filter_flag = request.args.get('filter_flag', [False])[0] diff --git a/src/leap/soledad/server/interfaces.py b/src/leap/soledad/server/interfaces.py index a7caf917..a1762647 100644 --- a/src/leap/soledad/server/interfaces.py +++ b/src/leap/soledad/server/interfaces.py @@ -98,9 +98,9 @@ class IBlobsBackend(Interface): :param namespace: Restrict the count to a certain namespace. :type namespace: str - :return: The number of blobs in the backend storage, possibly - restricted to a certain namespace. - :rtype: int + :return: A deferred that fires with the number of blobs in the backend + storage, possibly restricted to a certain namespace. + :rtype: twisted.internet.defer.Deferred """ def list_blobs(user, namespace='', order_by=None, deleted=False, diff --git a/tests/blobs/test_fs_backend.py b/tests/blobs/test_fs_backend.py index 69526cbf..e77e56b0 100644 --- a/tests/blobs/test_fs_backend.py +++ b/tests/blobs/test_fs_backend.py @@ -19,6 +19,7 @@ Tests for blobs backend on server side. """ from twisted.trial import unittest from twisted.internet import defer +from twisted.web.client import FileBodyProducer from twisted.web.test.test_web import DummyRequest from leap.common.files import mkdir_p from leap.soledad.server import _blobs @@ -26,6 +27,8 @@ from mock import Mock import mock import os import base64 +import io +import json import pytest @@ -209,11 +212,27 @@ class FilesystemBackendTestCase(unittest.TestCase): @defer.inlineCallbacks def test_write_blob_using_namespace(self): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) - request = DummyRequest(['']) - request.content = BytesIO('content') - yield backend.write_blob('user', 'blob_id', request, + producer = FileBodyProducer(io.BytesIO('content')) + yield backend.write_blob('user', 'blob_id', producer, namespace='custom') - default = yield backend.list_blobs('user', request) - custom = yield backend.list_blobs('user', request, namespace='custom') + default = yield backend.list_blobs('user') + custom = yield backend.list_blobs('user', namespace='custom') self.assertEquals([], json.loads(default)) self.assertEquals(['blob_id'], json.loads(custom)) + + @pytest.mark.usefixtures("method_tmpdir") + @defer.inlineCallbacks + def test_count(self): + backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) + content = 'blah' + yield backend.write_blob('user', 'blob_id_1', io.BytesIO(content)) + yield backend.write_blob('user', 'blob_id_2', io.BytesIO(content)) + yield backend.write_blob('user', 'blob_id_3', io.BytesIO(content)) + count = yield backend.count('user') + self.assertEqual(3, count) + yield backend.write_blob('user', 'blob_id_1', io.BytesIO(content), + namespace='xfiles') + yield backend.write_blob('user', 'blob_id_2', io.BytesIO(content), + namespace='xfiles') + count = yield backend.count('user', namespace='xfiles') + self.assertEqual(2, count) -- cgit v1.2.3