* 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'.
This commit is contained in:
parent
d610f6dd0f
commit
84b6d3df1a
2 changed files with 150 additions and 104 deletions
|
@ -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.
|
||||
|
|
|
@ -21,27 +21,77 @@
|
|||
|
||||
;; 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)))
|
||||
(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 '(change) 'ignore)))
|
||||
(file-notify-rm-watch desc)
|
||||
(should (setq desc (file-notify-add-watch
|
||||
"/" '(change attribute-change) 'ignore)))
|
||||
temporary-file-directory '(attribute-change) 'ignore)))
|
||||
(file-notify-rm-watch desc)
|
||||
(should (setq desc (file-notify-add-watch
|
||||
temporary-file-directory
|
||||
'(change attribute-change) 'ignore)))
|
||||
(file-notify-rm-watch desc)
|
||||
|
||||
;; Check error handling.
|
||||
|
@ -52,121 +102,85 @@
|
|||
(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.")
|
||||
(file-notify--deftest-remote file-notify-test01-add-watch
|
||||
"Check `file-notify-add-watch' for remote files.")
|
||||
|
||||
(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))))
|
||||
|
||||
(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))))
|
||||
(file-notify--event-file1-name file-notify--test-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-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 ()
|
||||
(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)
|
||||
|
|
Loading…
Add table
Reference in a new issue