]> git.eshelyaron.com Git - emacs.git/commitdiff
* automated/file-notify-tests.el
authorMichael Albinus <michael.albinus@gmx.de>
Fri, 5 Jul 2013 14:06:14 +0000 (16:06 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Fri, 5 Jul 2013 14:06:14 +0000 (16:06 +0200)
(file-notify-test-remote-temporary-file-directory): Use
`null-device' on w32.
(file-notify--test-tmpfile, file-notify--test-tmpfile1)
(file-notify--test-results, file-notify--test-event)
(file-notify--deftest-remote, file-notify--event-test)
(file-notify--test-event-handler)
(file-notify--test-make-temp-name): Renamed, in order to mark them
internal.
(tramp-message-show-message, tramp-read-passwd): Tweak them for
better fitting in noninteractive tests.
(file-notify-test00-availability): Renamed from `file-notify-test0'.
(file-notify-test01-add-watch): Renamed from `file-notify-test1'.
Use `temporary-file-directory '.
(file-notify-test01-add-watch-remote): New test.
(file-notify-test02-events): Renamed from `file-notify-test2'.
(file-notify-test02-events-remote): Renamed from `file-notify-test3'.
(file-notify-test03-autorevert): Renamed from
`file-notify-test4'.  Use timeouts.
(file-notify-test03-autorevert-remote): Renamed from
`file-notify-test5'.

test/ChangeLog
test/automated/file-notify-tests.el

index ab7a57bc35ddb632154720e33b31dd5cf632d90b..aded547330414e0f90d1f2686884d66ec91ae010 100644 (file)
@@ -1,3 +1,27 @@
+2013-07-05  Michael Albinus  <michael.albinus@gmx.de>
+
+       * automated/file-notify-tests.el
+       (file-notify-test-remote-temporary-file-directory): Use
+       `null-device' on w32.
+       (file-notify--test-tmpfile, file-notify--test-tmpfile1)
+       (file-notify--test-results, file-notify--test-event)
+       (file-notify--deftest-remote, file-notify--event-test)
+       (file-notify--test-event-handler)
+       (file-notify--test-make-temp-name): Renamed, in order to mark them
+       internal.
+       (tramp-message-show-message, tramp-read-passwd): Tweak them for
+       better fitting in noninteractive tests.
+       (file-notify-test00-availability): Renamed from `file-notify-test0'.
+       (file-notify-test01-add-watch): Renamed from `file-notify-test1'.
+       Use `temporary-file-directory '.
+       (file-notify-test01-add-watch-remote): New test.
+       (file-notify-test02-events): Renamed from `file-notify-test2'.
+       (file-notify-test02-events-remote): Renamed from `file-notify-test3'.
+       (file-notify-test03-autorevert): Renamed from
+       `file-notify-test4'.  Use timeouts.
+       (file-notify-test03-autorevert-remote): Renamed from
+       `file-notify-test5'.
+
 2013-07-04  Michael Albinus  <michael.albinus@gmx.de>
 
        * automated/file-notify-tests.el: New package.
index 56259cd3ff4eef2d7ceceaa536155cac1ae59d68..8fcfbe548fc74e04c8887e6fba1e6d76523b8855 100644 (file)
 
 ;; Some of the tests are intended to run over remote files.  Set
 ;; `file-notify-test-remote-temporary-file-directory' to a suitable
-;; value.  The remote host must also provide the `inotifywait' program.
+;; value.  It must NOT require an interactive password prompt, when
+;; running the tests in batch mode.
+
+;; If you want to skip tests for remote files, set this variable to
+;; `null-device'.
 
 ;;; Code:
 
 (require 'ert)
 (require 'filenotify)
 
-(ert-deftest file-notify-test0 ()
-  "Test availability of \\[file-notify]."
+;; There is no default value on w32 systems, which could work out of the box.
+(defconst file-notify-test-remote-temporary-file-directory
+  (if (eq system-type 'windows-nt) null-device "/ssh::/tmp")
+  "Temporary directory for Tramp tests.")
+
+(defvar file-notify--test-tmpfile nil)
+(defvar file-notify--test-tmpfile1 nil)
+(defvar file-notify--test-results nil)
+(defvar file-notify--test-event nil)
+
+(require 'tramp)
+(setq tramp-verbose 0
+      tramp-message-show-message nil)
+(when noninteractive (defalias 'tramp-read-passwd 'ignore))
+
+(defmacro file-notify--deftest-remote (test docstring)
+  "Define ert `TEST-remote' for remote files."
+  `(when (ignore-errors
+          (and
+           (file-remote-p file-notify-test-remote-temporary-file-directory)
+           (file-directory-p file-notify-test-remote-temporary-file-directory)
+           (file-writable-p file-notify-test-remote-temporary-file-directory)))
+     ;; Define the test.
+     (ert-deftest ,(intern (concat (symbol-name test) "-remote")) ()
+       ,docstring
+       (let* ((temporary-file-directory
+              file-notify-test-remote-temporary-file-directory)
+             (ert-test (ert-get-test ',test))
+             (most-recent-result (ert-test-most-recent-result ert-test))
+             result)
+        (unwind-protect
+            (progn
+              (setq result
+                    (condition-case err
+                        (ert-run-test ert-test)
+                      ((error quit)
+                       (ert-fail err))))
+              (when (ert-test-failed-p result)
+                (ert-fail
+                 (cadr (ert-test-result-with-condition-condition result)))))
+          ;; Reset status of TEST.
+          (setf (ert-test-most-recent-result ert-test) most-recent-result))))))
+
+(ert-deftest file-notify-test00-availability ()
+  "Test availability of `file-notify'."
   (should (memq file-notify-support '(gfilenotify inotify w32notify))))
 
-(ert-deftest file-notify-test1 ()
-  "Add watch via \\[file-notify-add-watch]."
+(ert-deftest file-notify-test01-add-watch ()
+  "Check `file-notify-add-watch'."
   (let (desc)
     ;; Check, that different valid parameters are accepted.
-    (should (setq desc (file-notify-add-watch "/" '(change) 'ignore)))
+    (should (setq desc (file-notify-add-watch
+                       temporary-file-directory '(change) 'ignore)))
     (file-notify-rm-watch desc)
-    (should (setq desc (file-notify-add-watch "/" '(attribute-change) 'ignore)))
+    (should (setq desc (file-notify-add-watch
+                       temporary-file-directory '(attribute-change) 'ignore)))
     (file-notify-rm-watch desc)
     (should (setq desc (file-notify-add-watch
-                       "/" '(change attribute-change) 'ignore)))
+                       temporary-file-directory
+                       '(change attribute-change) 'ignore)))
     (file-notify-rm-watch desc)
 
     ;; Check error handling.
      (equal (should-error (file-notify-add-watch 1 2 3))
            '(wrong-type-argument 1)))
     (should
-     (equal (should-error (file-notify-add-watch "/" 2 3))
+     (equal (should-error (file-notify-add-watch temporary-file-directory 2 3))
            '(wrong-type-argument 2)))
     (should
-     (equal (should-error (file-notify-add-watch "/" '(change) 3))
+     (equal (should-error (file-notify-add-watch
+                          temporary-file-directory '(change) 3))
            '(wrong-type-argument 3)))))
 
-(defvar file-notify-test-tmpfile nil)
-(defvar file-notify-test-tmpfile1 nil)
-(defvar file-notify-test-results nil)
-(defconst file-notify-test-remote-temporary-file-directory "/ssh::/tmp"
-  "Temporary directory for Tramp tests.")
-
-(defvar tramp-verbose)
-(setq tramp-verbose 0)
-(defvar file-notify--event)
-
-(defun file-notify-test-run-remote-test ()
-  "Check, whether the remote tests can be run."
-  (ignore-errors
-    (and
-     (file-directory-p file-notify-test-remote-temporary-file-directory)
-     (file-writable-p file-notify-test-remote-temporary-file-directory))))
+(file-notify--deftest-remote file-notify-test01-add-watch
+  "Check `file-notify-add-watch' for remote files.")
 
-(defun file-notify-event-test ()
-  "Ert test function to be called by `file-notify-test-event-handler'.
-We cannot pass arguments, so we assume that `file-notify--event'
+(defun file-notify--test-event-test ()
+  "Ert test function to be called by `file-notify--test-event-handler'.
+We cannot pass arguments, so we assume that `file-notify--test-event'
 is bound somewhere."
-  (message "Event %S" file-notify--event)
+  ;(message "Event %S" file-notify--test-event)
   ;; Check the file name.
   (should
-   (string-equal (file-notify--event-file-name file-notify--event)
-                file-notify-test-tmpfile))
+   (string-equal (file-notify--event-file-name file-notify--test-event)
+                file-notify--test-tmpfile))
   ;; Check the second file name if exists.
-  (when (eq (nth 1 file-notify--event) 'renamed)
+  (when (eq (nth 1 file-notify--test-event) 'renamed)
     (should
      (string-equal
-      (file-notify--event-file1-name file-notify--event)
-      file-notify-test-tmpfile1))))
-
-(defun file-notify-test-event-handler (file-notify--event)
-  "Run a test over FILE-NOTIFY--EVENT.
-Save the result in `file-notify-test-results', for later analysis."
-  (let ((result (ert-run-test (make-ert-test :body 'file-notify-event-test))))
-    (setq file-notify-test-results
-         (append file-notify-test-results `(,result)))))
-
-(defun file-notify-test-make-temp-name ()
+      (file-notify--event-file1-name file-notify--test-event)
+      file-notify--test-tmpfile1))))
+
+(defun file-notify--test-event-handler (file-notify--test-event)
+  "Run a test over FILE-NOTIFY--TEST-EVENT.
+Save the result in `file-notify--test-results', for later analysis."
+  (let ((result
+        (ert-run-test (make-ert-test :body 'file-notify--test-event-test))))
+    (setq file-notify--test-results
+         (append file-notify--test-results `(,result)))))
+
+(defun file-notify--test-make-temp-name ()
   "Create a temporary file name for test."
   (expand-file-name
    (make-temp-name "file-notify-test") temporary-file-directory))
 
-(ert-deftest file-notify-test2 ()
+(ert-deftest file-notify-test02-events ()
   "Check file creation/removal notifications."
   (let (desc)
     (unwind-protect
        (progn
-         (setq file-notify-test-results nil
-               file-notify-test-tmpfile (file-notify-test-make-temp-name)
-               file-notify-test-tmpfile1 (file-notify-test-make-temp-name)
+         (setq file-notify--test-results nil
+               file-notify--test-tmpfile (file-notify--test-make-temp-name)
+               file-notify--test-tmpfile1 (file-notify--test-make-temp-name)
                desc
                (file-notify-add-watch
-                file-notify-test-tmpfile
-                '(change) 'file-notify-test-event-handler))
+                file-notify--test-tmpfile
+                '(change) 'file-notify--test-event-handler))
 
          ;; Check creation and removal.
-         (write-region "any text" nil file-notify-test-tmpfile)
-         (delete-file file-notify-test-tmpfile)
+         (write-region "any text" nil file-notify--test-tmpfile)
+         (delete-file file-notify--test-tmpfile)
 
          ;; Check copy and rename.
-         (write-region "any text" nil file-notify-test-tmpfile)
-         (copy-file file-notify-test-tmpfile file-notify-test-tmpfile1)
-         (delete-file file-notify-test-tmpfile)
-         (delete-file file-notify-test-tmpfile1)
+         (write-region "any text" nil file-notify--test-tmpfile)
+         (copy-file file-notify--test-tmpfile file-notify--test-tmpfile1)
+         (delete-file file-notify--test-tmpfile)
+         (delete-file file-notify--test-tmpfile1)
 
-         (write-region "any text" nil file-notify-test-tmpfile)
-         (rename-file file-notify-test-tmpfile file-notify-test-tmpfile1)
-         (delete-file file-notify-test-tmpfile1))
+         (write-region "any text" nil file-notify--test-tmpfile)
+         (rename-file file-notify--test-tmpfile file-notify--test-tmpfile1)
+         (delete-file file-notify--test-tmpfile1))
 
       ;; Wait for events, and exit.
       (sit-for 5 'nodisplay)
       (file-notify-rm-watch desc)
-      (ignore-errors (delete-file file-notify-test-tmpfile))
-      (ignore-errors (delete-file file-notify-test-tmpfile1))))
+      (ignore-errors (delete-file file-notify--test-tmpfile))
+      (ignore-errors (delete-file file-notify--test-tmpfile1))))
 
-  (dolist (result file-notify-test-results)
+  (dolist (result file-notify--test-results)
     ;(message "%s" (ert-test-result-messages result))
     (when (ert-test-failed-p result)
       (ert-fail (cadr (ert-test-result-with-condition-condition result))))))
 
-;; TODO: When the remote test fails, suppress FAILED indication for TEST.
-(defmacro file-notify-test-remote (test)
-  "Run ert TEST for remote files."
-  `(let* ((temporary-file-directory
-          file-notify-test-remote-temporary-file-directory)
-         (ert-test (ert-get-test ,test))
-         (most-recent-result (ert-test-most-recent-result ert-test))
-         result)
-     (unwind-protect
-        (progn
-          (setq result
-                (condition-case err
-                    (ert-run-test (ert-get-test ,test))
-                  ((error quit)
-                   (ert-fail err))))
-          (when (ert-test-failed-p result)
-            (ert-fail
-             (cadr (ert-test-result-with-condition-condition result)))))
-       ;; Reset status of TEST.
-       (setf (ert-test-most-recent-result ert-test) most-recent-result))))
-
-(when (file-notify-test-run-remote-test)
-  (ert-deftest file-notify-test3 ()
-    "Check file creation/removal notification for remote files."
-    (file-notify-test-remote 'file-notify-test2))
-) ;; (file-notify-test-run-remote-test)
+(file-notify--deftest-remote file-notify-test02-events
+  "Check file creation/removal notifications for remote files.")
 
 ;; autorevert runs only in interactive mode.
 (defvar auto-revert-remote-files)
@@ -174,50 +188,58 @@ Save the result in `file-notify-test-results', for later analysis."
 (require 'autorevert)
 (when (null noninteractive)
 
-  (ert-deftest file-notify-test4 ()
+  (ert-deftest file-notify-test03-autorevert ()
     "Check autorevert via file notification.
 This test is skipped in batch mode."
     ;; `auto-revert-buffers' runs every 5".  And we must wait, until
     ;; the file has been reverted.
-    (let ((wait 10)
+    (let ((timeout 10)
          buf)
       (unwind-protect
          (progn
-           (setq file-notify-test-tmpfile (file-notify-test-make-temp-name))
+           (setq file-notify--test-tmpfile (file-notify--test-make-temp-name))
 
-           (write-region "any text" nil file-notify-test-tmpfile)
-           (setq buf (find-file-noselect file-notify-test-tmpfile))
+           (write-region "any text" nil file-notify--test-tmpfile)
+           (setq buf (find-file-noselect file-notify--test-tmpfile))
            (with-current-buffer buf
              (should (string-equal (buffer-string) "any text"))
              (auto-revert-mode 1)
+
              ;; `auto-revert-buffers' runs every 5".
-             (sit-for wait)
+             (with-timeout (timeout (ignore))
+               (while (null auto-revert-notify-watch-descriptor)
+                 (sit-for 0.1 'nodisplay)))
 
              ;; Check, that file notification has been used.
              (should auto-revert-mode)
              (should auto-revert-use-notify)
              (should auto-revert-notify-watch-descriptor)
 
-             ;; Modify file.
+             ;; Modify file.  We wait for a second, in order to
+             ;; have another timestamp.
+             (sit-for 1)
              (shell-command
               (format "echo -n 'another text' >%s"
-                      (or (file-remote-p file-notify-test-tmpfile 'localname)
-                          file-notify-test-tmpfile)))
-             (sit-for wait)
+                      (or (file-remote-p file-notify--test-tmpfile 'localname)
+                          file-notify--test-tmpfile)))
 
              ;; Check, that the buffer has been reverted.
+             (with-current-buffer (get-buffer-create "*Messages*")
+               (with-timeout (timeout (ignore))
+                 (while
+                     (null (string-match
+                            (format "Reverting buffer `%s'." (buffer-name buf))
+                            (buffer-string)))
+                   (sit-for 0.1 'nodisplay))))
              (should (string-equal (buffer-string) "another text"))))
 
        ;; Exit.
        (ignore-errors (kill-buffer buf))
-       (ignore-errors (delete-file file-notify-test-tmpfile)))))
+       (ignore-errors (delete-file file-notify--test-tmpfile)))))
 
-  (when (file-notify-test-run-remote-test)
-    (ert-deftest file-notify-test5 ()
-      "Check autorevert via file notification for remote files.
-This test is skipped in batch mode."
-      (file-notify-test-remote 'file-notify-test4))
-    ) ;; (file-notify-test-run-remote-test)
+  (file-notify--deftest-remote file-notify-test03-autorevert
+    "Check autorevert via file notification for remote files.
+This test is skipped in batch mode.")
   ) ;; (null noninteractive)
 
 (defun file-notify-test-all (&optional interactive)