From deef3a85555f04abbcdf1a63c3a7d1dcc975a4de Mon Sep 17 00:00:00 2001
From: Yuya Kusakabe <yuya.kusakabe@gmail.com>
Date: Tue, 15 May 2018 22:49:55 +0900
Subject: T626 Add tests for vyos-update-crontab and initial setup for
 sonarcloud

---
 src/tests/helper.py                   |  27 +++++++
 src/tests/test_vyos_update_crontab.py | 131 ++++++++++++++++++++++++++++++++++
 2 files changed, 158 insertions(+)
 create mode 100644 src/tests/helper.py
 create mode 100644 src/tests/test_vyos_update_crontab.py

(limited to 'src')

diff --git a/src/tests/helper.py b/src/tests/helper.py
new file mode 100644
index 000000000..a7e4f201c
--- /dev/null
+++ b/src/tests/helper.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2018 VyOS maintainers and contributors
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or later as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+
+import sys
+import importlib.util
+
+
+def prepare_module(file_path='', module_name=''):
+    spec = importlib.util.spec_from_file_location(module_name, file_path)
+    module = importlib.util.module_from_spec(spec)
+    spec.loader.exec_module(module)
+    sys.modules[module_name] = module
diff --git a/src/tests/test_vyos_update_crontab.py b/src/tests/test_vyos_update_crontab.py
new file mode 100644
index 000000000..efeadf2f5
--- /dev/null
+++ b/src/tests/test_vyos_update_crontab.py
@@ -0,0 +1,131 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2018 VyOS maintainers and contributors
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or later as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+
+import os
+import sys
+import tempfile
+import unittest
+
+from vyos import ConfigError
+import helper
+
+file_path = 'src/conf-mode/vyos-update-crontab.py'
+module_name = 'vyos_update_crontab'
+helper.prepare_module(file_path, module_name)
+import vyos_update_crontab
+
+
+class TestUpdateCrontab(unittest.TestCase):
+
+    def test_verify(self):
+        tests = [
+            {'name': 'one_task',
+             'tasks': [{'name': 'aaa', 'interval': '60m', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': None
+             },
+            {'name': 'has_interval_and_spec',
+             'tasks': [{'name': 'aaa', 'interval': '60m', 'spec': '0 * * * *', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': ConfigError
+             },
+            {'name': 'has_no_interval_and_spec',
+             'tasks': [{'name': 'aaa', 'interval': '', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': ConfigError
+             },
+            {'name': 'invalid_interval',
+             'tasks': [{'name': 'aaa', 'interval': '1y', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': ConfigError
+             },
+            {'name': 'invalid_interval_min',
+             'tasks': [{'name': 'aaa', 'interval': '61m', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': ConfigError
+             },
+            {'name': 'invalid_interval_hour',
+             'tasks': [{'name': 'aaa', 'interval': '25h', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': ConfigError
+             },
+            {'name': 'invalid_interval_day',
+             'tasks': [{'name': 'aaa', 'interval': '32d', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': ConfigError
+             },
+            {'name': 'no_executable',
+             'tasks': [{'name': 'aaa', 'interval': '60m', 'spec': '', 'executable': '', 'args': ''}],
+             'expected': ConfigError
+             },
+            {'name': 'invalid_executable',
+             'tasks': [{'name': 'aaa', 'interval': '60m', 'spec': '', 'executable': '/bin/aaa', 'args': ''}],
+             'expected': ConfigError
+             }
+        ]
+        for t in tests:
+            with self.subTest(msg=t['name'], tasks=t['tasks'], expected=t['expected']):
+                if t['expected'] is not None:
+                    with self.assertRaises(t['expected']):
+                        vyos_update_crontab.verify(t['tasks'])
+                else:
+                    vyos_update_crontab.verify(t['tasks'])
+
+    def test_generate(self):
+        tests = [
+            {'name': 'zero_task',
+             'tasks': [],
+             'expected': []
+             },
+            {'name': 'one_task',
+             'tasks': [{'name': 'aaa', 'interval': '60m', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': [
+                 '### Generated by vyos-update-crontab.py ###',
+                 '*/60 * * * * root /bin/ls -l']
+             },
+            {'name': 'one_task_with_hour',
+             'tasks': [{'name': 'aaa', 'interval': '10h', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': [
+                 '### Generated by vyos-update-crontab.py ###',
+                 '0 */10 * * * root /bin/ls -l']
+             },
+            {'name': 'one_task_with_day',
+             'tasks': [{'name': 'aaa', 'interval': '10d', 'spec': '', 'executable': '/bin/ls', 'args': '-l'}],
+             'expected': [
+                 '### Generated by vyos-update-crontab.py ###',
+                 '0 0 */10 * * root /bin/ls -l']
+             },
+            {'name': 'multiple_tasks',
+             'tasks': [{'name': 'aaa', 'interval': '60m', 'spec': '', 'executable': '/bin/ls', 'args': '-l'},
+                       {'name': 'bbb', 'interval': '', 'spec': '0 0 * * *', 'executable': '/bin/ls', 'args': '-ltr'}
+                       ],
+             'expected': [
+                 '### Generated by vyos-update-crontab.py ###',
+                 '*/60 * * * * root /bin/ls -l',
+                 '0 0 * * * root /bin/ls -ltr']
+             }
+        ]
+        for t in tests:
+            with self.subTest(msg=t['name'], tasks=t['tasks'], expected=t['expected']):
+                vyos_update_crontab.crontab_file = tempfile.mkstemp()[1]
+                vyos_update_crontab.generate(t['tasks'])
+                if len(t['expected']) > 0:
+                    self.assertTrue(os.path.isfile(vyos_update_crontab.crontab_file))
+                    with open(vyos_update_crontab.crontab_file) as f:
+                        actual = f.read()
+                        self.assertEqual(t['expected'], actual.splitlines())
+                    os.remove(vyos_update_crontab.crontab_file)
+                else:
+                    self.assertFalse(os.path.isfile(vyos_update_crontab.crontab_file))
+
+
+if __name__ == "__main__":
+    unittest.main()
-- 
cgit v1.2.3