AboutSummaryRefsLogTreeCommitDiffStats
diff options
context:
space:
mode:
-rwxr-xr-xMakefile.am1
-rw-r--r--tests/vixie-specification.scm144
2 files changed, 145 insertions, 0 deletions
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 <mthl@gnu.org>
+;;;
+;;; 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)