X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-posix%2Fposix-tests.lisp;h=4761a221662452a67bfcc8484b5625d6add366aa;hb=c3699db2053ff3b5ac6a98d4431c3789496002d8;hp=2b8ff6e010a49e9d6438ba5683eab345278a7070;hpb=38da35e372a6e6f353fe5559edf6fca6459ef966;p=sbcl.git diff --git a/contrib/sb-posix/posix-tests.lisp b/contrib/sb-posix/posix-tests.lisp index 2b8ff6e..4761a22 100644 --- a/contrib/sb-posix/posix-tests.lisp +++ b/contrib/sb-posix/posix-tests.lisp @@ -13,6 +13,11 @@ (defvar *this-file* *load-truename*) +(eval-when (:compile-toplevel :load-toplevel) + (defconstant +mode-rwx-all+ (logior sb-posix::s-irusr sb-posix::s-iwusr sb-posix::s-ixusr + sb-posix::s-irgrp sb-posix::s-iwgrp sb-posix::s-ixgrp + sb-posix::s-iroth sb-posix::s-iwoth sb-posix::s-ixoth))) + (deftest chdir.1 (sb-posix:chdir *test-directory*) 0) @@ -47,7 +52,7 @@ (sb-posix:syscall-error (c) (sb-posix:syscall-errno c))) #.sb-posix::enotdir) - + (deftest mkdir.1 (let ((dne (make-pathname :directory '(:relative "mkdir.does-not-exist.1")))) (unwind-protect @@ -84,7 +89,7 @@ (sb-posix:syscall-error (c) (sb-posix:syscall-errno c))) #.sb-posix::eacces) - + (deftest rmdir.1 (let ((dne (make-pathname :directory '(:relative "rmdir.does-not-exist.1")))) (ensure-directories-exist (merge-pathnames dne *test-directory*)) @@ -112,6 +117,7 @@ (sb-posix:syscall-errno c))) #.sb-posix::enotdir) +#-sunos ; Apparently gives EINVAL on SunOS 8, which doesn't make sense (deftest rmdir.error.3 (handler-case (sb-posix:rmdir "/") @@ -132,8 +138,10 @@ (sb-posix:syscall-error (c) (delete-file file) (sb-posix:rmdir dir) - (sb-posix:syscall-errno c)))) - #.sb-posix::enotempty) + (let ((errno (sb-posix:syscall-errno c))) + ;; documented by POSIX + (or (= errno sb-posix::eexist) (= errno sb-posix::enotempty)))))) + t) (deftest rmdir.error.5 (let* ((dir (merge-pathnames @@ -142,8 +150,8 @@ (dir2 (merge-pathnames (make-pathname :directory '(:relative "unremovable")) dir))) - (sb-posix:mkdir dir #xffffffff) - (sb-posix:mkdir dir2 #xffffffff) + (sb-posix:mkdir dir +mode-rwx-all+) + (sb-posix:mkdir dir2 +mode-rwx-all+) (sb-posix:chmod dir 0) (handler-case (sb-posix:rmdir dir2) @@ -153,7 +161,7 @@ (sb-posix:rmdir dir) (sb-posix:syscall-errno c)))) #.sb-posix::eacces) - + (deftest stat.1 (let* ((stat (sb-posix:stat *test-directory*)) (mode (sb-posix::stat-mode stat))) @@ -162,8 +170,11 @@ #.(logior sb-posix::s-iread sb-posix::s-iwrite sb-posix::s-iexec)) (deftest stat.2 - (let* ((stat (sb-posix:stat "/root")) + (let* ((stat (sb-posix:stat "/")) (mode (sb-posix::stat-mode stat))) + ;; it's logically possible for / to be writeable by others... but + ;; if it is, either someone is playing with strange security + ;; modules or they want to know about it anyway. (logand mode sb-posix::s-iwoth)) 0) @@ -193,7 +204,7 @@ (file (merge-pathnames (make-pathname :name "unstatable") dir))) - (sb-posix:mkdir dir #xffffffff) + (sb-posix:mkdir dir +mode-rwx-all+) (with-open-file (s file :direction :output) (write "" :stream s)) (sb-posix:chmod dir 0) @@ -205,7 +216,73 @@ (sb-posix:rmdir dir) (sb-posix:syscall-errno c)))) #.sb-posix::eacces) + +;;; stat-mode tests +(defmacro with-stat-mode ((mode pathname) &body body) + (let ((stat (gensym))) + `(let* ((,stat (sb-posix:stat ,pathname)) + (,mode (sb-posix::stat-mode ,stat))) + ,@body))) + +(defmacro with-lstat-mode ((mode pathname) &body body) + (let ((stat (gensym))) + `(let* ((,stat (sb-posix:lstat ,pathname)) + (,mode (sb-posix::stat-mode ,stat))) + ,@body))) + +(deftest stat-mode.1 + (with-stat-mode (mode *test-directory*) + (sb-posix:s-isreg mode)) + nil) + +(deftest stat-mode.2 + (with-stat-mode (mode *test-directory*) + (sb-posix:s-isdir mode)) + t) +(deftest stat-mode.3 + (with-stat-mode (mode *test-directory*) + (sb-posix:s-ischr mode)) + nil) + +(deftest stat-mode.4 + (with-stat-mode (mode *test-directory*) + (sb-posix:s-isblk mode)) + nil) + +(deftest stat-mode.5 + (with-stat-mode (mode *test-directory*) + (sb-posix:s-isfifo mode)) + nil) + +(deftest stat-mode.6 + (with-stat-mode (mode *test-directory*) + (sb-posix:s-issock mode)) + nil) + +(deftest stat-mode.7 + (let ((link-pathname (make-pathname :name "stat-mode.7" + :defaults *test-directory*))) + (unwind-protect + (progn + (sb-posix:symlink *test-directory* link-pathname) + (with-lstat-mode (mode link-pathname) + (sb-posix:s-islnk mode))) + (ignore-errors (sb-posix:unlink link-pathname)))) + t) + +(deftest stat-mode.8 + (let ((pathname (make-pathname :name "stat-mode.8" + :defaults *test-directory*))) + (unwind-protect + (progn + (with-open-file (out pathname :direction :output) + (write-line "test" out)) + (with-stat-mode (mode pathname) + (sb-posix:s-isreg mode))) + (ignore-errors (delete-file pathname)))) + t) + ;;; see comment in filename's designator definition, in macros.lisp (deftest filename-designator.1 (let ((file (format nil "~A/[foo].txt" (namestring *test-directory*))))