Merge pull request #12568 from mgedmin/py3k

Python 3: fix most tests for ansible.module_utils.basic
This commit is contained in:
Toshio Kuratomi 2015-09-30 12:47:29 -07:00
commit 4cfcf5d61b
2 changed files with 57 additions and 23 deletions

View file

@ -69,9 +69,44 @@ import errno
from itertools import repeat from itertools import repeat
try: try:
from itertools import imap # Python 2 # Python 2
from itertools import imap
except ImportError: except ImportError:
imap = map # Python 3 # Python 3
imap = map
try:
# Python 2
basestring
except NameError:
# Python 3
basestring = str
try:
# Python 2
unicode
except NameError:
# Python 3
unicode = str
try:
# Python 2.6+
bytes
except NameError:
# Python 2.4
bytes = str
try:
dict.iteritems
except AttributeError:
# Python 3
def iteritems(d):
return d.items()
else:
# Python 2
def iteritems(d): # Python 2
return d.iteritems()
try: try:
import json import json
@ -283,7 +318,7 @@ def json_dict_unicode_to_bytes(d, encoding='utf-8'):
if isinstance(d, unicode): if isinstance(d, unicode):
return d.encode(encoding) return d.encode(encoding)
elif isinstance(d, dict): elif isinstance(d, dict):
return dict(imap(json_dict_unicode_to_bytes, d.iteritems(), repeat(encoding))) return dict(imap(json_dict_unicode_to_bytes, iteritems(d), repeat(encoding)))
elif isinstance(d, list): elif isinstance(d, list):
return list(imap(json_dict_unicode_to_bytes, d, repeat(encoding))) return list(imap(json_dict_unicode_to_bytes, d, repeat(encoding)))
elif isinstance(d, tuple): elif isinstance(d, tuple):
@ -298,10 +333,10 @@ def json_dict_bytes_to_unicode(d, encoding='utf-8'):
and dict container types (the containers that the json module returns) and dict container types (the containers that the json module returns)
''' '''
if isinstance(d, str): if isinstance(d, bytes):
return unicode(d, encoding) return unicode(d, encoding)
elif isinstance(d, dict): elif isinstance(d, dict):
return dict(imap(json_dict_bytes_to_unicode, d.iteritems(), repeat(encoding))) return dict(imap(json_dict_bytes_to_unicode, iteritems(d), repeat(encoding)))
elif isinstance(d, list): elif isinstance(d, list):
return list(imap(json_dict_bytes_to_unicode, d, repeat(encoding))) return list(imap(json_dict_bytes_to_unicode, d, repeat(encoding)))
elif isinstance(d, tuple): elif isinstance(d, tuple):
@ -398,7 +433,7 @@ class AnsibleModule(object):
self.aliases = {} self.aliases = {}
if add_file_common_args: if add_file_common_args:
for k, v in FILE_COMMON_ARGUMENTS.iteritems(): for k, v in FILE_COMMON_ARGUMENTS.items():
if k not in self.argument_spec: if k not in self.argument_spec:
self.argument_spec[k] = v self.argument_spec[k] = v
@ -934,7 +969,7 @@ class AnsibleModule(object):
def _handle_aliases(self): def _handle_aliases(self):
aliases_results = {} #alias:canon aliases_results = {} #alias:canon
for (k,v) in self.argument_spec.iteritems(): for (k,v) in self.argument_spec.items():
self._legal_inputs.append(k) self._legal_inputs.append(k)
aliases = v.get('aliases', None) aliases = v.get('aliases', None)
default = v.get('default', None) default = v.get('default', None)
@ -955,7 +990,7 @@ class AnsibleModule(object):
return aliases_results return aliases_results
def _check_arguments(self, check_invalid_arguments): def _check_arguments(self, check_invalid_arguments):
for (k,v) in self.params.iteritems(): for (k,v) in self.params.items():
if k == '_ansible_check_mode' and v: if k == '_ansible_check_mode' and v:
if not self.supports_check_mode: if not self.supports_check_mode:
@ -1007,7 +1042,7 @@ class AnsibleModule(object):
def _check_required_arguments(self): def _check_required_arguments(self):
''' ensure all required arguments are present ''' ''' ensure all required arguments are present '''
missing = [] missing = []
for (k,v) in self.argument_spec.iteritems(): for (k,v) in self.argument_spec.items():
required = v.get('required', False) required = v.get('required', False)
if required and k not in self.params: if required and k not in self.params:
missing.append(k) missing.append(k)
@ -1030,7 +1065,7 @@ class AnsibleModule(object):
def _check_argument_values(self): def _check_argument_values(self):
''' ensure all arguments have the requested values, and there are no stray arguments ''' ''' ensure all arguments have the requested values, and there are no stray arguments '''
for (k,v) in self.argument_spec.iteritems(): for (k,v) in self.argument_spec.items():
choices = v.get('choices',None) choices = v.get('choices',None)
if choices is None: if choices is None:
continue continue
@ -1173,7 +1208,7 @@ class AnsibleModule(object):
def _check_argument_types(self): def _check_argument_types(self):
''' ensure all arguments have the requested type ''' ''' ensure all arguments have the requested type '''
for (k, v) in self.argument_spec.iteritems(): for (k, v) in self.argument_spec.items():
wanted = v.get('type', None) wanted = v.get('type', None)
if wanted is None: if wanted is None:
continue continue
@ -1192,7 +1227,7 @@ class AnsibleModule(object):
self.fail_json(msg="argument %s is of type %s and we were unable to convert to %s" % (k, type(value), wanted)) self.fail_json(msg="argument %s is of type %s and we were unable to convert to %s" % (k, type(value), wanted))
def _set_defaults(self, pre=True): def _set_defaults(self, pre=True):
for (k,v) in self.argument_spec.iteritems(): for (k,v) in self.argument_spec.items():
default = v.get('default', None) default = v.get('default', None)
if pre == True: if pre == True:
# this prevents setting defaults on required items # this prevents setting defaults on required items

View file

@ -20,10 +20,9 @@
from __future__ import (absolute_import, division) from __future__ import (absolute_import, division)
__metaclass__ = type __metaclass__ = type
import __builtin__
import errno import errno
from nose.tools import timed from six.moves import builtins
from ansible.compat.tests import unittest from ansible.compat.tests import unittest
from ansible.compat.tests.mock import patch, MagicMock, mock_open, Mock from ansible.compat.tests.mock import patch, MagicMock, mock_open, Mock
@ -37,16 +36,16 @@ class TestModuleUtilsBasic(unittest.TestCase):
pass pass
def test_module_utils_basic_imports(self): def test_module_utils_basic_imports(self):
realimport = __builtin__.__import__ realimport = builtins.__import__
def _mock_import(name, *args, **kwargs): def _mock_import(name, *args, **kwargs):
if name == 'json': if name == 'json':
raise ImportError() raise ImportError()
realimport(name, *args, **kwargs) realimport(name, *args, **kwargs)
with patch.object(__builtin__, '__import__', _mock_import, create=True) as m: with patch.object(builtins, '__import__', _mock_import, create=True) as m:
m('ansible.module_utils.basic') m('ansible.module_utils.basic')
__builtin__.__import__('ansible.module_utils.basic') builtins.__import__('ansible.module_utils.basic')
def test_module_utils_basic_get_platform(self): def test_module_utils_basic_get_platform(self):
with patch('platform.system', return_value='foo'): with patch('platform.system', return_value='foo'):
@ -510,7 +509,7 @@ class TestModuleUtilsBasic(unittest.TestCase):
m = mock_open() m = mock_open()
m.side_effect = OSError m.side_effect = OSError
with patch('__builtin__.open', m, create=True): with patch.object(builtins, 'open', m, create=True):
self.assertEqual(am.is_special_selinux_path('/some/path/that/should/be/nfs'), (False, None)) self.assertEqual(am.is_special_selinux_path('/some/path/that/should/be/nfs'), (False, None))
mount_data = [ mount_data = [
@ -524,7 +523,7 @@ class TestModuleUtilsBasic(unittest.TestCase):
m = mock_open(read_data=''.join(mount_data)) m = mock_open(read_data=''.join(mount_data))
m.return_value.readlines.return_value = mount_data m.return_value.readlines.return_value = mount_data
with patch('__builtin__.open', m, create=True): with patch.object(builtins, 'open', m, create=True):
self.assertEqual(am.is_special_selinux_path('/some/random/path'), (False, None)) self.assertEqual(am.is_special_selinux_path('/some/random/path'), (False, None))
self.assertEqual(am.is_special_selinux_path('/some/path/that/should/be/nfs'), (True, ['foo_u', 'foo_r', 'foo_t', 's0'])) self.assertEqual(am.is_special_selinux_path('/some/path/that/should/be/nfs'), (True, ['foo_u', 'foo_r', 'foo_t', 's0']))
self.assertEqual(am.is_special_selinux_path('/weird/random/fstype/path'), (True, ['foo_u', 'foo_r', 'foo_t', 's0'])) self.assertEqual(am.is_special_selinux_path('/weird/random/fstype/path'), (True, ['foo_u', 'foo_r', 'foo_t', 's0']))
@ -537,8 +536,8 @@ class TestModuleUtilsBasic(unittest.TestCase):
argument_spec = dict(), argument_spec = dict(),
) )
self.assertEqual(am._to_filesystem_str(u'foo'), 'foo') self.assertEqual(am._to_filesystem_str(u'foo'), b'foo')
self.assertEqual(am._to_filesystem_str(u'föö'), 'f\xc3\xb6\xc3\xb6') self.assertEqual(am._to_filesystem_str(u'föö'), b'f\xc3\xb6\xc3\xb6')
def test_module_utils_basic_ansible_module_user_and_group(self): def test_module_utils_basic_ansible_module_user_and_group(self):
from ansible.module_utils import basic from ansible.module_utils import basic
@ -603,7 +602,7 @@ class TestModuleUtilsBasic(unittest.TestCase):
with patch.dict('sys.modules', {'selinux': basic.selinux}): with patch.dict('sys.modules', {'selinux': basic.selinux}):
with patch('selinux.lsetfilecon', return_value=0) as m: with patch('selinux.lsetfilecon', return_value=0) as m:
self.assertEqual(am.set_context_if_different('/path/to/file', ['foo_u', 'foo_r', 'foo_t', 's0'], False), True) self.assertEqual(am.set_context_if_different('/path/to/file', ['foo_u', 'foo_r', 'foo_t', 's0'], False), True)
m.assert_called_with('/path/to/file', 'foo_u:foo_r:foo_t:s0') m.assert_called_with(b'/path/to/file', 'foo_u:foo_r:foo_t:s0')
m.reset_mock() m.reset_mock()
am.check_mode = True am.check_mode = True
self.assertEqual(am.set_context_if_different('/path/to/file', ['foo_u', 'foo_r', 'foo_t', 's0'], False), True) self.assertEqual(am.set_context_if_different('/path/to/file', ['foo_u', 'foo_r', 'foo_t', 's0'], False), True)
@ -620,7 +619,7 @@ class TestModuleUtilsBasic(unittest.TestCase):
with patch('selinux.lsetfilecon', return_value=0) as m: with patch('selinux.lsetfilecon', return_value=0) as m:
self.assertEqual(am.set_context_if_different('/path/to/file', ['foo_u', 'foo_r', 'foo_t', 's0'], False), True) self.assertEqual(am.set_context_if_different('/path/to/file', ['foo_u', 'foo_r', 'foo_t', 's0'], False), True)
m.assert_called_with('/path/to/file', 'sp_u:sp_r:sp_t:s0') m.assert_called_with(b'/path/to/file', 'sp_u:sp_r:sp_t:s0')
delattr(basic, 'selinux') delattr(basic, 'selinux')