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:
parent
2557d66fa4
commit
bf5c513472
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
6
tox.ini
6
tox.ini
|
@ -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}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue