# Copyright (c) 2013 - 2017, Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""``test_service_lib.py``
`SystemD service library unittests`
"""
import unittest
from testlib.linux import service_lib
from unittest.mock import (patch, MagicMock)
__author__ = 'rbbratta'
[docs]class TestSystemd(unittest.TestCase):
[docs] def setUp(self):
self.service_name = "fake_service"
return_codes = service_lib.SystemdReturnCodes
self.service_command_generator = service_lib.ServiceCommandGenerator(
service_lib.systemd_command_generator,
return_codes,
)
[docs] def test_all_commands(self):
for cmd in (c for c in self.service_command_generator.commands
if c not in ["list", "daemon_reload"]):
ret = getattr(
self.service_command_generator, cmd)(self.service_name)
assert ret == ["systemctl", cmd.replace('_', '-'), "%s.service" % self.service_name]
[docs]class TestSpecificServiceManager(unittest.TestCase):
[docs] def setUp(self):
self.run_mock = MagicMock()
self.service_manager = service_lib.SpecificServiceManager("lldpad", self.run_mock)
[docs] def test_start(self):
service = "lldpad"
# should really use --generated-members, but start() is too generic
self.service_manager.start() # pylint: disable=no-member
assert self.run_mock.call_args[0][0] == "systemctl start %s.service" % service
[docs] def test_stop_with_args(self):
service = "lldpad"
self.service_manager.stop(ignore_status=True) # pylint: disable=no-member
assert self.run_mock.call_args[0][0] == "systemctl stop %s.service" % service
assert self.run_mock.call_args[1] == {'ignore_status': True}
[docs] def test_list_is_not_present_in_SpecificServiceManager(self):
assert not hasattr(self.service_manager, "list")
[docs]class TestSystemdServiceManager(unittest.TestCase):
[docs] def setUp(self):
self.run_mock = MagicMock()
self.service_manager = service_lib.SystemdServiceManager(self.run_mock)
[docs] def test_start(self):
service = "lldpad"
self.service_manager.start(service) # pylint: disable=no-member
assert self.run_mock.call_args[0][
0] == "systemctl start %s.service" % service
[docs] def test_list(self):
self.service_manager.list() # pylint: disable=no-member
assert self.run_mock.call_args[0][
0] == "systemctl list-unit-files --type=service"
[docs] def test_set_default_runlevel(self):
runlevel = "multi-user.target"
mktemp_mock = MagicMock(return_value="temp_filename")
symlink_mock = MagicMock()
rename_mock = MagicMock()
@patch.object(service_lib, "mktemp", mktemp_mock)
@patch("os.symlink", symlink_mock)
@patch("os.rename", rename_mock)
def _():
self.service_manager.change_default_runlevel(runlevel)
assert mktemp_mock.called
assert symlink_mock.call_args[0][0] == "/usr/lib/systemd/system/multi-user.target"
assert rename_mock.call_args[0][1] == "/etc/systemd/system/default.target"
_()
_examples = """
try:
service.start("lldpad")
pgrep("lldpad")
except CmdError, c:
c.err == "something"
try:
service.stop("fcoe", "force", ignoreStatus=True)
if not pgrep("fcoemon"):
pass
except:
pass
try:
service.stop("fcoe", "-HUP", ignoreStatus=True)
except:
pass
try:
service.start("boot.lldpad")
except:
pass
try:
try:
service.start("ntp")
except:
pass
"""