diff --git a/cloudinit/sources/openstack/httpopenstack.py b/cloudinit/sources/openstack/httpopenstack.py index 71dcee3f..d2f49acc 100644 --- a/cloudinit/sources/openstack/httpopenstack.py +++ b/cloudinit/sources/openstack/httpopenstack.py @@ -58,7 +58,7 @@ class HttpOpenStackSource(baseopenstack.BaseOpenStackSource): for version in versions: if not self._valid_api_version(version): - msg = 'Invalid API version {!r}'.format(version) + msg = 'Invalid API version %r' % (version,) raise exceptions.CloudInitError(msg) return versions diff --git a/cloudinit/tests/osys/windows/test_network.py b/cloudinit/tests/osys/windows/test_network.py index 26bb5a3d..f5e7c91b 100644 --- a/cloudinit/tests/osys/windows/test_network.py +++ b/cloudinit/tests/osys/windows/test_network.py @@ -5,16 +5,18 @@ import importlib import subprocess -import unittest from cloudinit import exceptions +from cloudinit import test from cloudinit.tests.util import LogSnatcher from cloudinit.tests.util import mock -class TestNetworkWindows(unittest.TestCase): +class TestNetworkWindows(test.TestCase): def setUp(self): + super(TestNetworkWindows, self).setUp() + self._ctypes_mock = mock.MagicMock() self._winreg_mock = mock.Mock() self._win32com_mock = mock.Mock() @@ -41,6 +43,8 @@ class TestNetworkWindows(unittest.TestCase): self._network = self._network_module.Network() def tearDown(self): + super(TestNetworkWindows, self).tearDown() + self._module_patcher.stop() def _test__heap_alloc(self, fail): @@ -50,12 +54,12 @@ class TestNetworkWindows(unittest.TestCase): if fail: self._kernel32.HeapAlloc.return_value = None - with self.assertRaises(exceptions.CloudInitError) as cm: - self._network_module._heap_alloc(mock_heap, mock_size) + e = self.assertRaises(exceptions.CloudInitError, + self._network_module._heap_alloc, + mock_heap, mock_size) self.assertEqual('Unable to allocate memory for the IP ' - 'forward table', - str(cm.exception)) + 'forward table', str(e)) else: result = self._network_module._heap_alloc(mock_heap, mock_size) self.assertEqual(self._kernel32.HeapAlloc.return_value, result) @@ -69,17 +73,20 @@ class TestNetworkWindows(unittest.TestCase): def test__heap_alloc_no_error(self): self._test__heap_alloc(fail=False) + def _check_raises_forward(self): + with self._network._get_forward_table(): + pass + def test__get_forward_table_no_memory(self): self._network_module._heap_alloc = mock.Mock() error_msg = 'Unable to allocate memory for the IP forward table' exc = exceptions.CloudInitError(error_msg) self._network_module._heap_alloc.side_effect = exc - with self.assertRaises(exceptions.CloudInitError) as cm: - with self._network._get_forward_table(): - pass + e = self.assertRaises(exceptions.CloudInitError, + self._check_raises_forward) - self.assertEqual(error_msg, str(cm.exception)) + self.assertEqual(error_msg, str(e)) self._network_module._heap_alloc.assert_called_once_with( self._kernel32.GetProcessHeap.return_value, self._ctypes_mock.wintypes.ULONG.return_value) @@ -89,9 +96,8 @@ class TestNetworkWindows(unittest.TestCase): self._iphlpapi.GetIpForwardTable.return_value = ( self._iphlpapi.ERROR_INSUFFICIENT_BUFFER) - with self.assertRaises(exceptions.CloudInitError): - with self._network._get_forward_table(): - pass + self.assertRaises(exceptions.CloudInitError, + self._check_raises_forward) table = self._ctypes_mock.cast.return_value self._iphlpapi.GetIpForwardTable.assert_called_once_with( @@ -107,13 +113,11 @@ class TestNetworkWindows(unittest.TestCase): insufficient_buffer=False, fail=False): if fail: - with self.assertRaises(exceptions.CloudInitError) as cm: - with self._network._get_forward_table(): - pass - + e = self.assertRaises(exceptions.CloudInitError, + self._check_raises_forward) msg = ('Unable to get IP forward table. Error: %s' % mock.sentinel.error) - self.assertEqual(msg, str(cm.exception)) + self.assertEqual(msg, str(e)) else: with self._network._get_forward_table() as table: pass @@ -207,11 +211,11 @@ class TestNetworkWindows(unittest.TestCase): mock_popen.return_value.communicate.return_value = (None, err) if err: - with self.assertRaises(exceptions.CloudInitError) as cm: - self._network_module.Route.add(mock_route) - + e = self.assertRaises(exceptions.CloudInitError, + self._network_module.Route.add, + mock_route) msg = "Unable to add route: %s" % err - self.assertEqual(msg, str(cm.exception)) + self.assertEqual(msg, str(e)) else: self._network_module.Route.add(mock_route) diff --git a/cloudinit/tests/sources/openstack/test_httpopenstack.py b/cloudinit/tests/sources/openstack/test_httpopenstack.py index f830a3b2..f4cce1cb 100644 --- a/cloudinit/tests/sources/openstack/test_httpopenstack.py +++ b/cloudinit/tests/sources/openstack/test_httpopenstack.py @@ -75,7 +75,7 @@ class TestHttpOpenStackSource(test.TestCase): exc = self.assertRaises(exceptions.CloudInitError, self._source._available_versions) - expected = 'Invalid API version {!r}'.format(version) + expected = 'Invalid API version %r' % (version,) self.assertEqual(expected, str(exc)) def test__available_versions_invalid_versions(self): diff --git a/cloudinit/tests/util.py b/cloudinit/tests/util.py index a34c6478..b1331527 100644 --- a/cloudinit/tests/util.py +++ b/cloudinit/tests/util.py @@ -4,6 +4,7 @@ # vi: ts=4 expandtab import logging +import sys try: from unittest import mock @@ -11,11 +12,21 @@ except ImportError: import mock # noqa +_IS_PY26 = sys.version_info[0:2] == (2, 6) + + # This is similar with unittest.TestCase.assertLogs from Python 3.4. class SnatchHandler(logging.Handler): - def __init__(self, *args, **kwargs): - super(SnatchHandler, self).__init__(*args, **kwargs) - self.output = [] + + if _IS_PY26: + # Old style junk is required on 2.6... + def __init__(self, *args, **kwargs): + logging.Handler.__init__(self, *args, **kwargs) + self.output = [] + else: + def __init__(self, *args, **kwargs): + super(SnatchHandler, self).__init__(*args, **kwargs) + self.output = [] def emit(self, record): msg = self.format(record) diff --git a/tox.ini b/tox.ini index 7cddb181..607d83e2 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] minversion = 1.6 skipsdist = True -envlist = py27, py34, docs, pep8, py27-coverage, py34-coverage +envlist = py26, py27, py34, docs, pep8, py27-coverage, py34-coverage [tox:jenkins] downloadcache = ~/cache/pip @@ -15,6 +15,10 @@ deps = -r{toxinidir}/test-requirements.txt -r{toxinidir}/requirements.txt commands = {envpython} {toxinidir}/tools/noproxy nosetests {posargs} +[testenv:py26] +deps = {[testenv]deps} + importlib + [testenv:py27-coverage] commands = {envpython} {toxinidir}/tools/noproxy nosetests --with-coverage --cover-erase --cover-package=cloudinit --cover-min-percentage=90 --cover-html {posargs}