signal errors for bad initialization of slot definitions
[sbcl.git] / tests / signals.impure.lisp
1 ;;;; Tests for async signal safety.
2
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; While most of SBCL is derived from the CMU CL system, the test
7 ;;;; files (like this one) were written from scratch after the fork
8 ;;;; from CMU CL.
9 ;;;
10 ;;;; This software is in the public domain and is provided with
11 ;;;; absoluely no warranty. See the COPYING and CREDITS files for
12 ;;;; more information.
13
14 (use-package :test-util)
15
16 (with-test (:name (:async-unwind :specials))
17   (let ((*x0* nil) (*x1* nil) (*x2* nil) (*x3* nil) (*x4* nil))
18     (declare (special *x0* *x1* *x2* *x3* *x4*))
19     (loop repeat 10 do
20           (loop repeat 10 do
21                 (catch 'again
22                   (sb-ext:schedule-timer (sb-ext:make-timer
23                                           (lambda ()
24                                             (throw 'again nil)))
25                                          (random 0.1))
26                   (loop
27                    (let ((*x0* (cons nil nil)) (*x1* (cons nil nil))
28                          (*x2* (cons nil nil)) (*x3* (cons nil nil))
29                          (*x4* (cons nil nil)))
30                      (declare (special *x0* *x1* *x2* *x3* *x4*)))))
31                 (when (not (and (null *x0*) (null *x1*) (null *x2*) (null *x3*)
32                                 (null *x4*)))
33                   (format t "~S ~S ~S ~S ~S~%" *x0* *x1* *x2* *x3* *x4*)
34                   (assert nil)))
35           (princ '*)
36           (force-output))
37     (terpri)))
38
39 (require :sb-posix)
40
41 (with-test (:name (:signal :errno)
42                   ;; This test asserts that nanosleep behaves correctly
43                   ;; for invalid values and sets EINVAL.  Well, we have
44                   ;; nanosleep on Windows, but it depends on the caller
45                   ;; (namely SLEEP) to produce known-good arguments, and
46                   ;; even if we wanted to check argument validity,
47                   ;; integration with `errno' is not to be expected.
48                   :skipped-on :win32)
49   (let* (saved-errno
50          (returning nil)
51          (timer (make-timer (lambda ()
52                               (sb-unix:unix-open "~!@#$%^&*[]()/\\" 0 0)
53                               (assert (= sb-unix:enoent
54                                          (sb-unix::get-errno)))
55                               (setq returning t)))))
56     (schedule-timer timer 0.2)
57     ;; Fail and set errno.
58     (sb-unix:nanosleep -1 -1)
59     (setq saved-errno (sb-unix::get-errno))
60     (assert (= saved-errno sb-posix:einval))
61     ;; Wait, but not with sleep because that will be interrupted and
62     ;; we get EINTR.
63     (loop until returning)
64     (loop repeat 1000000000)
65     (assert (= saved-errno (sb-unix::get-errno)))))
66
67 (with-test (:name :handle-interactive-interrupt
68                   ;; It is desirable to support C-c on Windows, but SIGINT
69                   ;; is not the mechanism to use on this platform.
70                   :skipped-on :win32)
71   (assert (eq :condition
72               (handler-case
73                   (progn
74                     (sb-thread::kill-safely
75                      (sb-thread::thread-os-thread sb-thread::*current-thread*)
76                      sb-unix:sigint)
77                     #+sb-safepoint-strictly
78                     ;; In this case, the signals handler gets invoked
79                     ;; indirectly through an INTERRUPT-THREAD.  Give it
80                     ;; enough time to hit.
81                     (sleep 1))
82                 (sb-sys:interactive-interrupt ()
83                   :condition)))))
84
85 (with-test (:name :bug-640516)
86   ;; On Darwin interrupting a SLEEP so that it took longer than
87   ;; the requested amount caused it to hang.
88   (assert
89    (handler-case
90        (sb-ext:with-timeout 10
91          (let (to)
92            (handler-bind ((sb-ext:timeout (lambda (c)
93                                             (unless to
94                                               (setf to t)
95                                               (sleep 2)
96                                               (continue c)))))
97              (sb-ext:with-timeout 0.1 (sleep 1) t))))
98      (sb-ext:timeout ()
99        nil))))