salt/tests/unit/modules/win_system_test.py

304 lines
12 KiB
Python

# -*- coding: utf-8 -*-
'''
:codeauthor: :email:`Rahul Handay <rahulha@saltstack.com>`
'''
# Import Python Libs
from __future__ import absolute_import
from datetime import datetime
# Import Salt Testing Libs
from salttesting import TestCase, skipIf
from salttesting.helpers import ensure_in_syspath
from salttesting.mock import (
MagicMock,
patch,
NO_MOCK,
NO_MOCK_REASON
)
ensure_in_syspath('../../')
# Import Salt Libs
from salt.modules import win_system
# Import 3rd Party Libs
try:
import win32net # pylint: disable=W0611
import win32api # pylint: disable=W0611
import pywintypes # pylint: disable=W0611
from ctypes import windll # pylint: disable=W0611
HAS_WIN32NET_MODS = True
except ImportError:
HAS_WIN32NET_MODS = False
win_system.__salt__ = {}
@skipIf(NO_MOCK, NO_MOCK_REASON)
class WinSystemTestCase(TestCase):
'''
Test cases for salt.modules.win_system
'''
def test_halt(self):
'''
Test to halt a running system
'''
mock = MagicMock(return_value='salt')
with patch.object(win_system, 'shutdown', mock):
self.assertEqual(win_system.halt(), 'salt')
def test_init(self):
'''
Test to change the system runlevel on sysV compatible systems
'''
self.assertEqual(win_system.init(3),
'Not implemented on Windows at this time.')
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_poweroff(self):
'''
Test to poweroff a running system
'''
mock = MagicMock(return_value='salt')
with patch.object(win_system, 'shutdown', mock):
self.assertEqual(win_system.poweroff(), 'salt')
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_reboot(self):
'''
Test to reboot the system
'''
mock = MagicMock(return_value='salt')
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertEqual(win_system.reboot(), 'salt')
mock.assert_called_once_with(['shutdown', '/r', '/t', '300'], python_shell=False)
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_reboot_with_timeout_in_minutes(self):
'''
Test to reboot the system with a timeout
'''
mock = MagicMock(return_value='salt')
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertEqual(win_system.reboot(5, in_seconds=False), 'salt')
mock.assert_called_once_with(['shutdown', '/r', '/t', '300'], python_shell=False)
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_reboot_with_timeout_in_seconds(self):
'''
Test to reboot the system with a timeout
'''
mock = MagicMock(return_value='salt')
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertEqual(win_system.reboot(5, in_seconds=True), 'salt')
mock.assert_called_once_with(['shutdown', '/r', '/t', '5'], python_shell=False)
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_reboot_with_wait(self):
'''
Test to reboot the system with a timeout and
wait for it to finish
'''
mock = MagicMock(return_value='salt')
sleep_mock = MagicMock(return_value='salt')
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
with patch('time.sleep', sleep_mock):
self.assertEqual(win_system.reboot(wait_for_reboot=True), 'salt')
mock.assert_called_once_with(['shutdown', '/r', '/t', '300'], python_shell=False)
sleep_mock.assert_called_once_with(330)
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_shutdown(self):
'''
Test to shutdown a running system
'''
mock = MagicMock(return_value='salt')
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertEqual(win_system.shutdown(), 'salt')
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_shutdown_hard(self):
'''
Test to shutdown a running system with no timeout or warning
'''
mock = MagicMock(return_value='salt')
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertEqual(win_system.shutdown_hard(), 'salt')
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_set_computer_name(self):
'''
Test to set the Windows computer name
'''
mock = MagicMock(side_effect=[{'Computer Name': {'Current': ""},
'ReturnValue = 0;': True},
{'Computer Name': {'Current': 'salt'}}])
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
mock = MagicMock(return_value='salt')
with patch.object(win_system, 'get_computer_name', mock):
mock = MagicMock(return_value=True)
with patch.object(win_system,
'get_pending_computer_name', mock):
self.assertDictEqual(win_system.set_computer_name("salt"),
{'Computer Name': {'Current': 'salt',
'Pending': True}})
self.assertFalse(win_system.set_computer_name("salt"))
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_get_pending_computer_name(self):
'''
Test to get a pending computer name.
'''
mock = MagicMock(return_value='salt')
with patch.object(win_system, 'get_computer_name', mock):
mock = MagicMock(side_effect=['salt0',
'ComputerName REG_SZ (salt)'])
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertFalse(win_system.get_pending_computer_name())
self.assertEqual(win_system.get_pending_computer_name(),
'(salt)')
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_get_computer_name(self):
'''
Test to get the Windows computer name
'''
mock = MagicMock(side_effect=['Server Name Salt', 'Salt'])
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertEqual(win_system.get_computer_name(), 'Salt')
self.assertFalse(win_system.get_computer_name())
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_set_computer_desc(self):
'''
Test to set the Windows computer description
'''
mock = MagicMock(return_value=True)
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
mock = MagicMock(return_value="Salt's comp")
with patch.object(win_system, 'get_computer_desc', mock):
self.assertDictEqual(win_system.set_computer_desc(
"Salt's comp"
),
{'Computer Description': "Salt's comp"})
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_get_computer_desc(self):
'''
Test to get the Windows computer description
'''
mock = MagicMock(side_effect=['Server Comment Salt', 'Salt'])
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertEqual(win_system.get_computer_desc(), 'Salt')
self.assertFalse(win_system.get_computer_desc())
@skipIf(not HAS_WIN32NET_MODS, 'this test needs w32net and other windows libraries')
def test_join_domain(self):
'''
Test to join a computer to an Active Directory domain
'''
mock = MagicMock(side_effect=[{'ReturnValue = 0;': True},
{'Salt': True}])
with patch.dict(win_system.__salt__, {'cmd.run': mock}):
self.assertDictEqual(win_system.join_domain("saltstack",
"salt",
"salt@123"),
{'Domain': 'saltstack'})
self.assertFalse(win_system.join_domain("saltstack",
"salt",
"salt@123"))
def test_get_system_time(self):
'''
Test to get system time
'''
tm = datetime.strftime(datetime.now(), "%I:%M %p")
win_tm = win_system.get_system_time()
try:
self.assertEqual(win_tm, tm)
except AssertionError:
# handle race condition
import re
self.assertTrue(re.search(r'^\d{2}:\d{2} \w{2}$', win_tm))
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_set_system_time(self):
'''
Test to set system time
'''
mock = MagicMock(side_effect=[False, True])
with patch.object(win_system, '_validate_time', mock):
self.assertFalse(win_system.set_system_time("11:31:15 AM"))
mock = MagicMock(return_value=True)
with patch.dict(win_system.__salt__, {'cmd.retcode': mock}):
self.assertFalse(win_system.set_system_time("11:31:15 AM"))
def test_get_system_date(self):
'''
Test to get system date
'''
date = datetime.strftime(datetime.now(), "%a %m/%d/%Y")
self.assertEqual(win_system.get_system_date(), date)
@skipIf(not HAS_WIN32NET_MODS, 'this test needs the w32net library')
def test_set_system_date(self):
'''
Test to set system date
'''
mock = MagicMock(side_effect=[False, True])
with patch.object(win_system, '_validate_date', mock):
self.assertFalse(win_system.set_system_date("03-28-13"))
mock = MagicMock(return_value=True)
with patch.dict(win_system.__salt__, {'cmd.retcode': mock}):
self.assertFalse(win_system.set_system_date("03-28-13"))
def test_start_time_service(self):
'''
Test to start the Windows time service
'''
mock = MagicMock(return_value=True)
with patch.dict(win_system.__salt__, {'service.start': mock}):
self.assertTrue(win_system.start_time_service())
def test_stop_time_service(self):
'''
Test to stop the windows time service
'''
mock = MagicMock(return_value=True)
with patch.dict(win_system.__salt__, {'service.stop': mock}):
self.assertTrue(win_system.stop_time_service())
def test_set_hostname(self):
'''
Test setting a new hostname
'''
cmd_run_mock = MagicMock(return_value="Method execution successful.")
get_hostname = MagicMock(return_value="MINION")
with patch.dict(win_system.__salt__, {'cmd.run': cmd_run_mock}):
with patch.object(win_system, 'get_hostname', get_hostname):
win_system.set_hostname("NEW")
cmd_run_mock.assert_called_once_with(cmd="wmic computersystem where name='MINION' call rename name='NEW'")
def test_get_hostname(self):
'''
Test setting a new hostname
'''
cmd_run_mock = MagicMock(return_value="Name\nMINION")
with patch.dict(win_system.__salt__, {'cmd.run': cmd_run_mock}):
ret = win_system.get_hostname()
self.assertEqual(ret, "MINION")
cmd_run_mock.assert_called_once_with(cmd="wmic computersystem get name")
if __name__ == '__main__':
from integration import run_tests
run_tests(WinSystemTestCase, needs_daemon=False)