summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmer Katz <omer.drow@gmail.com>2019-03-09 11:41:28 +0200
committerGitHub <noreply@github.com>2019-03-09 11:41:28 +0200
commitf08e2106eed9878e73d7d553473226d9c74c7d3d (patch)
treee6ad6d6cce26d40039eb37cdcc9be5258786c65f
parent06fee8b193aaab02736b1018d216bf5dfba4fabf (diff)
downloadpy-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.yml33
-rw-r--r--requirements/test-ci.txt1
-rw-r--r--t/integration/test_rmq.py84
-rw-r--r--tox.ini8
-rwxr-xr-xwait_for_rabbitmq.sh15
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]
diff --git a/tox.ini b/tox.ini
index 30f78dd..1fb953c 100644
--- a/tox.ini
+++ b/tox.ini
@@ -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;