コード例 #1
0
    def test_no_impact(self):
        """Tests no impact."""
        mock_issue = self._make_mock_issue()

        data_handler.update_issue_impact_labels(self.testcase, mock_issue)
        mock_issue.add_label.assert_not_called()
        mock_issue.remove_label.assert_not_called()
コード例 #2
0
  def test_no_impact(self):
    """Tests no impact."""
    mock_issue = self._make_mock_issue()

    data_handler.update_issue_impact_labels(self.testcase, mock_issue)
    self.assertItemsEqual([], mock_issue.labels.added)
    self.assertItemsEqual([], mock_issue.labels.removed)
コード例 #3
0
  def test_update_impact_stable_from_regression(self):
    """Tests updating impact to Stable from the regression range."""
    self.testcase.regression = '0:1000'
    mock_issue = self._make_mock_issue()

    data_handler.update_issue_impact_labels(self.testcase, mock_issue)
    self.assertItemsEqual(['Security_Impact-Stable'], mock_issue.labels.added)
    self.assertItemsEqual([], mock_issue.labels.removed)
コード例 #4
0
    def test_update_impact_stable_from_regression(self):
        """Tests updating impact to Stable from the regression range."""
        self.testcase.regression = '0:1000'
        mock_issue = self._make_mock_issue()

        data_handler.update_issue_impact_labels(self.testcase, mock_issue)
        mock_issue.add_label.assert_called_with('Security_Impact-Stable')
        mock_issue.remove_label.assert_not_called()
コード例 #5
0
  def test_update_impact_head(self):
    """Tests updating impact to Head."""
    self.testcase.is_impact_set_flag = True

    mock_issue = self._make_mock_issue()

    data_handler.update_issue_impact_labels(self.testcase, mock_issue)
    self.assertItemsEqual(['Security_Impact-Head'], mock_issue.labels.added)
    self.assertItemsEqual([], mock_issue.labels.removed)
コード例 #6
0
    def test_update_impact_head(self):
        """Tests updating impact to Head."""
        self.testcase.is_impact_set_flag = True

        mock_issue = self._make_mock_issue()

        data_handler.update_issue_impact_labels(self.testcase, mock_issue)
        mock_issue.add_label.assert_called_with('Security_Impact-Head')
        mock_issue.remove_label.assert_not_called()
コード例 #7
0
  def test_update_impact_beta(self):
    """Tests updating impact to Beta."""
    self.testcase.is_impact_set_flag = True
    self.testcase.impact_beta_version = 'Beta'

    mock_issue = self._make_mock_issue()

    data_handler.update_issue_impact_labels(self.testcase, mock_issue)
    self.assertItemsEqual(['Security_Impact-Beta'], mock_issue.labels.added)
    self.assertItemsEqual([], mock_issue.labels.removed)
コード例 #8
0
    def test_replace_same_impact(self):
        """Tests replacing same impact."""
        self.testcase.is_impact_set_flag = True

        mock_issue = self._make_mock_issue()
        mock_issue.labels = ['Security_Impact-Head']

        data_handler.update_issue_impact_labels(self.testcase, mock_issue)
        mock_issue.add_label.assert_not_called()
        mock_issue.remove_label.assert_not_called()
コード例 #9
0
    def test_update_impact_beta(self):
        """Tests updating impact to Beta."""
        self.testcase.is_impact_set_flag = True
        self.testcase.impact_beta_version = 'Beta'

        mock_issue = self._make_mock_issue()

        data_handler.update_issue_impact_labels(self.testcase, mock_issue)
        mock_issue.add_label.assert_called_with('Security_Impact-Beta')
        mock_issue.remove_label.assert_not_called()
コード例 #10
0
  def test_replace_same_impact(self):
    """Tests replacing same impact."""
    self.testcase.is_impact_set_flag = True

    mock_issue = self._make_mock_issue()
    mock_issue.labels.add('Security_Impact-Head')
    mock_issue.labels.reset()

    data_handler.update_issue_impact_labels(self.testcase, mock_issue)
    self.assertItemsEqual([], mock_issue.labels.added)
    self.assertItemsEqual([], mock_issue.labels.removed)
コード例 #11
0
  def test_component_dont_add_label(self):
    """Test that we don't set labels for component builds."""
    self.testcase.job_type = 'job'
    self.testcase.put()

    data_types.Job(
        name='job',
        environment_string=(
            'RELEASE_BUILD_BUCKET_PATH = '
            'https://example.com/blah-v8-component-([0-9]+).zip\n')).put()

    self.testcase.is_impact_set_flag = True
    mock_issue = self._make_mock_issue()
    data_handler.update_issue_impact_labels(self.testcase, mock_issue)
    self.assertItemsEqual([], mock_issue.labels.added)
    self.assertItemsEqual([], mock_issue.labels.removed)
コード例 #12
0
def _update_issue_when_uploaded_testcase_is_processed(testcase, issue,
                                                      description,
                                                      upload_metadata):
    """Add issue comment when uploaded testcase is processed."""
    # Update the summary in the following cases:
    # 1. Upload metadata indicates that we need to do so.
    # 2. We have a valid crash state.
    # 3. Crash state != 'NULL' which is unhelpful for title.
    if (upload_metadata.bug_summary_update_flag and testcase.crash_state
            and testcase.crash_state != 'NULL'):
        issue.title = data_handler.get_issue_summary(testcase)

    # Impact labels like impacting head/beta/stable only apply for Chromium.
    if testcase.project_name == 'chromium':
        data_handler.update_issue_impact_labels(testcase, issue)

    # Add severity labels for all project types.
    comment = description + _update_issue_severity_labels(testcase, issue)
    issue.save(new_comment=comment)
コード例 #13
0
ファイル: issue_filer.py プロジェクト: zzdxxd/clusterfuzz
def file_issue(testcase,
               itm,
               security_severity=None,
               user_email=None,
               additional_ccs=None):
  """File an issue for the given test case."""
  issue = Issue()
  issue.summary = data_handler.get_issue_summary(testcase)
  issue.body = data_handler.get_issue_description(
      testcase, reporter=user_email, show_reporter=True)

  # Labels applied by default across all issue trackers.
  issue.status = 'New'
  issue.add_label('ClusterFuzz')

  # Add label on memory tool used.
  add_memory_tool_label_if_needed(issue, testcase)

  # Add reproducibility flag label.
  if testcase.one_time_crasher_flag:
    issue.add_label('Unreproducible')
  else:
    issue.add_label('Reproducible')

  # Add security severity flag label.
  add_security_severity_label_if_needed(issue, testcase, security_severity)

  # Get view restriction rules for the job.
  issue_restrictions = data_handler.get_value_from_job_definition(
      testcase.job_type, 'ISSUE_VIEW_RESTRICTIONS', 'security')
  should_restrict_issue = (
      issue_restrictions == 'all' or
      (issue_restrictions == 'security' and testcase.security_flag))

  # Chromium-specific labels.
  if itm.project_name == 'chromium':
    # A different status system is used on the chromium tracker. Since we
    # have already reproduced the crash, we skip the Unconfirmed status.
    issue.status = 'Untriaged'

    # Add OS label.
    if environment.is_chromeos_job(testcase.job_type):
      # ChromeOS fuzzers run on Linux platform, so use correct OS-Chrome for
      # tracking.
      issue.add_label('OS-Chrome')
    elif testcase.platform_id:
      os_label = 'OS-%s' % ((testcase.platform_id.split(':')[0]).capitalize())
      issue.add_label(os_label)

    # Add view restrictions for internal job types.
    add_view_restrictions_if_needed(issue, testcase)

    if testcase.security_flag:
      # Apply labels specific to security bugs.
      issue.add_label('Restrict-View-SecurityTeam')
      issue.add_label('Type-Bug-Security')

      # Add reward labels if this is from an external fuzzer contribution.
      fuzzer = data_types.Fuzzer.query(
          data_types.Fuzzer.name == testcase.fuzzer_name).get()
      if fuzzer and fuzzer.external_contribution:
        issue.add_label('reward-topanel')
        issue.add_label('External-Fuzzer-Contribution')

      data_handler.update_issue_impact_labels(testcase, issue)
    else:
      # Apply labels for functional (non-security) bugs.
      if utils.sub_string_exists_in(NON_CRASH_TYPES, testcase.crash_type):
        # Non-crashing test cases shouldn't be assigned Pri-1.
        issue.add_label('Pri-2')
        issue.add_label('Type-Bug')
      else:
        # Default functional bug labels.
        issue.add_label('Pri-1')
        issue.add_label('Stability-Crash')
        issue.add_label('Type-Bug')

  # AOSP-specific labels.
  elif itm.project_name == 'android':
    if testcase.security_flag:
      # Security bug labels.
      issue.add_cc('*****@*****.**')
      issue.add_label('Type-Security')
      issue.add_label('Restrict-View-Commit')
    else:
      # Functional bug labels.
      issue.add_label('Type-Defect')

  # OSS-Fuzz specific labels.
  elif itm.project_name == 'oss-fuzz':
    if testcase.security_flag:
      # Security bug labels.
      issue.add_label('Type-Bug-Security')
    else:
      # Functional bug labels.
      issue.add_label('Type-Bug')

    if should_restrict_issue:
      issue.add_label('Restrict-View-Commit')

  # Add additional labels from the job definition and fuzzer.
  additional_labels = data_handler.get_additional_values_for_variable(
      'AUTOMATIC_LABELS', testcase.job_type, testcase.fuzzer_name)
  for label in additional_labels:
    issue.add_label(label)

  # Add additional components from the job definition and fuzzer.
  automatic_components = data_handler.get_additional_values_for_variable(
      'AUTOMATIC_COMPONENTS', testcase.job_type, testcase.fuzzer_name)
  for component in automatic_components:
    issue.add_component(component)

  # Add additional ccs from the job definition and fuzzer.
  ccs = data_handler.get_additional_values_for_variable(
      'AUTOMATIC_CCS', testcase.job_type, testcase.fuzzer_name)

  # For externally contributed fuzzers, potentially cc the author.
  # Use fully qualified fuzzer name if one is available.
  fully_qualified_fuzzer_name = (
      testcase.overridden_fuzzer_name or testcase.fuzzer_name)
  ccs += external_users.cc_users_for_fuzzer(fully_qualified_fuzzer_name,
                                            testcase.security_flag)
  ccs += external_users.cc_users_for_job(testcase.job_type,
                                         testcase.security_flag)

  # Add the user as a cc if requested, and any default ccs for this job.
  # Check for additional ccs or labels from the job definition.
  if additional_ccs:
    ccs += [cc for cc in additional_ccs if cc not in ccs]

  # For user uploads, we assume the uploader is interested in the issue.
  if testcase.uploader_email and testcase.uploader_email not in ccs:
    ccs.append(testcase.uploader_email)

  if itm.project_name == 'oss-fuzz' and ccs:
    # Add a reported label for deadline tracking.
    issue.add_label(reported_label())

    if issue.has_label_matching('Restrict-View-Commit'):
      issue.body += '\n\n' + DEADLINE_NOTE

    issue.body += '\n\n' + FIX_NOTE
    issue.body += '\n\n' + QUESTIONS_NOTE

  for cc in ccs:
    issue.add_cc(cc)

  # Add additional labels from testcase metadata.
  metadata_labels = utils.parse_delimited(
      testcase.get_metadata('issue_labels', ''),
      delimiter=',',
      strip=True,
      remove_empty=True)
  for label in metadata_labels:
    issue.add_label(label)

  issue.itm = itm
  issue.reporter = user_email
  issue.save()

  # Update the testcase with this newly created issue.
  testcase.bug_information = str(issue.id)
  testcase.put()

  data_handler.update_group_bug(testcase.group_id)

  return issue.id