0.8.5.16:
[sbcl/lichteblau.git] / contrib / sb-posix / posix-tests.lisp
blob14f04b0ffaf7be28c207cac513a3a4695faa6030
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*)
16 (deftest chdir.1
17 (sb-posix:chdir *test-directory*)
20 (deftest chdir.2
21 (sb-posix:chdir (namestring *test-directory*))
24 (deftest chdir.3
25 (sb-posix:chdir "/")
28 (deftest chdir.4
29 (sb-posix:chdir #p"/")
32 (deftest chdir.5
33 (sb-posix:chdir *current-directory*)
36 (deftest chdir.error.1
37 (let ((dne (make-pathname :directory '(:relative "chdir.does-not-exist"))))
38 (handler-case
39 (sb-posix:chdir (merge-pathnames dne *test-directory*))
40 (sb-posix:syscall-error (c)
41 (sb-posix:syscall-errno c))))
42 #.sb-posix::enoent)
44 (deftest chdir.error.2
45 (handler-case
46 (sb-posix:chdir *this-file*)
47 (sb-posix:syscall-error (c)
48 (sb-posix:syscall-errno c)))
49 #.sb-posix::enotdir)
51 (deftest mkdir.1
52 (let ((dne (make-pathname :directory '(:relative "mkdir.does-not-exist.1"))))
53 (unwind-protect
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*)))))
60 (deftest mkdir.2
61 (let ((dne (make-pathname :directory '(:relative "mkdir.does-not-exist.2"))))
62 (unwind-protect
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
68 (handler-case
69 (sb-posix:mkdir *test-directory* 0)
70 (sb-posix:syscall-error (c)
71 (sb-posix:syscall-errno c)))
72 #.sb-posix::eexist)
74 (deftest mkdir.error.2
75 (handler-case
76 (sb-posix:mkdir "/" 0)
77 (sb-posix:syscall-error (c)
78 (sb-posix:syscall-errno c)))
79 #.sb-posix::eexist)
81 (deftest mkdir.error.3
82 (handler-case
83 (sb-posix:mkdir "/almost-certainly-does-not-exist" 0)
84 (sb-posix:syscall-error (c)
85 (sb-posix:syscall-errno c)))
86 #.sb-posix::eacces)
88 (deftest rmdir.1
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*)))
94 (deftest rmdir.2
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"))))
102 (handler-case
103 (sb-posix:rmdir (merge-pathnames dne *test-directory*))
104 (sb-posix:syscall-error (c)
105 (sb-posix:syscall-errno c))))
106 #.sb-posix::enoent)
108 (deftest rmdir.error.2
109 (handler-case
110 (sb-posix:rmdir *this-file*)
111 (sb-posix:syscall-error (c)
112 (sb-posix:syscall-errno c)))
113 #.sb-posix::enotdir)
115 #-sunos ; Apparently gives EINVAL on SunOS 8, which doesn't make sense
116 (deftest rmdir.error.3
117 (handler-case
118 (sb-posix:rmdir "/")
119 (sb-posix:syscall-error (c)
120 (sb-posix:syscall-errno c)))
121 #.sb-posix::ebusy)
123 (deftest rmdir.error.4
124 (let* ((dir (ensure-directories-exist
125 (merge-pathnames
126 (make-pathname :directory '(:relative "rmdir.error.4"))
127 *test-directory*)))
128 (file (make-pathname :name "foo" :defaults dir)))
129 (with-open-file (s file :direction :output)
130 (write "" :stream s))
131 (handler-case
132 (sb-posix:rmdir dir)
133 (sb-posix:syscall-error (c)
134 (delete-file file)
135 (sb-posix:rmdir dir)
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"))
144 *test-directory*))
145 (dir2 (merge-pathnames
146 (make-pathname :directory '(:relative "unremovable"))
147 dir)))
148 (sb-posix:mkdir dir #xffffffff)
149 (sb-posix:mkdir dir2 #xffffffff)
150 (sb-posix:chmod dir 0)
151 (handler-case
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)
156 (sb-posix:rmdir dir)
157 (sb-posix:syscall-errno c))))
158 #.sb-posix::eacces)
160 (deftest stat.1
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))
167 (deftest stat.2
168 (let* ((stat (sb-posix:stat "/root"))
169 (mode (sb-posix::stat-mode stat)))
170 (logand mode sb-posix::s-iwoth))
173 (deftest stat.3
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)))
190 #.sb-posix::enoent)
192 (deftest stat.error.2
193 (let* ((dir (merge-pathnames
194 (make-pathname :directory '(:relative "stat.error.2"))
195 *test-directory*))
196 (file (merge-pathnames
197 (make-pathname :name "unstatable")
198 dir)))
199 (sb-posix:mkdir dir #xffffffff)
200 (with-open-file (s file :direction :output)
201 (write "" :stream s))
202 (sb-posix:chmod dir 0)
203 (handler-case
204 (sb-posix:stat file)
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)
208 (sb-posix:rmdir dir)
209 (sb-posix:syscall-errno c))))
210 #.sb-posix::eacces)
212 ;;; stat-mode tests
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)))
217 ,@body)))
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)))
223 ,@body)))
225 (deftest stat-mode.1
226 (with-stat-mode (mode *test-directory*)
227 (sb-posix:s-isreg mode))
230 (deftest stat-mode.2
231 (with-stat-mode (mode *test-directory*)
232 (zerop (sb-posix:s-isdir mode)))
233 nil)
235 (deftest stat-mode.3
236 (with-stat-mode (mode *test-directory*)
237 (sb-posix:s-ischr mode))
240 (deftest stat-mode.4
241 (with-stat-mode (mode *test-directory*)
242 (sb-posix:s-isblk mode))
245 (deftest stat-mode.5
246 (with-stat-mode (mode *test-directory*)
247 (sb-posix:s-isfifo mode))
250 (deftest stat-mode.6
251 (with-stat-mode (mode *test-directory*)
252 (sb-posix:s-issock mode))
255 (deftest stat-mode.7
256 (let ((link-pathname (make-pathname :name "stat-mode.7"
257 :defaults *test-directory*)))
258 (unwind-protect
259 (progn
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))))
264 nil)
266 (deftest stat-mode.8
267 (let ((pathname (make-pathname :name "stat-mode.8"
268 :defaults *test-directory*)))
269 (unwind-protect
270 (progn
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))))
276 nil)
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")))))