Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved Travis CI #96

Merged
merged 3 commits into from May 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 12 additions & 7 deletions .travis.yml
Expand Up @@ -11,18 +11,23 @@ python:
- 3.8
- 3.9
before_install:
- docker pull eandersson86/amqpstorm-rabbitmq-ci:latest
- docker run -d --hostname rmq.eandersson.net --name travis-rmq -p 5671:5671 -p 5672:5672 -p 15672:15672 eandersson86/amqpstorm-rabbitmq-ci:latest
- sleep 15s
- nc -zv localhost 5671
- nc -zv localhost 5672
- nc -zv localhost 15672
- docker build -t amqpstormdev ./docker/
- docker run -d --hostname rmq.eandersson.net --name amqpstormdev -p 5671:5671 -p 5672:5672 -p 15671:15671 -p 15672:15672 amqpstormdev
- docker cp amqpstormdev:/etc/rabbitmq/ssl/ ./amqpstorm/tests/resources/
- docker exec amqpstormdev wait-for-rabbitmq
- docker exec amqpstormdev rabbitmqctl add_user 'eandersson' '2a55f70a841f18b'
- docker exec amqpstormdev rabbitmqctl -p / set_permissions 'eandersson' '.*' '.*' '.*'
- docker exec amqpstormdev rabbitmqctl set_user_tags eandersson administrator
- nc -zv rmq.eandersson.net 5671 || exit 1
- nc -zv rmq.eandersson.net 5672 || exit 1
- nc -zv rmq.eandersson.net 15671 || exit 1
- nc -zv rmq.eandersson.net 15672 || exit 1
install:
- pip install -r requirements.txt
- pip install -r test-requirements.txt
script:
- nosetests -v -l DEBUG --logging-level=DEBUG --with-coverage --cover-package=amqpstorm --with-timer --timer-top-n 10
- flake8 --ignore=F821,W605 .
- flake8 --ignore=F821 .
after_success:
- bash <(curl -s https://codecov.io/bash)
services:
Expand Down
4 changes: 3 additions & 1 deletion MANIFEST.in
@@ -1 +1,3 @@
include *.rst LICENSE
include *.rst LICENSE
prune examples*
prune resources*
2 changes: 1 addition & 1 deletion amqpstorm/connection.py
Expand Up @@ -42,7 +42,7 @@ class Connection(Stateful):
import ssl
import amqpstorm
ssl_options = {
'context': ssl.create_default_context(cafile='cacert.pem'),
'context': ssl.create_default_context(cafile='ca_certificate.pem'),
'server_hostname': 'rmq.eandersson.net',
'check_hostname': True, # New 2.8.0, default is False
'verify_mode': 'required', # New 2.8.0, default is 'none'
Expand Down
51 changes: 40 additions & 11 deletions amqpstorm/tests/__init__.py
Expand Up @@ -2,14 +2,43 @@

CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))

HOST = os.environ.get('AMQP_HOST', '127.0.0.1')
USERNAME = os.environ.get('AMQP_USERNAME', 'guest')
PASSWORD = os.environ.get('AMQP_PASSWORD', 'guest')
URI = os.environ.get('AMQP_URI', 'amqp://guest:guest@127.0.0.1:5672/%2F')
HTTP_URL = os.environ.get('AMQP_HTTP_URL', 'http://127.0.0.1:15672')

SSL_URI = os.environ.get('AMQP_SSL_URI',
'amqps://guest:guest@rmq.eandersson.net:5671/%2F')
SSL_HOST = os.environ.get('AMQP_SSL_HOST', 'rmq.eandersson.net')
CAFILE = os.environ.get('AMQP_CAFILE',
'{0}/resources/cacert.pem'.format(CURRENT_DIR))
HOST = os.environ.get(
'AMQP_HOST',
'rmq.eandersson.net'
)
USERNAME = os.environ.get(
'AMQP_USERNAME',
'eandersson'
)
PASSWORD = os.environ.get(
'AMQP_PASSWORD',
'2a55f70a841f18b'
)
URI = os.environ.get(
'AMQP_URI',
'amqp://eandersson:2a55f70a841f18b@rmq.eandersson.net:5672/%2F'
)
HTTP_URL = os.environ.get(
'AMQP_HTTP_URL',
'http://rmq.eandersson.net:15672'
)
SSL_URI = os.environ.get(
'AMQP_SSL_URI',
'amqps://eandersson:2a55f70a841f18b@rmq.eandersson.net:5671/%2F'
)
SSL_HOST = os.environ.get(
'AMQP_SSL_HOST',
'rmq.eandersson.net'
)
CAFILE = os.environ.get(
'AMQP_CAFILE',
'{0}/resources/ssl/ca_certificate.pem'.format(CURRENT_DIR)
)
CERTFILE = os.environ.get(
'AMQP_CERTFILE',
'{0}/resources/ssl/client/client_certificate.pem'.format(CURRENT_DIR)
)
KEYFILE = os.environ.get(
'AMQP_KEYFILE',
'{0}/resources/ssl/client/private_key.pem'.format(CURRENT_DIR)
)
77 changes: 67 additions & 10 deletions amqpstorm/tests/functional/ssl/reliability_tests.py
@@ -1,10 +1,14 @@
import os.path
import ssl
import threading
import time
import unittest

from amqpstorm import Connection
from amqpstorm import UriConnection
from amqpstorm.tests import CAFILE
from amqpstorm.tests import CERTFILE
from amqpstorm.tests import KEYFILE
from amqpstorm.tests import PASSWORD
from amqpstorm.tests import SSL_HOST
from amqpstorm.tests import SSL_URI
Expand All @@ -13,11 +17,17 @@
from amqpstorm.tests.functional.utility import setup


@unittest.skipIf(not os.path.exists(CAFILE), 'SSL tests not configured')
class SSLReliabilityFunctionalTests(TestFunctionalFramework):
@setup(new_connection=False, queue=True)
def test_functional_ssl_open_new_connection_loop(self):
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': ssl.create_default_context(cafile=CAFILE),
'context': context,
'server_hostname': SSL_HOST
}

Expand Down Expand Up @@ -49,8 +59,13 @@ def test_functional_ssl_open_new_connection_loop(self):

@setup(new_connection=False, queue=True)
def test_functional_ssl_open_close_connection_loop(self):
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': ssl.create_default_context(cafile=CAFILE),
'context': context,
'server_hostname': SSL_HOST
}
self.connection = self.connection = Connection(
Expand Down Expand Up @@ -84,11 +99,16 @@ def test_functional_ssl_open_close_connection_loop(self):

@setup(new_connection=False, queue=False)
def test_functional_ssl_open_close_channel_loop(self):
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': ssl.create_default_context(cafile=CAFILE),
'context': context,
'server_hostname': SSL_HOST
}
self.connection = self.connection = Connection(
self.connection = Connection(
SSL_HOST, USERNAME, PASSWORD, port=5671, ssl=True,
ssl_options=ssl_options)

Expand All @@ -110,8 +130,13 @@ def test_functional_ssl_open_close_channel_loop(self):

@setup(new_connection=False, queue=True)
def test_functional_ssl_open_multiple_channels(self):
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': ssl.create_default_context(cafile=CAFILE),
'context': context,
'server_hostname': SSL_HOST
}
self.connection = self.connection = Connection(
Expand All @@ -137,8 +162,13 @@ def test_functional_ssl_close_performance(self):
:return:
"""
for _ in range(10):
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': ssl.create_default_context(cafile=CAFILE),
'context': context,
'server_hostname': SSL_HOST
}
self.connection = self.connection = Connection(
Expand All @@ -151,14 +181,29 @@ def test_functional_ssl_close_performance(self):

@setup(new_connection=False)
def test_functional_ssl_uri_connection(self):
self.connection = UriConnection(SSL_URI)
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': context,
'server_hostname': SSL_HOST
}

self.connection = UriConnection(SSL_URI, ssl_options=ssl_options)
self.channel = self.connection.channel()
self.assertTrue(self.connection.is_open)

@setup(new_connection=False)
def test_functional_ssl_uri_connection_with_context(self):
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': ssl.create_default_context(cafile=CAFILE),
'context': context,
'server_hostname': SSL_HOST
}

Expand All @@ -167,6 +212,7 @@ def test_functional_ssl_uri_connection_with_context(self):
self.assertTrue(self.connection.is_open)


@unittest.skipIf(not os.path.exists(CAFILE), 'SSL tests not configured')
class PublishAndConsume1kWithSSLTest(TestFunctionalFramework):
messages_to_send = 1000
messages_consumed = 0
Expand Down Expand Up @@ -197,8 +243,13 @@ def increment_message_count(self):

@setup(new_connection=False, queue=False)
def test_functional_publish_1k_with_ssl(self):
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': ssl.create_default_context(cafile=CAFILE),
'context': context,
'server_hostname': SSL_HOST
}
self.connection = self.connection = Connection(
Expand Down Expand Up @@ -231,6 +282,7 @@ def test_functional_publish_1k_with_ssl(self):
'test took too long')


@unittest.skipIf(not os.path.exists(CAFILE), 'SSL tests not configured')
class Consume1kWithSSLUntilEmpty(TestFunctionalFramework):
messages_to_send = 1000

Expand All @@ -244,8 +296,13 @@ def publish_messages(self):

@setup(new_connection=False, queue=True)
def test_functional_consume_with_ssl_until_empty(self):
context = ssl.create_default_context(cafile=CAFILE)
context.load_cert_chain(
certfile=CERTFILE,
keyfile=KEYFILE,
)
ssl_options = {
'context': ssl.create_default_context(cafile=CAFILE),
'context': context,
'server_hostname': SSL_HOST
}
self.connection = self.connection = Connection(
Expand Down
File renamed without changes.
Empty file.
6 changes: 3 additions & 3 deletions amqpstorm/tests/unit/basic/basic_exception_tests.py
Expand Up @@ -246,7 +246,7 @@ def test_basic_get_content_body_timeout_error(self):

self.assertRaisesRegexp(
exception.AMQPChannelError,
'rpc requests .* \(.*\) took too long',
r'rpc requests .* \(.*\) took too long',
basic._get_content_body, uuid, len(self.message)
)

Expand All @@ -259,7 +259,7 @@ def test_basic_publish_confirms_raises_on_timeout(self):

self.assertRaisesRegexp(
exception.AMQPChannelError,
'rpc requests .* \(.*\) took too long',
r'rpc requests .* \(.*\) took too long',
basic.publish, body=self.message,
routing_key='travis-ci'
)
Expand All @@ -276,7 +276,7 @@ def on_publish_return_invalid_frame(*_):

self.assertRaisesRegexp(
exception.AMQPChannelError,
'rpc requests .* \(.*\) took too long',
r'rpc requests .* \(.*\) took too long',
basic.publish, body=self.message,
routing_key='travis-ci'
)
2 changes: 1 addition & 1 deletion amqpstorm/tests/unit/basic/basic_tests.py
Expand Up @@ -96,7 +96,7 @@ def on_get_frame(*_):

self.assertRaisesRegexp(
AMQPChannelError,
'rpc requests .* \(.*\) took too long',
r'rpc requests .* \(.*\) took too long',
basic.get, 'travis-ci'
)

Expand Down
4 changes: 2 additions & 2 deletions amqpstorm/tests/unit/channel/channel_exception_tests.py
Expand Up @@ -175,8 +175,8 @@ def test_channel_raises_with_return_reply_code_500(self):

self.assertRaisesRegexp(
AMQPMessageError,
"Message not delivered: Error \(500\) to queue "
"'' from exchange ''",
r"Message not delivered: Error \(500\) to queue "
r"'' from exchange ''",
channel.check_for_errors
)

Expand Down
4 changes: 2 additions & 2 deletions amqpstorm/tests/unit/channel/channel_frame_tests.py
Expand Up @@ -80,8 +80,8 @@ def test_channel_basic_return_frame(self):

self.assertRaisesRegexp(
AMQPMessageError,
"Message not delivered: travis-ci \(500\) to queue "
"'routing_key' from exchange 'exchange'",
r"Message not delivered: travis-ci \(500\) to queue "
r"'routing_key' from exchange 'exchange'",
channel.check_for_errors
)

Expand Down
2 changes: 1 addition & 1 deletion amqpstorm/tests/unit/channel0/channel0_frame_tests.py
Expand Up @@ -102,7 +102,7 @@ def test_channel0_start_invalid_auth_frame(self):

self.assertRaisesRegexp(
AMQPConnectionError,
'Unsupported Security Mechanism\(s\): invalid',
r'Unsupported Security Mechanism\(s\): invalid',
connection.check_for_errors
)

Expand Down
6 changes: 3 additions & 3 deletions amqpstorm/tests/unit/rpc_tests.py
Expand Up @@ -54,7 +54,7 @@ def test_rpc_get_request_timeout(self):
uuid = rpc.register_request(['travis-ci'])
self.assertRaisesRegexp(
AMQPChannelError,
'rpc requests %s \(travis-ci\) took too long'
r'rpc requests %s \(travis-ci\) took too long'
% uuid,
rpc.get_request, uuid=uuid, raw=False
)
Expand All @@ -64,7 +64,7 @@ def test_rpc_get_request_timeout_raw(self):
uuid = rpc.register_request(['travis-ci'])
self.assertRaisesRegexp(
AMQPChannelError,
'rpc requests %s \(travis-ci\) took too long'
r'rpc requests %s \(travis-ci\) took too long'
% uuid,
rpc.get_request, uuid=uuid, raw=False
)
Expand Down Expand Up @@ -166,7 +166,7 @@ def test_rpc_raises_on_timeout(self):
time.sleep(0.1)
self.assertRaisesRegexp(
AMQPChannelError,
'rpc requests %s \(travis-ci-2\) took too long' % uuid,
r'rpc requests %s \(travis-ci-2\) took too long' % uuid,
rpc.get_request, uuid
)

Expand Down
2 changes: 1 addition & 1 deletion amqpstorm/uri_connection.py
Expand Up @@ -31,7 +31,7 @@ class UriConnection(Connection):
import ssl
import amqpstorm
ssl_options = {
'context': ssl.create_default_context(cafile='cacert.pem'),
'context': ssl.create_default_context(cafile='ca_certificate.pem'),
'server_hostname': 'rmq.eandersson.net'
}
connection = amqpstorm.UriConnection(
Expand Down
13 changes: 13 additions & 0 deletions docker/Dockerfile
@@ -0,0 +1,13 @@
FROM rabbitmq:management-alpine
RUN apk --update add openssl

env RABBITMQ_USE_LONGNAME=true
RUN mkdir -p /etc/rabbitmq/ssl/

COPY ./files/rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
COPY ./files/wait-for-rabbitmq /bin/wait-for-rabbitmq
COPY ./files/generate-certs /etc/rabbitmq/ssl/generate-certs
COPY ./files/openssl.cnf /etc/rabbitmq/ssl/openssl.cnf

RUN /etc/rabbitmq/ssl/generate-certs && \
chown -R rabbitmq.rabbitmq /etc/rabbitmq/ssl/*