def test_retrieve_log_with_raw(self, sample_task): mock_api = MagicMock() task = Task(sample_task, mock_api) log = task.retrieve_log('task_log', raw=True) assert log == mock_api.retrieve_task_log.return_value mock_api.retrieve_task_log.assert_called_with(task.log_map['task_log'], True)
def test_generate_by_system_undispatched_priority(self, sample_task_list): sample_task_list[0]["status"] = "undispatched" sample_task_list[1]["status"] = "failure" sample_task_list[1]["status_details"]["type"] = "system" sample_task_list[1]["status_details"]["timed_out"] = True sample_task_list[2]["status"] = "failure" sample_task_list[0]["generated_by"] = "foo" sample_task_list[1]["generated_by"] = "foo" sample_task_list[2]["generated_by"] = "foo" mock_build = create_mock_build([ Task(sample_task_list[0], None), Task(sample_task_list[1], None), Task(sample_task_list[2], None), ]) build_metrics = under_test.BuildMetrics(mock_build).calculate() assert build_metrics.undispatched_count == 1 assert build_metrics.failure_count == 2 assert build_metrics.system_failure_count == 1 assert build_metrics.timed_out_count == 1 assert build_metrics.display_success_count == 0 assert build_metrics.display_failure_count == 0 assert build_metrics.display_system_failure_count == 0 assert build_metrics.display_timed_out_count == 0 assert build_metrics.display_undispatched_count == 1
def test_detailed_task_is_scored_correctly(self, sample_task, status_string, status_score): sample_task["status_details"]["type"] = "system" sample_task["status"] = "failed" sample_task["status_details"]["timed_out"] = status_string task = Task(sample_task, None) assert task.get_status_score() == status_score
def test_get_manifest(self, sample_task): mock_api = MagicMock() task = Task(sample_task, mock_api) manifest = task.get_manifest() assert manifest == mock_api.manifest_for_task.return_value mock_api.manifest_for_task.assert_called_with(task.task_id)
def test_bad_status_attributes(self, sample_task): sample_task["status_details"]["type"] = "system" sample_task["status"] = "failed" sample_task["status_details"]["timed_out"] = True task = Task(sample_task, None) assert not task.is_success() assert task.is_system_failure() assert task.is_timeout()
def test_get_tests(self, sample_task): mock_api = MagicMock() task = Task(sample_task, mock_api) tests = task.get_tests() mock_api.tests_by_task.assert_called_once() assert tests == mock_api.tests_by_task.return_value
def test_bad_status_attributes(self, sample_task): sample_task['status_details']['type'] = 'system' sample_task['status'] = 'failed' sample_task['status_details']['timed_out'] = True task = Task(sample_task, None) assert not task.is_success() assert task.is_system_failure() assert task.is_timeout()
def test_get_execution_tasks(self, sample_task, sample_display_task): mock_api = MagicMock() mock_api.task_by_id.return_value = Task(sample_task, mock_api) display_task = Task(sample_display_task, mock_api) execution_tasks = display_task.get_execution_tasks() assert len(execution_tasks) == len( sample_display_task["execution_tasks"])
def test_get_execution(self, sample_task): task = Task(sample_task, None) execution1 = task.get_execution(1) assert execution1.display_name == 'aggregation_auth' execution0 = task.get_execution(0) assert execution0.display_name == 'sharding_auth_gen' assert not task.get_execution(999)
def test_task_filter(self, sample_task): n_tasks = 5 task_list = [Task(sample_task, None) for _ in range(n_tasks)] sample_task_2 = sample_task.copy() filter_task_name = 'filter me' sample_task_2['display_name'] = filter_task_name task_list_2 = [Task(sample_task_2, None) for _ in range(n_tasks)] mock_build = create_mock_build(task_list + task_list_2) build_metrics = under_test.BuildMetrics(mock_build) build_metrics.calculate(lambda t: filter_task_name not in t.display_name) assert build_metrics.total_tasks == n_tasks
def test_get_tests(self, sample_task, execution, expected): mock_api = MagicMock() task = Task(sample_task, mock_api) if execution is None: tests = task.get_tests() else: tests = task.get_tests(execution=execution) mock_api.tests_by_task.assert_called_once() kwargs = mock_api.tests_by_task.call_args[1] assert "execution" in kwargs and kwargs["execution"] == expected assert tests == mock_api.tests_by_task.return_value
def test_adding_successful_task(self, sample_task): sample_task["status"] = "success" task = Task(sample_task, None) mock_build = create_mock_build() build_metrics = under_test.BuildMetrics(mock_build) build_metrics._count_task(task) build_metrics._count_display_tasks() assert build_metrics.undispatched_count == 0 assert build_metrics.total_tasks == 1 assert len(build_metrics._start_times) == 1 assert build_metrics.failure_count == 0 assert build_metrics.success_count == 1 assert build_metrics.pct_tasks_success == 1 assert build_metrics.system_failure_count == 0 assert build_metrics.timed_out_count == 0 assert build_metrics.display_undispatched_count == 0 assert build_metrics.total_display_tasks == 1 assert build_metrics.display_failure_count == 0 assert build_metrics.display_success_count == 1 assert build_metrics.pct_display_tasks_success == 1 assert build_metrics.display_system_failure_count == 0 assert build_metrics.display_timed_out_count == 0
def test_oom_tracker_info_object_has_oom(self, sample_task): task = Task(sample_task, None) assert task.status_details.oom_tracker_info == OomTrackerInfo( task.json["status_details"]["oom_tracker_info"], None) assert (task.status_details.oom_tracker_info.detected == task.status_details.json["oom_tracker_info"]["detected"]) assert (task.status_details.oom_tracker_info.pids == task.status_details.json["oom_tracker_info"]["pids"])
def test_in_progress_task(self, sample_task): sample_task["finish_time"] = None task = Task(sample_task, None) mock_build = create_mock_build() build_metrics = under_test.BuildMetrics(mock_build) with pytest.raises(ActiveTaskMetricsException): build_metrics._count_task(task)
def test_string_format(self, sample_task): task = Task(sample_task, None) mock_build = create_mock_build([task]) build_metrics = under_test.BuildMetrics(mock_build) build_metrics._count_task(task) assert mock_build.id in str(build_metrics)
def test_get_execution_tasks_with_filters(self, sample_task, sample_display_task): mock_api = MagicMock() mock_api.task_by_id.return_value = Task(sample_task, mock_api) max_return = 2 seen = 0 def cap_seen(t): nonlocal seen if seen >= max_return: return False seen += 1 return True display_task = Task(sample_display_task, mock_api) execution_tasks = display_task.get_execution_tasks(filter_fn=cap_seen) assert len(execution_tasks) == max_return
def test_display_tasks_are_filtered(self, sample_task): sample_task["display_only"] = True task = Task(sample_task, None) mock_build = create_mock_build([task]) build_metrics = under_test.BuildMetrics(mock_build) build_metrics.calculate() assert len(build_metrics.task_list) == 1 assert build_metrics.total_tasks == 0
def test_dict_format(self, sample_task): task = Task(sample_task, None) mock_build = create_mock_build() build_metrics = under_test.BuildMetrics(mock_build) build_metrics._count_task(task) bm_dict = build_metrics.as_dict() assert bm_dict['build'] == mock_build.id assert 'tasks' not in bm_dict
def test_dict_format_with_children(self, sample_task): task = Task(sample_task, None) mock_build = create_mock_build([task]) build_metrics = under_test.BuildMetrics(mock_build) build_metrics.calculate() bm_dict = build_metrics.as_dict(include_children=True) assert bm_dict["build"] == mock_build.id assert len(bm_dict["tasks"]) == 1 assert bm_dict["tasks"][0]["task_id"] == task.task_id
def test_various_tasks(self, sample_task): n_tasks = 5 task_list = [Task(sample_task, None) for _ in range(n_tasks)] mock_build = create_mock_build(task_list) build_metrics = under_test.BuildMetrics(mock_build).calculate() assert build_metrics.total_tasks == n_tasks assert build_metrics.pct_tasks_success == 1 assert len(build_metrics._create_times) == n_tasks assert len(build_metrics._start_times) == n_tasks assert len(build_metrics._finish_times) == n_tasks
def test_adding_undispatched_task(self, sample_task): sample_task['status'] = 'undispatched' task = Task(sample_task, None) mock_build = create_mock_build() build_metrics = under_test.BuildMetrics(mock_build) build_metrics._count_task(task) assert build_metrics.undispatched_count == 1 assert build_metrics.pct_tasks_undispatched == 1 assert build_metrics.total_tasks == 1 assert len(build_metrics._start_times) == 0
def tasks_by_project(self, project_id, statuses=None): """ Get all the tasks for a project. :param project_id: The project's id. :param statuses: the types of statuses to get tasks for. :return: The list of matching tasks. """ url = self._create_url("/projects/{project_id}/versions/tasks".format( project_id=project_id)) params = {'status': statuses} if statuses else None return [Task(json, self) for json in self._paginate(url, params)]
def test_adding_undispatched_generated_task(self, sample_task): n_tasks = 2 sample_task["status"] = "undispatched" sample_task["generated_by"] = "foobar" task_list = [Task(sample_task, None) for _ in range(n_tasks)] mock_build = create_mock_build(task_list) build_metrics = under_test.BuildMetrics(mock_build).calculate() assert build_metrics.display_undispatched_count == 1 assert build_metrics.total_display_tasks == 1 assert build_metrics.pct_display_tasks_undispatched == 1
def test_generate_by_failure_priority(self, sample_task_list): sample_task_list[0]["status"] = "failure" sample_task_list[1]["status"] = "success" sample_task_list[2]["status"] = "success" sample_task_list[0]["generated_by"] = "foo" sample_task_list[1]["generated_by"] = "foo" sample_task_list[2]["generated_by"] = "foo" mock_build = create_mock_build([ Task(sample_task_list[0], None), Task(sample_task_list[1], None), Task(sample_task_list[2], None), ]) build_metrics = under_test.BuildMetrics(mock_build).calculate() assert build_metrics.success_count == 2 assert build_metrics.failure_count == 1 assert build_metrics.display_success_count == 0 assert build_metrics.display_failure_count == 1 assert build_metrics.total_display_tasks == 1
def tasks_by_project(self, project_id: str, statuses: Optional[List[str]] = None) -> List[Task]: """ Get all the tasks for a project. :param project_id: The project's id. :param statuses: the types of statuses to get tasks for. :return: The list of matching tasks. """ url = self._create_url( "/projects/{project_id}/versions/tasks".format(project_id=project_id) ) params = {"status": statuses} if statuses else None return [Task(json, self) for json in self._paginate(url, params)] # type: ignore[arg-type]
def task_by_id(self, task_id: str, fetch_all_executions: Optional[bool] = None) -> Task: """ Get a task by task_id. :param task_id: Id of task to query for. :param fetch_all_executions: Should all executions of the task be fetched. :return: Task queried for. """ params = None if fetch_all_executions: params = {"fetch_all_executions": fetch_all_executions} url = self._create_url("/tasks/{task_id}".format(task_id=task_id)) return Task(self._call_api(url, params).json(), self) # type: ignore[arg-type]
def task_by_id(self, task_id, fetch_all_executions=None): """ Get a task by task_id. :param task_id: Id of task to query for. :param fetch_all_executions: Should all executions of the task be fetched. :return: Task queried for. """ params = None if fetch_all_executions: params = {'fetch_all_executions': fetch_all_executions} url = self._create_url('/tasks/{task_id}'.format(task_id=task_id)) return Task(self._call_api(url, params).json(), self)
def test_task_is_test_failure(self, sample_task): sample_task["status_details"]["type"] = EVG_TEST_STATUS_TYPE sample_task["status"] = "failed" task = Task(sample_task, None) assert not task.is_success() assert not task.is_system_failure() assert not task.is_timeout() assert task.is_test_failure()
def test_adding_task_without_ingest_time(self, sample_task): del sample_task['ingest_time'] task = Task(sample_task, None) mock_build = create_mock_build() build_metrics = under_test.BuildMetrics(mock_build) build_metrics._count_task(task) assert build_metrics.undispatched_count == 0 assert build_metrics.total_tasks == 1 assert len(build_metrics._start_times) == 1 assert build_metrics.failure_count == 0 assert build_metrics.success_count == 1 assert build_metrics.system_failure_count == 0 assert build_metrics.timed_out_count == 0
def tasks_by_build(self, build_id, fetch_all_executions=None): """ Get all tasks for a given build. :param build_id: build_id to query. :param fetch_all_executions: Fetch all executions for a given task. :return: List of tasks for the specified build. """ params = {} if fetch_all_executions: params['fetch_all_executions'] = 1 url = self._create_url( '/builds/{build_id}/tasks'.format(build_id=build_id)) task_list = self._paginate(url, params) return [Task(task, self) for task in task_list]