patches salt grains locale_info decode error

This commit is contained in:
cmcmarrow 2019-07-17 14:54:36 -06:00
parent 61e9efd7e0
commit eaca473a47
No known key found for this signature in database
GPG key ID: 62FAA6B3AC79AD2F
2 changed files with 57 additions and 1 deletions

View file

@ -2135,8 +2135,16 @@ def locale_info():
grains['locale_info']['defaultlanguage'] = 'unknown'
grains['locale_info']['defaultencoding'] = 'unknown'
grains['locale_info']['detectedencoding'] = __salt_system_encoding__
grains['locale_info']['timezone'] = 'unknown'
if _DATEUTIL_TZ:
grains['locale_info']['timezone'] = datetime.datetime.now(dateutil.tz.tzlocal()).tzname()
try:
grains['locale_info']['timezone'] = datetime.datetime.now(dateutil.tz.tzlocal()).tzname()
except UnicodeDecodeError:
# Because the method 'tzname' is not a part of salt the decoding error cant be fixed.
# 'datetime' does not supply the raw data to write a new 'tzname' in a graceful way.
pass
return grains

View file

@ -19,6 +19,7 @@ except ImportError as import_error:
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.unit import TestCase, skipIf
from tests.support.mock import (
call,
MagicMock,
patch,
mock_open,
@ -54,6 +55,19 @@ OS_RELEASE_DIR = os.path.join(os.path.dirname(__file__), "os-releases")
SOLARIS_DIR = os.path.join(os.path.dirname(__file__), 'solaris')
class MockDateTime:
def __init__(self, **kwargs):
for attr in kwargs:
setattr(self, attr, self._getattr(attr, kwargs[attr]))
def _getattr(self, attr, attr_value):
def __getattr(*args, **kwargs):
return attr_value
setattr(__getattr, attr, attr_value)
return __getattr
@skipIf(NO_MOCK, NO_MOCK_REASON)
@skipIf(not pytest, False)
class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
@ -1171,3 +1185,37 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
ret = core._osx_memdata()
assert ret['swap_total'] == 0
assert ret['mem_total'] == 4096
@skipIf(not core._DATEUTIL_TZ, 'Missing dateutil.tz')
def test_locale_info_tzname(self):
# core.datatime.datatime.now is readonly
with patch.object(core.datetime, 'datetime', wraps=MockDateTime(now=MockDateTime(tzname='MDT'))) as datetime:
with patch.object(core.dateutil.tz, 'tzlocal', return_value=object) as tzlocal:
ret = core.locale_info()
self.assertEqual(len(datetime.method_calls), 1)
self.assertEqual(datetime.method_calls[0], call.now(object))
tzlocal.assert_called_once_with()
self.assertEqual(ret['locale_info']['timezone'], 'MDT')
@skipIf(not core._DATEUTIL_TZ, 'Missing dateutil.tz')
def test_locale_info_unicode_error_tzname(self):
# UnicodeDecodeError most have the default string encoding
unicode_error = UnicodeDecodeError(str('fake'), b'\x00\x00', 1, 2, str('fake'))
# core.datatime.datatime.now is readonly
with patch.object(core.datetime, 'datetime', wraps=MockDateTime(now=MockDateTime(tzname='MDT'))) as datetime:
with patch.object(core.dateutil.tz, 'tzlocal', side_effect=unicode_error) as tzlocal:
ret = core.locale_info()
tzlocal.assert_called_once_with()
self.assertEqual(len(datetime.method_calls), 0)
self.assertEqual(ret['locale_info']['timezone'], 'unknown')
@skipIf(core._DATEUTIL_TZ, 'Not Missing dateutil.tz')
def test_locale_info_no_tz_tzname(self):
# core.datatime.datatime.now is readonly
with patch.object(core.datetime, 'datetime', wraps=MockDateTime(now=MockDateTime(tzname='MDT'))) as datetime:
ret = core.locale_info()
self.assertEqual(len(datetime.method_calls), 0)
self.assertEqual(ret['locale_info']['timezone'], 'unknown')