Add importlib for python 2.6 *only*

Also fixes up a bunch of test issues that are now
being triggered on py2.6

Change-Id: I28b13ee3e1c47e2eb5266bc72c8f2da31220b99f
This commit is contained in:
Joshua Harlow 2015-07-01 11:42:18 -07:00 committed by Joshua Harlow
parent 2557d66fa4
commit bf5c513472
5 changed files with 47 additions and 28 deletions

View File

@ -58,7 +58,7 @@ class HttpOpenStackSource(baseopenstack.BaseOpenStackSource):
for version in versions: for version in versions:
if not self._valid_api_version(version): if not self._valid_api_version(version):
msg = 'Invalid API version {!r}'.format(version) msg = 'Invalid API version %r' % (version,)
raise exceptions.CloudInitError(msg) raise exceptions.CloudInitError(msg)
return versions return versions

View File

@ -5,16 +5,18 @@
import importlib import importlib
import subprocess import subprocess
import unittest
from cloudinit import exceptions from cloudinit import exceptions
from cloudinit import test
from cloudinit.tests.util import LogSnatcher from cloudinit.tests.util import LogSnatcher
from cloudinit.tests.util import mock from cloudinit.tests.util import mock
class TestNetworkWindows(unittest.TestCase): class TestNetworkWindows(test.TestCase):
def setUp(self): def setUp(self):
super(TestNetworkWindows, self).setUp()
self._ctypes_mock = mock.MagicMock() self._ctypes_mock = mock.MagicMock()
self._winreg_mock = mock.Mock() self._winreg_mock = mock.Mock()
self._win32com_mock = mock.Mock() self._win32com_mock = mock.Mock()
@ -41,6 +43,8 @@ class TestNetworkWindows(unittest.TestCase):
self._network = self._network_module.Network() self._network = self._network_module.Network()
def tearDown(self): def tearDown(self):
super(TestNetworkWindows, self).tearDown()
self._module_patcher.stop() self._module_patcher.stop()
def _test__heap_alloc(self, fail): def _test__heap_alloc(self, fail):
@ -50,12 +54,12 @@ class TestNetworkWindows(unittest.TestCase):
if fail: if fail:
self._kernel32.HeapAlloc.return_value = None self._kernel32.HeapAlloc.return_value = None
with self.assertRaises(exceptions.CloudInitError) as cm: e = self.assertRaises(exceptions.CloudInitError,
self._network_module._heap_alloc(mock_heap, mock_size) self._network_module._heap_alloc,
mock_heap, mock_size)
self.assertEqual('Unable to allocate memory for the IP ' self.assertEqual('Unable to allocate memory for the IP '
'forward table', 'forward table', str(e))
str(cm.exception))
else: else:
result = self._network_module._heap_alloc(mock_heap, mock_size) result = self._network_module._heap_alloc(mock_heap, mock_size)
self.assertEqual(self._kernel32.HeapAlloc.return_value, result) self.assertEqual(self._kernel32.HeapAlloc.return_value, result)
@ -69,17 +73,20 @@ class TestNetworkWindows(unittest.TestCase):
def test__heap_alloc_no_error(self): def test__heap_alloc_no_error(self):
self._test__heap_alloc(fail=False) 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): def test__get_forward_table_no_memory(self):
self._network_module._heap_alloc = mock.Mock() self._network_module._heap_alloc = mock.Mock()
error_msg = 'Unable to allocate memory for the IP forward table' error_msg = 'Unable to allocate memory for the IP forward table'
exc = exceptions.CloudInitError(error_msg) exc = exceptions.CloudInitError(error_msg)
self._network_module._heap_alloc.side_effect = exc self._network_module._heap_alloc.side_effect = exc
with self.assertRaises(exceptions.CloudInitError) as cm: e = self.assertRaises(exceptions.CloudInitError,
with self._network._get_forward_table(): self._check_raises_forward)
pass
self.assertEqual(error_msg, str(cm.exception)) self.assertEqual(error_msg, str(e))
self._network_module._heap_alloc.assert_called_once_with( self._network_module._heap_alloc.assert_called_once_with(
self._kernel32.GetProcessHeap.return_value, self._kernel32.GetProcessHeap.return_value,
self._ctypes_mock.wintypes.ULONG.return_value) self._ctypes_mock.wintypes.ULONG.return_value)
@ -89,9 +96,8 @@ class TestNetworkWindows(unittest.TestCase):
self._iphlpapi.GetIpForwardTable.return_value = ( self._iphlpapi.GetIpForwardTable.return_value = (
self._iphlpapi.ERROR_INSUFFICIENT_BUFFER) self._iphlpapi.ERROR_INSUFFICIENT_BUFFER)
with self.assertRaises(exceptions.CloudInitError): self.assertRaises(exceptions.CloudInitError,
with self._network._get_forward_table(): self._check_raises_forward)
pass
table = self._ctypes_mock.cast.return_value table = self._ctypes_mock.cast.return_value
self._iphlpapi.GetIpForwardTable.assert_called_once_with( self._iphlpapi.GetIpForwardTable.assert_called_once_with(
@ -107,13 +113,11 @@ class TestNetworkWindows(unittest.TestCase):
insufficient_buffer=False, insufficient_buffer=False,
fail=False): fail=False):
if fail: if fail:
with self.assertRaises(exceptions.CloudInitError) as cm: e = self.assertRaises(exceptions.CloudInitError,
with self._network._get_forward_table(): self._check_raises_forward)
pass
msg = ('Unable to get IP forward table. Error: %s' msg = ('Unable to get IP forward table. Error: %s'
% mock.sentinel.error) % mock.sentinel.error)
self.assertEqual(msg, str(cm.exception)) self.assertEqual(msg, str(e))
else: else:
with self._network._get_forward_table() as table: with self._network._get_forward_table() as table:
pass pass
@ -207,11 +211,11 @@ class TestNetworkWindows(unittest.TestCase):
mock_popen.return_value.communicate.return_value = (None, err) mock_popen.return_value.communicate.return_value = (None, err)
if err: if err:
with self.assertRaises(exceptions.CloudInitError) as cm: e = self.assertRaises(exceptions.CloudInitError,
self._network_module.Route.add(mock_route) self._network_module.Route.add,
mock_route)
msg = "Unable to add route: %s" % err msg = "Unable to add route: %s" % err
self.assertEqual(msg, str(cm.exception)) self.assertEqual(msg, str(e))
else: else:
self._network_module.Route.add(mock_route) self._network_module.Route.add(mock_route)

View File

@ -75,7 +75,7 @@ class TestHttpOpenStackSource(test.TestCase):
exc = self.assertRaises(exceptions.CloudInitError, exc = self.assertRaises(exceptions.CloudInitError,
self._source._available_versions) self._source._available_versions)
expected = 'Invalid API version {!r}'.format(version) expected = 'Invalid API version %r' % (version,)
self.assertEqual(expected, str(exc)) self.assertEqual(expected, str(exc))
def test__available_versions_invalid_versions(self): def test__available_versions_invalid_versions(self):

View File

@ -4,6 +4,7 @@
# vi: ts=4 expandtab # vi: ts=4 expandtab
import logging import logging
import sys
try: try:
from unittest import mock from unittest import mock
@ -11,11 +12,21 @@ except ImportError:
import mock # noqa import mock # noqa
_IS_PY26 = sys.version_info[0:2] == (2, 6)
# This is similar with unittest.TestCase.assertLogs from Python 3.4. # This is similar with unittest.TestCase.assertLogs from Python 3.4.
class SnatchHandler(logging.Handler): class SnatchHandler(logging.Handler):
def __init__(self, *args, **kwargs):
super(SnatchHandler, self).__init__(*args, **kwargs) if _IS_PY26:
self.output = [] # 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): def emit(self, record):
msg = self.format(record) msg = self.format(record)

View File

@ -1,7 +1,7 @@
[tox] [tox]
minversion = 1.6 minversion = 1.6
skipsdist = True skipsdist = True
envlist = py27, py34, docs, pep8, py27-coverage, py34-coverage envlist = py26, py27, py34, docs, pep8, py27-coverage, py34-coverage
[tox:jenkins] [tox:jenkins]
downloadcache = ~/cache/pip downloadcache = ~/cache/pip
@ -15,6 +15,10 @@ deps = -r{toxinidir}/test-requirements.txt
-r{toxinidir}/requirements.txt -r{toxinidir}/requirements.txt
commands = {envpython} {toxinidir}/tools/noproxy nosetests {posargs} commands = {envpython} {toxinidir}/tools/noproxy nosetests {posargs}
[testenv:py26]
deps = {[testenv]deps}
importlib
[testenv:py27-coverage] [testenv:py27-coverage]
commands = {envpython} {toxinidir}/tools/noproxy nosetests --with-coverage --cover-erase --cover-package=cloudinit --cover-min-percentage=90 --cover-html {posargs} commands = {envpython} {toxinidir}/tools/noproxy nosetests --with-coverage --cover-erase --cover-package=cloudinit --cover-min-percentage=90 --cover-html {posargs}