diff --git a/.travis.yml b/.travis.yml index 7d08b7ab..7f12ec69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,8 @@ env: install: - pip install tox before_script: + - sudo sed -i "s/fsync/#fsync/" /etc/postgresql/9.4/main/postgresql.conf + - sudo /etc/init.d/postgresql restart - psql -c "CREATE DATABASE testdb ENCODING 'UTF8' TEMPLATE template0;" -U postgres script: - tox -e $TOX_ENV diff --git a/cliquet/storage/postgresql/client.py b/cliquet/storage/postgresql/client.py index 09764f73..80fce120 100644 --- a/cliquet/storage/postgresql/client.py +++ b/cliquet/storage/postgresql/client.py @@ -1,5 +1,6 @@ import contextlib import os +import platform import warnings from cliquet import logger @@ -63,7 +64,7 @@ def create_from_config(config, prefix=''): "Refer to installation section in documentation.") raise ImportWarning(message) - settings = config.get_settings() + settings = config.get_settings().copy() url = settings[prefix + 'url'] if url in _ENGINES: @@ -76,15 +77,15 @@ def create_from_config(config, prefix=''): poolclass_key = prefix + 'poolclass' settings.setdefault(poolclass_key, 'sqlalchemy.pool.QueuePool') settings[poolclass_key] = config.maybe_dotted(settings[poolclass_key]) - - # When fsync setting is off, like on TravisCI or in during development, - # some storage tests fail because commits are not applied - # accross every opened connections. - # XXX: find a proper solution to support fsync off. - # Meanhwile, disable connection pooling to prevent test suite failures. - if os.getenv('TRAVIS', False): # pragma: no cover - warnings.warn('Option fsync = off detected. Disable pooling.') - settings = dict([(poolclass_key, sqlalchemy.pool.NullPool)]) + settings.pop(prefix + 'max_fetch_size', None) + + # There seems to be a problem with the pool implementation using PyPy. + # XXX: Disable pooling at least during tests to avoid stalled tests. + pypy_on_travis = (platform.python_implementation().lower() == 'pypy' and + os.getenv('TRAVIS', False)) + if pypy_on_travis: + warnings.warn('Disable pooling with PyPy on TravisCI') + settings = dict([(poolclass_key, sqlalchemy.pool.StaticPool)]) engine = sqlalchemy.engine_from_config(settings, prefix=prefix, url=url) diff --git a/cliquet/tests/test_storage.py b/cliquet/tests/test_storage.py index 18d89689..17f90053 100644 --- a/cliquet/tests/test_storage.py +++ b/cliquet/tests/test_storage.py @@ -527,8 +527,12 @@ def _get_last_modified_filters(self): def create_and_delete_record(self, record=None): """Helper to create and delete a record.""" record = record or {'challenge': 'accepted'} + time.sleep(0.001) # 1 msec record = self.create_record(record) - return self.storage.delete(object_id=record['id'], **self.storage_kw) + time.sleep(0.001) # 1 msec + deleted = self.storage.delete(object_id=record['id'], **self.storage_kw) + time.sleep(0.001) # 1 msec + return deleted def test_get_should_not_return_deleted_items(self): record = self.create_and_delete_record() diff --git a/tox.ini b/tox.ini index 31c25eb4..1ab658a3 100644 --- a/tox.ini +++ b/tox.ini @@ -6,7 +6,7 @@ skip_missing_interpreters = True passenv = TRAVIS commands = python --version - nosetests --with-coverage --cover-min-percentage=100 --cover-package=cliquet cliquet {posargs} + nosetests -s -v cliquet {posargs} deps = coverage mock