Ejemplo n.º 1
0
  def test_domain_with_job_and_fuzzer(self):
    """Test domain user with job and fuzzer."""
    self.mock.has_access.side_effect = _has_access
    self.mock.get_user_job_type.return_value = 'job'
    self.mock._allowed_entities_for_user.side_effect = [['job2'], ['fuzzer']]
    self.mock.get_permission_names.side_effect = [['perm'], ['perm1']]

    crash_access.add_scope(self.query, self.params, 'security_flag', 'job_type',
                           'fuzzer_name')

    self.assertTrue(self.params['permissions']['everything'])
    self.assertFalse(self.params['permissions']['isPrivileged'])
    self.assertListEqual(['perm', 'job'], self.params['permissions']['jobs'])
    self.assertListEqual(['perm1'], self.params['permissions']['fuzzers'])

    self.query.union.assert_has_calls([])
    self.query.union.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY)

    everything_query = self.query.union.call_args[0][0]
    job_query = self.query.union.call_args[0][1]
    fuzzer_query = self.query.union.call_args[0][2]

    everything_query.union.assert_has_calls([])
    job_query.union.assert_has_calls([])
    fuzzer_query.union.assert_has_calls([])

    everything_query.filter.assert_has_calls(
        [mock.call('security_flag', False)])
    job_query.filter_in.assert_has_calls([
        mock.call('job_type', ['job2', 'job']),
    ])
    fuzzer_query.filter_in.assert_has_calls([
        mock.call('fuzzer_name', ['fuzzer']),
    ])
Ejemplo n.º 2
0
def get_result():
  """Get the result for the crash stats page."""
  params = dict(request.iterparams())
  params['type'] = params.get('type', 'regression')
  page = helpers.cast(request.get('page') or 1, int, "'page' is not an int.")

  is_revision_empty = 'revision' not in params

  query = big_query_query.Query()
  crash_access.add_scope(query, params, 'security_flag', 'job_type',
                         'fuzzer_name')

  if is_revision_empty:
    total_count = 0
    rows = []
  else:
    filters.add(query, params, FILTERS)
    rows, total_count = get(
        params=params,
        query=query,
        offset=(page - 1) * PAGE_SIZE,
        limit=PAGE_SIZE)
    helpers.log('Regression', helpers.VIEW_OPERATION)

  result = {
      'totalPages': (total_count // PAGE_SIZE) + 1,
      'page': page,
      'pageSize': PAGE_SIZE,
      'items': rows,
      'totalCount': total_count,
      'isRevisionEmpty': is_revision_empty
  }
  return result, params
Ejemplo n.º 3
0
  def test_default_global_privileged(self):
    """Test the default filter for globally privileged users."""
    self.mock.has_access.return_value = True
    crash_access.add_scope(self.query, self.params, 'security_flag', 'job_type',
                           'fuzzer_name')

    self.assertTrue(self.params['permissions']['everything'])
    self.assertTrue(self.params['permissions']['isPrivileged'])
    self.assertEqual([], self.params['permissions']['jobs'])
    self.assertFalse([], self.params['permissions']['fuzzers'])

    self.query.union.assert_has_calls([])
    self.query.filter.assert_has_calls([])
Ejemplo n.º 4
0
  def test_default_domain(self):
    """Test the default filter for domain users."""
    self.mock.has_access.side_effect = _has_access
    crash_access.add_scope(self.query, self.params, 'security_flag', 'job_type',
                           'fuzzer_name')

    self.assertTrue(self.params['permissions']['everything'])
    self.assertFalse(self.params['permissions']['isPrivileged'])
    self.assertEqual([], self.params['permissions']['jobs'])
    self.assertFalse([], self.params['permissions']['fuzzers'])

    self.query.filter.assert_has_calls([])
    self.query.union.assert_called_once_with(mock.ANY)

    q = self.query.union.call_args[0][0]
    q.union.assert_has_calls([])
    q.filter.assert_has_calls([mock.call('security_flag', False)])
Ejemplo n.º 5
0
def get_result():
  """Get the result for the crash stats page."""
  params = dict(request.iterparams())
  page = helpers.cast(request.get('page') or 1, int, "'page' is not an int.")
  group_by = params.get('group', 'platform')
  params['group'] = group_by
  sort_by = params.get('sort', 'total_count')
  params['sort'] = sort_by
  params['number'] = params.get('number', 'count')

  # Conditions for individual records.
  query = crash_stats.Query()
  query.group_by = group_by
  query.sort_by = sort_by
  crash_access.add_scope(query, params, 'security_flag', 'job_type',
                         'fuzzer_name')
  filters.add(query, params, FILTERS)

  # Conditions after grouping.
  group_query = crash_stats.Query()
  filters.add(group_query, params, GROUP_FILTERS)

  try:
    total_count, rows = crash_stats.get(
        query=query,
        group_query=group_query,
        offset=(page - 1) * PAGE_SIZE,
        limit=PAGE_SIZE)
  except ValueError:
    raise helpers.EarlyExitException('Invalid filters', 400)

  attach_testcases(rows)

  helpers.log('CrashStats', helpers.VIEW_OPERATION)

  result = {
      'totalPages': (total_count // PAGE_SIZE) + 1,
      'page': page,
      'pageSize': PAGE_SIZE,
      'items': rows,
      'totalCount': total_count
  }
  return result, params
Ejemplo n.º 6
0
def get_result(this):
    """Get the result for the testcase list page."""
    params = {k: v for k, v in this.request.iterparams()}
    page = helpers.cast(
        this.request.get('page') or 1, int, "'page' is not an int.")

    query = datastore_query.Query(data_types.Testcase)
    crash_access.add_scope(query, params, 'security_flag', 'job_type',
                           'fuzzer_name_indices')
    add_filters(query, params)

    testcases, total_pages, total_items, has_more = query.fetch_page(
        page=page,
        page_size=PAGE_SIZE,
        projection=FIELDS,
        more_limit=MORE_LIMIT)

    items = []
    for testcase in testcases:
        regression_range = ''
        fixed_range = ''

        if testcase.regression and testcase.regression != 'NA':
            regression_range = testcase.regression
        if testcase.fixed and testcase.fixed != 'NA':
            fixed_range = testcase.fixed

        item = {
            'id': testcase.key.id(),
            'crashType': ' '.join(testcase.crash_type.splitlines()),
            'crashStateLines': testcase.crash_state.strip().splitlines(),
            'jobType': testcase.job_type,
            'isClosed': not testcase.open,
            'isFixed': testcase.fixed and testcase.fixed != 'NA',
            'isReproducible': not testcase.one_time_crasher_flag,
            'isSecurity': testcase.security_flag,
            'isImpactSet': testcase.is_impact_set_flag,
            'impacts': {
                'stable': testcase.impact_stable_version,
                'beta': testcase.impact_beta_version,
            },
            'regressionRange': regression_range,
            'fixedRange': fixed_range,
            'groupId': testcase.group_id,
            'projectName': testcase.project_name,
            'platform': testcase.platform,
            'issueId': testcase.bug_information
            or testcase.group_bug_information,
            'showImpacts': testcase.has_impacts(),
            'impactsProduction': testcase.impacts_production()
        }
        if testcase.timestamp:
            item['timestamp'] = utils.utc_datetime_to_timestamp(
                testcase.timestamp)

        items.append(item)

    helpers.log('Testcases', helpers.VIEW_OPERATION)

    result = {
        'hasMore': has_more,
        'items': items,
        'page': page,
        'pageSize': PAGE_SIZE,
        'totalItems': total_items,
        'totalPages': total_pages,
    }
    return result, params
Ejemplo n.º 7
0
 def test_forbidden(self):
   """Test when user is forbidden."""
   self.mock.has_access.return_value = False
   with self.assertRaises(helpers.EarlyExitException):
     crash_access.add_scope(self.query, self.params, 'security_flag',
                            'job_type', 'fuzzer_name')