Changeset View
Changeset View
Standalone View
Standalone View
swh/storage/tests/test_api_client.py
# Copyright (C) 2015-2018 The Software Heritage developers | # Copyright (C) 2015-2018 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import pytest | |||||
import shutil | import shutil | ||||
import tempfile | import tempfile | ||||
import unittest | import unittest | ||||
import pytest | |||||
from swh.core.api.tests.server_testing import ServerTestFixture | from swh.core.api.tests.server_testing import ServerTestFixture | ||||
import swh.storage.storage as storage | import swh.storage.storage as storage | ||||
from swh.storage.journal_writer import \ | from swh.storage.journal_writer import \ | ||||
get_journal_writer, InMemoryJournalWriter | get_journal_writer, InMemoryJournalWriter | ||||
from swh.storage.in_memory import Storage as InMemoryStorage | |||||
from swh.storage.api.client import RemoteStorage | from swh.storage.api.client import RemoteStorage | ||||
import swh.storage.api.server as server | import swh.storage.api.server as server | ||||
from swh.storage.api.server import app | from swh.storage.api.server import app | ||||
from swh.storage.tests.test_storage import \ | from swh.storage.tests.test_storage import \ | ||||
CommonTestStorage, CommonPropTestStorage, StorageTestDbFixture | CommonTestStorage, CommonPropTestStorage, StorageTestDbFixture | ||||
class RemoteStorageFixture(ServerTestFixture, StorageTestDbFixture, | class RemoteStorageFixture(ServerTestFixture, | ||||
unittest.TestCase): | unittest.TestCase): | ||||
"""Test the remote storage API. | """Test the remote storage API. | ||||
This class doesn't define any tests as we want identical | This class doesn't define any tests as we want identical | ||||
functionality between local and remote storage. All the tests are | functionality between local and remote storage. All the tests are | ||||
therefore defined in CommonTestStorage. | therefore defined in CommonTestStorage. | ||||
""" | """ | ||||
def setUp(self): | def setUp(self): | ||||
self.app = app | |||||
super().setUp() | |||||
self.storage = RemoteStorage(self.url()) | |||||
class RemotePgStorageFixture(StorageTestDbFixture, RemoteStorageFixture): | |||||
def setUp(self): | |||||
def mock_get_journal_writer(cls, args=None): | def mock_get_journal_writer(cls, args=None): | ||||
assert cls == 'inmemory' | assert cls == 'inmemory' | ||||
return journal_writer | return journal_writer | ||||
server.storage = None | server.storage = None | ||||
storage.get_journal_writer = mock_get_journal_writer | storage.get_journal_writer = mock_get_journal_writer | ||||
journal_writer = InMemoryJournalWriter() | journal_writer = InMemoryJournalWriter() | ||||
self.journal_writer = journal_writer | self.journal_writer = journal_writer | ||||
# ServerTestFixture needs to have self.objroot for | # ServerTestFixture needs to have self.objroot for | ||||
# setUp() method, but this field is defined in | # setUp() method, but this field is defined in | ||||
# AbstractTestStorage's setUp() | # AbstractTestStorage's setUp() | ||||
# To avoid confusion, override the self.objroot to a | # To avoid confusion, override the self.objroot to a | ||||
# one chosen in this class. | # one chosen in this class. | ||||
self.storage_base = tempfile.mkdtemp() | self.storage_base = tempfile.mkdtemp() | ||||
self.objroot = self.storage_base | |||||
self.config = { | self.config = { | ||||
'storage': { | 'storage': { | ||||
'cls': 'local', | 'cls': 'local', | ||||
'args': { | 'args': { | ||||
'db': 'dbname=%s' % self.TEST_DB_NAME, | 'db': 'dbname=%s' % self.TEST_DB_NAME, | ||||
'objstorage': { | 'objstorage': { | ||||
'cls': 'pathslicing', | 'cls': 'pathslicing', | ||||
'args': { | 'args': { | ||||
'root': self.storage_base, | 'root': self.storage_base, | ||||
'slicing': '0:2', | 'slicing': '0:2', | ||||
}, | }, | ||||
}, | }, | ||||
'journal_writer': { | 'journal_writer': { | ||||
'cls': 'inmemory', | 'cls': 'inmemory', | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
self.app = app | |||||
super().setUp() | super().setUp() | ||||
self.storage = RemoteStorage(self.url()) | |||||
self.objroot = self.storage_base | |||||
def tearDown(self): | def tearDown(self): | ||||
storage.get_journal_writer = get_journal_writer | |||||
super().tearDown() | super().tearDown() | ||||
shutil.rmtree(self.storage_base) | shutil.rmtree(self.storage_base) | ||||
storage.get_journal_writer = get_journal_writer | |||||
class RemoteMemStorageFixture(RemoteStorageFixture): | |||||
def setUp(self): | |||||
self.config = { | |||||
'storage': { | |||||
'cls': 'memory', | |||||
'args': { | |||||
'journal_writer': { | |||||
'cls': 'inmemory', | |||||
} | |||||
} | |||||
} | |||||
} | |||||
self.__storage = InMemoryStorage(journal_writer={'cls': 'inmemory'}) | |||||
self._get_storage_patcher = unittest.mock.patch( | |||||
'swh.storage.api.server.get_storage', return_value=self.__storage) | |||||
self._get_storage_patcher.start() | |||||
super().setUp() | |||||
self.journal_writer = self.__storage.journal_writer | |||||
def tearDown(self): | |||||
super().tearDown() | |||||
self._get_storage_patcher.stop() | |||||
class TestRemoteMemStorage(CommonTestStorage, RemoteMemStorageFixture): | |||||
@pytest.mark.skip('refresh_stat_counters not available in the remote api.') | |||||
def test_stat_counters(self): | |||||
pass | |||||
@pytest.mark.skip('postgresql-specific test') | |||||
def test_content_add_db(self): | |||||
pass | |||||
@pytest.mark.skip('postgresql-specific test') | |||||
def test_skipped_content_add_db(self): | |||||
pass | |||||
@pytest.mark.skip('postgresql-specific test') | |||||
def test_content_add_metadata_db(self): | |||||
pass | |||||
@pytest.mark.skip( | |||||
'not implemented, see https://forge.softwareheritage.org/T1633') | |||||
def test_skipped_content_add(self): | |||||
pass | |||||
@pytest.mark.db | @pytest.mark.db | ||||
class TestRemoteStorage(CommonTestStorage, RemoteStorageFixture): | class TestRemotePgStorage(CommonTestStorage, RemotePgStorageFixture): | ||||
@pytest.mark.skip('refresh_stat_counters not available in the remote api.') | @pytest.mark.skip('refresh_stat_counters not available in the remote api.') | ||||
def test_stat_counters(self): | def test_stat_counters(self): | ||||
pass | pass | ||||
@pytest.mark.db | @pytest.mark.db | ||||
@pytest.mark.property_based | @pytest.mark.property_based | ||||
class PropTestRemoteStorage(CommonPropTestStorage, RemoteStorageFixture): | class PropTestRemotePgStorage(CommonPropTestStorage, RemotePgStorageFixture): | ||||
@pytest.mark.skip('too slow') | @pytest.mark.skip('too slow') | ||||
def test_add_arbitrary(self): | def test_add_arbitrary(self): | ||||
pass | pass |