mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Add tests for salt.utils.win_reg
Fix some issues found in testing
This commit is contained in:
parent
f7112b19a2
commit
f15f92318d
2 changed files with 334 additions and 24 deletions
|
@ -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
|
||||
|
|
306
tests/unit/utils/test_win_reg.py
Normal file
306
tests/unit/utils/test_win_reg.py
Normal 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
|
||||
)
|
Loading…
Add table
Reference in a new issue