summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrebs <drebs@leap.se>2017-12-08 22:16:11 -0200
committerdrebs <drebs@leap.se>2017-12-13 13:49:25 -0200
commit96dff026a7b58d116543b4f181c93946e04894b0 (patch)
tree7141497b46c35987a5a1d11b667b0d797c5b50c6
parent601eb94cabe9d7003bdda012338bf0a3edfd46cb (diff)
[refactor] make count() return a deferred
-rw-r--r--src/leap/soledad/server/_blobs.py8
-rw-r--r--src/leap/soledad/server/interfaces.py6
-rw-r--r--tests/blobs/test_fs_backend.py29
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)