test-module-excessive-depend.script 3.51 KB
Newer Older
1
;;; -*- Lisp -*-
2

3 4 5 6 7 8 9 10 11 12 13 14
;;;---------------------------------------------------------------------------
;;; Here's what we are trying to test.  Let us say we have a system X that
;;; contains a file, "file1" and a module, "quux" that depends on file 1.  In
;;; turn, "quux" contains "file2" which depends on loading another system, Y
;;; (note that this dependency cannot be recorded using only the defsystem
;;; grammar; we must use an ancillary method definition).  If we over-force
;;; actions, then the recompiling of "file1" will force "quux" to be loaded,
;;; forcing "file2" load and in turn forcing the reload and recompilation of Y.
;;; If operations are done properly, a change to file1 will force recompilation
;;; and reloading of "file2," but /not/ of system Y.
;;;---------------------------------------------------------------------------

15 16 17 18 19 20
(def-test-system :test-module-excessive-depend
  :components ((:file "file1")
               (:module "quux"
                :pathname ""
                :depends-on ("file1")
                :components ((:file "file2")))))
21

22 23
(defun find-quux ()
  (find-component :test-module-excessive-depend "quux"))
24

25 26
(defun find-file2 ()
  (find-component (find-quux) "file2"))
27

28 29 30 31
(defmethod component-depends-on ((op load-op)
                                 (c (eql (find-file2))))
  (cons `(load-op ,(find-system "file3-only"))
        (call-next-method)))
32

33 34 35 36
(defmethod component-depends-on ((op compile-op)
                                 (c (eql (find-file2))))
  (cons `(load-op ,(find-system "file3-only"))
        (call-next-method)))
37

38 39
(DBG "loading test-module-excessive-depend"
     (operate 'load-op 'test-module-excessive-depend))
40

41 42 43 44 45 46 47 48 49
;; test that it compiled
(defparameter file1 (test-fasl "file1"))
(defparameter file2 (test-fasl "file2"))
(defparameter file3 (test-fasl "file3"))
(defparameter file1-date (file-write-date file1))
(defparameter file2-date (file-write-date file2))
(defparameter file3-date (file-write-date file3))
(unless (and file1-date file2-date file3-date)
  (error "Failed to compile one of the three files ~
50
	     that should be compiled for this test: ~{~a~}"
51 52 53 54
         (mapcar #'cdr
                 (remove-if #'car
                            (pairlis (list file1-date file2-date file3-date)
                                     '("file1" "file2" "file3"))))))
55

56
;; and loaded
57 58
(assert (eval (find-symbol* '#:*file1* :test-package)))
(assert (eval (find-symbol* '#:*file3* :test-package)))
59 60


61 62 63 64
;; now touch file1 and check that file2 _is_ also recompiled
;; but that file3 is _not_ recompiled.
;; this will only work if the cross-module (intra-system)
;; dependency bug is fixed and the excessive compilation bug is fixed.
65

66
(defparameter before file3-date)
67
(touch-file (test-source "file1.lisp") :timestamp (- before 60))
68
(touch-file file1 :timestamp (- before 90))
69
(touch-file (test-source "file2.lisp") :timestamp (- before 30))
70
(touch-file file2 :timestamp (- before 15))
71

72 73
(defparameter plan (traverse 'load-op 'test-module-excessive-depend))
(defparameter file3c (find-component :file3-only "file3"))
74
#|(format t "~%Operation plan is:~%")(pprint plan)(terpri)|#
75
(when (loop :for (o . c) :in plan :thereis (and (eq c file3c) (typep o 'asdf:compile-op)))
76
  (error "Excessive operations on file3-only system.  Bad propagation of dependencies."))
77
(operate 'load-op 'test-module-excessive-depend)
78 79
(assert-compare (>= (file-write-date file1) before))
(assert-compare (>= (file-write-date file2) before))
80 81 82
(unless (= (file-write-date file3)
           file3-date)
  (error "Excessive compilation of file3.lisp:  traverse bug."))