diff options
author | John Wiegley <johnw@newartisans.com> | 2016-02-22 11:33:54 -0800 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2016-02-22 11:33:54 -0800 |
commit | 81ef756e6aea369ec78f19b3609f01ceddc5851f (patch) | |
tree | 183251df6d3bf87ccc1216cf187e141488dd7c82 /test | |
parent | 23d463d40cca1b68ef4f74a303b748e0649c506c (diff) | |
parent | a9c48d5c9e3cb5952aab1c6e8821677d49068a74 (diff) | |
download | emacs-81ef756e6aea369ec78f19b3609f01ceddc5851f.tar.gz |
Merge from origin/emacs-25
a9c48d5 Additional fixes for file notification
6bd9d69 Fix documentation of 'global-disable-point-adjustment'
8c22ac9 ; Spelling fix
2975784 Set file modes of pinentry socket for extra safety
2667b3e Clarify GnuPG version compatibility chapter
5e34c36 Revert "Change the default socket location for pinentry"
e19c1c3 Kill off xref--display-history
5698947 Keep the xref buffer visible until the user quits it explicitly
e34fbde Change the default socket location for pinentry
5f89658 Mention how to enable pinentry feature
db51224 Sync with gnulib
aa5a794 Remove `semanticdb-save-all-db-idle' from `auto-save-hook'
2d8b2fd Restore point when writing semantic table to disk
27d3430 Mention pinentry.el in epa manual
5baa001 Fix Bug#22736
7261355 Grammar fix in doc string
d0f3b18 Naming fix for consistency
74ec92d Prefer customized value for GnuPG executable
ea0b604 Fix memory reservation on MS-Windows
c5f72aa Update NextStep readme and add wish list.
6de26a7 Report also result in `file-notify--test-event-handler'
5d17ae7 Improve file-notify-test08-watched-file-in-watched-dir
1cb1268 Fix todo-mode item date editing bugs
1e996cf Fix "[:upper:]" for non-ASCII characters
896f993 Allow customising the article mode cursor behavior
24c1c1d Use pop-to-buffer-same-window in woman.el
2a75f64 New filenotify test for bug#22736
c9bccf7 Report critical battery errors
d675db9 Make eww message toggling message clearer
5e0bb40 * lisp/calc/calc-units.el (math-standard-units): Update to 2014 CODATA adjustment.
fa8fd65 ; Improve character-folding entries in NEWS
3722a69 Fix bugs in window resizing code
289d5c6 Fix decoding DOS EOL in a unibyte buffer
2abcb06 Correct c-parse-state cache manipulation error.
14aec91 Take advantage of new GnuPG version check function
e80c2a7 Make GnuPG version check robuster
15a9464 Fix x-load-color-file pointer signedness
132dbf0 * lisp/time-stamp.el (time-stamp-time-zone): Fix doc string punct.
78ab6f1 Follow convention for greek letter constants.
106b5bb Add Stefan-Boltzmann constant to calc units table.
b96baa8 * lisp/calc/calc-units.el (math-build-units-table-buffer): Use special-mode.
5f91cf9 Avoid loading cl-lib for term/xterm.elc, eg in -Q -nw. (Bug#22669)
2d40f7d Fix soffice UserInstallation-URL for Windows
b1a3ebe Fix display of <pre> elements
57d0e3d ; * lisp/help-fns.el: Remove outdated comment.
7a0628d ; * admin/make-tarball.txt: Mention cleaning.
Diffstat (limited to 'test')
-rw-r--r-- | test/lisp/filenotify-tests.el | 232 |
1 files changed, 175 insertions, 57 deletions
diff --git a/test/lisp/filenotify-tests.el b/test/lisp/filenotify-tests.el index a8521828c0e..a16de7fb058 100644 --- a/test/lisp/filenotify-tests.el +++ b/test/lisp/filenotify-tests.el @@ -58,6 +58,8 @@ (defvar file-notify--test-tmpfile nil) (defvar file-notify--test-tmpfile1 nil) (defvar file-notify--test-desc nil) +(defvar file-notify--test-desc1 nil) +(defvar file-notify--test-desc2 nil) (defvar file-notify--test-results nil) (defvar file-notify--test-event nil) (defvar file-notify--test-events nil) @@ -77,6 +79,8 @@ It is different for local and remote file notification libraries.") (defun file-notify--test-cleanup () "Cleanup after a test." (file-notify-rm-watch file-notify--test-desc) + (file-notify-rm-watch file-notify--test-desc1) + (file-notify-rm-watch file-notify--test-desc2) (ignore-errors (delete-file (file-newest-backup file-notify--test-tmpfile))) @@ -96,6 +100,8 @@ It is different for local and remote file notification libraries.") (setq file-notify--test-tmpfile nil file-notify--test-tmpfile1 nil file-notify--test-desc nil + file-notify--test-desc1 nil + file-notify--test-desc2 nil file-notify--test-results nil file-notify--test-events nil) (when file-notify--test-event @@ -250,19 +256,15 @@ is bound somewhere." (should (equal (car file-notify--test-event) file-notify--test-desc)) ;; Check the file name. (should - (or (string-equal (file-notify--event-file-name file-notify--test-event) - file-notify--test-tmpfile) - (string-equal (file-notify--event-file-name file-notify--test-event) - file-notify--test-tmpfile1) - (string-equal (file-notify--event-file-name file-notify--test-event) - temporary-file-directory))) + (string-prefix-p + (file-notify--event-watched-file file-notify--test-event) + (file-notify--event-file-name file-notify--test-event))) ;; Check the second file name if exists. (when (eq (nth 1 file-notify--test-event) 'renamed) (should - (or (string-equal (file-notify--event-file1-name file-notify--test-event) - file-notify--test-tmpfile1) - (string-equal (file-notify--event-file1-name file-notify--test-event) - temporary-file-directory))))) + (string-prefix-p + (file-notify--event-watched-file file-notify--test-event) + (file-notify--event-file1-name file-notify--test-event))))) (defun file-notify--test-event-handler (event) "Run a test over FILE-NOTIFY--TEST-EVENT. @@ -275,7 +277,8 @@ and the event to `file-notify--test-events'." (unless (string-match (regexp-quote ".#") (file-notify--event-file-name file-notify--test-event)) - ;;(message "file-notify--test-event-handler %S" file-notify--test-event) + ;;(message "file-notify--test-event-handler result: %s event: %S" + ;;(null (ert-test-failed-p result)) file-notify--test-event) (setq file-notify--test-events (append file-notify--test-events `(,file-notify--test-event)) file-notify--test-results @@ -319,25 +322,28 @@ EVENTS is either a simple list of events, or a list of lists of events, which represent different possible results. Don't wait longer than timeout seconds for the events to be delivered." (declare (indent 1)) - (let ((outer (make-symbol "outer"))) - `(let* ((,outer file-notify--test-events) - (events (if (consp (car ,events)) ,events (list ,events))) - (max-length (apply 'max (mapcar 'length events))) - create-lockfiles) - ;; Flush pending events. - (file-notify--wait-for-events - (file-notify--test-timeout) - (input-pending-p)) - (let (file-notify--test-events) - ,@body - (file-notify--wait-for-events - ;; More events need more time. Use some fudge factor. - (* (ceiling max-length 100) (file-notify--test-timeout)) - (= max-length (length file-notify--test-events))) - ;; One of the possible results shall match. - (should (file-notify--test-with-events-check events)) - (setq ,outer (append ,outer file-notify--test-events))) - (setq file-notify--test-events ,outer)))) + `(let* ((events (if (consp (car ,events)) ,events (list ,events))) + (max-length (apply 'max (mapcar 'length events))) + create-lockfiles) + ;; Flush pending events. + (file-notify--wait-for-events + (file-notify--test-timeout) + (input-pending-p)) + (setq file-notify--test-events nil + file-notify--test-results nil) + ,@body + (file-notify--wait-for-events + ;; More events need more time. Use some fudge factor. + (* (ceiling max-length 100) (file-notify--test-timeout)) + (= max-length (length file-notify--test-events))) + ;; Check the result sequence just to make sure that all events + ;; are as expected. + (dolist (result file-notify--test-results) + (when (ert-test-failed-p result) + (ert-fail + (cadr (ert-test-result-with-condition-condition result))))) + ;; One of the possible event sequences shall match. + (should (file-notify--test-with-events-check events)))) (ert-deftest file-notify-test02-events () "Check file creation/change/removal notifications." @@ -366,9 +372,7 @@ longer than timeout seconds for the events to be delivered." "another text" nil file-notify--test-tmpfile nil 'no-message) (read-event nil nil file-notify--test-read-event-timeout) (delete-file file-notify--test-tmpfile)) - ;; `file-notify-rm-watch' fires the `stopped' event. Suppress it. - (let (file-notify--test-events) - (file-notify-rm-watch file-notify--test-desc))) + (file-notify-rm-watch file-notify--test-desc)) ;; Check file change and deletion. (setq file-notify--test-tmpfile (file-notify--test-make-temp-name)) @@ -398,9 +402,7 @@ longer than timeout seconds for the events to be delivered." "another text" nil file-notify--test-tmpfile nil 'no-message) (read-event nil nil file-notify--test-read-event-timeout) (delete-file file-notify--test-tmpfile)) - ;; `file-notify-rm-watch' fires the `stopped' event. Suppress it. - (let (file-notify--test-events) - (file-notify-rm-watch file-notify--test-desc)) + (file-notify-rm-watch file-notify--test-desc) ;; Check file creation, change and deletion when watching a ;; directory. There must be a `stopped' event when deleting @@ -432,9 +434,7 @@ longer than timeout seconds for the events to be delivered." "any text" nil file-notify--test-tmpfile nil 'no-message) (read-event nil nil file-notify--test-read-event-timeout) (delete-directory temporary-file-directory 'recursive)) - ;; `file-notify-rm-watch' fires the `stopped' event. Suppress it. - (let (file-notify--test-events) - (file-notify-rm-watch file-notify--test-desc))) + (file-notify-rm-watch file-notify--test-desc)) ;; Check copy of files inside a directory. (let ((temporary-file-directory @@ -474,9 +474,7 @@ longer than timeout seconds for the events to be delivered." (set-file-times file-notify--test-tmpfile '(0 0)) (read-event nil nil file-notify--test-read-event-timeout) (delete-directory temporary-file-directory 'recursive)) - ;; `file-notify-rm-watch' fires the `stopped' event. Suppress it. - (let (file-notify--test-events) - (file-notify-rm-watch file-notify--test-desc))) + (file-notify-rm-watch file-notify--test-desc)) ;; Check rename of files inside a directory. (let ((temporary-file-directory @@ -510,9 +508,7 @@ longer than timeout seconds for the events to be delivered." ;; After the rename, we won't get events anymore. (read-event nil nil file-notify--test-read-event-timeout) (delete-directory temporary-file-directory 'recursive)) - ;; `file-notify-rm-watch' fires the `stopped' event. Suppress it. - (let (file-notify--test-events) - (file-notify-rm-watch file-notify--test-desc))) + (file-notify-rm-watch file-notify--test-desc)) ;; Check attribute change. Does not work for cygwin. (unless (eq system-type 'cygwin) @@ -545,17 +541,7 @@ longer than timeout seconds for the events to be delivered." (set-file-times file-notify--test-tmpfile '(0 0)) (read-event nil nil file-notify--test-read-event-timeout) (delete-file file-notify--test-tmpfile)) - ;; `file-notify-rm-watch' fires the `stopped' event. Suppress it. - (let (file-notify--test-events) - (file-notify-rm-watch file-notify--test-desc))) - - ;; Check the global sequence again just to make sure that - ;; `file-notify--test-events' has been set correctly. - (should file-notify--test-results) - (dolist (result file-notify--test-results) - (when (ert-test-failed-p result) - (ert-fail - (cadr (ert-test-result-with-condition-condition result)))))) + (file-notify-rm-watch file-notify--test-desc))) ;; Cleanup. (file-notify--test-cleanup))) @@ -825,7 +811,7 @@ longer than timeout seconds for the events to be delivered." (dotimes (i n) ;; It matters which direction we rename, at least for ;; kqueue. This backend parses directories in alphabetic - ;; order (x%d before y%d). So we rename both directions. + ;; order (x%d before y%d). So we rename into both directions. (if (zerop (mod i 2)) (progn (push (expand-file-name (format "x%d" i)) source-file-list) @@ -885,6 +871,11 @@ longer than timeout seconds for the events to be delivered." ((or (string-equal (file-notify--test-library) "w32notify") (file-remote-p temporary-file-directory)) '(changed changed)) + ;; gfilenotify raises one or two `changed' events + ;; randomly, no chance to test. So we accept both cases. + ((string-equal "gfilenotify" (file-notify--test-library)) + '((changed) + (changed changed))) (t '(changed))) ;; There shouldn't be any problem, because the file is kept. (with-temp-buffer @@ -938,6 +929,133 @@ longer than timeout seconds for the events to be delivered." (file-notify--deftest-remote file-notify-test07-backup "Check that backup keeps file notification for remote files.") +(ert-deftest file-notify-test08-watched-file-in-watched-dir () + "Watches a directory and a file in that directory separately. +Checks that the callbacks are only called with events with +descriptors that were issued when registering the watches. This +test caters for the situation in bug#22736 where the callback for +the directory received events for the file with the descriptor of +the file watch." + :tags '(:expensive-test) + (skip-unless (file-notify--test-local-enabled)) + + ;; A directory to be watched. + (should + (setq file-notify--test-tmpfile + (make-temp-file "file-notify-test-parent" t))) + ;; A file to be watched. + (should + (setq file-notify--test-tmpfile1 + (let ((temporary-file-directory file-notify--test-tmpfile)) + (file-notify--test-make-temp-name)))) + (write-region "any text" nil file-notify--test-tmpfile1 nil 'no-message) + (unwind-protect + (cl-flet (;; Directory monitor. + (dir-callback (event) + (let ((file-notify--test-desc file-notify--test-desc1)) + (file-notify--test-event-handler event))) + ;; File monitor. + (file-callback (event) + (let ((file-notify--test-desc file-notify--test-desc2)) + (file-notify--test-event-handler event)))) + (should + (setq file-notify--test-desc1 + (file-notify-add-watch + file-notify--test-tmpfile + '(change) #'dir-callback))) + (should + (setq file-notify--test-desc2 + (file-notify-add-watch + file-notify--test-tmpfile1 + '(change) #'file-callback))) + (should (file-notify-valid-p file-notify--test-desc1)) + (should (file-notify-valid-p file-notify--test-desc2)) + (should-not (equal file-notify--test-desc1 file-notify--test-desc2)) + ;; gfilenotify raises one or two `changed' events randomly in + ;; the file monitor, no chance to test. + (unless (string-equal "gfilenotify" (file-notify--test-library)) + (let ((n 100) events) + ;; Compute the expected events. + (dotimes (_i (/ n 2)) + (setq events + (append + (append + ;; Directory monitor and file monitor. + (cond + ;; In the remote case, there are two `changed' + ;; events. + ((file-remote-p temporary-file-directory) + '(changed changed changed changed)) + ;; The directory monitor in kqueue does not + ;; raise any `changed' event. Just the file + ;; monitor event is received. + ((string-equal (file-notify--test-library) "kqueue") + '(changed)) + ;; Otherwise, both monitors report the + ;; `changed' event. + (t '(changed changed))) + ;; Just the directory monitor. + (cond + ;; In kqueue, there is an additional `changed' + ;; event. Why? + ((string-equal (file-notify--test-library) "kqueue") + '(changed created changed)) + (t '(created changed)))) + events))) + + ;; Run the test. + (file-notify--test-with-events events + (dotimes (i n) + (read-event nil nil file-notify--test-read-event-timeout) + (if (zerop (mod i 2)) + (write-region + "any text" nil file-notify--test-tmpfile1 t 'no-message) + (let ((temporary-file-directory file-notify--test-tmpfile)) + (write-region + "any text" nil + (file-notify--test-make-temp-name) nil 'no-message))))))) + + ;; If we delete the file, the directory monitor shall still be + ;; active. We receive the `deleted' event from both the + ;; directory and the file monitor. The `stopped' event is + ;; from the file monitor. It's undecided in which order the + ;; the directory and the file monitor are triggered. + (file-notify--test-with-events + '((deleted deleted stopped) + (deleted stopped deleted)) + (delete-file file-notify--test-tmpfile1)) + (should (file-notify-valid-p file-notify--test-desc1)) + (should-not (file-notify-valid-p file-notify--test-desc2)) + + ;; Now we delete the directory. + (file-notify--test-with-events + (cond + ;; In kqueue, just one `deleted' event for the directory + ;; is received. + ((string-equal (file-notify--test-library) "kqueue") + '(deleted stopped)) + (t (append + ;; The directory monitor raises a `deleted' event for + ;; every file contained in the directory, we must + ;; count them. + (make-list + (length + (directory-files + file-notify--test-tmpfile nil + directory-files-no-dot-files-regexp 'nosort)) + 'deleted) + ;; The events of the directory itself. + '(deleted stopped)))) + (delete-directory file-notify--test-tmpfile 'recursive)) + (should-not (file-notify-valid-p file-notify--test-desc1)) + (should-not (file-notify-valid-p file-notify--test-desc2))) + + ;; Cleanup. + (file-notify--test-cleanup))) + +(file-notify--deftest-remote file-notify-test08-watched-file-in-watched-dir + "Check `file-notify-test08-watched-file-in-watched-dir' for remote files.") + (defun file-notify-test-all (&optional interactive) "Run all tests for \\[file-notify]." (interactive "p") |