rally/tests/unit/common/test_broker.py
Andrey Kurilin 712a6fa482 Fix all py3 related issues
This patch makes output of `tox -epy34` to finish with following message:
>  py34: commands succeeded
>  congratulations :)

Issues:
 * module "__builtin__" was renamed to "builtins" in Python 3

   Related modules:
    - rally.api
    - tests.unit.benchmark.scenarios.vm.test_utils

 * function "map"/"filter" returns "builtins.map"/"builtins.filter" object
   in Python 3 instead of list in Python 2. "builtins.map" and
   "builtins.filter" object is not subscriptable and has no len(), so list
   comprehension is preferable to use and py2/py3 compatible way.

   Related modules:
    - rally.benchmark.context.sahara.sahara_edp
    - rally.benchmark.processing.plot
    - rally.benchmark.sla.base
    - rally.benchmark.types
    - rally.cmd.commands.task
    - rally.cmd.commands.verify
    - tests.unit.benchmark.scenarios.test_base
    - tests.unit.benchmark.wrappers.test_keystone
    - tests.unit.cmd.commands.test_task
    - tests.unit.cmd.commands.test_verify

 * dict.keys()/dict.values() returns "dict_keys"/"dict_values" object in
   Python 3 instead of list in Python 2. so list(dict) and
   list(dict.values()) should be used instead.

   Related modules:
    - rally.benchmark.scenarios.utils
    - rally.benchmark.scenarios.vm.vmtasks
    - tests.unit.cmd.commands.test_show
    - tests.unit.common.test_broker
    - tests.unit.deploy.engines.test_fuel
    - tests.unit.fakes

 * Some changes was made in Python 3 related to data model, so we should
   change our inspect code. See code changes for more details

   Related modules:
    - rally.cmd.cliutils
    - rally.common.utils

 * ConfigParser is more strict for duplicate items in Python 3, so
   duplicates are removed

   Related files:
    - rally/verification/tempest/config.ini

 * Exception object doesn't have "message" attribute in Python 3, so
   if we want to get it, the most proper way is using "getattr"

   Related modules:
    - rally.verification.tempest.config

 * "mock.MagicMock" is not sortable in Python 3, so we should add required
   attributes to fix that.

   Related modules:
    - tests.unit.benchmark.context.test_base

 * assertSequenceEqual assertation method was added in tests.unit.test to
   compare sequence objects

   Related modules:
    - tests.unit.benchmark.context.cleanup.test_resources
    - tests.unit.benchmark.scenarios.nova.test_utils

 * function "range" returns "range" object in Python 3 instead of list
   in Python 2.

   Related modules:
    - tests.unit.benchmark.processing.test_utils

 * keyword arguments should be transmitted to self.assertRaises as kwargs,
   not like a dict

   Related modules:
    - tests.unit.benchmark.scenarios.dummy.test_dummy

Additional changes:
 * Python 2.6 was added to setup.cfg, since Rally supports it.
 * py33, py34 environments were added to tox.ini
 * wrong ignore path was removed from tox.ini
 * made items of bash complition sorted

Several tests are skipped in Python 3 env. For more details see notes in code:
 - tests.unit.benchmark.processing.test_plot.PlotTestCase.test__process_main_time
 - tests.unit.benchmark.processing.test_plot.PlotTestCase.test__process_atomic_time
 - tests.unit.common.test_utils.MethodClassTestCase.test_method_class_for_class_level_method

During porting Rally to Python3, several issues found and fixed in
TempestContext and its unit tests:

 - If process of cleanup is failed, exception is handled and cleanup is
   marked as successfull. This issue was fixed and CleanUpException was
   added to rally.exception module
 - Cleanup was called with wrong path.

Change-Id: If04e873790dcb4c9c882d4be4bf40479deedd36d
2015-01-26 15:18:36 +00:00

86 lines
2.9 KiB
Python

# Copyright 2014: Mirantis Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import collections
import mock
from rally.common import broker
from tests.unit import test
class BrokerTestCase(test.TestCase):
def test__publisher(self):
mock_publish = mock.MagicMock()
mock_is_published = mock.MagicMock()
queue = collections.deque()
broker._publisher(mock_publish, queue, mock_is_published)
mock_publish.assert_called_once_with(queue)
mock_is_published.set.assert_called_once_with()
def test__publisher_fails(self):
mock_publish = mock.MagicMock(side_effect=Exception())
mock_is_published = mock.MagicMock()
queue = collections.deque()
broker._publisher(mock_publish, queue, mock_is_published)
mock_is_published.set.assert_called_once_with()
def test__consumer(self):
queue = collections.deque([1, 2, 3])
mock_consume = mock.MagicMock()
mock_is_published = mock.MagicMock()
mock_is_published.isSet = mock.MagicMock(return_value=True)
broker._consumer(mock_consume, queue, mock_is_published)
self.assertEqual(3, mock_consume.call_count)
self.assertEqual(0, len(queue))
def test__consumer_cache(self):
cache_keys_history = []
def consume(cache, item):
cache[item] = True
cache_keys_history.append(list(cache))
queue = collections.deque([1, 2, 3])
mock_is_published = mock.MagicMock()
mock_is_published.isSet = mock.MagicMock(return_value=True)
broker._consumer(consume, queue, mock_is_published)
self.assertEqual([[1], [1, 2], [1, 2, 3]], cache_keys_history)
def test__consumer_fails(self):
queue = collections.deque([1, 2, 3])
mock_consume = mock.MagicMock(side_effect=Exception())
mock_is_published = mock.MagicMock()
mock_is_published.isSet = mock.MagicMock(return_value=True)
broker._consumer(mock_consume, queue, mock_is_published)
self.assertEqual(0, len(queue))
def test_run(self):
def publish(queue):
queue.append(1)
queue.append(2)
queue.append(3)
consumed = set()
def consume(cache, item):
consumed.add(item)
consumer_count = 2
broker.run(publish, consume, consumer_count)
self.assertEqual(set([1, 2, 3]), consumed)