def test_delete_old_flakes(self): # Create old FlakyRuns. now = datetime.datetime.utcnow() old_flakes = [] for i in range(1, 101): # id can not be 0 key = FlakyRun(key=ndb.Key('FlakyRun', i), failure_run_time_finished=now - datetime.timedelta(days=100 + i), failure_run=ndb.Key('BuildRun', 1), success_run=ndb.Key('BuildRun', 2)).put() old_flakes.append(key) # Create new FlakyRuns. new_flakes = [] for i in range(101, 201): key = FlakyRun(key=ndb.Key('FlakyRun', i), failure_run_time_finished=now - datetime.timedelta(hours=100 + i), failure_run=ndb.Key('BuildRun', 1), success_run=ndb.Key('BuildRun', 2)).put() new_flakes.append(key) non_existant_flake = [ndb.Key('FlakyRun', '201')] # Create Flakes. Flake(key=ndb.Key('Flake', 'foo'), name='foo', occurrences=old_flakes + new_flakes, last_time_seen=now).put() Flake(key=ndb.Key('Flake', 'bar'), name='bar', occurrences=old_flakes + new_flakes[:50], last_time_seen=now).put() Flake(key=ndb.Key('Flake', 'baz'), name='baz', occurrences=non_existant_flake + new_flakes, last_time_seen=now).put() path = '/cron/delete_old_flake_occurrences' response = self.test_app.get(path, headers={'X-AppEngine-Cron': 'true'}) self.assertEqual(200, response.status_int) # Removed old flakes. self.assertEqual(set(Flake.get_by_id('foo').occurrences), set(new_flakes)) # Kept old flakes since there are just 50 new flakes. self.assertEqual(len(Flake.get_by_id('bar').occurrences), 150) # Make sure that non existant flake got removed. self.assertNotIn(non_existant_flake, Flake.get_by_id('bar').occurrences) # Make sure that we do not delete any FlakyRun entities. self.assertEqual(FlakyRun.query().count(limit=300), 200)
def test_create_tasks_to_update_issue_tracker(self): Flake(name='foo1', count_day=1).put() key2 = Flake(name='foo2', count_day=3).put() key3 = Flake(name='foo3', count_day=5).put() Flake(name='foo4', count_day=2).put() key5 = Flake(name='foo5', count_day=200).put() path = '/cron/update_issue_tracker' response = self.test_app.get(path, headers={'X-AppEngine-Cron': 'true'}) self.assertEqual(200, response.status_int) tasks = self.taskqueue_stub.get_filtered_tasks(queue_names='issue-updates') self.assertEqual(len(tasks), 3) self.assertEqual(tasks[0].url, '/issues/process/%s' % key2.urlsafe()) self.assertEqual(tasks[1].url, '/issues/process/%s' % key3.urlsafe()) self.assertEqual(tasks[2].url, '/issues/process/%s' % key5.urlsafe())
def test_converts_step_flake(self): last_updated = datetime.datetime.now() Flake(issue_id=1, is_step=True, name='fake_step', issue_last_updated=last_updated).put() self.test_app.get('/migrate') flake_types = FlakeType.query().fetch() self.assertEqual(len(flake_types), 1) flake_type = flake_types[0] self.assertEqual(flake_type.project, 'chromium') self.assertEqual(flake_type.step_name, 'fake_step') self.assertIsNone(flake_type.test_name) self.assertIsNone(flake_type.config) self.assertEqual(flake_type.last_updated, last_updated) issues = Issue.query().fetch() self.assertEqual(len(issues), 1) issue = issues[0] self.assertEqual(issue.issue_id, 1) self.assertEqual(issue.project, 'chromium') self.assertEqual(sorted(issue.flake_type_keys), sorted(flake_type.key for flake_type in flake_types))
def test_normalizes_step_name(self): key = Flake(name='my_unittests (with patch)').put() response = self.test_app.get( '/search?q=my_unittests+(with+patch)+on+NVIDIA+GPU', status=302) self.assertIn('location', response.headers) self.assertTrue(response.headers['location'].endswith( '/all_flake_occurrences?key=%s' % key.urlsafe()))
def test_ignores_if_issue_id_is_0(self): last_updated = datetime.datetime.now() Flake(issue_id=0, is_step=True, name='fake_step', issue_last_updated=last_updated).put() self.test_app.get('/migrate') self.assertEqual(len(FlakeType.query().fetch()), 0)
def test_ignores_null_flaky_runs(self): last_updated = datetime.datetime.now() fake_build_key = BuildRun(buildnumber=1, result=1, time_finished=last_updated).put() flake_run_key = FlakyRun(failure_run=fake_build_key, success_run=fake_build_key, failure_run_time_finished=last_updated, flakes=[ FlakeOccurrence(name='fake_step', failure='fake_test_name'), FlakeOccurrence(name='fake_step2', failure='fake_test_name') ]).put() null_flake_run_key = ndb.Key('FlakyRun', 'fake-key') Flake(issue_id=1, is_step=False, name='fake_test_name', issue_last_updated=last_updated, occurrences=[ flake_run_key, null_flake_run_key, ]).put() self.test_app.get('/migrate') flake_types = FlakeType.query().fetch() self.assertEqual(len(flake_types), 2) flake_type_1 = flake_types[0] self.assertEqual(flake_type_1.project, 'chromium') self.assertEqual(flake_type_1.step_name, 'fake_step') self.assertEqual(flake_type_1.test_name, 'fake_test_name') self.assertIsNone(flake_type_1.config) self.assertEqual(flake_type_1.last_updated, last_updated) flake_type_2 = flake_types[1] self.assertEqual(flake_type_2.project, 'chromium') self.assertEqual(flake_type_2.step_name, 'fake_step2') self.assertEqual(flake_type_2.test_name, 'fake_test_name') self.assertIsNone(flake_type_2.config) self.assertEqual(flake_type_2.last_updated, last_updated) issues = Issue.query().fetch() self.assertEqual(len(issues), 1) issue = issues[0] self.assertEqual(issue.issue_id, 1) self.assertEqual(issue.project, 'chromium') self.assertEqual(sorted(issue.flake_type_keys), sorted(flake_type.key for flake_type in flake_types))
def add_failure_to_flake(name, flaky_run): flake = Flake.get_by_id(name) if not flake: flake = Flake(name=name, id=name, last_time_seen=datetime.datetime.min) flake.put() flake.occurrences.append(flaky_run.key) flaky_run_time = flaky_run.failure_run.get().time_finished add_occurance_time_to_flake(flake, flaky_run_time) flake.put()
def add_failure_to_flake(name, flaky_run_key, failure_time, is_step): flake = Flake.get_by_id(name) if not flake: flake = Flake(name=name, id=name, last_time_seen=datetime.datetime.min, is_step=is_step) flake.put() flake.occurrences.append(flaky_run_key) # TODO(sergiyb): This is necessary to update existing flakes. Remove in July # 2016 or later. flake.is_step = is_step util.add_occurrence_time_to_flake(flake, failure_time) flake.put()
def test_adds_occurrence_time_to_flake(self): flake = Flake(name='foo.bar', last_time_seen=datetime.datetime.min) now = datetime.datetime.utcnow() util.add_occurrence_time_to_flake(flake, now) self.assertEqual(flake.last_time_seen, now) self.assertEqual(flake.count_hour, 1) self.assertEqual(flake.count_day, 1) self.assertEqual(flake.count_week, 1) self.assertEqual(flake.count_month, 1) self.assertEqual(flake.last_hour, True) self.assertEqual(flake.last_day, True) self.assertEqual(flake.last_week, True) self.assertEqual(flake.last_month, True)
def test_does_not_modify_flake(self): little_time_ago = datetime.datetime.utcnow() - datetime.timedelta( hours=2) flake = Flake(name='foo.bar', last_time_seen=little_time_ago) long_time_ago = datetime.datetime.utcnow() - datetime.timedelta( days=60) util.add_occurrence_time_to_flake(flake, long_time_ago) self.assertEqual(flake.last_time_seen, little_time_ago) self.assertEqual(flake.count_hour, 0) self.assertEqual(flake.count_day, 0) self.assertEqual(flake.count_week, 0) self.assertEqual(flake.count_month, 0) self.assertEqual(flake.last_hour, False) self.assertEqual(flake.last_day, False) self.assertEqual(flake.last_week, False) self.assertEqual(flake.last_month, False)
def _create_flake(): tf = datetime.datetime.utcnow() ts = tf - datetime.timedelta(hours=1) p = PatchsetBuilderRuns(issue=1, patchset=1, master='tryserver.bar', builder='baz').put() br_f0 = BuildRun(parent=p, buildnumber=10, result=2, time_started=ts, time_finished=tf).put() br_f1 = BuildRun(parent=p, buildnumber=20, result=2, time_started=ts, time_finished=tf).put() br_s0 = BuildRun(parent=p, buildnumber=30, result=0, time_started=ts, time_finished=tf).put() occ1 = FlakyRun(failure_run=br_f0, success_run=br_s0, failure_run_time_started=ts, failure_run_time_finished=tf, flakes=[ FlakeOccurrence(name='step1', failure='testX'), ]) occ2 = FlakyRun(failure_run=br_f1, success_run=br_s0, failure_run_time_started=ts, failure_run_time_finished=tf, flakes=[ FlakeOccurrence(name='step2', failure='testX'), FlakeOccurrence(name='step3', failure='step3'), ]) f = Flake(name='testX', count_day=10, occurrences=[occ1.put(), occ2.put()], is_step=True, issue_id=123456) return f, [occ1, occ2]
def test_create_tasks_to_update_stale_issues(self): Flake(name='foo1', issue_id=123).put() Flake(name='foo2', issue_id=234).put() Flake(name='foo3', issue_id=234).put() Flake(name='foo4', issue_id=345).put() Flake(name='foo5', issue_id=345).put() Flake(name='foo6', issue_id=234).put() path = '/cron/update_stale_issues' response = self.test_app.get(path, headers={'X-AppEngine-Cron': 'true'}) self.assertEqual(200, response.status_int) tasks = self.taskqueue_stub.get_filtered_tasks(queue_names='issue-updates') self.assertEqual(len(tasks), 3) self.assertEqual(tasks[0].url, '/issues/update-if-stale/123') self.assertEqual(tasks[1].url, '/issues/update-if-stale/234') self.assertEqual(tasks[2].url, '/issues/update-if-stale/345')
def _create_flake(self): tf = datetime.datetime(2016, 8, 6, 10, 20, 30) ts = tf - datetime.timedelta(hours=1) tf2 = tf - datetime.timedelta(days=5) ts2 = tf2 - datetime.timedelta(hours=1) p = PatchsetBuilderRuns(issue=123456, patchset=1, master='tryserver.test', builder='test-builder').put() br_f0 = BuildRun(parent=p, buildnumber=0, result=2, time_started=ts2, time_finished=tf2).put() br_f1 = BuildRun(parent=p, buildnumber=1, result=2, time_started=ts, time_finished=tf).put() br_s1 = BuildRun(parent=p, buildnumber=2, result=0, time_started=ts, time_finished=tf).put() br_f2 = BuildRun(parent=p, buildnumber=3, result=4, time_started=ts, time_finished=tf).put() br_s2 = BuildRun(parent=p, buildnumber=4, result=0, time_started=ts, time_finished=tf).put() occ_key1 = FlakyRun(failure_run=br_f0, success_run=br_s2, flakes=[ FlakeOccurrence(name='foo (x)', failure='foo.bar'), FlakeOccurrence(name='foo (x)', failure='other')], failure_run_time_started=ts2, failure_run_time_finished=tf2).put() occ_key2 = FlakyRun(failure_run=br_f1, success_run=br_s1, flakes=[ FlakeOccurrence(name='bar (y)', failure='foo.bar')], failure_run_time_started=ts, failure_run_time_finished=tf).put() occ_key3 = FlakyRun(failure_run=br_f2, success_run=br_s2, flakes=[ FlakeOccurrence( name='foo (x)', failure='foo.bar', issue_id=100), FlakeOccurrence( name='bar (y)', failure='foo.bar', issue_id=200)], failure_run_time_started=ts, failure_run_time_finished=tf).put() return Flake(name='foo.bar', count_day=10, is_step=False, occurrences=[occ_key1, occ_key2, occ_key3])
def put_flake(self, attr, count): flake = Flake(name='foo') setattr(flake, 'last_%s' % attr, True) setattr(flake, 'count_%s' % attr, count) flake.put()
def test_redirects_to_all_flake_occurrences(self): key = Flake(name='foo').put() response = self.test_app.get('/search?q=foo', status=302) self.assertIn('location', response.headers) self.assertTrue(response.headers['location'].endswith( '/all_flake_occurrences?key=%s' % key.urlsafe()))
def test_no_occurrences(self): flake_key = Flake(name='foo.bar').put() self.test_app.get('/all_flake_occurrences?key=%s' % flake_key.urlsafe())
def _create_flakes(ts, tf, ts2, tf2): p = PatchsetBuilderRuns(issue=123456, patchset=1, master='tryserver.test', builder='test-builder').put() br_f0 = BuildRun(parent=p, buildnumber=0, result=2, time_started=ts2, time_finished=tf2).put() br_f1 = BuildRun(parent=p, buildnumber=1, result=2, time_started=ts, time_finished=tf).put() br_s1 = BuildRun(parent=p, buildnumber=2, result=0, time_started=ts, time_finished=tf).put() br_f2 = BuildRun(parent=p, buildnumber=3, result=4, time_started=ts, time_finished=tf2).put() br_s2 = BuildRun(parent=p, buildnumber=4, result=0, time_started=ts, time_finished=tf2).put() occ_key1 = FlakyRun(failure_run=br_f0, success_run=br_s2, failure_run_time_started=ts2, failure_run_time_finished=tf2).put() occ_key2 = FlakyRun(failure_run=br_f1, success_run=br_s1, failure_run_time_started=ts, failure_run_time_finished=tf).put() occ_key3 = FlakyRun(failure_run=br_f2, success_run=br_s2, failure_run_time_started=ts, failure_run_time_finished=tf).put() Flake(name='foo', last_hour=True, last_day=True, last_week=True, last_month=True).put() Flake(name='bar', last_hour=True, last_day=True, last_week=True, last_month=True, occurrences=[occ_key1, occ_key2]).put() Flake(name='baz', last_hour=True, last_day=True, last_week=True, last_month=True, occurrences=[occ_key3]).put() Flake(name='zee', last_hour=False, last_day=False, last_week=True, last_month=False).put()