Add tests for salt.utils.win_reg

Fix some issues found in testing
This commit is contained in:
twangboy 2018-03-16 18:01:43 -06:00
parent f7112b19a2
commit f15f92318d
No known key found for this signature in database
GPG key ID: 93FF3BDEB278C9EB
2 changed files with 334 additions and 24 deletions

View file

@ -37,7 +37,6 @@ try:
import win32gui
import win32api
import win32con
import pywintypes
HAS_WINDOWS_MODULES = True
except ImportError:
HAS_WINDOWS_MODULES = False
@ -177,7 +176,7 @@ def key_exists(hive, key, use_32bit_registry=False):
handle = win32api.RegOpenKeyEx(hkey, local_key, 0, access_mask)
win32api.RegCloseKey(handle)
return True
except WindowsError: # pylint: disable=E0602
except Exception: # pylint: disable=E0602
return False
@ -248,7 +247,7 @@ def list_keys(hive, key=None, use_32bit_registry=False):
handle.Close()
except pywintypes.error: # pylint: disable=E0602
except Exception: # pylint: disable=E0602
log.debug(r'Cannot find key: %s\%s', hive, key, exc_info=True)
return False, r'Cannot find key: {0}\{1}'.format(hive, key)
@ -315,7 +314,7 @@ def list_values(hive, key=None, use_32bit_registry=False, include_default=True):
else:
value['vdata'] = vdata
values.append(value)
except pywintypes.error as exc: # pylint: disable=E0602
except Exception as exc: # pylint: disable=E0602
log.debug(r'Cannot find key: %s\%s', hive, key, exc_info=True)
return False, r'Cannot find key: {0}\{1}'.format(hive, key)
finally:
@ -398,17 +397,18 @@ def read_value(hive, key, vname=None, use_32bit_registry=False):
ret['vdata'] = vdata
else:
ret['comment'] = 'Empty Value'
except WindowsError: # pylint: disable=E0602
ret['vdata'] = ('(value not set)')
ret['vtype'] = 'REG_SZ'
except pywintypes.error as exc: # pylint: disable=E0602
msg = 'Cannot find {0} in {1}\\{2}' \
''.format(local_vname, local_hive, local_key)
log.trace(exc)
log.trace(msg)
ret['comment'] = msg
ret['success'] = False
except pywintypes.error as exc: # pylint: disable=E0602
except Exception as exc:
if exc.winerror == 2 and vname is None:
ret['vdata'] = ('(value not set)')
ret['vtype'] = 'REG_SZ'
else:
msg = 'Cannot find {0} in {1}\\{2}' \
''.format(local_vname, local_hive, local_key)
log.trace(exc)
log.trace(msg)
ret['comment'] = msg
ret['success'] = False
except Exception as exc: # pylint: disable=E0602
msg = 'Cannot find key: {0}\\{1}'.format(local_hive, local_key)
log.trace(exc)
log.trace(msg)
@ -626,7 +626,7 @@ def delete_key_recursive(hive, key, use_32bit_registry=False):
subkey = win32api.RegEnumKey(_key, i)
yield subkey
i += 1
except pywintypes.error: # pylint: disable=E0602
except Exception: # pylint: disable=E0602
break
def _traverse_registry_tree(_hkey, _keypath, _ret, _access_mask):
@ -684,7 +684,8 @@ def delete_value(hive, key, vname=None, use_32bit_registry=False):
:param bool use_32bit_registry: Deletes the 32bit portion of the registry on
64bit installations. On 32bit machines this is ignored.
:return: Returns True if successful, False if not
:return: Returns True if successful, None if the value didn't exist, and
False if unsuccessful
:rtype: bool
CLI Example:
@ -707,10 +708,13 @@ def delete_value(hive, key, vname=None, use_32bit_registry=False):
win32api.RegCloseKey(handle)
broadcast_change()
return True
except WindowsError as exc: # pylint: disable=E0602
log.error(exc, exc_info=True)
log.error('Hive: %s', local_hive)
log.error('Key: %s', local_key)
log.error('ValueName: %s', local_vname)
log.error('32bit Reg: %s', use_32bit_registry)
return False
except Exception as exc: # pylint: disable=E0602
if exc.winerror == 2:
return None
else:
log.error(exc, exc_info=True)
log.error('Hive: %s', local_hive)
log.error('Key: %s', local_key)
log.error('ValueName: %s', local_vname)
log.error('32bit Reg: %s', use_32bit_registry)
return False

View file

@ -0,0 +1,306 @@
# -*- coding: utf-8 -*-
# Import Python Libs
from __future__ import absolute_import, unicode_literals, print_function
# Import Salt Testing Libs
from tests.support.helpers import destructiveTest
from tests.support.mock import NO_MOCK, NO_MOCK_REASON, patch
from tests.support.unit import TestCase, skipIf
# Import Salt Libs
import salt.utils.platform
import salt.utils.win_reg as win_reg
@skipIf(NO_MOCK, NO_MOCK_REASON)
@skipIf(not salt.utils.platform.is_windows(), 'System is not Windows')
class WinFunctionsTestCase(TestCase):
'''
Test cases for salt.utils.win_reg
'''
def test_key_exists_existing(self):
'''
Tests the key exists function using a well known registry key
'''
self.assertEqual(
win_reg.key_exists(
hive='HKLM',
key='SOFTWARE\\Microsoft'
),
True
)
def test_key_exists_non_existing(self):
'''
Tests the key exists function using a non existing registry key
'''
self.assertEqual(
win_reg.key_exists(
hive='HKLM',
key='SOFTWARE\\Salt\\fake_key'
),
False
)
def test_broadcast_change_success(self):
'''
Tests the broadcast_change function
'''
with patch('win32gui.SendMessageTimeout', return_value=('', 0)):
self.assertEqual(win_reg.broadcast_change(), True)
def test_broadcast_change_fail(self):
'''
Tests the broadcast_change function failure
'''
with patch('win32gui.SendMessageTimeout', return_value=('', 1)):
self.assertEqual(win_reg.broadcast_change(), False)
def test_list_keys_existing(self):
'''
Test the list_keys function using a well known registry key
'''
self.assertIn(
'Microsoft',
win_reg.list_keys(
hive='HKLM',
key='SOFTWARE'
)
)
def test_list_keys_non_existing(self):
'''
Test the list_keys function using a non existing registry key
'''
expected = (False, 'Cannot find key: HKLM\\SOFTWARE\\Salt\\fake_key')
self.assertEqual(
win_reg.list_keys(
hive='HKLM',
key='SOFTWARE\\Salt\\fake_key'),
expected
)
def test_list_values_existing(self):
'''
Test the list_values function using a well known registry key
'''
values = win_reg.list_values(
hive='HKLM',
key='SOFTWARE\\Microsoft\\Windows\\CurrentVersion'
)
keys = []
for value in values:
keys.append(value['vname'])
self.assertIn('ProgramFilesDir', keys)
def test_list_values_non_existing(self):
'''
Test the list_values function using a non existing registry key
'''
expected = (False, 'Cannot find key: HKLM\\SOFTWARE\\Salt\\fake_key')
self.assertEqual(
win_reg.list_values(
hive='HKLM',
key='SOFTWARE\\Salt\\fake_key'
),
expected
)
def test_read_value_existing(self):
'''
Test the list_values function using a well known registry key
'''
ret = win_reg.read_value(
hive='HKLM',
key='SOFTWARE\\Microsoft\\Windows\\CurrentVersion',
vname='ProgramFilesPath'
)
self.assertEqual(ret['vdata'], '%ProgramFiles%')
def test_read_value_default(self):
'''
Test the read_value function reading the default value
'''
ret = win_reg.read_value(
hive='HKLM',
key='SOFTWARE\\Microsoft\\Windows\\CurrentVersion'
)
self.assertEqual(ret['vdata'], '(value not set)')
def test_read_value_non_existing(self):
'''
Test the list_values function using a non existing registry key
'''
expected = {
'comment': 'Cannot find fake_name in HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion',
'vdata': None,
'vname': 'fake_name',
'success': False,
'hive': 'HKLM',
'key': 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion'
}
self.assertEqual(
win_reg.read_value(
hive='HKLM',
key='SOFTWARE\\Microsoft\\Windows\\CurrentVersion',
vname='fake_name'
),
expected
)
def test_read_value_non_existing_key(self):
'''
Test the list_values function using a non existing registry key
'''
expected = {
'comment': 'Cannot find key: HKLM\\SOFTWARE\\Salt\\fake_key',
'vdata': None,
'vname': 'fake_name',
'success': False,
'hive': 'HKLM',
'key': 'SOFTWARE\\Salt\\fake_key'
}
self.assertEqual(
win_reg.read_value(
hive='HKLM',
key='SOFTWARE\\Salt\\fake_key',
vname='fake_name'
),
expected
)
@destructiveTest
def test_set_value(self):
'''
Test the set_value function
'''
self.assertTrue(
win_reg.set_value(
hive='HKLM',
key='SOFTWARE\\Salt\\Test\\',
vname='fake_name',
vdata='fake_data'
)
)
expected = {
'hive': 'HKLM',
'key': 'SOFTWARE\\Salt\\Test\\',
'success': True,
'vdata': 'fake_data',
'vname': 'fake_name',
'vtype': 'REG_SZ'
}
self.assertEqual(
win_reg.read_value(
hive='HKLM',
key='SOFTWARE\\Salt\\Test\\',
vname='fake_name'
),
expected
)
expected = {
'Deleted': [
'HKLM\\SOFTWARE\\Salt\\Test',
'HKLM\\SOFTWARE\\Salt'
],
'Failed': []
}
self.assertEqual(
win_reg.delete_key_recursive(
hive='HKLM',
key='SOFTWARE\\Salt'
),
expected
)
@destructiveTest
def test_set_value_default(self):
'''
Test the set_value function
'''
self.assertTrue(
win_reg.set_value(
hive='HKLM',
key='SOFTWARE\\Salt\\Test\\',
vdata='fake_default_data'
)
)
expected = {
'hive': 'HKLM',
'key': 'SOFTWARE\\Salt\\Test\\',
'success': True,
'vdata': 'fake_default_data',
'vname': '(Default)',
'vtype': 'REG_SZ'
}
self.assertEqual(
win_reg.read_value(
hive='HKLM',
key='SOFTWARE\\Salt\\Test\\',
),
expected
)
expected = {
'Deleted': [
'HKLM\\SOFTWARE\\Salt\\Test',
'HKLM\\SOFTWARE\\Salt'
],
'Failed': []
}
self.assertEqual(
win_reg.delete_key_recursive(
hive='HKLM',
key='SOFTWARE\\Salt'
),
expected
)
@destructiveTest
def test_delete_value(self):
'''
Test the delete_value function
'''
self.assertTrue(
win_reg.set_value(
hive='HKLM',
key='SOFTWARE\\Salt\\Test\\',
vname='fake_name',
vdata='fake_data'
)
)
self.assertTrue(
win_reg.delete_value(
hive='HKLM',
key='SOFTWARE\\Salt\\Test\\',
vname='fake_name'
)
)
expected = {
'Deleted': [
'HKLM\\SOFTWARE\\Salt\\Test',
'HKLM\\SOFTWARE\\Salt'
],
'Failed': []
}
self.assertEqual(
win_reg.delete_key_recursive(
hive='HKLM',
key='SOFTWARE\\Salt'
),
expected
)
def test_delete_value_non_existing(self):
'''
Test the delete_value function
'''
self.assertEqual(
win_reg.delete_value(
hive='HKLM',
key='SOFTWARE\\Salt\\Test\\',
vname='fake_name'
),
None
)