~ chicken-core (chicken-5) /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\x00embedded-NUL"))35(assert-error (set-environment-variable! "with\x00embedded-NUL" "blabla"))36(assert-error (set-environment-variable! "blabla" "with\x00embedded-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\x00123"))41(assert-error (process-execute "false" '("1" "123\x00456")))42(assert-error (process-execute "false" '("123\x00456") '("foo\x00bar" "blabla") '("lalala" "qux\x00mooh")))4344(receive (in out pid)45 (process csi-path '("-n" "-I" ".." "-e"46 "(write 'err (current-error-port)) (write 'ok)"))47 (assert (equal? 'ok (read in)))48 (newline (current-error-port)))4950(receive (in out pid err)51 (process* csi-path '("-n" "-I" ".." "-e"52 "(write 'err (current-error-port)) (write 'ok)"))53 (assert (equal? 'ok (read in)))54 (assert (equal? 'err (read err))))5556;; delete-directory57(let* ((t (create-temporary-directory))58 (t/a (make-pathname t "a"))59 (t/a/file (make-pathname t/a "file"))60 (t/b (make-pathname t "b"))61 (t/b/c (make-pathname t/b "c"))62 (t/b/c/link (make-pathname t/b/c "link"))63 (t/b/c/.file (make-pathname t/b/c ".file")))64 ;; Create file under a:65 (create-directory t/a)66 (with-output-to-file t/a/file void)67 ;; Create directories under b:68 (create-directory t/b/c/.file 'recursively)69 (assert (directory? t/b/c/.file))70 (when (or (feature? #:unix) (feature? #:cygwin))71 (create-symbolic-link t/a t/b/c/link)72 (assert (directory? t/b/c/link)))73 ;; Delete directory tree at b:74 (delete-directory t/b 'recursively)75 (assert (not (directory? t/b/c/.file)))76 (assert (not (directory? t/b/c/link)))77 (assert (not (directory? t/b/c)))78 (assert (not (directory? t/b)))79 ;; Make sure symlink wasn't followed:80 (assert (directory? t/a))81 (assert (regular-file? t/a/file))82 ;; Clean up temporary directory:83 (delete-directory t 'recursively)84 (assert (not (directory? t))))8586;; unset-environment-variable!87(set-environment-variable! "FOO" "bar")88(assert (equal? (get-environment-variable "FOO") "bar"))89(unset-environment-variable! "FOO")90(assert (not (get-environment-variable "FOO")))9192;; file creation and umask interaction9394;; For windows, the file must be writable before it can be deleted!95(define (delete-maybe-readonly-file filename)96 (cond-expand97 (windows (when (file-exists? filename)98 (set-file-permissions! filename #o666)))99 (else))100 (delete-file* filename))101102#+(not windows)103(letrec-syntax ((test (syntax-rules ()104 ((test umask expected)105 (test umask "expected" expected "given"))106 ((test umask given expected)107 (test umask "expected" expected "given" given))108 ((test umask "expected" expected "given" given ...)109 (let ((mode (file-creation-mode)))110 (set! (file-creation-mode) umask)111 (delete-file* "posix-tests.out")112 (file-close (file-open "posix-tests.out" open/creat given ...))113 (assert (equal? (file-permissions "posix-tests.out") expected))114 (set! (file-creation-mode) mode))))))115 ;; default file mode116 (test #o000 #o666)117 (test #o002 #o664)118 (test #o020 #o646)119 (test #o022 #o644)120 (test #o027 #o640)121 (test #o072 #o604)122 (test #o077 #o600)123 (test #o777 #o000)124 ;; explicit file mode argument125 (test #o000 #o644 #o644)126 (test #o002 #o644 #o644)127 (test #o020 #o644 #o644)128 (test #o022 #o644 #o644)129 (test #o027 #o644 #o640)130 (test #o072 #o644 #o604)131 (test #o077 #o644 #o600)132 (test #o777 #o644 #o000)133 (test #o000 #o777 #o777)134 (test #o002 #o777 #o775)135 (test #o020 #o777 #o757)136 (test #o022 #o777 #o755)137 (test #o027 #o777 #o750)138 (test #o072 #o777 #o705)139 (test #o077 #o777 #o700)140 (test #o777 #o777 #o000))