From: Michael Albinus Date: Fri, 5 Jul 2013 14:06:14 +0000 (+0200) Subject: * automated/file-notify-tests.el X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~1922 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=84b6d3df1ad4f84faaf2bdf511f184ae1716762e;p=emacs.git * 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'. --- diff --git a/test/ChangeLog b/test/ChangeLog index ab7a57bc35d..aded5473304 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,27 @@ +2013-07-05 Michael Albinus + + * 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 * automated/file-notify-tests.el: New package. diff --git a/test/automated/file-notify-tests.el b/test/automated/file-notify-tests.el index 56259cd3ff4..8fcfbe548fc 100644 --- a/test/automated/file-notify-tests.el +++ b/test/automated/file-notify-tests.el @@ -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))) + (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. @@ -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.") - -(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)