diff --git a/tests/filename_map.yml b/tests/filename_map.yml index 7a47425f6f6..693b1baf7c6 100644 --- a/tests/filename_map.yml +++ b/tests/filename_map.yml @@ -225,12 +225,13 @@ salt/utils/docker/*: - unit.utils.test_docker salt/utils/schedule.py: - - integration.scheduler.test_error - - integration.scheduler.test_eval - - integration.scheduler.test_postpone - - integration.scheduler.test_skip - - integration.scheduler.test_maxrunning - - integration.scheduler.test_helpers + - unit.utils.scheduler.test_error + - unit.utils.scheduler.test_eval + - unit.utils.scheduler.test_postpone + - unit.utils.scheduler.test_skip + - unit.utils.scheduler.test_maxrunning + - unit.utils.scheduler.test_helpers + - unit.utils.scheduler.test_schedule salt/utils/vt.py: - integration.cli.test_custom_module diff --git a/tests/integration/scheduler/test_helpers.py b/tests/integration/scheduler/test_helpers.py deleted file mode 100644 index d3c8b8f8a11..00000000000 --- a/tests/integration/scheduler/test_helpers.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import absolute_import - -import copy -import logging -import os - -import pytest -import salt.utils.platform -import salt.utils.schedule -from salt.modules.test import ping -from tests.support.case import ModuleCase -from tests.support.mixins import SaltReturnAssertsMixin -from tests.support.mock import MagicMock, patch -from tests.support.runtests import RUNTIME_VARS - -log = logging.getLogger(__name__) -ROOT_DIR = os.path.join(RUNTIME_VARS.TMP, "schedule-unit-tests") -SOCK_DIR = os.path.join(ROOT_DIR, "test-socks") - -DEFAULT_CONFIG = salt.config.minion_config(None) -DEFAULT_CONFIG["conf_dir"] = ROOT_DIR -DEFAULT_CONFIG["root_dir"] = ROOT_DIR -DEFAULT_CONFIG["sock_dir"] = SOCK_DIR -DEFAULT_CONFIG["pki_dir"] = os.path.join(ROOT_DIR, "pki") -DEFAULT_CONFIG["cachedir"] = os.path.join(ROOT_DIR, "cache") - - -@pytest.mark.windows_whitelisted -class SchedulerHelpersTest(ModuleCase, SaltReturnAssertsMixin): - """ - Test scheduler helper functions - """ - - def setUp(self): - with patch("salt.utils.schedule.clean_proc_dir", MagicMock(return_value=None)): - functions = {"test.ping": ping} - self.schedule = salt.utils.schedule.Schedule( - copy.deepcopy(DEFAULT_CONFIG), functions, returners={} - ) - self.schedule.opts["loop_interval"] = 1 - - def tearDown(self): - self.schedule.reset() - - def test_get_schedule(self): - """ - verify that the _get_schedule function works - when remove_hidden is True and schedule data - contains enabled key - """ - job_name = "test_get_schedule" - job = { - "schedule": { - "enabled": True, - job_name: {"function": "test.ping", "seconds": 60}, - } - } - # Add the job to the scheduler - self.schedule.opts.update(job) - - ret = self.schedule._get_schedule(remove_hidden=True) - self.assertEqual(job["schedule"], ret) diff --git a/tests/integration/scheduler/test_run_job.py b/tests/integration/scheduler/test_run_job.py deleted file mode 100644 index ad58751d1d0..00000000000 --- a/tests/integration/scheduler/test_run_job.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- - -# Import Python libs -from __future__ import absolute_import - -import copy -import logging -import os - -import salt.utils.platform - -# Import Salt libs -import salt.utils.schedule -from salt.modules.test import ping - -# Import Salt Testing libs -from tests.support.case import ModuleCase -from tests.support.mixins import SaltReturnAssertsMixin -from tests.support.mock import MagicMock, patch -from tests.support.runtests import RUNTIME_VARS - -try: - import croniter # pylint: disable=W0611 - - HAS_CRONITER = True -except ImportError: - HAS_CRONITER = False - -log = logging.getLogger(__name__) -ROOT_DIR = os.path.join(RUNTIME_VARS.TMP, "schedule-unit-tests") -SOCK_DIR = os.path.join(ROOT_DIR, "test-socks") - -DEFAULT_CONFIG = salt.config.minion_config(None) -DEFAULT_CONFIG["conf_dir"] = ROOT_DIR -DEFAULT_CONFIG["root_dir"] = ROOT_DIR -DEFAULT_CONFIG["sock_dir"] = SOCK_DIR -DEFAULT_CONFIG["pki_dir"] = os.path.join(ROOT_DIR, "pki") -DEFAULT_CONFIG["cachedir"] = os.path.join(ROOT_DIR, "cache") - - -class SchedulerRunJobTest(ModuleCase, SaltReturnAssertsMixin): - """ - Validate the pkg module - """ - - def setUp(self): - with patch("salt.utils.schedule.clean_proc_dir", MagicMock(return_value=None)): - functions = {"test.ping": ping} - self.schedule = salt.utils.schedule.Schedule( - copy.deepcopy(DEFAULT_CONFIG), functions, returners={} - ) - self.schedule.opts["loop_interval"] = 1 - - def tearDown(self): - self.schedule.reset() - - def test_run_job(self): - """ - verify that scheduled job runs - """ - job_name = "test_run_job" - job = {"schedule": {job_name: {"function": "test.ping"}}} - # Add the job to the scheduler - self.schedule.opts.update(job) - - # Run job - self.schedule.run_job(job_name) - ret = self.schedule.job_status(job_name) - expected = {"function": "test.ping", "run": True, "name": "test_run_job"} - self.assertEqual(ret, expected) diff --git a/tests/runtests.py b/tests/runtests.py index ce2670631d6..315a6429171 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -129,7 +129,6 @@ TEST_SUITES_UNORDERED = { "proxy": {"display_name": "Proxy", "path": "integration/proxy"}, "external_api": {"display_name": "ExternalAPIs", "path": "integration/externalapi"}, "daemons": {"display_name": "Daemon", "path": "integration/daemons"}, - "scheduler": {"display_name": "Scheduler", "path": "integration/scheduler"}, "sdb": {"display_name": "Sdb", "path": "integration/sdb"}, "logging": {"display_name": "Logging", "path": "integration/logging"}, } diff --git a/tests/unit/test_module_names.py b/tests/unit/test_module_names.py index bdb9c6f93a3..971aedc86ef 100644 --- a/tests/unit/test_module_names.py +++ b/tests/unit/test_module_names.py @@ -50,6 +50,7 @@ EXCLUDED_FILES = [ os.path.join("tests", "virtualname.py"), os.path.join("tests", "committer_parser.py"), os.path.join("tests", "zypp_plugin.py"), + os.path.join("tests", "unit", "utils", "scheduler", "base.py"), os.path.join("tests", "unit", "transport", "mixins.py"), os.path.join("tests", "integration", "utils", "testprogram.py"), ] @@ -161,13 +162,14 @@ class BadTestModuleNamesTestCase(TestCase): "integration.reactor.test_reactor", "integration.returners.test_noop_return", "integration.runners.test_runner_returns", - "integration.scheduler.test_error", - "integration.scheduler.test_eval", - "integration.scheduler.test_postpone", - "integration.scheduler.test_skip", - "integration.scheduler.test_maxrunning", - "integration.scheduler.test_helpers", - "integration.scheduler.test_run_job", + "unit.utils.scheduler.test_error", + "unit.utils.scheduler.test_eval", + "unit.utils.scheduler.test_postpone", + "unit.utils.scheduler.test_skip", + "unit.utils.scheduler.test_maxrunning", + "unit.utils.scheduler.test_helpers", + "unit.utils.scheduler.test_run_job", + "unit.utils.scheduler.test_schedule", "integration.setup.test_bdist", "integration.setup.test_egg", "integration.shell.test_spm", diff --git a/tests/integration/scheduler/__init__.py b/tests/unit/utils/scheduler/__init__.py similarity index 100% rename from tests/integration/scheduler/__init__.py rename to tests/unit/utils/scheduler/__init__.py diff --git a/tests/unit/utils/scheduler/base.py b/tests/unit/utils/scheduler/base.py new file mode 100644 index 00000000000..e95ccae44cc --- /dev/null +++ b/tests/unit/utils/scheduler/base.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +""" + tests.unit.utils.scheduler.base + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +""" + +from __future__ import absolute_import + +import copy +import logging +import os + +import salt.utils.platform +import salt.utils.schedule +from salt.modules.test import ping +from salt.utils.process import SubprocessList +from tests.support.case import TestCase +from tests.support.mixins import SaltReturnAssertsMixin +from tests.support.mock import MagicMock, patch +from tests.support.processes import terminate_process +from tests.support.runtests import RUNTIME_VARS + +log = logging.getLogger(__name__) + + +class SchedulerTestsBase(TestCase, SaltReturnAssertsMixin): + """ + Validate the pkg module + """ + + @classmethod + def setUpClass(cls): + root_dir = os.path.join(RUNTIME_VARS.TMP, "schedule-unit-tests") + sock_dir = os.path.join(root_dir, "test-socks") + + default_config = salt.config.minion_config(None) + default_config["conf_dir"] = root_dir + default_config["root_dir"] = root_dir + default_config["sock_dir"] = sock_dir + default_config["pki_dir"] = os.path.join(root_dir, "pki") + default_config["cachedir"] = os.path.join(root_dir, "cache") + cls.default_config = default_config + cls.subprocess_list = SubprocessList() + + @classmethod + def tearDownClass(cls): + del cls.default_config + del cls.subprocess_list + + def setUp(self): + with patch("salt.utils.schedule.clean_proc_dir", MagicMock(return_value=None)): + functions = {"test.ping": ping} + self.schedule = salt.utils.schedule.Schedule( + copy.deepcopy(self.default_config), functions, returners={} + ) + self.schedule._subprocess_list = self.subprocess_list + + def tearDown(self): + subprocess_list = self.subprocess_list + processes = subprocess_list.processes + self.schedule.reset() + del self.schedule + for proc in processes: + if proc.is_alive(): + terminate_process(proc.pid, kill_children=True, slow_stop=True) + subprocess_list.cleanup() + processes = subprocess_list.processes + if processes: + for proc in processes: + if proc.is_alive(): + terminate_process(proc.pid, kill_children=True, slow_stop=False) + subprocess_list.cleanup() + processes = subprocess_list.processes + if processes: + log.warning("Processes left running: %s", processes) diff --git a/tests/integration/scheduler/test_error.py b/tests/unit/utils/scheduler/test_error.py similarity index 76% rename from tests/integration/scheduler/test_error.py rename to tests/unit/utils/scheduler/test_error.py index c103054a7c2..6428164daaa 100644 --- a/tests/integration/scheduler/test_error.py +++ b/tests/unit/utils/scheduler/test_error.py @@ -1,62 +1,40 @@ # -*- coding: utf-8 -*- -# Import Python libs from __future__ import absolute_import -import copy import logging -import os -import dateutil.parser as dateutil_parser - -# Import Salt libs -import salt.utils.schedule -from salt.modules.test import ping - -# Import Salt Testing libs -from tests.support.case import ModuleCase -from tests.support.mixins import SaltReturnAssertsMixin from tests.support.mock import MagicMock, patch -from tests.support.runtests import RUNTIME_VARS from tests.support.unit import skipIf +from tests.unit.utils.scheduler.base import SchedulerTestsBase try: - import croniter # pylint: disable=W0611 + import dateutil.parser + + HAS_DATEUTIL_PARSER = True +except ImportError: + HAS_DATEUTIL_PARSER = False + +try: + import croniter # pylint: disable=unused-import HAS_CRONITER = True except ImportError: HAS_CRONITER = False log = logging.getLogger(__name__) -ROOT_DIR = os.path.join(RUNTIME_VARS.TMP, "schedule-unit-tests") -SOCK_DIR = os.path.join(ROOT_DIR, "test-socks") - -DEFAULT_CONFIG = salt.config.minion_config(None) -DEFAULT_CONFIG["conf_dir"] = ROOT_DIR -DEFAULT_CONFIG["root_dir"] = ROOT_DIR -DEFAULT_CONFIG["sock_dir"] = SOCK_DIR -DEFAULT_CONFIG["pki_dir"] = os.path.join(ROOT_DIR, "pki") -DEFAULT_CONFIG["cachedir"] = os.path.join(ROOT_DIR, "cache") -class SchedulerErrorTest(ModuleCase, SaltReturnAssertsMixin): - """ - Validate the pkg module - """ - +@skipIf( + HAS_DATEUTIL_PARSER is False, "The 'dateutil.parser' library is not available", +) +class SchedulerErrorTest(SchedulerTestsBase): def setUp(self): - with patch("salt.utils.schedule.clean_proc_dir", MagicMock(return_value=None)): - functions = {"test.ping": ping} - self.schedule = salt.utils.schedule.Schedule( - copy.deepcopy(DEFAULT_CONFIG), functions, returners={} - ) + super(SchedulerErrorTest, self).setUp() self.schedule.opts["loop_interval"] = 1 self.schedule.opts["grains"]["whens"] = {"tea time": "11/29/2017 12:00pm"} - def tearDown(self): - self.schedule.reset() - @skipIf(not HAS_CRONITER, "Cannot find croniter python module") def test_eval_cron_invalid(self): """ @@ -67,7 +45,7 @@ class SchedulerErrorTest(ModuleCase, SaltReturnAssertsMixin): # Add the job to the scheduler self.schedule.opts.update(job) - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") with patch("croniter.croniter.get_next", MagicMock(return_value=run_time)): self.schedule.eval(now=run_time) @@ -79,7 +57,7 @@ class SchedulerErrorTest(ModuleCase, SaltReturnAssertsMixin): verify that scheduled job does not run and returns the right error """ - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") job = { "schedule": {"job1": {"function": "test.ping", "when": "13/29/2017 1:00pm"}} @@ -100,7 +78,7 @@ class SchedulerErrorTest(ModuleCase, SaltReturnAssertsMixin): verify that scheduled job does not run and returns the right error """ - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") job = {"schedule": {"job1": {"function": "test.ping", "when": "tea time"}}} @@ -126,7 +104,7 @@ class SchedulerErrorTest(ModuleCase, SaltReturnAssertsMixin): "job1": {"function": "test.ping", "once": "2017-13-13T13:00:00"} } } - run_time = dateutil_parser.parse("12/13/2017 1:00pm") + run_time = dateutil.parser.parse("12/13/2017 1:00pm") # Add the job to the scheduler self.schedule.opts.update(job) @@ -161,12 +139,12 @@ class SchedulerErrorTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 3:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 3:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status("job1") # eval at 4:00pm to prime - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status("job1") _expected = ( @@ -194,12 +172,12 @@ class SchedulerErrorTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 3:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 3:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status("job1") # eval at 4:00pm to prime - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status("job1") _expected = ( @@ -229,12 +207,12 @@ class SchedulerErrorTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 3:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 3:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status("job1") # eval at 4:00pm to prime - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status("job1") _expected = ( diff --git a/tests/integration/scheduler/test_eval.py b/tests/unit/utils/scheduler/test_eval.py similarity index 85% rename from tests/integration/scheduler/test_eval.py rename to tests/unit/utils/scheduler/test_eval.py index 00217e71937..68e94a20019 100644 --- a/tests/integration/scheduler/test_eval.py +++ b/tests/unit/utils/scheduler/test_eval.py @@ -2,25 +2,20 @@ from __future__ import absolute_import -import copy import datetime import logging -import os import random import time import pytest import salt.utils.platform import salt.utils.schedule -from salt.modules.test import ping -from tests.support.case import ModuleCase -from tests.support.mixins import SaltReturnAssertsMixin from tests.support.mock import MagicMock, patch -from tests.support.runtests import RUNTIME_VARS from tests.support.unit import skipIf +from tests.unit.utils.scheduler.base import SchedulerTestsBase try: - import dateutil.parser as dateutil_parser + import dateutil.parser HAS_DATEUTIL_PARSER = True except ImportError: @@ -35,32 +30,16 @@ except ImportError: HAS_CRONITER = False log = logging.getLogger(__name__) -ROOT_DIR = os.path.join(RUNTIME_VARS.TMP, "schedule-unit-tests") -SOCK_DIR = os.path.join(ROOT_DIR, "test-socks") - -DEFAULT_CONFIG = salt.config.minion_config(None) -DEFAULT_CONFIG["conf_dir"] = ROOT_DIR -DEFAULT_CONFIG["root_dir"] = ROOT_DIR -DEFAULT_CONFIG["sock_dir"] = SOCK_DIR -DEFAULT_CONFIG["pki_dir"] = os.path.join(ROOT_DIR, "pki") -DEFAULT_CONFIG["cachedir"] = os.path.join(ROOT_DIR, "cache") -@skipIf(HAS_DATEUTIL_PARSER is False, "The 'dateutil.parser' library is not available") +@skipIf( + HAS_DATEUTIL_PARSER is False, "The 'dateutil.parser' library is not available", +) @pytest.mark.windows_whitelisted -class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): - """ - Validate the pkg module - """ - +class SchedulerEvalTest(SchedulerTestsBase): def setUp(self): - with patch("salt.utils.schedule.clean_proc_dir", MagicMock(return_value=None)): - functions = {"test.ping": ping} - self.schedule = salt.utils.schedule.Schedule( - copy.deepcopy(DEFAULT_CONFIG), functions, returners={} - ) + super(SchedulerEvalTest, self).setUp() self.schedule.opts["loop_interval"] = 1 - self.schedule.opts["grains"]["whens"] = {"tea time": "11/29/2017 12:00pm"} def tearDown(self): @@ -77,7 +56,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): job_name: {"function": "test.ping", "when": "11/29/2017 4:00pm"} } } - run_time2 = dateutil_parser.parse("11/29/2017 4:00pm") + run_time2 = dateutil.parser.parse("11/29/2017 4:00pm") run_time1 = run_time2 - datetime.timedelta(seconds=1) # Add the job to the scheduler @@ -110,8 +89,8 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): if salt.utils.platform.is_darwin(): job["schedule"][job_name]["dry_run"] = True - run_time1 = dateutil_parser.parse("11/29/2017 4:00pm") - run_time2 = dateutil_parser.parse("11/29/2017 5:00pm") + run_time1 = dateutil.parser.parse("11/29/2017 4:00pm") + run_time2 = dateutil.parser.parse("11/29/2017 5:00pm") # Add the job to the scheduler self.schedule.opts.update(job) @@ -135,7 +114,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): """ job_name = "test_eval_whens" job = {"schedule": {job_name: {"function": "test.ping", "when": "tea time"}}} - run_time = dateutil_parser.parse("11/29/2017 12:00pm") + run_time = dateutil.parser.parse("11/29/2017 12:00pm") # Add the job to the scheduler self.schedule.opts.update(job) @@ -160,7 +139,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): LOOP_INTERVAL = random.randint(30, 59) self.schedule.opts["loop_interval"] = LOOP_INTERVAL - run_time2 = dateutil_parser.parse("11/29/2017 4:00pm") + run_time2 = dateutil.parser.parse("11/29/2017 4:00pm") # Add the job to the scheduler self.schedule.opts.update(job) @@ -194,10 +173,10 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): LOOP_INTERVAL = random.randint(30, 59) self.schedule.opts["loop_interval"] = LOOP_INTERVAL - run_time1 = dateutil_parser.parse("11/29/2017 4:00pm") + datetime.timedelta( + run_time1 = dateutil.parser.parse("11/29/2017 4:00pm") + datetime.timedelta( seconds=LOOP_INTERVAL ) - run_time2 = dateutil_parser.parse("11/29/2017 5:00pm") + datetime.timedelta( + run_time2 = dateutil.parser.parse("11/29/2017 5:00pm") + datetime.timedelta( seconds=LOOP_INTERVAL ) @@ -227,7 +206,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): job_name: {"function": "test.ping", "once": "2017-12-13T13:00:00"} } } - run_time = dateutil_parser.parse("12/13/2017 1:00pm") + run_time = dateutil.parser.parse("12/13/2017 1:00pm") # Add the job to the scheduler self.schedule.opts["schedule"] = {} @@ -254,7 +233,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts["loop_interval"] = LOOP_INTERVAL # Run the job at the right plus LOOP_INTERVAL - run_time = dateutil_parser.parse("12/13/2017 1:00pm") + datetime.timedelta( + run_time = dateutil.parser.parse("12/13/2017 1:00pm") + datetime.timedelta( seconds=LOOP_INTERVAL ) @@ -279,7 +258,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): # Add the job to the scheduler self.schedule.opts.update(job) - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") with patch("croniter.croniter.get_next", MagicMock(return_value=run_time)): self.schedule.eval(now=run_time) @@ -302,7 +281,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): # Add the job to the scheduler self.schedule.opts.update(job) - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") with patch("croniter.croniter.get_next", MagicMock(return_value=run_time)): self.schedule.eval(now=run_time) @@ -334,12 +313,12 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # eval at 3:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 3:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -347,7 +326,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 4:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -355,7 +334,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 5:00pm, will not run - run_time = dateutil_parser.parse("11/29/2017 5:00pm") + run_time = dateutil.parser.parse("11/29/2017 5:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_skip_reason"], "until_passed") @@ -382,33 +361,33 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # eval at 3:00pm, will not run. - run_time = dateutil_parser.parse("11/29/2017 3:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_skip_reason"], "after_not_passed") self.assertEqual(ret["_skipped_time"], run_time) # eval at 4:00pm, will not run. - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_skip_reason"], "after_not_passed") self.assertEqual(ret["_skipped_time"], run_time) # eval at 5:00pm, will not run - run_time = dateutil_parser.parse("11/29/2017 5:00pm") + run_time = dateutil.parser.parse("11/29/2017 5:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_skip_reason"], "after_not_passed") self.assertEqual(ret["_skipped_time"], run_time) # eval at 6:00pm, will run - run_time = dateutil_parser.parse("11/29/2017 6:00pm") + run_time = dateutil.parser.parse("11/29/2017 6:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -425,7 +404,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): job_name: {"function": "test.ping", "when": "11/29/2017 4:00pm"}, } } - run_time1 = dateutil_parser.parse("11/29/2017 4:00pm") + run_time1 = dateutil.parser.parse("11/29/2017 4:00pm") # Add the job to the scheduler self.schedule.opts.update(job) @@ -449,7 +428,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): job_name: {"function": "test.ping", "when": "11/29/2017 4:00pm"}, } } - run_time2 = dateutil_parser.parse("11/29/2017 4:00pm") + run_time2 = dateutil.parser.parse("11/29/2017 4:00pm") run_time1 = run_time2 - datetime.timedelta(seconds=1) # Add the job to the scheduler @@ -476,7 +455,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): job_name: {"function": "test.ping", "when": "11/29/2017 4:00pm"}, } } - run_time1 = dateutil_parser.parse("11/29/2017 4:00pm") + run_time1 = dateutil.parser.parse("11/29/2017 4:00pm") # Add the job to the scheduler self.schedule.opts.update(job) @@ -505,7 +484,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): }, } } - run_time1 = dateutil_parser.parse("11/29/2017 4:00pm") + run_time1 = dateutil.parser.parse("11/29/2017 4:00pm") # Add the job to the scheduler self.schedule.opts.update(job) @@ -535,13 +514,13 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 2:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) # eval at 3:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 3:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -562,12 +541,12 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): with patch("random.randint", MagicMock(return_value=10)): # eval at 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # eval at 2:00:40pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:00:40pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:40pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -593,12 +572,12 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): with patch("random.randint", MagicMock(return_value=10)): # eval at 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # eval at 2:00:40pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:00:40pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:40pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -621,12 +600,12 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): with patch("random.randint", MagicMock(return_value=10)): # eval at 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # eval at 2:00:40pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:00:40pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:40pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -646,21 +625,21 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") next_run_time = run_time + datetime.timedelta(seconds=30) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_next_fire_time"], next_run_time) # eval at 2:00:01pm, will not run. - run_time = dateutil_parser.parse("11/29/2017 2:00:01pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:01pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertNotIn("_last_run", ret) self.assertEqual(ret["_next_fire_time"], next_run_time) # eval at 2:00:30pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:00:30pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:30pm") next_run_time = run_time + datetime.timedelta(seconds=30) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -670,7 +649,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 2:01:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:01:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:01:00pm") next_run_time = run_time + datetime.timedelta(seconds=30) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -680,7 +659,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 2:01:30pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:01:30pm") + run_time = dateutil.parser.parse("11/29/2017 2:01:30pm") next_run_time = run_time + datetime.timedelta(seconds=30) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -702,21 +681,21 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") next_run_time = run_time + datetime.timedelta(minutes=30) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_next_fire_time"], next_run_time) # eval at 2:00:01pm, will not run. - run_time = dateutil_parser.parse("11/29/2017 2:00:01pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:01pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertNotIn("_last_run", ret) self.assertEqual(ret["_next_fire_time"], next_run_time) # eval at 2:30:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:30:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:30:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -724,7 +703,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 3:00:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 3:00:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -732,7 +711,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 3:30:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 3:30:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:30:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -752,21 +731,21 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") next_run_time = run_time + datetime.timedelta(hours=2) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_next_fire_time"], next_run_time) # eval at 2:00:01pm, will not run. - run_time = dateutil_parser.parse("11/29/2017 2:00:01pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:01pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertNotIn("_last_run", ret) self.assertEqual(ret["_next_fire_time"], next_run_time) # eval at 4:00:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 4:00:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -774,7 +753,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 6:00:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 6:00:00pm") + run_time = dateutil.parser.parse("11/29/2017 6:00:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -782,7 +761,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 8:00:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 8:00:00pm") + run_time = dateutil.parser.parse("11/29/2017 8:00:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -806,14 +785,14 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 11/23/2017 2:00pm to prime, simulate minion start up. - run_time = dateutil_parser.parse("11/23/2017 2:00pm") + run_time = dateutil.parser.parse("11/23/2017 2:00pm") next_run_time = run_time + datetime.timedelta(days=2) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_next_fire_time"], next_run_time) # eval at 11/25/2017 2:00:00pm, will run. - run_time = dateutil_parser.parse("11/25/2017 2:00:00pm") + run_time = dateutil.parser.parse("11/25/2017 2:00:00pm") next_run_time = run_time + datetime.timedelta(days=2) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -821,7 +800,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): self.assertEqual(ret["_next_fire_time"], next_run_time) # eval at 11/26/2017 2:00:00pm, will not run. - run_time = dateutil_parser.parse("11/26/2017 2:00:00pm") + run_time = dateutil.parser.parse("11/26/2017 2:00:00pm") last_run_time = run_time - datetime.timedelta(days=1) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -831,7 +810,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 11/27/2017 2:00:00pm, will run. - run_time = dateutil_parser.parse("11/27/2017 2:00:00pm") + run_time = dateutil.parser.parse("11/27/2017 2:00:00pm") next_run_time = run_time + datetime.timedelta(days=2) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -841,7 +820,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 11/28/2017 2:00:00pm, will not run. - run_time = dateutil_parser.parse("11/28/2017 2:00:00pm") + run_time = dateutil.parser.parse("11/28/2017 2:00:00pm") last_run_time = run_time - datetime.timedelta(days=1) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -851,7 +830,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): time.sleep(2) # eval at 11/29/2017 2:00:00pm, will run. - run_time = dateutil_parser.parse("11/29/2017 2:00:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:00pm") next_run_time = run_time + datetime.timedelta(days=2) self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -874,7 +853,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): } } } - run_time1 = dateutil_parser.parse("11/29/2017 4:00pm") + run_time1 = dateutil.parser.parse("11/29/2017 4:00pm") run_time2 = run_time1 + datetime.timedelta(seconds=splay) run_time3 = run_time2 + datetime.timedelta(seconds=1) @@ -883,7 +862,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): with patch("random.randint", MagicMock(return_value=splay)): # Evaluate to prime - run_time = dateutil_parser.parse("11/29/2017 3:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) @@ -919,13 +898,13 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin): } } } - run_time1 = dateutil_parser.parse("11/29/2017 4:00pm") + run_time1 = dateutil.parser.parse("11/29/2017 4:00pm") # Add the job to the scheduler self.schedule.opts.update(job) # Evaluate to prime - run_time = dateutil_parser.parse("11/29/2017 3:00pm") + run_time = dateutil.parser.parse("11/29/2017 3:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) diff --git a/tests/unit/utils/scheduler/test_helpers.py b/tests/unit/utils/scheduler/test_helpers.py new file mode 100644 index 00000000000..cda8fdc4ce2 --- /dev/null +++ b/tests/unit/utils/scheduler/test_helpers.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +import logging + +from tests.unit.utils.scheduler.base import SchedulerTestsBase + +log = logging.getLogger(__name__) + + +class SchedulerHelpersTest(SchedulerTestsBase): + """ + Test scheduler helper functions + """ + + def setUp(self): + super(SchedulerHelpersTest, self).setUp() + self.schedule.opts["loop_interval"] = 1 + + def test_get_schedule(self): + """ + verify that the _get_schedule function works + when remove_hidden is True and schedule data + contains enabled key + """ + job_name = "test_get_schedule" + job = { + "schedule": { + "enabled": True, + job_name: {"function": "test.ping", "seconds": 60}, + } + } + # Add the job to the scheduler + self.schedule.opts.update(job) + + ret = self.schedule._get_schedule(remove_hidden=True) + self.assertEqual(job["schedule"], ret) diff --git a/tests/integration/scheduler/test_maxrunning.py b/tests/unit/utils/scheduler/test_maxrunning.py similarity index 74% rename from tests/integration/scheduler/test_maxrunning.py rename to tests/unit/utils/scheduler/test_maxrunning.py index e09b3fa31d6..f9e884233ab 100644 --- a/tests/integration/scheduler/test_maxrunning.py +++ b/tests/unit/utils/scheduler/test_maxrunning.py @@ -1,59 +1,25 @@ # -*- coding: utf-8 -*- -# Import Python libs from __future__ import absolute_import -import copy import logging -import os import dateutil.parser as dateutil_parser - -# Import Salt libs -import salt.utils.schedule -from salt.modules.test import ping - -# Import Salt Testing libs -from tests.support.case import ModuleCase -from tests.support.mixins import SaltReturnAssertsMixin from tests.support.mock import MagicMock, patch -from tests.support.runtests import RUNTIME_VARS - -try: - import croniter # pylint: disable=W0611 - - HAS_CRONITER = True -except ImportError: - HAS_CRONITER = False +from tests.unit.utils.scheduler.base import SchedulerTestsBase log = logging.getLogger(__name__) -ROOT_DIR = os.path.join(RUNTIME_VARS.TMP, "schedule-unit-tests") -SOCK_DIR = os.path.join(ROOT_DIR, "test-socks") - -DEFAULT_CONFIG = salt.config.minion_config(None) -DEFAULT_CONFIG["conf_dir"] = ROOT_DIR -DEFAULT_CONFIG["root_dir"] = ROOT_DIR -DEFAULT_CONFIG["sock_dir"] = SOCK_DIR -DEFAULT_CONFIG["pki_dir"] = os.path.join(ROOT_DIR, "pki") -DEFAULT_CONFIG["cachedir"] = os.path.join(ROOT_DIR, "cache") -class SchedulerMaxRunningTest(ModuleCase, SaltReturnAssertsMixin): +class SchedulerMaxRunningTest(SchedulerTestsBase): """ Validate the pkg module """ def setUp(self): - with patch("salt.utils.schedule.clean_proc_dir", MagicMock(return_value=None)): - functions = {"test.ping": ping} - self.schedule = salt.utils.schedule.Schedule( - copy.deepcopy(DEFAULT_CONFIG), functions, returners={} - ) + super(SchedulerMaxRunningTest, self).setUp() self.schedule.opts["loop_interval"] = 1 - def tearDown(self): - self.schedule.reset() - def test_maxrunning_minion(self): """ verify that scheduled job runs diff --git a/tests/integration/scheduler/test_postpone.py b/tests/unit/utils/scheduler/test_postpone.py similarity index 60% rename from tests/integration/scheduler/test_postpone.py rename to tests/unit/utils/scheduler/test_postpone.py index a9a59fa8355..0ecbbf81307 100644 --- a/tests/integration/scheduler/test_postpone.py +++ b/tests/unit/utils/scheduler/test_postpone.py @@ -2,45 +2,32 @@ from __future__ import absolute_import -import copy import datetime import logging -import os -import dateutil.parser as dateutil_parser -import pytest -import salt.utils.schedule -from salt.modules.test import ping -from tests.support.case import ModuleCase -from tests.support.mixins import SaltReturnAssertsMixin -from tests.support.mock import MagicMock, patch -from tests.support.runtests import RUNTIME_VARS from tests.support.unit import skipIf +from tests.unit.utils.scheduler.base import SchedulerTestsBase + +try: + import dateutil.parser + + HAS_DATEUTIL_PARSER = True +except ImportError: + HAS_DATEUTIL_PARSER = False log = logging.getLogger(__name__) -ROOT_DIR = os.path.join(RUNTIME_VARS.TMP, "schedule-unit-tests") -SOCK_DIR = os.path.join(ROOT_DIR, "test-socks") - -DEFAULT_CONFIG = salt.config.minion_config(None) -DEFAULT_CONFIG["conf_dir"] = ROOT_DIR -DEFAULT_CONFIG["root_dir"] = ROOT_DIR -DEFAULT_CONFIG["sock_dir"] = SOCK_DIR -DEFAULT_CONFIG["pki_dir"] = os.path.join(ROOT_DIR, "pki") -DEFAULT_CONFIG["cachedir"] = os.path.join(ROOT_DIR, "cache") -@pytest.mark.windows_whitelisted -class SchedulerPostponeTest(ModuleCase, SaltReturnAssertsMixin): +@skipIf( + HAS_DATEUTIL_PARSER is False, "The 'dateutil.parser' library is not available", +) +class SchedulerPostponeTest(SchedulerTestsBase): """ Validate the pkg module """ def setUp(self): - with patch("salt.utils.schedule.clean_proc_dir", MagicMock(return_value=None)): - functions = {"test.ping": ping} - self.schedule = salt.utils.schedule.Schedule( - copy.deepcopy(DEFAULT_CONFIG), functions, returners={} - ) + super(SchedulerPostponeTest, self).setUp() self.schedule.opts["loop_interval"] = 1 def tearDown(self): @@ -56,7 +43,7 @@ class SchedulerPostponeTest(ModuleCase, SaltReturnAssertsMixin): } # 11/29/2017 4pm - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") # 5 minute delay delay = 300 diff --git a/tests/unit/utils/scheduler/test_run_job.py b/tests/unit/utils/scheduler/test_run_job.py new file mode 100644 index 00000000000..c498c3f0133 --- /dev/null +++ b/tests/unit/utils/scheduler/test_run_job.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +import logging + +from tests.unit.utils.scheduler.base import SchedulerTestsBase + +log = logging.getLogger(__name__) + + +class SchedulerRunJobTest(SchedulerTestsBase): + """ + Validate the pkg module + """ + + def setUp(self): + super(SchedulerRunJobTest, self).setUp() + self.schedule.opts["loop_interval"] = 1 + + def test_run_job(self): + """ + verify that scheduled job runs + """ + job_name = "test_run_job" + job = {"schedule": {job_name: {"function": "test.ping"}}} + # Add the job to the scheduler + self.schedule.opts.update(job) + + # Run job + self.schedule.run_job(job_name) + ret = self.schedule.job_status(job_name) + expected = {"function": "test.ping", "run": True, "name": "test_run_job"} + self.assertEqual(ret, expected) diff --git a/tests/integration/scheduler/test_skip.py b/tests/unit/utils/scheduler/test_skip.py similarity index 80% rename from tests/integration/scheduler/test_skip.py rename to tests/unit/utils/scheduler/test_skip.py index 963bf8f8c64..27e58bc333a 100644 --- a/tests/integration/scheduler/test_skip.py +++ b/tests/unit/utils/scheduler/test_skip.py @@ -2,44 +2,31 @@ from __future__ import absolute_import -import copy import logging -import os -import dateutil.parser as dateutil_parser -import pytest -import salt.utils.schedule -from salt.modules.test import ping -from tests.support.case import ModuleCase -from tests.support.mixins import SaltReturnAssertsMixin -from tests.support.mock import MagicMock, patch -from tests.support.runtests import RUNTIME_VARS from tests.support.unit import skipIf +from tests.unit.utils.scheduler.base import SchedulerTestsBase + +try: + import dateutil.parser + + HAS_DATEUTIL_PARSER = True +except ImportError: + HAS_DATEUTIL_PARSER = False log = logging.getLogger(__name__) -ROOT_DIR = os.path.join(RUNTIME_VARS.TMP, "schedule-unit-tests") -SOCK_DIR = os.path.join(ROOT_DIR, "test-socks") - -DEFAULT_CONFIG = salt.config.minion_config(None) -DEFAULT_CONFIG["conf_dir"] = ROOT_DIR -DEFAULT_CONFIG["root_dir"] = ROOT_DIR -DEFAULT_CONFIG["sock_dir"] = SOCK_DIR -DEFAULT_CONFIG["pki_dir"] = os.path.join(ROOT_DIR, "pki") -DEFAULT_CONFIG["cachedir"] = os.path.join(ROOT_DIR, "cache") -@pytest.mark.windows_whitelisted -class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): +@skipIf( + HAS_DATEUTIL_PARSER is False, "The 'dateutil.parser' library is not available", +) +class SchedulerSkipTest(SchedulerTestsBase): """ Validate the pkg module """ def setUp(self): - with patch("salt.utils.schedule.clean_proc_dir", MagicMock(return_value=None)): - functions = {"test.ping": ping} - self.schedule = salt.utils.schedule.Schedule( - copy.deepcopy(DEFAULT_CONFIG), functions, returners={} - ) + super(SchedulerSkipTest, self).setUp() self.schedule.opts["loop_interval"] = 1 def tearDown(self): @@ -63,7 +50,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): # Add job to schedule self.schedule.opts.update(job) - run_time = dateutil_parser.parse("11/29/2017 4:00pm") + run_time = dateutil.parser.parse("11/29/2017 4:00pm") self.schedule.skip_job( job_name, { @@ -80,7 +67,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.assertEqual(ret["_skipped_time"], run_time) # Run 11/29/2017 at 5pm - run_time = dateutil_parser.parse("11/29/2017 5:00pm") + run_time = dateutil.parser.parse("11/29/2017 5:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -108,12 +95,12 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 1:30pm to prime. - run_time = dateutil_parser.parse("11/29/2017 1:30pm") + run_time = dateutil.parser.parse("11/29/2017 1:30pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # eval at 2:30pm, will not run during range. - run_time = dateutil_parser.parse("11/29/2017 2:30pm") + run_time = dateutil.parser.parse("11/29/2017 2:30pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertNotIn("_last_run", ret) @@ -121,7 +108,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.assertEqual(ret["_skipped_time"], run_time) # eval at 3:30pm, will run. - run_time = dateutil_parser.parse("11/29/2017 3:30pm") + run_time = dateutil.parser.parse("11/29/2017 3:30pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -130,7 +117,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): """ verify that scheduled job is not not and returns the right error string """ - run_time = dateutil_parser.parse("11/29/2017 2:30pm") + run_time = dateutil.parser.parse("11/29/2017 2:30pm") job_name1 = "skip_during_range_invalid_datestring1" job1 = { @@ -207,12 +194,12 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 1:30pm to prime. - run_time = dateutil_parser.parse("11/29/2017 1:30pm") + run_time = dateutil.parser.parse("11/29/2017 1:30pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # eval at 2:30pm, will not run during range. - run_time = dateutil_parser.parse("11/29/2017 2:30pm") + run_time = dateutil.parser.parse("11/29/2017 2:30pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertNotIn("_last_run", ret) @@ -220,7 +207,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.assertEqual(ret["_skipped_time"], run_time) # eval at 3:30pm, will run. - run_time = dateutil_parser.parse("11/29/2017 3:30pm") + run_time = dateutil.parser.parse("11/29/2017 3:30pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -249,7 +236,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 2:30pm, will not run during range. - run_time = dateutil_parser.parse("11/29/2017 2:30pm") + run_time = dateutil.parser.parse("11/29/2017 2:30pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertNotIn("_last_run", ret) @@ -257,7 +244,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.assertEqual(ret["_skipped_time"], run_time) # eval at 3:00:01pm, will run. - run_time = dateutil_parser.parse("11/29/2017 3:00:01pm") + run_time = dateutil.parser.parse("11/29/2017 3:00:01pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertEqual(ret["_last_run"], run_time) @@ -274,17 +261,17 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.schedule.opts.update(job) # eval at 2:00pm, to prime the scheduler - run_time = dateutil_parser.parse("11/29/2017 2:00pm") + run_time = dateutil.parser.parse("11/29/2017 2:00pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # eval at 2:00:10pm - run_time = dateutil_parser.parse("11/29/2017 2:00:10pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:10pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) # Skip at 2:00:20pm - run_time = dateutil_parser.parse("11/29/2017 2:00:20pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:20pm") self.schedule.skip_job( job_name, { @@ -299,7 +286,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin): self.assertEqual(ret["_skipped_time"], run_time) # Run at 2:00:30pm - run_time = dateutil_parser.parse("11/29/2017 2:00:30pm") + run_time = dateutil.parser.parse("11/29/2017 2:00:30pm") self.schedule.eval(now=run_time) ret = self.schedule.job_status(job_name) self.assertIn("_last_run", ret) diff --git a/tests/whitelist.txt b/tests/whitelist.txt index 36db51452a4..570d5d64600 100644 --- a/tests/whitelist.txt +++ b/tests/whitelist.txt @@ -69,10 +69,6 @@ integration.runners.test_manage integration.runners.test_runner_returns integration.runners.test_nacl integration.runners.test_salt -integration.scheduler.test_eval -integration.scheduler.test_postpone -integration.scheduler.test_skip -integration.scheduler.test_helpers integration.sdb.test_env integration.shell.test_arguments integration.shell.test_auth