Reduce the numbers of threads in test ATOMIC-UPDATE on 32bit platforms
[sbcl.git] / tests / test-util.lisp
index 00a986d..8381019 100644 (file)
 (defvar *break-on-failure* nil)
 (defvar *break-on-expected-failure* nil)
 
-(defmacro with-test ((&key fails-on name) &body body)
-  `(handler-case (progn
-                   (start-test)
-                   ,@body
-                   (when (expected-failure-p ,fails-on)
-                     (fail-test :unexpected-success ',name nil)))
-    (error (error)
-     (if (expected-failure-p ,fails-on)
-         (fail-test :expected-failure ',name error)
-         (fail-test :unexpected-failure ',name error)))))
+(defun log-msg (&rest args)
+  (format *trace-output* "~&::: ")
+  (apply #'format *trace-output* args)
+  (terpri *trace-output*)
+  (force-output *trace-output*))
+
+(defmacro with-test ((&key fails-on broken-on skipped-on name) &body body)
+  (let ((block-name (gensym)))
+    `(progn
+       (start-test)
+       (cond
+         ((broken-p ,broken-on)
+          (fail-test :skipped-broken ',name "Test broken on this platform"))
+         ((skipped-p ,skipped-on)
+          (fail-test :skipped-disabled ',name "Test disabled for this combination of platform and features"))
+         (t
+          (block ,block-name
+            (handler-bind ((error (lambda (error)
+                                    (if (expected-failure-p ,fails-on)
+                                        (fail-test :expected-failure ',name error)
+                                        (fail-test :unexpected-failure ',name error))
+                                    (return-from ,block-name))))
+              (progn
+                (log-msg "Running ~S" ',name)
+                ,@body
+                (if (expected-failure-p ,fails-on)
+                    (fail-test :unexpected-success ',name nil)
+                    (log-msg "Success ~S" ',name))))))))))
 
 (defun report-test-status ()
-  (with-standard-io-syntax 
+  (with-standard-io-syntax
       (with-open-file (stream "test-status.lisp-expr"
                               :direction :output
                               :if-exists :supersede)
     (setf *test-count* 0))
   (incf *test-count*))
 
-(defun fail-test (type test-name condition)  
+(defun really-invoke-debugger (condition)
+  (with-simple-restart (continue "Continue")
+    (let ((*invoke-debugger-hook* *invoke-debugger-hook*))
+      (enable-debugger)
+      (invoke-debugger condition))))
+
+(defun fail-test (type test-name condition)
+  (if (stringp condition)
+      (log-msg "~@<~A ~S ~:_~A~:>"
+               type test-name condition)
+      (log-msg "~@<~A ~S ~:_due to ~S: ~4I~:_\"~A\"~:>"
+               type test-name condition condition))
   (push (list type *test-file* (or test-name *test-count*))
         *failures*)
-  (when (or (and *break-on-failure*
-                 (not (eq type :expected-failure)))
-            *break-on-expected-failure*)
-    (really-invoke-debugger condition)))
+  (unless (stringp condition)
+    (when (or (and *break-on-failure*
+                   (not (eq type :expected-failure)))
+              *break-on-expected-failure*)
+      (really-invoke-debugger condition))))
 
 (defun expected-failure-p (fails-on)
   (sb-impl::featurep fails-on))
 
-(defun really-invoke-debugger (condition)
-  (with-simple-restart (continue "Continue")
-    (let ((*invoke-debugger-hook* *invoke-debugger-hook*))
-      (enable-debugger)
-      (invoke-debugger condition))))
+(defun broken-p (broken-on)
+  (sb-impl::featurep broken-on))
+
+(defun skipped-p (skipped-on)
+  (sb-impl::featurep skipped-on))
+
+(defun test-env ()
+  (cons (format nil "SBCL_MACHINE_TYPE=~A" (machine-type))
+        (cons (format nil "SBCL_SOFTWARE_TYPE=~A" (software-type))
+              (posix-environ))))