mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-22 12:50:22 -07:00
make hash_params more robust in the face of many corner cases (#18701)
* make hash_params more robust in the face of many corner cases Fixes #18680 Alternative fix to #18681 * add test case for role.hash_params * Add role.hash_params test for more types A set, a generator/iterable, and a Container that is not Iterable.
This commit is contained in:
parent
8e375913b0
commit
5f5ea06ca4
2 changed files with 139 additions and 21 deletions
|
@ -19,18 +19,107 @@
|
|||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
import collections
|
||||
|
||||
from ansible.compat.tests import unittest
|
||||
from ansible.compat.tests.mock import patch, MagicMock
|
||||
|
||||
from ansible.errors import AnsibleError, AnsibleParserError
|
||||
from ansible.playbook.block import Block
|
||||
from ansible.playbook.role import Role
|
||||
from ansible.playbook.role.include import RoleInclude
|
||||
from ansible.playbook.task import Task
|
||||
|
||||
from units.mock.loader import DictDataLoader
|
||||
from units.mock.path import mock_unfrackpath_noop
|
||||
|
||||
from ansible.playbook.role import Role
|
||||
from ansible.playbook.role.include import RoleInclude
|
||||
from ansible.playbook.role import hash_params
|
||||
|
||||
|
||||
class TestHashParams(unittest.TestCase):
|
||||
def test(self):
|
||||
params = {'foo': 'bar'}
|
||||
res = hash_params(params)
|
||||
self._assert_set(res)
|
||||
self._assert_hashable(res)
|
||||
|
||||
def _assert_hashable(self, res):
|
||||
a_dict = {}
|
||||
try:
|
||||
a_dict[res] = res
|
||||
except TypeError as e:
|
||||
self.fail('%s is not hashable: %s' % (res, e))
|
||||
|
||||
def _assert_set(self, res):
|
||||
self.assertIsInstance(res, frozenset)
|
||||
|
||||
def test_dict_tuple(self):
|
||||
params = {'foo': (1, 'bar',)}
|
||||
res = hash_params(params)
|
||||
self._assert_set(res)
|
||||
|
||||
def test_tuple(self):
|
||||
params = (1, None, 'foo')
|
||||
res = hash_params(params)
|
||||
self._assert_hashable(res)
|
||||
|
||||
def test_tuple_dict(self):
|
||||
params = ({'foo': 'bar'}, 37)
|
||||
res = hash_params(params)
|
||||
self._assert_hashable(res)
|
||||
|
||||
def test_list(self):
|
||||
params = ['foo', 'bar', 1, 37, None]
|
||||
res = hash_params(params)
|
||||
self._assert_set(res)
|
||||
self._assert_hashable(res)
|
||||
|
||||
def test_dict_with_list_value(self):
|
||||
params = {'foo': [1, 4, 'bar']}
|
||||
res = hash_params(params)
|
||||
self._assert_set(res)
|
||||
self._assert_hashable(res)
|
||||
|
||||
def test_empty_set(self):
|
||||
params = set([])
|
||||
res = hash_params(params)
|
||||
self._assert_hashable(res)
|
||||
self._assert_set(res)
|
||||
|
||||
def test_generator(self):
|
||||
def my_generator():
|
||||
for i in ['a', 1, None, {}]:
|
||||
yield i
|
||||
|
||||
params = my_generator()
|
||||
res = hash_params(params)
|
||||
self._assert_hashable(res)
|
||||
|
||||
def test_container_but_not_iterable(self):
|
||||
# This is a Container that is not iterable, which is unlikely but...
|
||||
class MyContainer(collections.Container):
|
||||
def __init__(self, some_thing):
|
||||
self.data = []
|
||||
self.data.append(some_thing)
|
||||
|
||||
def __contains__(self, item):
|
||||
return item in self.data
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.data)
|
||||
|
||||
def __len__(self):
|
||||
return len(self.data)
|
||||
|
||||
def __call__(self):
|
||||
return False
|
||||
|
||||
foo = MyContainer('foo bar')
|
||||
params = foo
|
||||
|
||||
self.assertRaises(TypeError, hash_params, params)
|
||||
|
||||
|
||||
class TestRole(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue