diff options
author | Omer Katz <omer.drow@gmail.com> | 2019-03-09 11:41:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-09 11:41:28 +0200 |
commit | f08e2106eed9878e73d7d553473226d9c74c7d3d (patch) | |
tree | e6ad6d6cce26d40039eb37cdcc9be5258786c65f | |
parent | 06fee8b193aaab02736b1018d216bf5dfba4fabf (diff) | |
download | py-amqp-f08e2106eed9878e73d7d553473226d9c74c7d3d.tar.gz |
Use tox-docker in integration tests (#262)
* Use tox-docker in integration tests. Add more coverage.
* Readd PyPy2 & PyPy3 to the integration matrix.
-rw-r--r-- | .travis.yml | 33 | ||||
-rw-r--r-- | requirements/test-ci.txt | 1 | ||||
-rw-r--r-- | t/integration/test_rmq.py | 84 | ||||
-rw-r--r-- | tox.ini | 8 | ||||
-rwxr-xr-x | wait_for_rabbitmq.sh | 15 |
5 files changed, 113 insertions, 28 deletions
diff --git a/.travis.yml b/.travis.yml index df302cc..0c30ee5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,37 +39,46 @@ matrix: stage: lint - python: 2.7 env: MATRIX_TOXENV=integration-rabbitmq + services: + - docker stage: integration - python: 3.4 env: MATRIX_TOXENV=integration-rabbitmq + services: + - docker stage: integration - python: 3.5 env: MATRIX_TOXENV=integration-rabbitmq + services: + - docker stage: integration - python: 3.6 env: MATRIX_TOXENV=integration-rabbitmq + services: + - docker stage: integration - python: 3.7 env: MATRIX_TOXENV=integration-rabbitmq + services: + - docker + stage: integration + - python: pypy2.7-6.0 + env: MATRIX_TOXENV=integration-rabbitmq + services: + - docker + stage: integration + - python: pypy3.5-6.0 + env: MATRIX_TOXENV=integration-rabbitmq + services: + - docker stage: integration before_install: # - sudo apt install libcurl4-openssl-dev libssl-dev gnutls-dev - if [[ -v MATRIX_TOXENV ]]; then export TOXENV=${TRAVIS_PYTHON_VERSION}-${MATRIX_TOXENV}; fi; env - - | - if [[ "$TOXENV" == *integration* ]]; then - sudo echo 'deb https://dl.bintray.com/rabbitmq-erlang/debian xenial main' > /etc/apt/sources.list.d/rabbitmq-bintray.list - sudo apt-key adv --keyserver "hkps.pool.sks-keyservers.net" --recv-keys "0x6B73A36E6026DFCA" - wget -O - "https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc" | sudo apt-key add - - sudo apt update - sudo apt install rabbitmq-server -y - sudo systemctl enable rabbitmq-server - sudo systemctl start rabbitmq-server - fi - install: - pip --disable-pip-version-check install -U pip setuptools wheel | cat - - pip --disable-pip-version-check install -U tox | cat + - pip --disable-pip-version-check install -U tox tox-docker | cat script: tox -v -- -v after_success: - .tox/$TRAVIS_PYTHON_VERSION/bin/coverage xml diff --git a/requirements/test-ci.txt b/requirements/test-ci.txt index 681c837..1d1a024 100644 --- a/requirements/test-ci.txt +++ b/requirements/test-ci.txt @@ -1,3 +1,4 @@ pytest-cov codecov pytest-travis-fold +pytest-xdist diff --git a/t/integration/test_rmq.py b/t/integration/test_rmq.py index ca41ee9..e5f0496 100644 --- a/t/integration/test_rmq.py +++ b/t/integration/test_rmq.py @@ -1,14 +1,22 @@ from __future__ import absolute_import, unicode_literals +import os + import pytest import amqp from case import ANY, Mock +@pytest.fixture +def connection(request): + host = 'localhost:%s' % os.environ.get('RABBITMQ_5672_TCP', '5672') + vhost = getattr(request.config, "slaveinput", {}).get("slaveid", None) + return amqp.Connection(host=host, vhost=vhost) + + @pytest.mark.env('rabbitmq') -def test_connect(): - connection = amqp.Connection() +def test_connect(connection): connection.connect() connection.close() @@ -17,29 +25,77 @@ def test_connect(): class test_rabbitmq_operations(): @pytest.fixture(autouse=True) - def setup_conn(self): - self.connection = amqp.Connection() + def setup_conn(self, connection): + self.connection = connection self.connection.connect() self.channel = self.connection.channel() yield self.connection.close() @pytest.mark.parametrize( - "publish_method", ('basic_publish', 'basic_publish_confirm') + "publish_method,mandatory,immediate", + ( + ('basic_publish', False, True), + ('basic_publish', True, True), + ('basic_publish', False, False), + ('basic_publish', True, False), + ('basic_publish_confirm', False, True), + ('basic_publish_confirm', True, True), + ('basic_publish_confirm', False, False), + ('basic_publish_confirm', True, False), + ) ) - def test_publish_consume(self, publish_method): + def test_publish_consume(self, publish_method, mandatory, immediate): callback = Mock() self.channel.queue_declare( queue='py-amqp-unittest', durable=False, exclusive=True ) - getattr(self.channel, publish_method)( - amqp.Message('Unittest'), routing_key='py-amqp-unittest' - ) - self.channel.basic_consume( - queue='py-amqp-unittest', - callback=callback, - consumer_tag='amq.ctag-PCmzXGkhCw_v0Zq7jXyvkg' - ) + # RabbitMQ 3 removed the support for the immediate flag + # Since we confirm the message, RabbitMQ complains + # See + # http://www.rabbitmq.com/blog/2012/11/19/breaking-things-with-rabbitmq-3-0/ + if immediate and publish_method == "basic_publish_confirm": + with pytest.raises(amqp.exceptions.AMQPNotImplementedError) as exc: + getattr(self.channel, publish_method)( + amqp.Message('Unittest'), + routing_key='py-amqp-unittest', + mandatory=mandatory, + immediate=immediate + ) + + assert exc.value.reply_code == 540 + assert exc.value.method_name == 'Basic.publish' + assert exc.value.reply_text == 'NOT_IMPLEMENTED - immediate=true' + + return + else: + getattr(self.channel, publish_method)( + amqp.Message('Unittest'), + routing_key='py-amqp-unittest', + mandatory=mandatory, + immediate=immediate + ) + # RabbitMQ 3 removed the support for the immediate flag + # See + # http://www.rabbitmq.com/blog/2012/11/19/breaking-things-with-rabbitmq-3-0/ + if immediate: + with pytest.raises(amqp.exceptions.AMQPNotImplementedError) as exc: + self.channel.basic_consume( + queue='py-amqp-unittest', + callback=callback, + consumer_tag='amq.ctag-PCmzXGkhCw_v0Zq7jXyvkg' + ) + assert exc.value.reply_code == 540 + assert exc.value.method_name == 'Basic.publish' + assert exc.value.reply_text == 'NOT_IMPLEMENTED - immediate=true' + + return + else: + self.channel.basic_consume( + queue='py-amqp-unittest', + callback=callback, + consumer_tag='amq.ctag-PCmzXGkhCw_v0Zq7jXyvkg' + ) self.connection.drain_events() callback.assert_called_once_with(ANY) msg = callback.call_args[0][0] @@ -19,8 +19,7 @@ sitepackages = False recreate = False commands = unit: py.test -xv --cov=amqp --cov-report=xml --no-cov-on-fail t/unit - integration: py.test -xv -E rabbitmq t/integration - + integration: py.test -xv -E rabbitmq t/integration {posargs:-n2} basepython = 2.7,flakeplus,flake8,apicheck,linkcheck,pydocstyle: python2.7 pypy2.7-6.0,pypy3.5-6.0: pypy @@ -29,6 +28,11 @@ basepython = 3.6: python3.6 3.7: python3.7 install_command = python -m pip --disable-pip-version-check install {opts} {packages} +commands_pre = + integration-rabbitmq: ./wait_for_rabbitmq.sh +docker = + integration-rabbitmq: rabbitmq:alpine +dockerenv = PYAMQP_INTEGRATION_INSTANCE=1 [testenv:apicheck] commands = diff --git a/wait_for_rabbitmq.sh b/wait_for_rabbitmq.sh new file mode 100755 index 0000000..2e56f90 --- /dev/null +++ b/wait_for_rabbitmq.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +containers=$(sudo docker ps -q | tail -n +1) + +for item in ${containers//\\n/} +do + env=$(sudo docker inspect -f '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' $item); + if [[ $env == *"PYAMQP_INTEGRATION_INSTANCE=1"* ]]; then + grep -m1 'Server startup complete' <(sudo docker logs -f $item) + sudo docker exec $item rabbitmqctl add_vhost gw0 + sudo docker exec $item rabbitmqctl set_permissions -p gw0 guest ".*" ".*" ".*" + sudo docker exec $item rabbitmqctl add_vhost gw1 + sudo docker exec $item rabbitmqctl set_permissions -p gw1 guest ".*" ".*" ".*" + fi +done; |