Esempio n. 1
0
def notify_uploader_when_testcase_is_processed(testcase, issue):
    """Notify uploader by email when all the testcase tasks are finished."""
    testcase_id = testcase.key.id()

    # Check if this is a user upload. If not, bail out.
    upload_metadata = data_types.TestcaseUploadMetadata.query(
        data_types.TestcaseUploadMetadata.testcase_id == testcase_id).get()
    if not upload_metadata:
        return

    # Check that we have a valid email to send the notification. If not, bail out.
    to_email = upload_metadata.uploader_email
    if not to_email:
        return

    # If this is a bundled archive with multiple testcases, then don't send email
    # for individual testcases.
    if upload_metadata.bundled:
        return

    # Check if the notification is already sent once. If yes, bail out.
    if data_handler.is_notification_sent(testcase_id, to_email):
        return

    # Make sure all testcase taks are done (e.g. minimization, regression, etc).
    if not data_handler.critical_tasks_completed(testcase):
        return

    description = data_handler.get_issue_description(testcase)
    if issue:
        _update_issue_when_uploaded_testcase_is_processed(
            testcase, issue, description, upload_metadata)

    _send_email_to_uploader(testcase_id, to_email, description)
    data_handler.create_notification_entry(testcase_id, to_email)
Esempio n. 2
0
def notify_uploader_when_testcase_is_processed(policy, testcase, issue):
  """Notify uploader by email when all the testcase tasks are finished."""
  testcase_id = testcase.key.id()

  # Check if this is a user upload. If not, bail out.
  upload_metadata = data_types.TestcaseUploadMetadata.query(
      data_types.TestcaseUploadMetadata.testcase_id == testcase_id).get()
  if not upload_metadata:
    return

  # Check that we have a valid email to send the notification. If not, bail out.
  to_email = upload_metadata.uploader_email
  if not to_email:
    return

  # If this is a bundled archive with multiple testcases, then don't send email
  # for individual testcases.
  if upload_metadata.bundled:
    return

  # Check if the notification is already sent once. If yes, bail out.
  if data_handler.is_notification_sent(testcase_id, to_email):
    return

  # Make sure all testcase taks are done (e.g. minimization, regression, etc).
  if not data_handler.critical_tasks_completed(testcase):
    return

  notify = not upload_metadata.quiet_flag
  if issue and not testcase.duplicate_of:
    issue_description = data_handler.get_issue_description(testcase)
    _update_issue_when_uploaded_testcase_is_processed(
        policy, testcase, issue, issue_description,
        upload_metadata.bug_summary_update_flag, notify)

  if notify:
    issue_description_without_crash_state = data_handler.get_issue_description(
        testcase, hide_crash_state=True)
    _send_email_to_uploader(testcase_id, to_email,
                            issue_description_without_crash_state)

  # Make sure to create notification entry, as we use this to update bug.
  data_handler.create_notification_entry(testcase_id, to_email)
Esempio n. 3
0
    def get(self):
        """Handle a get request."""
        try:
            grouper.group_testcases()
        except:
            logs.log_error('Error occurred while grouping test cases.')
            return

        # Free up memory after group task run.
        utils.python_gc()

        # Get a list of jobs excluded from bug filing.
        excluded_jobs = _get_excluded_jobs()

        # Get a list of all jobs. This is used to filter testcases whose jobs have
        # been removed.
        all_jobs = data_handler.get_all_job_type_names()

        for testcase_id in data_handler.get_open_testcase_id_iterator():
            try:
                testcase = data_handler.get_testcase_by_id(testcase_id)
            except errors.InvalidTestcaseError:
                # Already deleted.
                continue

            # Skip if testcase's job is removed.
            if testcase.job_type not in all_jobs:
                continue

            # Skip if testcase's job is in exclusions list.
            if testcase.job_type in excluded_jobs:
                continue

            # Skip if we are running progression task at this time.
            if testcase.get_metadata('progression_pending'):
                continue

            # If the testcase has a bug filed already, no triage is needed.
            if _is_bug_filed(testcase):
                continue

            # Check if the crash is important, i.e. it is either a reproducible crash
            # or an unreproducible crash happening frequently.
            if not _is_crash_important(testcase):
                continue

            # Require that all tasks like minimizaton, regression testing, etc have
            # finished.
            if not data_handler.critical_tasks_completed(testcase):
                continue

            # For testcases that are not part of a group, wait an additional time till
            # group task completes.
            # FIXME: In future, grouping might be dependent on regression range, so we
            # would have to add an additional wait time.
            if not testcase.group_id and not dates.time_has_expired(
                    testcase.timestamp,
                    hours=data_types.MIN_ELAPSED_TIME_SINCE_REPORT):
                continue

            # If this project does not have an associated issue tracker, we cannot
            # file this crash anywhere.
            issue_tracker = issue_tracker_utils.get_issue_tracker_for_testcase(
                testcase)
            if not issue_tracker:
                continue

            # If there are similar issues to this test case already filed or recently
            # closed, skip filing a duplicate bug.
            if _check_and_update_similar_bug(testcase, issue_tracker):
                continue

            # Clean up old triage messages that would be not applicable now.
            testcase.delete_metadata(TRIAGE_MESSAGE_KEY, update_testcase=False)

            # File the bug first and then create filed bug metadata.
            try:
                issue_filer.file_issue(testcase, issue_tracker)
            except Exception:
                logs.log_error('Failed to file issue for testcase %d.' %
                               testcase_id)
                continue

            _create_filed_bug_metadata(testcase)
            logs.log('Filed new issue %s for testcase %d.' %
                     (testcase.bug_information, testcase_id))