def test_cancel_analysis(self): """Test canceling experiment analysis.""" event = threading.Event() self.addCleanup(event.set) def _job_result(): event.wait(timeout=15) return self._get_job_result(1) def _analysis(*args): # pylint: disable = unused-argument event.wait(timeout=15) job = mock.create_autospec(Job, instance=True) job.job_id.return_value = "1234" job.result = _job_result job.status = lambda: JobStatus.DONE if event.is_set() else JobStatus.RUNNING exp_data = DbExperimentData(experiment_type="qiskit_test") exp_data.add_jobs(job) exp_data.add_analysis_callback(_analysis) exp_data.cancel_analysis() # Test status while job still running self.assertEqual(exp_data.job_status(), JobStatus.RUNNING) self.assertEqual(exp_data.analysis_status(), AnalysisStatus.CANCELLED) self.assertEqual(exp_data.status(), ExperimentStatus.RUNNING) # Test status after job finishes event.set() self.assertEqual(exp_data.job_status(), JobStatus.DONE) self.assertEqual(exp_data.analysis_status(), AnalysisStatus.CANCELLED) self.assertEqual(exp_data.status(), ExperimentStatus.CANCELLED)
def test_partial_cancel_analysis(self): """Test canceling experiment analysis.""" event = threading.Event() self.addCleanup(event.set) run_analysis = [] def _job_result(): event.wait(timeout=3) return self._get_job_result(1) def _analysis(expdata, name=None, timeout=0): # pylint: disable = unused-argument event.wait(timeout=timeout) run_analysis.append(name) job = mock.create_autospec(Job, instance=True) job.job_id.return_value = "1234" job.result = _job_result job.status = lambda: JobStatus.DONE if event.is_set() else JobStatus.RUNNING exp_data = DbExperimentData(experiment_type="qiskit_test") exp_data.add_jobs(job) exp_data.add_analysis_callback(_analysis, name=1, timeout=1) exp_data.add_analysis_callback(_analysis, name=2, timeout=30) cancel_id = exp_data._analysis_callbacks.keys()[-1] exp_data.add_analysis_callback(_analysis, name=3, timeout=1) exp_data.cancel_analysis(cancel_id) # Test status while job still running self.assertEqual(exp_data.job_status(), JobStatus.RUNNING) self.assertEqual(exp_data.analysis_status(), AnalysisStatus.CANCELLED) self.assertEqual(exp_data.status(), ExperimentStatus.RUNNING) # Test status after job finishes event.set() self.assertEqual(exp_data.job_status(), JobStatus.DONE) self.assertEqual(exp_data.analysis_status(), AnalysisStatus.CANCELLED) self.assertEqual(exp_data.status(), ExperimentStatus.CANCELLED) # Check that correct analysis callback was cancelled exp_data.block_for_results() self.assertEqual(run_analysis, [1, 3]) for cid, analysis in exp_data._analysis_callbacks.items(): if cid == cancel_id: self.assertEqual(analysis.status, AnalysisStatus.CANCELLED) else: self.assertEqual(analysis.status, AnalysisStatus.DONE)
def test_status_cancelled_analysis(self): """Test experiment status during post processing.""" job = mock.create_autospec(Job, instance=True) job.result.return_value = self._get_job_result(3) job.status.return_value = JobStatus.DONE event = threading.Event() self.addCleanup(event.set) exp_data = DbExperimentData(experiment_type="qiskit_test") exp_data.add_jobs(job) exp_data.add_analysis_callback((lambda *args, **kwargs: event.wait(timeout=2))) # Add second callback because the first can't be cancelled once it has started exp_data.add_analysis_callback((lambda *args, **kwargs: event.wait(timeout=20))) exp_data.cancel_analysis() status = exp_data.status() self.assertEqual(ExperimentStatus.CANCELLED, status)