1 (defpackage "SB-POSIX-TESTS"
2 (:use "COMMON-LISP" "SB-RT"))
4 (in-package "SB-POSIX-TESTS")
6 (defvar *test-directory*
7 (ensure-directories-exist
8 (merge-pathnames (make-pathname :directory '(:relative "test-lab"))
9 (make-pathname :directory
10 (pathname-directory *load-truename*)))))
12 (defvar *current-directory* *default-pathname-defaults*)
14 (defvar *this-file* *load-truename*)
17 (sb-posix:chdir *test-directory*)
21 (sb-posix:chdir (namestring *test-directory*))
29 (sb-posix:chdir #p"/")
33 (sb-posix:chdir *current-directory*)
36 (deftest chdir.error.1
37 (let ((dne (make-pathname :directory '(:relative "chdir.does-not-exist"))))
39 (sb-posix:chdir (merge-pathnames dne *test-directory*))
40 (sb-posix:syscall-error (c)
41 (sb-posix:syscall-errno c))))
44 (deftest chdir.error.2
46 (sb-posix:chdir *this-file*)
47 (sb-posix:syscall-error (c)
48 (sb-posix:syscall-errno c)))
52 (let ((dne (make-pathname :directory '(:relative "mkdir.does-not-exist.1"))))
54 (sb-posix:mkdir (merge-pathnames dne *test-directory*) 0)
55 ;; FIXME: no delete-directory in CL, but using our own operators
56 ;; is probably not ideal
57 (ignore-errors (sb-posix:rmdir (merge-pathnames dne *test-directory*)))))
61 (let ((dne (make-pathname :directory '(:relative "mkdir.does-not-exist.2"))))
63 (sb-posix:mkdir (namestring (merge-pathnames dne *test-directory*)) 0)
64 (ignore-errors (sb-posix:rmdir (merge-pathnames dne *test-directory*)))))
67 (deftest mkdir.error.1
69 (sb-posix:mkdir *test-directory* 0)
70 (sb-posix:syscall-error (c)
71 (sb-posix:syscall-errno c)))
74 (deftest mkdir.error.2
76 (sb-posix:mkdir "/" 0)
77 (sb-posix:syscall-error (c)
78 (sb-posix:syscall-errno c)))
81 (deftest mkdir.error.3
83 (sb-posix:mkdir "/almost-certainly-does-not-exist" 0)
84 (sb-posix:syscall-error (c)
85 (sb-posix:syscall-errno c)))
89 (let ((dne (make-pathname :directory '(:relative "rmdir.does-not-exist.1"))))
90 (ensure-directories-exist (merge-pathnames dne *test-directory*))
91 (sb-posix:rmdir (merge-pathnames dne *test-directory*)))
95 (let ((dne (make-pathname :directory '(:relative "rmdir.does-not-exist.2"))))
96 (ensure-directories-exist (merge-pathnames dne *test-directory*))
97 (sb-posix:rmdir (namestring (merge-pathnames dne *test-directory*))))
100 (deftest rmdir.error.1
101 (let ((dne (make-pathname :directory '(:relative "rmdir.dne.error.1"))))
103 (sb-posix:rmdir (merge-pathnames dne *test-directory*))
104 (sb-posix:syscall-error (c)
105 (sb-posix:syscall-errno c))))
108 (deftest rmdir.error.2
110 (sb-posix:rmdir *this-file*)
111 (sb-posix:syscall-error (c)
112 (sb-posix:syscall-errno c)))
115 (deftest rmdir.error.3
118 (sb-posix:syscall-error (c)
119 (sb-posix:syscall-errno c)))
122 (deftest rmdir.error.4
123 (let* ((dir (ensure-directories-exist
125 (make-pathname :directory '(:relative "rmdir.error.4"))
127 (file (make-pathname :name "foo" :defaults dir)))
128 (with-open-file (s file :direction :output)
129 (write "" :stream s))
132 (sb-posix:syscall-error (c)
135 (sb-posix:syscall-errno c))))
136 #.sb-posix::enotempty)
138 (deftest rmdir.error.5
139 (let* ((dir (merge-pathnames
140 (make-pathname :directory '(:relative "rmdir.error.5"))
142 (dir2 (merge-pathnames
143 (make-pathname :directory '(:relative "unremovable"))
145 (sb-posix:mkdir dir #xffffffff)
146 (sb-posix:mkdir dir2 #xffffffff)
147 (sb-posix:chmod dir 0)
149 (sb-posix:rmdir dir2)
150 (sb-posix:syscall-error (c)
151 (sb-posix:chmod dir (logior sb-posix::s-iread sb-posix::s-iwrite sb-posix::s-iexec))
152 (sb-posix:rmdir dir2)
154 (sb-posix:syscall-errno c))))
158 (let* ((stat (sb-posix:stat *test-directory*))
159 (mode (sb-posix::stat-mode stat)))
160 ;; FIXME: Ugly ::s everywhere
161 (logand mode (logior sb-posix::s-iread sb-posix::s-iwrite sb-posix::s-iexec)))
162 #.(logior sb-posix::s-iread sb-posix::s-iwrite sb-posix::s-iexec))
165 (let* ((stat (sb-posix:stat "/root"))
166 (mode (sb-posix::stat-mode stat)))
167 (logand mode sb-posix::s-iwoth))
171 (let* ((now (get-universal-time))
172 ;; FIXME: (encode-universal-time 00 00 00 01 01 1970)
173 (unix-now (- now 2208988800))
174 (stat (sb-posix:stat *test-directory*))
175 (atime (sb-posix::stat-atime stat)))
176 ;; FIXME: breaks if mounted noatime :-(
177 (< (- atime unix-now) 10))
180 ;;; FIXME: add tests for carrying a stat structure around in the
181 ;;; optional argument to SB-POSIX:STAT
183 (deftest stat.error.1
184 (handler-case (sb-posix:stat "")
185 (sb-posix:syscall-error (c)
186 (sb-posix:syscall-errno c)))
189 (deftest stat.error.2
190 (let* ((dir (merge-pathnames
191 (make-pathname :directory '(:relative "stat.error.2"))
193 (file (merge-pathnames
194 (make-pathname :name "unstatable")
196 (sb-posix:mkdir dir #xffffffff)
197 (with-open-file (s file :direction :output)
198 (write "" :stream s))
199 (sb-posix:chmod dir 0)
202 (sb-posix:syscall-error (c)
203 (sb-posix:chmod dir (logior sb-posix::s-iread sb-posix::s-iwrite sb-posix::s-iexec))
204 (sb-posix:unlink file)
206 (sb-posix:syscall-errno c))))
209 ;;; see comment in filename's designator definition, in macros.lisp
210 (deftest filename-designator.1
212 ;; we use run-program to bypass the wildcard quoting in the
213 ;; highlevel CL functions like OPEN
214 (sb-ext:run-program "touch"
216 (format nil "~A/[foo].txt"
217 (namestring *test-directory*)))
219 ;; if this test fails, it will probably be with
220 ;; "System call error 2 (No such file or directory)"
221 (let ((*default-pathname-defaults* *test-directory*))
222 (sb-posix:unlink (car (directory "*.txt")))))