bug-mcron
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/3] tests: Check (mcron vixie-specification)


From: Mathieu Lirzin
Subject: [PATCH 2/3] tests: Check (mcron vixie-specification)
Date: Mon, 18 May 2020 12:54:51 +0200

* tests/vixie-specification.scm: New file.
* Makefile.am (TESTS): Register it.
---
 Makefile.am                   |   1 +
 tests/vixie-specification.scm | 144 ++++++++++++++++++++++++++++++++++
 2 files changed, 145 insertions(+)
 create mode 100644 tests/vixie-specification.scm

diff --git a/Makefile.am b/Makefile.am
index b5c6260..c7562c5 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -138,6 +138,7 @@ TESTS = \
   tests/environment.scm \
   tests/job-specifier.scm \
   tests/utils.scm \
+  tests/vixie-specification.scm \
   tests/vixie-time.scm
 
 ## -------------- ##
diff --git a/tests/vixie-specification.scm b/tests/vixie-specification.scm
new file mode 100644
index 0000000..78c1dad
--- /dev/null
+++ b/tests/vixie-specification.scm
@@ -0,0 +1,144 @@
+;;;; vixie-specification.scm -- tests for (mcron vixie-specificaion) module
+;;; Copyright © 2020 Mathieu Lirzin <address@hidden>
+;;;
+;;; This file is part of GNU Mcron.
+;;;
+;;; GNU Mcron is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation, either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; GNU Mcron 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 GNU Mcron.  If not, see <http://www.gnu.org/licenses/>.
+
+(use-modules (srfi srfi-1)
+             (srfi srfi-64)
+             (mcron vixie-specification))
+
+(setenv "TZ" "UTC0")
+
+;;; Do not send mail
+(setenv "MAILTO" "")
+
+(define (create-file! content)
+  "Construct a temporary file port containing CONTENT which must be a string."
+  (let ((port (mkstemp! (string-copy "file-XXXXXX"))))
+    (display content port)
+    (force-output port)
+    port))
+
+(define (clean-temp port)
+  "Close and Delete a temporary file port"
+  (let ((fname (port-filename port)))
+    (close port)
+    (delete-file fname)))
+
+(define schedule (@@ (mcron base) %global-schedule))
+(define schedule-user (@@ (mcron base) schedule-user))
+(define set-schedule-user! (@@ (mcron base) set-schedule-user!))
+(define job:environment (@@ (mcron base) job:environment))
+(define job:displayable (@@ (mcron base) job:displayable))
+(define job:user (@@ (mcron base) job:user))
+
+(test-begin "vixie-specification")
+
+;;; Parse user crontab file
+
+(define user-crontab-example
+  "# Example crontab
+FOO=x
+BAR=y
+
+# Example of job definitions:
+17 *   * * *   cd / && run baz
+47 6   * * 7   foo -x /tmp/example || bar
+")
+
+(define user-crontab (create-file! user-crontab-example))
+
+(dynamic-wind
+  (const #t)
+  (lambda ()
+    (set-schedule-user! schedule '())
+    (read-vixie-file (port-filename user-crontab))
+
+    (test-assert "User schedule has exactly 2 matching jobs"
+      (lset= string=?
+             '("cd / && run baz"
+               "foo -x /tmp/example || bar")
+             (map job:displayable (schedule-user schedule))))
+
+    (test-assert "Job environment matches configuration"
+      (every (lambda (j)
+               (lset= equal?
+                      '(("FOO" . "x") ("BAR" . "y"))
+                      (job:environment j)))
+             (schedule-user schedule))))
+
+  (lambda ()
+    (clean-temp user-crontab)))
+
+;;; Parse system crontab file
+
+;;; Get two existing users from the test environment.
+(setpwent)
+(define user0 (getpwent))
+(define user1 (or (getpwent) user0))
+(define system-crontab-example
+  (string-append
+   "# Example crontab
+BAZ=z
+
+17 *   * * * " (passwd:name user0) " cd / && run baz
+47 6   * * 7 " (passwd:name user1) "   foo -x /tmp/example || bar"))
+
+(define sys-crontab (create-file! system-crontab-example))
+
+(dynamic-wind
+  (const #t)
+  (lambda ()
+    (set-schedule-user! schedule '())
+    (read-vixie-file (port-filename sys-crontab) parse-system-vixie-line)
+
+    (test-assert "System schedule has exactly 2 matching jobs"
+      (lset= equal?
+             `((,user0 . "cd / && run baz")
+               (,user1 . "foo -x /tmp/example || bar"))
+             (map (lambda (j)
+                    (cons (job:user j) (job:displayable j)))
+                  (schedule-user schedule))))
+
+    (test-assert "Job environment matches configuration"
+    (every (lambda (j)
+             (lset= equal? '(("BAZ" . "z")) (job:environment j)))
+           (schedule-user schedule))))
+
+  (lambda ()
+    (clean-temp sys-crontab)))
+
+;;; Try to parse a user crontab in a system context
+
+(define wrong-system-crontab-example
+  "
+# Example of job definitions:
+17 *   * * *   ls")
+
+(define wrong-sys-crontab (create-file! wrong-system-crontab-example))
+
+(dynamic-wind
+  (const #t)
+  (lambda ()
+    (test-error "missing user"
+      'mcron-error
+      (read-vixie-file (port-filename wrong-sys-crontab)
+                       parse-system-vixie-line)))
+
+  (lambda ()
+    (clean-temp wrong-sys-crontab)))
+
+(test-end)
-- 
2.20.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]