~ chicken-core (master) /tests/posix-tests.scm
Trap1(import (chicken bitwise)2 (chicken pathname)3 (chicken file)4 (chicken file posix)5 (chicken platform)6 (chicken process)7 (chicken process-context)8 (chicken memory representation))910(include "programs-path.scm")1112(define-syntax assert-error13 (syntax-rules ()14 ((_ expr)15 (assert (handle-exceptions _ #t expr #f)))))1617(define-constant SOME-POS 123456)1819(let ((tnpfilpn (create-temporary-file)))20 (let ((tmpfilno (file-open tnpfilpn (+ open/rdwr open/creat open/text))))21 (set-file-position! tmpfilno SOME-POS seek/end)22 (assert (= SOME-POS (file-position tmpfilno)))23 (file-close tmpfilno)24 (delete-file* tnpfilpn) ) )2526(let ((tnpfilpn (create-temporary-file)))27 (let ((tmpfilno (file-open tnpfilpn (+ open/rdwr open/creat open/text))))28 (let ((port (open-output-file* tmpfilno)))29 (set-file-position! port SOME-POS seek/end)30 (assert (= SOME-POS (file-position port)))31 (close-output-port port)32 (delete-file* tnpfilpn) ) ) )3334(assert-error (get-environment-variable "with\x00;embedded-NUL"))35(assert-error (set-environment-variable! "with\x00;embedded-NUL" "blabla"))36(assert-error (set-environment-variable! "blabla" "with\x00;embedded-NUL"))37(assert-error (system "echo this is \x00; not okay"))38;; Use "false" to signal to the calling script that there was an error,39;; even if the process will get called40(assert-error (process-execute "false\x00;123"))41(assert-error (process-execute "false" '("1" "123\x00;456")))42(assert-error (process-execute "false" '("123\x00;456") '(("foo\x00;bar" . "blabla") ("lalala" . "qux\x00;mooh"))))4344(let ((p (process csi-path '("-n" "-I" ".." "-e"45 "(write 'err (current-error-port)) (write 'ok)"))))46 (assert (equal? 'ok (read (process-output-port p))))47 (newline (current-error-port)))4849(let ((p (process* csi-path '("-n" "-I" ".." "-e"50 "(write 'err (current-error-port)) (write 'ok)"))))51 (assert (equal? 'ok (read (process-output-port p))))52 (assert (equal? 'err (read (process-error-port p)))))5354;; delete-directory55(let* ((t (create-temporary-directory))56 (t/a (make-pathname t "a"))57 (t/a/file (make-pathname t/a "file"))58 (t/b (make-pathname t "b"))59 (t/b/c (make-pathname t/b "c"))60 (t/b/c/link (make-pathname t/b/c "link"))61 (t/b/c/.file (make-pathname t/b/c ".file")))62 ;; Create file under a:63 (create-directory t/a)64 (with-output-to-file t/a/file void)65 ;; Create directories under b:66 (create-directory t/b/c/.file 'recursively)67 (assert (directory? t/b/c/.file))68 (when (or (feature? #:unix) (feature? #:cygwin))69 (create-symbolic-link t/a t/b/c/link)70 (assert (directory? t/b/c/link)))71 ;; Delete directory tree at b:72 (delete-directory t/b 'recursively)73 (assert (not (directory? t/b/c/.file)))74 (assert (not (directory? t/b/c/link)))75 (assert (not (directory? t/b/c)))76 (assert (not (directory? t/b)))77 ;; Make sure symlink wasn't followed:78 (assert (directory? t/a))79 (assert (regular-file? t/a/file))80 ;; Clean up temporary directory:81 (delete-directory t 'recursively)82 (assert (not (directory? t))))8384;; unset-environment-variable!85(set-environment-variable! "FOO" "bar")86(assert (equal? (get-environment-variable "FOO") "bar"))87(unset-environment-variable! "FOO")88(assert (not (get-environment-variable "FOO")))8990;; file creation and umask interaction9192;; For windows, the file must be writable before it can be deleted!93(define (delete-maybe-readonly-file filename)94 (cond-expand95 (windows (when (file-exists? filename)96 (set-file-permissions! filename #o666)))97 (else))98 (delete-file* filename))99100#+(not windows)101(letrec-syntax ((test (syntax-rules ()102 ((test umask expected)103 (test umask "expected" expected "given"))104 ((test umask given expected)105 (test umask "expected" expected "given" given))106 ((test umask "expected" expected "given" given ...)107 (let ((mode (file-creation-mode)))108 (set! (file-creation-mode) umask)109 (delete-file* "posix-tests.out")110 (file-close (file-open "posix-tests.out" open/creat given ...))111 (assert (equal? (file-permissions "posix-tests.out") expected))112 (set! (file-creation-mode) mode))))))113 ;; default file mode114 (test #o000 #o666)115 (test #o002 #o664)116 (test #o020 #o646)117 (test #o022 #o644)118 (test #o027 #o640)119 (test #o072 #o604)120 (test #o077 #o600)121 (test #o777 #o000)122 ;; explicit file mode argument123 (test #o000 #o644 #o644)124 (test #o002 #o644 #o644)125 (test #o020 #o644 #o644)126 (test #o022 #o644 #o644)127 (test #o027 #o644 #o640)128 (test #o072 #o644 #o604)129 (test #o077 #o644 #o600)130 (test #o777 #o644 #o000)131 (test #o000 #o777 #o777)132 (test #o002 #o777 #o775)133 (test #o020 #o777 #o757)134 (test #o022 #o777 #o755)135 (test #o027 #o777 #o750)136 (test #o072 #o777 #o705)137 (test #o077 #o777 #o700)138 (test #o777 #o777 #o000))