From d4cbb29c92b308a8e4f9aa5aa7c60ff185818405 Mon Sep 17 00:00:00 2001 From: Laurence Warne Date: Fri, 15 Nov 2024 16:22:52 +0100 Subject: [PATCH] Don't error in Proced tests if %CPU is a NaN * test/lisp/proced-tests.el (proced--cpu-at-point): New function. (proced--assert-process-valid-cpu-refinement) (proced-refine-test, proced-refine-with-update-test): If %CPU for any process visited is a NaN skip the test. (proced-update-preserves-pid-at-point-test): Fix typo in comment. (proced--assert-process-valid-cpu-refinement-explainer): Add process attributes to the explainer along with tweaking how the process %CPU is obtained to account for circumstances where it's not numeric (most notably '-nan'). (cherry picked from commit 926d47ab2ca72054f1a5c774916927160a839dc1) --- test/lisp/proced-tests.el | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/test/lisp/proced-tests.el b/test/lisp/proced-tests.el index 5c9dfaca109..cf3ce352ca1 100644 --- a/test/lisp/proced-tests.el +++ b/test/lisp/proced-tests.el @@ -37,6 +37,15 @@ (message "%s" (buffer-string))) (kill-buffer "*Proced*")))) +(defun proced--cpu-at-point () + "Return as an integer the current CPU value at point." + (if (string-suffix-p "nan" (thing-at-point 'sexp)) + (let ((pid (proced-pid-at-point))) + (ert-skip + (format + "Found NaN value for %%CPU at point for process with PID %d" pid))) + (thing-at-point 'number))) + (defun proced--assert-emacs-pid-in-buffer () "Fail unless the process ID of the current Emacs process exists in buffer." (should (string-match-p @@ -53,7 +62,7 @@ "Fail unless the process at point could be present after a refinement using CPU." (proced--move-to-column "%CPU") (condition-case err - (>= (thing-at-point 'number) cpu) + (>= (proced--cpu-at-point) cpu) (error (ert-fail (list err (proced--assert-process-valid-cpu-refinement-explainer cpu)))))) @@ -66,11 +75,14 @@ CPU is as in `proced--assert-process-valid-cpu-refinement'." (header-line ,(substring-no-properties (string-replace "%%" "%" (cadr (proced-header-line))))) - (process ,(thing-at-point 'line t)) + (buffer-process-line ,(thing-at-point 'line t)) + (process-attributes ,(format "%s" (process-attributes (proced-pid-at-point)))) (refined-value ,cpu) (process-value ,(save-excursion - (proced--move-to-column "%CPU") (thing-at-point 'number))))) + (proced--move-to-column "%CPU") + (or (thing-at-point 'number) + (substring-no-properties (thing-at-point 'sexp))))))) (put #'proced--assert-process-valid-cpu-refinement 'ert-explainer #'proced--assert-process-valid-cpu-refinement-explainer) @@ -110,7 +122,7 @@ CPU is as in `proced--assert-process-valid-cpu-refinement'." ;; When refining on %CPU for process A, a process is kept if and only ;; if its %CPU is greater than or equal to that of process A. (proced--move-to-column "%CPU") - (let ((cpu (thing-at-point 'number))) + (let ((cpu (proced--cpu-at-point))) (proced-refine) (while (not (eobp)) (should (proced--assert-process-valid-cpu-refinement cpu)) @@ -121,7 +133,7 @@ CPU is as in `proced--assert-process-valid-cpu-refinement'." 'verbose 'user (proced--move-to-column "%CPU") - (let ((cpu (thing-at-point 'number))) + (let ((cpu (proced--cpu-at-point))) (proced-refine) ;; Don't use (proced-update t) since this will reset `proced-process-alist' ;; and it's possible the process refined on would have exited by that @@ -134,7 +146,7 @@ CPU is as in `proced--assert-process-valid-cpu-refinement'." (ert-deftest proced-update-preserves-pid-at-point-test () ;; FIXME: Occasionally the cursor inexplicably changes to the first line which - ;; causes the test to file when the line isn't the Emacs process. + ;; causes the test to fail when the line isn't the Emacs process. :tags '(:unstable) (proced--within-buffer 'medium -- 2.39.5