From 02d5e0a7aeb38fc60b82d40dc1bd6e5d396a4a32 Mon Sep 17 00:00:00 2001 From: Matus Valo Date: Sun, 21 Jan 2018 14:40:49 -0800 Subject: Unittests can be run directly without installation of library Unittests are now migrated from nose to python standard unittests runner and Makefile calls tests directly from setup.py. This enables running tests without installation in system. --- Makefile | 9 +- funtests/setup.py | 2 +- librabbitmq/tests/__init__.py | 0 librabbitmq/tests/test_functional.py | 189 ----------------------------------- requirements/test-ci.txt | 3 + requirements/test.txt | 1 - setup.py | 2 +- tests/__init__.py | 0 tests/test_functional.py | 189 +++++++++++++++++++++++++++++++++++ 9 files changed, 199 insertions(+), 196 deletions(-) delete mode 100644 librabbitmq/tests/__init__.py delete mode 100644 librabbitmq/tests/test_functional.py create mode 100644 tests/__init__.py create mode 100644 tests/test_functional.py diff --git a/Makefile b/Makefile index 537d65c..659888a 100644 --- a/Makefile +++ b/Makefile @@ -80,11 +80,12 @@ flakeplusdiag: flakes: flakediag flakeplusdiag -test: - nosetests -xv librabbitmq.tests +test: build + python setup.py test -cov: - nosetests -xv librabbitmq.tests --with-coverage --cover-html --cover-branch +cov: build + coverage run --source=librabbitmq setup.py test + coverage report removepyc: -find . -type f -a \( -name "*.pyc" -o -name "*$$py.class" \) | xargs rm diff --git a/funtests/setup.py b/funtests/setup.py index 5116dd6..8f0ae22 100644 --- a/funtests/setup.py +++ b/funtests/setup.py @@ -41,7 +41,7 @@ setup( data_files=[], zip_safe=False, cmdclass={"install": no_install}, - test_suite="nose.collector", + test_suite="tests", build_requires=[ "nose", "nose-cover3", diff --git a/librabbitmq/tests/__init__.py b/librabbitmq/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/librabbitmq/tests/test_functional.py b/librabbitmq/tests/test_functional.py deleted file mode 100644 index 03d6276..0000000 --- a/librabbitmq/tests/test_functional.py +++ /dev/null @@ -1,189 +0,0 @@ -from __future__ import absolute_import - -from six.moves import xrange - -import socket -import unittest - -from librabbitmq import Message, Connection, ConnectionError, ChannelError -TEST_QUEUE = 'pyrabbit.testq' - - -class test_Channel(unittest.TestCase): - - def setUp(self): - self.connection = Connection(host='localhost:5672', userid='guest', - password='guest', virtual_host='/') - self.channel = self.connection.channel() - self.channel.queue_delete(TEST_QUEUE) - self._queue_declare() - - def test_send_message(self): - message = Message( - channel=self.channel, - body='the quick brown fox jumps over the lazy dog', - properties=dict(content_type='application/json', - content_encoding='utf-8')) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - self.assertGreater(self.channel.queue_purge(TEST_QUEUE), 2) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - - def _queue_declare(self): - self.channel.exchange_declare(TEST_QUEUE, 'direct') - x = self.channel.queue_declare(TEST_QUEUE) - self.assertEqual(x.message_count, x[1]) - self.assertEqual(x.consumer_count, x[2]) - self.assertEqual(x.queue, TEST_QUEUE) - self.channel.queue_bind(TEST_QUEUE, TEST_QUEUE, TEST_QUEUE) - - def test_basic_get_ack(self): - message = Message( - channel=self.channel, - body='the quick brown fox jumps over the lazy dog', - properties=dict(content_type='application/json', - content_encoding='utf-8')) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - while True: - x = self.channel.basic_get(TEST_QUEUE) - if x: - break - self.assertIs(self.channel, x.channel) - self.assertIn('message_count', x.delivery_info) - self.assertIn('redelivered', x.delivery_info) - self.assertEqual(x.delivery_info['routing_key'], TEST_QUEUE) - self.assertEqual(x.delivery_info['exchange'], TEST_QUEUE) - self.assertTrue(x.delivery_info['delivery_tag']) - self.assertTrue(x.properties['content_type']) - self.assertTrue(x.body) - x.ack() - - def test_timeout_burst(self): - """Check that if we have a large burst of messages in our queue - that we can fetch them with a timeout without needing to receive - any more messages.""" - - message = Message( - channel=self.channel, - body='the quick brown fox jumps over the lazy dog', - properties=dict(content_type='application/json', - content_encoding='utf-8')) - - for i in xrange(100): - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - - messages = [] - - def cb(x): - messages.append(x) - x.ack() - - self.channel.basic_consume(TEST_QUEUE, callback=cb) - for i in xrange(100): - self.connection.drain_events(timeout=0.2) - - self.assertEqual(len(messages), 100) - - def test_timeout(self): - """Check that our ``drain_events`` call actually times out if - there are no messages.""" - message = Message( - channel=self.channel, - body='the quick brown fox jumps over the lazy dog', - properties=dict(content_type='application/json', - content_encoding='utf-8')) - - self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) - - messages = [] - - def cb(x): - messages.append(x) - x.ack() - - self.channel.basic_consume(TEST_QUEUE, callback=cb) - self.connection.drain_events(timeout=0.1) - - with self.assertRaises(socket.timeout): - self.connection.drain_events(timeout=0.1) - self.assertEqual(len(messages), 1) - - def tearDown(self): - if self.channel and self.connection.connected: - self.channel.queue_purge(TEST_QUEUE) - self.channel.close() - if self.connection: - try: - self.connection.close() - except ConnectionError: - pass - - -class test_Delete(unittest.TestCase): - - def setUp(self): - self.connection = Connection(host='localhost:5672', userid='guest', - password='guest', virtual_host='/') - self.channel = self.connection.channel() - self.TEST_QUEUE = 'pyrabbitmq.testq2' - self.channel.queue_delete(self.TEST_QUEUE) - - def test_delete(self): - """Test that we can declare a channel delete it, and then declare with - different properties""" - - self.channel.exchange_declare(self.TEST_QUEUE, 'direct') - self.channel.queue_declare(self.TEST_QUEUE) - self.channel.queue_bind( - self.TEST_QUEUE, self.TEST_QUEUE, self.TEST_QUEUE, - ) - - # Delete the queue - self.channel.queue_delete(self.TEST_QUEUE) - - # Declare it again - x = self.channel.queue_declare(self.TEST_QUEUE, durable=True) - self.assertEqual(x.queue, self.TEST_QUEUE) - - self.channel.queue_delete(self.TEST_QUEUE) - - def test_delete_empty(self): - """Test that the queue doesn't get deleted if it is not empty""" - self.channel.exchange_declare(self.TEST_QUEUE, 'direct') - self.channel.queue_declare(self.TEST_QUEUE) - self.channel.queue_bind(self.TEST_QUEUE, self.TEST_QUEUE, - self.TEST_QUEUE) - - message = Message( - channel=self.channel, - body='the quick brown fox jumps over the lazy dog', - properties=dict(content_type='application/json', - content_encoding='utf-8')) - - self.channel.basic_publish(message, self.TEST_QUEUE, self.TEST_QUEUE) - - with self.assertRaises(ChannelError): - self.channel.queue_delete(self.TEST_QUEUE, if_empty=True) - - # We need to make a new channel after a ChannelError - self.channel = self.connection.channel() - - x = self.channel.basic_get(self.TEST_QUEUE) - self.assertTrue(x.body) - - self.channel.queue_delete(self.TEST_QUEUE, if_empty=True) - - def tearDown(self): - if self.channel and self.connection.connected: - self.channel.queue_purge(TEST_QUEUE) - self.channel.close() - if self.connection: - try: - self.connection.close() - except ConnectionError: - pass diff --git a/requirements/test-ci.txt b/requirements/test-ci.txt index a096a8c..62149e6 100644 --- a/requirements/test-ci.txt +++ b/requirements/test-ci.txt @@ -1 +1,4 @@ +mock +six>=1.0.0 +amqp>=1.4.6 coverage>=3.0 diff --git a/requirements/test.txt b/requirements/test.txt index 1f4031d..43c1ff5 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,3 +1,2 @@ -nose mock six diff --git a/setup.py b/setup.py index 0b94c10..ec00de9 100644 --- a/setup.py +++ b/setup.py @@ -211,7 +211,7 @@ setup( license='MPL', description='AMQP Client using the rabbitmq-c library.', long_description=long_description, - test_suite='nose.collector', + test_suite="tests", zip_safe=False, packages=packages, cmdclass=cmdclass, diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_functional.py b/tests/test_functional.py new file mode 100644 index 0000000..03d6276 --- /dev/null +++ b/tests/test_functional.py @@ -0,0 +1,189 @@ +from __future__ import absolute_import + +from six.moves import xrange + +import socket +import unittest + +from librabbitmq import Message, Connection, ConnectionError, ChannelError +TEST_QUEUE = 'pyrabbit.testq' + + +class test_Channel(unittest.TestCase): + + def setUp(self): + self.connection = Connection(host='localhost:5672', userid='guest', + password='guest', virtual_host='/') + self.channel = self.connection.channel() + self.channel.queue_delete(TEST_QUEUE) + self._queue_declare() + + def test_send_message(self): + message = Message( + channel=self.channel, + body='the quick brown fox jumps over the lazy dog', + properties=dict(content_type='application/json', + content_encoding='utf-8')) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + self.assertGreater(self.channel.queue_purge(TEST_QUEUE), 2) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + + def _queue_declare(self): + self.channel.exchange_declare(TEST_QUEUE, 'direct') + x = self.channel.queue_declare(TEST_QUEUE) + self.assertEqual(x.message_count, x[1]) + self.assertEqual(x.consumer_count, x[2]) + self.assertEqual(x.queue, TEST_QUEUE) + self.channel.queue_bind(TEST_QUEUE, TEST_QUEUE, TEST_QUEUE) + + def test_basic_get_ack(self): + message = Message( + channel=self.channel, + body='the quick brown fox jumps over the lazy dog', + properties=dict(content_type='application/json', + content_encoding='utf-8')) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + while True: + x = self.channel.basic_get(TEST_QUEUE) + if x: + break + self.assertIs(self.channel, x.channel) + self.assertIn('message_count', x.delivery_info) + self.assertIn('redelivered', x.delivery_info) + self.assertEqual(x.delivery_info['routing_key'], TEST_QUEUE) + self.assertEqual(x.delivery_info['exchange'], TEST_QUEUE) + self.assertTrue(x.delivery_info['delivery_tag']) + self.assertTrue(x.properties['content_type']) + self.assertTrue(x.body) + x.ack() + + def test_timeout_burst(self): + """Check that if we have a large burst of messages in our queue + that we can fetch them with a timeout without needing to receive + any more messages.""" + + message = Message( + channel=self.channel, + body='the quick brown fox jumps over the lazy dog', + properties=dict(content_type='application/json', + content_encoding='utf-8')) + + for i in xrange(100): + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + + messages = [] + + def cb(x): + messages.append(x) + x.ack() + + self.channel.basic_consume(TEST_QUEUE, callback=cb) + for i in xrange(100): + self.connection.drain_events(timeout=0.2) + + self.assertEqual(len(messages), 100) + + def test_timeout(self): + """Check that our ``drain_events`` call actually times out if + there are no messages.""" + message = Message( + channel=self.channel, + body='the quick brown fox jumps over the lazy dog', + properties=dict(content_type='application/json', + content_encoding='utf-8')) + + self.channel.basic_publish(message, TEST_QUEUE, TEST_QUEUE) + + messages = [] + + def cb(x): + messages.append(x) + x.ack() + + self.channel.basic_consume(TEST_QUEUE, callback=cb) + self.connection.drain_events(timeout=0.1) + + with self.assertRaises(socket.timeout): + self.connection.drain_events(timeout=0.1) + self.assertEqual(len(messages), 1) + + def tearDown(self): + if self.channel and self.connection.connected: + self.channel.queue_purge(TEST_QUEUE) + self.channel.close() + if self.connection: + try: + self.connection.close() + except ConnectionError: + pass + + +class test_Delete(unittest.TestCase): + + def setUp(self): + self.connection = Connection(host='localhost:5672', userid='guest', + password='guest', virtual_host='/') + self.channel = self.connection.channel() + self.TEST_QUEUE = 'pyrabbitmq.testq2' + self.channel.queue_delete(self.TEST_QUEUE) + + def test_delete(self): + """Test that we can declare a channel delete it, and then declare with + different properties""" + + self.channel.exchange_declare(self.TEST_QUEUE, 'direct') + self.channel.queue_declare(self.TEST_QUEUE) + self.channel.queue_bind( + self.TEST_QUEUE, self.TEST_QUEUE, self.TEST_QUEUE, + ) + + # Delete the queue + self.channel.queue_delete(self.TEST_QUEUE) + + # Declare it again + x = self.channel.queue_declare(self.TEST_QUEUE, durable=True) + self.assertEqual(x.queue, self.TEST_QUEUE) + + self.channel.queue_delete(self.TEST_QUEUE) + + def test_delete_empty(self): + """Test that the queue doesn't get deleted if it is not empty""" + self.channel.exchange_declare(self.TEST_QUEUE, 'direct') + self.channel.queue_declare(self.TEST_QUEUE) + self.channel.queue_bind(self.TEST_QUEUE, self.TEST_QUEUE, + self.TEST_QUEUE) + + message = Message( + channel=self.channel, + body='the quick brown fox jumps over the lazy dog', + properties=dict(content_type='application/json', + content_encoding='utf-8')) + + self.channel.basic_publish(message, self.TEST_QUEUE, self.TEST_QUEUE) + + with self.assertRaises(ChannelError): + self.channel.queue_delete(self.TEST_QUEUE, if_empty=True) + + # We need to make a new channel after a ChannelError + self.channel = self.connection.channel() + + x = self.channel.basic_get(self.TEST_QUEUE) + self.assertTrue(x.body) + + self.channel.queue_delete(self.TEST_QUEUE, if_empty=True) + + def tearDown(self): + if self.channel and self.connection.connected: + self.channel.queue_purge(TEST_QUEUE) + self.channel.close() + if self.connection: + try: + self.connection.close() + except ConnectionError: + pass -- cgit v1.2.1