forked from MirrorHub/synapse
13683a3a22
First some background: StreamChangeCache is used to keep track of what "entities" have changed since a given stream ID. So for example, we might use it to keep track of when the last to-device message for a given user was received [1], and hence whether we need to pull any to-device messages from the database on a sync [2]. Now, it turns out that StreamChangeCache didn't support more than one thing being changed at a given stream_id (this was part of the problem with #7206). However, it's entirely valid to send to-device messages to more than one user at a time. As it turns out, this did in fact work, because *some* methods of StreamChangeCache coped ok with having multiple things changing on the same stream ID, and it seems we never actually use the methods which don't work on the stream change caches where we allow multiple changes at the same stream ID. But that feels horribly fragile, hence: let's update StreamChangeCache to properly support this, and add some typing and some more tests while we're at it. [1]: https://github.com/matrix-org/synapse/blob/release-v1.12.3/synapse/storage/data_stores/main/deviceinbox.py#L301 [2]: https://github.com/matrix-org/synapse/blob/release-v1.12.3/synapse/storage/data_stores/main/deviceinbox.py#L47-L51
211 lines
6.1 KiB
INI
211 lines
6.1 KiB
INI
[tox]
|
|
envlist = packaging, py35, py36, py37, py38, check_codestyle, check_isort
|
|
|
|
[base]
|
|
basepython = python3.7
|
|
deps =
|
|
mock
|
|
python-subunit
|
|
junitxml
|
|
coverage
|
|
coverage-enable-subprocess
|
|
parameterized
|
|
|
|
# cyptography 2.2 requires setuptools >= 18.5
|
|
#
|
|
# older versions of virtualenv (?) give us a virtualenv with the same
|
|
# version of setuptools as is installed on the system python (and tox runs
|
|
# virtualenv under python3, so we get the version of setuptools that is
|
|
# installed on that).
|
|
#
|
|
# anyway, make sure that we have a recent enough setuptools.
|
|
setuptools>=18.5
|
|
|
|
# we also need a semi-recent version of pip, because old ones fail to
|
|
# install the "enum34" dependency of cryptography.
|
|
pip>=10
|
|
|
|
setenv =
|
|
# we have a pyproject.toml, but don't want pip to use it for building.
|
|
# (otherwise we get an error about 'editable mode is not supported for
|
|
# pyproject.toml-style projects').
|
|
PIP_USE_PEP517 = false
|
|
|
|
PYTHONDONTWRITEBYTECODE = no_byte_code
|
|
COVERAGE_PROCESS_START = {toxinidir}/.coveragerc
|
|
|
|
[testenv]
|
|
deps =
|
|
{[base]deps}
|
|
extras = all
|
|
|
|
whitelist_externals =
|
|
sh
|
|
|
|
setenv =
|
|
{[base]setenv}
|
|
postgres: SYNAPSE_POSTGRES = 1
|
|
TOP={toxinidir}
|
|
|
|
passenv = *
|
|
|
|
commands =
|
|
/usr/bin/find "{toxinidir}" -name '*.pyc' -delete
|
|
# Add this so that coverage will run on subprocesses
|
|
{envbindir}/coverage run "{envbindir}/trial" {env:TRIAL_FLAGS:} {posargs:tests} {env:TOXSUFFIX:}
|
|
|
|
# As of twisted 16.4, trial tries to import the tests as a package (previously
|
|
# it loaded the files explicitly), which means they need to be on the
|
|
# pythonpath. Our sdist doesn't include the 'tests' package, so normally it
|
|
# doesn't work within the tox virtualenv.
|
|
#
|
|
# As a workaround, we tell tox to do install with 'pip -e', which just
|
|
# creates a symlink to the project directory instead of unpacking the sdist.
|
|
#
|
|
# (An alternative to this would be to set PYTHONPATH to include the project
|
|
# directory. Note two problems with this:
|
|
#
|
|
# - if you set it via `setenv`, then it is also set during the 'install'
|
|
# phase, which inhibits unpacking the sdist, so the virtualenv isn't
|
|
# useful for anything else without setting PYTHONPATH similarly.
|
|
#
|
|
# - `synapse` is also loaded from PYTHONPATH so even if you only set
|
|
# PYTHONPATH for the test phase, we're still running the tests against
|
|
# the working copy rather than the contents of the sdist. So frankly
|
|
# you might as well use -e in the first place.
|
|
#
|
|
# )
|
|
usedevelop=true
|
|
|
|
# A test suite for the oldest supported versions of Python libraries, to catch
|
|
# any uses of APIs not available in them.
|
|
[testenv:py35-old]
|
|
skip_install=True
|
|
deps =
|
|
# Old automat version for Twisted
|
|
Automat == 0.3.0
|
|
|
|
mock
|
|
lxml
|
|
coverage
|
|
coverage-enable-subprocess
|
|
|
|
commands =
|
|
/usr/bin/find "{toxinidir}" -name '*.pyc' -delete
|
|
# Make all greater-thans equals so we test the oldest version of our direct
|
|
# dependencies, but make the pyopenssl 17.0, which can work against an
|
|
# OpenSSL 1.1 compiled cryptography (as older ones don't compile on Travis).
|
|
/bin/sh -c 'python -m synapse.python_dependencies | sed -e "s/>=/==/g" -e "s/psycopg2==2.6//" -e "s/pyopenssl==16.0.0/pyopenssl==17.0.0/" | xargs -d"\n" pip install'
|
|
|
|
# Install Synapse itself. This won't update any libraries.
|
|
pip install -e .
|
|
|
|
{envbindir}/coverage run "{envbindir}/trial" {env:TRIAL_FLAGS:} {posargs:tests} {env:TOXSUFFIX:}
|
|
|
|
[testenv:benchmark]
|
|
deps =
|
|
{[base]deps}
|
|
pyperf
|
|
setenv =
|
|
SYNAPSE_POSTGRES = 1
|
|
commands =
|
|
python -m synmark {posargs:}
|
|
|
|
[testenv:packaging]
|
|
skip_install=True
|
|
deps =
|
|
check-manifest
|
|
commands =
|
|
check-manifest
|
|
|
|
[testenv:check_codestyle]
|
|
skip_install = True
|
|
basepython = python3.6
|
|
deps =
|
|
flake8
|
|
flake8-comprehensions
|
|
black==19.10b0 # We pin so that our tests don't start failing on new releases of black.
|
|
commands =
|
|
python -m black --check --diff .
|
|
/bin/sh -c "flake8 synapse tests scripts scripts-dev synctl {env:PEP8SUFFIX:}"
|
|
{toxinidir}/scripts-dev/config-lint.sh
|
|
|
|
[testenv:check_isort]
|
|
skip_install = True
|
|
deps = isort
|
|
commands = /bin/sh -c "isort -c -df -sp setup.cfg -rc synapse tests scripts-dev scripts"
|
|
|
|
[testenv:check-newsfragment]
|
|
skip_install = True
|
|
deps = towncrier>=18.6.0rc1
|
|
commands =
|
|
python -m towncrier.check --compare-with=origin/develop
|
|
basepython = python3.6
|
|
|
|
[testenv:check-sampleconfig]
|
|
commands = {toxinidir}/scripts-dev/generate_sample_config --check
|
|
|
|
[testenv:combine]
|
|
skip_install = True
|
|
deps =
|
|
coverage
|
|
commands=
|
|
coverage combine
|
|
coverage report
|
|
|
|
[testenv:cov-erase]
|
|
skip_install = True
|
|
deps =
|
|
coverage
|
|
commands=
|
|
coverage erase
|
|
|
|
[testenv:cov-html]
|
|
skip_install = True
|
|
deps =
|
|
coverage
|
|
commands=
|
|
coverage html
|
|
|
|
[testenv:mypy]
|
|
skip_install = True
|
|
deps =
|
|
{[base]deps}
|
|
mypy==0.750
|
|
mypy-zope
|
|
env =
|
|
MYPYPATH = stubs/
|
|
extras = all
|
|
commands = mypy \
|
|
synapse/api \
|
|
synapse/appservice \
|
|
synapse/config \
|
|
synapse/events/spamcheck.py \
|
|
synapse/federation/federation_base.py \
|
|
synapse/federation/federation_client.py \
|
|
synapse/federation/federation_server.py \
|
|
synapse/federation/sender \
|
|
synapse/federation/transport \
|
|
synapse/handlers/auth.py \
|
|
synapse/handlers/cas_handler.py \
|
|
synapse/handlers/directory.py \
|
|
synapse/handlers/presence.py \
|
|
synapse/handlers/sync.py \
|
|
synapse/handlers/ui_auth \
|
|
synapse/logging/ \
|
|
synapse/metrics \
|
|
synapse/module_api \
|
|
synapse/push/pusherpool.py \
|
|
synapse/push/push_rule_evaluator.py \
|
|
synapse/replication \
|
|
synapse/rest \
|
|
synapse/spam_checker_api \
|
|
synapse/storage/engines \
|
|
synapse/storage/database.py \
|
|
synapse/streams \
|
|
synapse/util/caches/stream_change_cache.py \
|
|
tests/util/test_stream_change_cache.py
|
|
|
|
# To find all folders that pass mypy you run:
|
|
#
|
|
# find synapse/* -type d -not -name __pycache__ -exec bash -c "mypy '{}' > /dev/null" \; -print
|