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))
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)
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)
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)
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)