예제 #1
0
    def test_search_by_name_broken_tasks(self):
        # Create tasks where task_scheduler.schedule_request() fails in the middle.
        # This is done by mocking the functions to fail every SKIP call and running
        # it in a loop.
        class RandomFailure(Exception):
            pass

        # First call fails ndb.put_multi(), second call fails search.Index.put(),
        # third call work.
        index = [0]
        SKIP = 3

        def put_multi(*args, **kwargs):
            callers = [i[3] for i in inspect.stack()]
            self.assertTrue(
                'make_request' in callers or 'schedule_request' in callers,
                callers)
            if (index[0] % SKIP) == 1:
                raise RandomFailure()
            return old_put_multi(*args, **kwargs)

        def put_async(*args, **kwargs):
            callers = [i[3] for i in inspect.stack()]
            self.assertIn('schedule_request', callers)
            out = ndb.Future()
            if (index[0] % SKIP) == 2:
                out.set_exception(search.Error())
            else:
                out.set_result(old_put_async(*args, **kwargs).get_result())
            return out

        old_put_multi = self.mock(ndb, 'put_multi', put_multi)
        old_put_async = self.mock(search.Index, 'put_async', put_async)

        saved = []

        for i in xrange(100):
            index[0] = i
            data = _gen_request_data(
                name='Request %d' % i,
                properties=dict(dimensions={u'OS': u'Windows-3.1.1'}))
            try:
                request = task_request.make_request(data)
                result_summary = task_scheduler.schedule_request(request)
                saved.append(result_summary)
            except RandomFailure:
                pass

        self.assertEqual(67, len(saved))
        self.assertEqual(67, task_request.TaskRequest.query().count())
        self.assertEqual(67, task_result.TaskResultSummary.query().count())

        # Now the DB is full of half-corrupted entities.
        cursor = None
        actual, cursor = task_result.search_by_name('Request', cursor, 31)
        self.assertEqual(31, len(actual))
        actual, cursor = task_result.search_by_name('Request', cursor, 31)
        self.assertEqual(3, len(actual))
        actual, cursor = task_result.search_by_name('Request', cursor, 31)
        self.assertEqual(0, len(actual))
예제 #2
0
  def test_search_by_name_broken_tasks(self):
    # Create tasks where task_scheduler.schedule_request() fails in the middle.
    # This is done by mocking the functions to fail every SKIP call and running
    # it in a loop.
    class RandomFailure(Exception):
      pass

    # First call fails ndb.put_multi(), second call fails search.Index.put(),
    # third call work.
    index = [0]
    SKIP = 3
    def put_multi(*args, **kwargs):
      callers = [i[3] for i in inspect.stack()]
      self.assertTrue(
          'make_request' in callers or 'schedule_request' in callers, callers)
      if (index[0] % SKIP) == 1:
        raise RandomFailure()
      return old_put_multi(*args, **kwargs)

    def put_async(*args, **kwargs):
      callers = [i[3] for i in inspect.stack()]
      self.assertIn('schedule_request', callers)
      out = ndb.Future()
      if (index[0] % SKIP) == 2:
        out.set_exception(search.Error())
      else:
        out.set_result(old_put_async(*args, **kwargs).get_result())
      return out

    old_put_multi = self.mock(ndb, 'put_multi', put_multi)
    old_put_async = self.mock(search.Index, 'put_async', put_async)

    saved = []

    for i in xrange(100):
      index[0] = i
      data = _gen_request_data(
          name='Request %d' % i,
          properties=dict(dimensions={u'OS': u'Windows-3.1.1'}))
      try:
        request = task_request.make_request(data)
        result_summary = task_scheduler.schedule_request(request)
        saved.append(result_summary)
      except RandomFailure:
        pass

    self.assertEqual(67, len(saved))
    self.assertEqual(67, task_request.TaskRequest.query().count())
    self.assertEqual(67, task_result.TaskResultSummary.query().count())

    # Now the DB is full of half-corrupted entities.
    cursor = None
    actual, cursor = task_result.search_by_name('Request', cursor, 31)
    self.assertEqual(31, len(actual))
    actual, cursor = task_result.search_by_name('Request', cursor, 31)
    self.assertEqual(3, len(actual))
    actual, cursor = task_result.search_by_name('Request', cursor, 31)
    self.assertEqual(0, len(actual))
예제 #3
0
  def test_search_by_name_failures(self):
    data = _gen_request_data(
        properties=dict(dimensions={u'OS': u'Windows-3.1.1'}))
    request = task_request.make_request(data)
    result_summary = task_scheduler.schedule_request(request)

    actual, _cursor = task_result.search_by_name('foo', None, 10)
    self.assertEqual([], actual)
    # Partial match doesn't work.
    actual, _cursor = task_result.search_by_name('nam', None, 10)
    self.assertEqual([], actual)
예제 #4
0
  def test_search_by_name(self):
    data = _gen_request_data(
        properties=dict(dimensions={u'OS': u'Windows-3.1.1'}))
    request = task_request.make_request(data)
    result_summary = task_scheduler.schedule_request(request)

    # Assert that search is not case-sensitive by using unexpected casing.
    actual, _cursor = task_result.search_by_name('requEST', None, 10)
    self.assertEqual([result_summary], actual)
    actual, _cursor = task_result.search_by_name('name', None, 10)
    self.assertEqual([result_summary], actual)
예제 #5
0
    def test_search_by_name_failures(self):
        data = _gen_request_data(properties=dict(
            dimensions={u'OS': u'Windows-3.1.1'}))
        request = task_request.make_request(data)
        result_summary = task_scheduler.schedule_request(request)

        actual, _cursor = task_result.search_by_name('foo', None, 10)
        self.assertEqual([], actual)
        # Partial match doesn't work.
        actual, _cursor = task_result.search_by_name('nam', None, 10)
        self.assertEqual([], actual)
예제 #6
0
    def test_search_by_name(self):
        data = _gen_request_data(properties=dict(
            dimensions={u'OS': u'Windows-3.1.1'}))
        request = task_request.make_request(data)
        result_summary = task_scheduler.schedule_request(request)

        # Assert that search is not case-sensitive by using unexpected casing.
        actual, _cursor = task_result.search_by_name('requEST', None, 10)
        self.assertEqual([result_summary], actual)
        actual, _cursor = task_result.search_by_name('name', None, 10)
        self.assertEqual([result_summary], actual)