Fix scheduler's handling of jobs when the PID file can't be found.

Risk: low
Visibility: medium (scheduler bug fix)

Signed-off-by: James Ren <jamesren@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@3568 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/scheduler/monitor_db_unittest.py b/scheduler/monitor_db_unittest.py
index f811928..6e6236f 100644
--- a/scheduler/monitor_db_unittest.py
+++ b/scheduler/monitor_db_unittest.py
@@ -1707,35 +1707,46 @@
 
 
     def _setup_gather_logs_expects(self, autoserv_killed=True,
-                                   hqe_aborted=False):
+                                   hqe_aborted=False, has_process=True):
         self.god.stub_class(monitor_db, 'PidfileRunMonitor')
         self.god.stub_class(monitor_db, 'FinalReparseTask')
         self._setup_post_job_task_expects(not autoserv_killed, 'Gathering',
                                           hqe_aborted)
-        if hqe_aborted:
+        if hqe_aborted or not has_process:
             exit_code = None
         elif autoserv_killed:
             exit_code = 271
         else:
             exit_code = 0
         self.pidfile_monitor.exit_code.expect_call().and_return(exit_code)
-        if exit_code != 0:
-            self._setup_post_job_run_monitor('.collect_crashinfo_execute')
-        self.pidfile_monitor.has_process.expect_call().and_return(True)
-        self._expect_copy_results(monitor=self.pidfile_monitor,
-                                  queue_entry=self.queue_entry)
+
+        if has_process:
+            if exit_code != 0:
+                self._setup_post_job_run_monitor('.collect_crashinfo_execute')
+            self.pidfile_monitor.has_process.expect_call().and_return(True)
+            self._expect_copy_results(monitor=self.pidfile_monitor,
+                                      queue_entry=self.queue_entry)
+        else:
+            # The first has_process() is in GatherLogsTask.run(), and the second
+            # is in AgentTask._copy_results()
+            self.pidfile_monitor.has_process.expect_call().and_return(False)
+            self.pidfile_monitor.has_process.expect_call().and_return(False)
+
         parse_task = monitor_db.FinalReparseTask.expect_new([self.queue_entry])
         _set_host_and_qe_ids(parse_task)
         self._dispatcher.add_agent.expect_call(IsAgentWithTask(parse_task))
 
-        self.pidfile_monitor.num_tests_failed.expect_call().and_return(0)
+        self.pidfile_monitor.has_process.expect_call().and_return(has_process)
+
+        if has_process:
+            self.pidfile_monitor.num_tests_failed.expect_call().and_return(0)
 
 
-    def _run_gather_logs_task(self):
+    def _run_gather_logs_task(self, success=True):
         task = monitor_db.GatherLogsTask(self.job, [self.queue_entry])
         task.agent = DummyAgent()
         task.agent.dispatcher = self._dispatcher
-        self.run_task(task, True)
+        self.run_task(task, success)
         self.god.check_playback()
 
 
@@ -1780,6 +1791,14 @@
         self._run_gather_logs_task()
 
 
+    def test_gather_logs_no_process(self):
+        self._setup_gather_logs_expects(has_process=False)
+        self.job.reboot_after = models.RebootAfter.NEVER
+        self.host.set_status.expect_call('Ready')
+
+        self._run_gather_logs_task(success=False)
+
+
     def _test_cleanup_task_helper(self, success, task_tag,
                                   use_queue_entry=False):
         if use_queue_entry: