(in-package #:clsql-tests)
+(defvar *report-stream* nil "Stream to send text report.")
+(defvar *sexp-report-stream* nil "Stream to send sexp report.")
(defvar *rt-connection*)
(defvar *rt-fddl*)
(defvar *rt-fdml*)
-(defun test-connect-to-database (db-type)
- (let ((spec (db-type-spec db-type (read-specs))))
- (when (db-backend-has-create/destroy-db? db-type)
- (ignore-errors (destroy-database spec :database-type db-type))
- (ignore-errors (create-database spec :database-type db-type)))
-
-
- (setf *test-database-type* db-type)
- (when (>= (length spec) 3)
- (setq *test-database-user* (third spec)))
-
- ;; Connect to the database
- (clsql:connect spec
- :database-type db-type
- :make-default t
- :if-exists :old))
+(defun test-connect-to-database (db-type spec)
+ (when (db-backend-has-create/destroy-db? db-type)
+ (ignore-errors (destroy-database spec :database-type db-type))
+ (ignore-errors (create-database spec :database-type db-type)))
+
+ (setf *test-database-type* db-type)
+ (when (>= (length spec) 3)
+ (setq *test-database-user* (third spec)))
+
+ ;; Connect to the database
+ (clsql:connect spec
+ :database-type db-type
+ :make-default t
+ :if-exists :old)
+
+ (unless (db-backend-has-create/destroy-db? db-type)
+ (truncate-database :database *default-database*))
(setf *test-database-underlying-type*
- (clsql-sys:database-underlying-type *default-database*))
+ (clsql-sys:database-underlying-type *default-database*))
*default-database*)
(defparameter employee10 nil)
(defun test-initialise-database ()
- ;; Ensure that old objects are removed
- (unless (db-backend-has-create/destroy-db? *test-database-type*)
- (truncate-database *default-database*))
-
(test-basic-initialize)
(clsql:create-view-from-class 'employee)
:first-name "Vladamir"
:last-name "Putin"
:email "putin@soviet.org"))
-
+
+ ;; sleep to ensure birthdays are no longer at current time
+ (sleep 2)
+
;; Lenin manages everyone
(clsql:add-to-relation employee2 'manager employee1)
(clsql:add-to-relation employee3 'manager employee1)
(clsql:update-records-from-instance company1))
(defvar *error-count* 0)
+(defvar *error-list* nil)
-(defun run-tests ()
+(defun run-tests-append-report-file (report-file)
+ (let* ((report-path (etypecase report-file
+ (pathname report-file)
+ (string (parse-namestring report-file))))
+ (sexp-report-path (make-pathname :defaults report-path
+ :type "sexp")))
+ (with-open-file (rs report-path :direction :output
+ :if-exists :append
+ :if-does-not-exist :create)
+ (with-open-file (srs sexp-report-path :direction :output
+ :if-exists :append
+ :if-does-not-exist :create)
+ (run-tests :report-stream rs :sexp-report-stream srs)))))
+
+(defun run-tests (&key (report-stream *standard-output*) (sexp-report-stream nil))
(let ((specs (read-specs))
- (*error-count* 0))
+ (*report-stream* report-stream)
+ (*sexp-report-stream* sexp-report-stream)
+ (*error-count* 0)
+ (*error-list* nil))
(unless specs
(warn "Not running tests because test configuration file is missing")
(return-from run-tests :skipped))
(load-necessary-systems specs)
(dolist (db-type +all-db-types+)
- (when (db-type-spec db-type specs)
- (do-tests-for-backend db-type)))
- (zerop *error-count*)))
+ (dolist (spec (db-type-spec db-type specs))
+ (do-tests-for-backend db-type spec))))
+ (zerop *error-count*))
(defun load-necessary-systems (specs)
(dolist (db-type +all-db-types+)
(when (db-type-spec db-type specs)
(db-type-ensure-system db-type))))
-(defun do-tests-for-backend (db-type)
- (format t
- "~&
-*******************************************************************
-*** Running CLSQL tests with ~A backend.
-*******************************************************************
-" db-type)
-
- (test-connect-to-database db-type)
+(defun do-tests-for-backend (db-type spec)
+ (test-connect-to-database db-type spec)
+
(unwind-protect
(multiple-value-bind (test-forms skip-tests)
(compute-tests-for-backend db-type *test-database-underlying-type*)
+ (format *report-stream*
+ "~&
+******************************************************************************
+*** CLSQL Test Suite begun at ~A
+*** ~A
+*** ~A on ~A
+*** Database ~A backend~A.
+******************************************************************************
+"
+ (clsql-base:format-time
+ nil
+ (clsql-base:utime->time (get-universal-time)))
+ (lisp-implementation-type)
+ (lisp-implementation-version)
+ (machine-type)
+ db-type
+ (if (not (eq db-type *test-database-underlying-type*))
+ (format nil " with underlying type ~A"
+ *test-database-underlying-type*)
+ "")
+ )
+
(test-initialise-database)
-
+
(regression-test:rem-all-tests)
(dolist (test-form test-forms)
(eval test-form))
- (let ((remaining (rtest:do-tests)))
- (when (consp remaining)
+ (let ((remaining (regression-test:do-tests *report-stream*)))
+ (when (regression-test:pending-tests)
(incf *error-count* (length remaining))))
- (format t "~&Tests skipped for ~A:" db-type)
+ (let ((sexp-error (list db-type
+ *test-database-underlying-type*
+ (get-universal-time)
+ (length test-forms)
+ (regression-test:pending-tests)
+ (lisp-implementation-type)
+ (lisp-implementation-version)
+ (machine-type))))
+ (when *sexp-report-stream*
+ (write sexp-error :stream *sexp-report-stream*))
+ (push sexp-error *error-list*))
+
+ (format *report-stream* "~&Tests skipped:")
(if skip-tests
(dolist (skipped skip-tests)
- (format t "~& ~20A ~A~%" (car skipped) (cdr skipped)))
- (format t " None~%")))
+ (format *report-stream*
+ "~& ~20A ~A~%" (car skipped) (cdr skipped)))
+ (format *report-stream* " None~%")))
(disconnect)))
(defun compute-tests-for-backend (db-type db-underlying-type)
- (declare (ignore db-type))
(let ((test-forms '())
(skip-tests '()))
(dolist (test-form (append