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 #-sunos
; Apparently gives EINVAL on SunOS 8, which doesn't make sense
116 (deftest rmdir.error
.3
119 (sb-posix:syscall-error
(c)
120 (sb-posix:syscall-errno c
)))
123 (deftest rmdir.error
.4
124 (let* ((dir (ensure-directories-exist
126 (make-pathname :directory
'(:relative
"rmdir.error.4"))
128 (file (make-pathname :name
"foo" :defaults dir
)))
129 (with-open-file (s file
:direction
:output
)
130 (write "" :stream s
))
133 (sb-posix:syscall-error
(c)
136 (let ((errno (sb-posix:syscall-errno c
)))
137 ;; documented by POSIX
138 (or (= errno sb-posix
::eexist
) (= errno sb-posix
::enotempty
))))))
141 (deftest rmdir.error
.5
142 (let* ((dir (merge-pathnames
143 (make-pathname :directory
'(:relative
"rmdir.error.5"))
145 (dir2 (merge-pathnames
146 (make-pathname :directory
'(:relative
"unremovable"))
148 (sb-posix:mkdir dir
#xffffffff
)
149 (sb-posix:mkdir dir2
#xffffffff
)
150 (sb-posix:chmod dir
0)
152 (sb-posix:rmdir dir2
)
153 (sb-posix:syscall-error
(c)
154 (sb-posix:chmod dir
(logior sb-posix
::s-iread sb-posix
::s-iwrite sb-posix
::s-iexec
))
155 (sb-posix:rmdir dir2
)
157 (sb-posix:syscall-errno c
))))
161 (let* ((stat (sb-posix:stat
*test-directory
*))
162 (mode (sb-posix::stat-mode stat
)))
163 ;; FIXME: Ugly ::s everywhere
164 (logand mode
(logior sb-posix
::s-iread sb-posix
::s-iwrite sb-posix
::s-iexec
)))
165 #.
(logior sb-posix
::s-iread sb-posix
::s-iwrite sb-posix
::s-iexec
))
168 (let* ((stat (sb-posix:stat
"/root"))
169 (mode (sb-posix::stat-mode stat
)))
170 (logand mode sb-posix
::s-iwoth
))
174 (let* ((now (get-universal-time))
175 ;; FIXME: (encode-universal-time 00 00 00 01 01 1970)
176 (unix-now (- now
2208988800))
177 (stat (sb-posix:stat
*test-directory
*))
178 (atime (sb-posix::stat-atime stat
)))
179 ;; FIXME: breaks if mounted noatime :-(
180 (< (- atime unix-now
) 10))
183 ;;; FIXME: add tests for carrying a stat structure around in the
184 ;;; optional argument to SB-POSIX:STAT
186 (deftest stat.error
.1
187 (handler-case (sb-posix:stat
"")
188 (sb-posix:syscall-error
(c)
189 (sb-posix:syscall-errno c
)))
192 (deftest stat.error
.2
193 (let* ((dir (merge-pathnames
194 (make-pathname :directory
'(:relative
"stat.error.2"))
196 (file (merge-pathnames
197 (make-pathname :name
"unstatable")
199 (sb-posix:mkdir dir
#xffffffff
)
200 (with-open-file (s file
:direction
:output
)
201 (write "" :stream s
))
202 (sb-posix:chmod dir
0)
205 (sb-posix:syscall-error
(c)
206 (sb-posix:chmod dir
(logior sb-posix
::s-iread sb-posix
::s-iwrite sb-posix
::s-iexec
))
207 (sb-posix:unlink file
)
209 (sb-posix:syscall-errno c
))))
213 (defmacro with-stat-mode
((mode pathname
) &body body
)
214 (let ((stat (gensym)))
215 `(let* ((,stat
(sb-posix:stat
,pathname
))
216 (,mode
(sb-posix::stat-mode
,stat
)))
219 (defmacro with-lstat-mode
((mode pathname
) &body body
)
220 (let ((stat (gensym)))
221 `(let* ((,stat
(sb-posix:lstat
,pathname
))
222 (,mode
(sb-posix::stat-mode
,stat
)))
226 (with-stat-mode (mode *test-directory
*)
227 (sb-posix:s-isreg mode
))
231 (with-stat-mode (mode *test-directory
*)
232 (zerop (sb-posix:s-isdir mode
)))
236 (with-stat-mode (mode *test-directory
*)
237 (sb-posix:s-ischr mode
))
241 (with-stat-mode (mode *test-directory
*)
242 (sb-posix:s-isblk mode
))
246 (with-stat-mode (mode *test-directory
*)
247 (sb-posix:s-isfifo mode
))
251 (with-stat-mode (mode *test-directory
*)
252 (sb-posix:s-issock mode
))
256 (let ((link-pathname (make-pathname :name
"stat-mode.7"
257 :defaults
*test-directory
*)))
260 (sb-posix:symlink
*test-directory
* link-pathname
)
261 (with-lstat-mode (mode link-pathname
)
262 (zerop (sb-posix:s-islnk mode
))))
263 (ignore-errors (sb-posix:unlink link-pathname
))))
267 (let ((pathname (make-pathname :name
"stat-mode.8"
268 :defaults
*test-directory
*)))
271 (with-open-file (out pathname
:direction
:output
)
272 (write-line "test" out
))
273 (with-stat-mode (mode pathname
)
274 (zerop (sb-posix:s-isreg mode
))))
275 (ignore-errors (delete-file pathname
))))
278 ;;; see comment in filename's designator definition, in macros.lisp
279 (deftest filename-designator
.1
280 (let ((file (format nil
"~A/[foo].txt" (namestring *test-directory
*))))
281 ;; creat() with a string as argument
282 (sb-posix:creat file
0)
283 ;; if this test fails, it will probably be with
284 ;; "System call error 2 (No such file or directory)"
285 (let ((*default-pathname-defaults
* *test-directory
*))
286 (sb-posix:unlink
(car (directory "*.txt")))))