patch 8.2.2586: process id may be invalid

Problem:    Process id may be invalid.
Solution:   Use sysinfo.uptime to check for recent reboot. (suggested by Hugo
            van der Sanden, closes #7947)
diff --git a/src/testdir/test_recover.vim b/src/testdir/test_recover.vim
index 8408ff3..621e315 100644
--- a/src/testdir/test_recover.vim
+++ b/src/testdir/test_recover.vim
@@ -1,5 +1,7 @@
 " Test :recover
 
+source check.vim
+
 func Test_recover_root_dir()
   " This used to access invalid memory.
   split Xtest
@@ -21,6 +23,21 @@
   set dir&
 endfunc
 
+" Make a copy of the current swap file to "Xswap".
+" Return the name of the swap file.
+func CopySwapfile()
+  preserve
+  " get the name of the swap file
+  let swname = split(execute("swapname"))[0]
+  let swname = substitute(swname, '[[:blank:][:cntrl:]]*\(.\{-}\)[[:blank:][:cntrl:]]*$', '\1', '')
+  " make a copy of the swap file in Xswap
+  set binary
+  exe 'sp ' . swname
+  w! Xswap
+  set nobinary
+  return swname
+endfunc
+
 " Inserts 10000 lines with text to fill the swap file with two levels of pointer
 " blocks.  Then recovers from the swap file and checks all text is restored.
 "
@@ -37,15 +54,9 @@
     let i += 1
   endwhile
   $delete
-  preserve
-  " get the name of the swap file
-  let swname = split(execute("swapname"))[0]
-  let swname = substitute(swname, '[[:blank:][:cntrl:]]*\(.\{-}\)[[:blank:][:cntrl:]]*$', '\1', '')
-  " make a copy of the swap file in Xswap
-  set binary
-  exe 'sp ' . swname
-  w! Xswap
-  set nobinary
+
+  let swname = CopySwapfile()
+
   new
   only!
   bwipe! Xtest
@@ -67,4 +78,52 @@
   enew! | only
 endfunc
 
+func Test_nocatch_process_still_running()
+  " assume Unix means sysinfo.uptime can be used
+  CheckUnix
+  CheckNotGui
+
+  " don't intercept existing swap file here
+  au! SwapExists
+
+  " Edit a file and grab its swapfile.
+  edit Xswaptest
+  call setline(1, ['a', 'b', 'c'])
+  let swname = CopySwapfile()
+
+  " Forget we edited this file
+  new
+  only!
+  bwipe! Xswaptest
+
+  call rename('Xswap', swname)
+  call feedkeys('e', 'tL')
+  redir => editOutput
+  edit Xswaptest
+  redir END
+  call assert_match('E325: ATTENTION', editOutput)
+  call assert_match('file name: .*Xswaptest', editOutput)
+  call assert_match('process ID: \d* (STILL RUNNING)', editOutput)
+
+  " Forget we edited this file
+  new
+  only!
+  bwipe! Xswaptest
+
+  " pretend we rebooted
+  call test_override("uptime", 0)
+  sleep 1
+
+  call rename('Xswap', swname)
+  call feedkeys('e', 'tL')
+  redir => editOutput
+  edit Xswaptest
+  redir END
+  call assert_match('E325: ATTENTION', editOutput)
+  call assert_notmatch('(STILL RUNNING)', editOutput)
+
+  call test_override("ALL", 0)
+  call delete(swname)
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab