tests: Check (mcron vixie-specification)
* tests/vixie-specification.scm: New file. * Makefile.am (TESTS): Register it.
This commit is contained in:
		
					parent
					
						
							
								d1a3e83cbc
							
						
					
				
			
			
				commit
				
					
						5fd0ccde5a
					
				
			
		
					 2 changed files with 145 additions and 0 deletions
				
			
		|  | @ -138,6 +138,7 @@ TESTS = \ | ||||||
|   tests/environment.scm \ |   tests/environment.scm \ | ||||||
|   tests/job-specifier.scm \ |   tests/job-specifier.scm \ | ||||||
|   tests/utils.scm \ |   tests/utils.scm \ | ||||||
|  |   tests/vixie-specification.scm \ | ||||||
|   tests/vixie-time.scm |   tests/vixie-time.scm | ||||||
| 
 | 
 | ||||||
| ## -------------- ## | ## -------------- ## | ||||||
|  |  | ||||||
							
								
								
									
										144
									
								
								tests/vixie-specification.scm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								tests/vixie-specification.scm
									
										
									
									
									
										Normal file
									
								
							|  | @ -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) | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mathieu Lirzin
				Mathieu Lirzin