def test_read_range(self): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) producer = FileBodyProducer(io.BytesIO("0123456789")) yield backend.write_blob('user', 'blob-id', producer) consumer = DummyRequest(['']) yield backend.read_blob('user', 'blob-id', consumer, range=(1, 3)) self.assertEqual(['12'], consumer.written)
def test_count(self): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) content = 'blah' ids = range(5) def _write(namespace=''): producer = FileBodyProducer(io.BytesIO(content)) d = backend.write_blob('user', str(ids.pop()), producer, namespace=namespace) return d yield _write() yield _write() yield _write() count = yield backend.count('user') self.assertEqual(3, count) yield _write(namespace='xfiles') yield _write(namespace='xfiles') count = yield backend.count('user', namespace='xfiles') self.assertEqual(2, count)
def test_write_cannot_exceed_quota(self, isfile): isfile.return_value = False backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) backend.get_total_storage = lambda x: defer.succeed(100) backend.quota = 90 with pytest.raises(_blobs.QuotaExceeded): producer = FileBodyProducer(io.BytesIO('a' * 100)) yield backend.write_blob('user', 'blob_id', producer)
def test_cannot_overwrite(self, isfile): isfile.return_value = True backend = _blobs.FilesystemBlobsBackend() backend._get_path = Mock(return_value='path') request = DummyRequest(['']) result = backend.write_blob('user', 'blob_id', request) self.assertEquals(result, "Blob already exists: blob_id") self.assertEquals(request.responseCode, 409)
def test_list_blobs_limited_by_namespace(self, walk_mock): backend = _blobs.FilesystemBlobsBackend(self.tempdir) _ = None walk_mock.return_value = [('', _, ['blob_0']), ('', _, ['blob_1'])] result = yield backend.list_blobs('user', namespace='incoming') self.assertEquals(result, ['blob_0', 'blob_1']) target_dir = os.path.join(self.tempdir, 'user', 'incoming') walk_mock.assert_called_once_with(target_dir)
def test_read_blob(self, get_path): path = os.path.join(self.tempdir, 'blob') with open(path, 'w') as f: f.write('bl0b') get_path.return_value = path backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) consumer = DummyRequest(['']) yield backend.read_blob('user', 'blob_id', consumer) self.assertEqual(['bl0b'], consumer.written)
def test_tag_header(self, open_mock): open_mock.return_value = BytesIO('A' * 40 + 'B' * 16) expected_tag = base64.urlsafe_b64encode('B' * 16) expected_method = Mock() backend = _blobs.FilesystemBlobsBackend() request = Mock(responseHeaders=Mock(setRawHeaders=expected_method)) backend.tag_header('user', 'blob_id', request) expected_method.assert_called_once_with('Tag', [expected_tag])
def test_path_validation_on_write_blob(self): blobs_path, producer = self.tempdir, Mock() backend = _blobs.FilesystemBlobsBackend(blobs_path=blobs_path) with pytest.raises(Exception): yield backend.write_blob('..', '..', producer) with pytest.raises(Exception): yield backend.write_blob('user', '../../../', producer) with pytest.raises(Exception): yield backend.write_blob('../../../', 'id1', producer) with pytest.raises(Exception): yield backend.write_blob('user', 'id2', producer, namespace='..')
def test_get_tag(self): expected_tag = base64.urlsafe_b64encode('B' * 16) backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) # write a blob... path = backend._get_path('user', 'blob_id', '') mkdir_p(os.path.split(path)[0]) with open(path, "w") as f: f.write('A' * 40 + 'B' * 16) # ...and get its tag tag = yield backend.get_tag('user', 'blob_id') self.assertEquals(expected_tag, tag)
def test_get_blob_size(self): # get a backend backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) # write a blob with size=10 path = backend._get_path('user', 'blob_id', '') mkdir_p(os.path.split(path)[0]) with open(path, "w") as f: f.write("0123456789") # check it's size size = yield backend.get_blob_size('user', 'blob_id', '') self.assertEquals(10, size)
def test_write_blob_using_namespace(self): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) producer = FileBodyProducer(io.BytesIO('content')) yield backend.write_blob('user', 'blob_id', producer, namespace='custom') default = yield backend.list_blobs('user') custom = yield backend.list_blobs('user', namespace='custom') self.assertEquals([], default) self.assertEquals(['blob_id'], custom)
def test_delete_blob(self, unlink_mock): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) # write a blob... path = backend._get_path('user', 'blob_id', '') mkdir_p(os.path.split(path)[0]) with open(path, "w") as f: f.write("bl0b") # ...and delete it yield backend.delete_blob('user', 'blob_id') unlink_mock.assert_any_call(backend._get_path('user', 'blob_id')) unlink_mock.assert_any_call( backend._get_path('user', 'blob_id') + '.flags')
def test_read_blob(self, file_mock): render_mock = Mock() file_mock.return_value = render_mock backend = _blobs.FilesystemBlobsBackend() request = DummyRequest(['']) backend._get_path = Mock(return_value='path') backend.read_blob('user', 'blob_id', request) backend._get_path.assert_called_once_with('user', 'blob_id') ctype = 'application/octet-stream' _blobs.static.File.assert_called_once_with('path', defaultType=ctype) render_mock.render_GET.assert_called_once_with(request)
def test_write_cannot_exceed_quota(self, isfile): isfile.return_value = False backend = _blobs.FilesystemBlobsBackend() backend._get_path = Mock(return_value=self.tempdir) request = Mock() backend.get_total_storage = lambda x: 100 backend.quota = 90 backend.write_blob('user', 'blob_id', request) request.setResponseCode.assert_called_once_with(507) request.write.assert_called_once_with('Quota Exceeded!') request.finish.assert_called_once()
def test_get_path_partitioning_by_default(self): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) backend.path = '/somewhere/' path = backend._get_path('user', 'blob_id', '') expected = '/somewhere/user/default/b/blo/blob_i/blob_id' self.assertEquals(path, expected)
def test_cannot_overwrite(self, isfile): isfile.return_value = True backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) with pytest.raises(_blobs.BlobExists): producer = Mock() yield backend.write_blob('user', 'blob_id', producer)
def test_get_path_partitioning(self): backend = _blobs.FilesystemBlobsBackend() backend.path = '/somewhere/' path = backend._get_path('user', 'blob_id') self.assertEquals(path, '/somewhere/user/b/blo/blob_i/blob_id')
def test_list_blobs(self, walk_mock): backend, _ = _blobs.FilesystemBlobsBackend(self.tempdir), None walk_mock.return_value = [(_, _, ['blob_0']), (_, _, ['blob_1'])] result = json.loads(backend.list_blobs('user', DummyRequest(['']))) self.assertEquals(result, ['blob_0', 'blob_1'])
def test_get_path_custom(self): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) backend.path = '/somewhere/' path = backend._get_path('user', 'blob_id', 'wonderland') expected = '/somewhere/user/wonderland/b/blo/blob_i/blob_id' self.assertEquals(expected, path)
def test_get_path_namespace_traversal_raises(self): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) backend.path = '/somewhere/' with pytest.raises(Exception): backend._get_path('user', 'blob_id', '..')
def test_list_blobs(self, walk_mock): backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) _ = None walk_mock.return_value = [('', _, ['blob_0']), ('', _, ['blob_1'])] result = yield backend.list_blobs('user') self.assertEquals(result, ['blob_0', 'blob_1'])