def testPost_AdminAddsAndRemovesOther_Succeeds(self): self.SetCurrentUser('*****@*****.**', is_admin=True) self._SetOwnersDict(_SAMPLE_OWNER_DICT) # Test adding test owner. self.testapp.post('/edit_test_owners', { 'action': 'add', 'item': 'ChromiumPerf/speedometer', 'sub_item': '*****@*****.**', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) owner_dict = layered_cache.GetExternal(test_owner._MASTER_OWNER_CACHE_KEY) self.assertIn('*****@*****.**', owner_dict['ChromiumPerf/speedometer']) # Test removing test owner. self.testapp.post('/edit_test_owners', { 'action': 'remove', 'item': 'ChromiumPerf/speedometer', 'sub_item': '*****@*****.**', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) owner_dict = layered_cache.GetExternal(test_owner._MASTER_OWNER_CACHE_KEY) self.assertNotIn( '*****@*****.**', owner_dict['ChromiumPerf/speedometer']) # Test removing all test owners for a test suite path. self.testapp.post('/edit_test_owners', { 'action': 'remove', 'item': 'ChromiumPerf/speedometer', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) owner_dict = layered_cache.GetExternal(test_owner._MASTER_OWNER_CACHE_KEY) self.assertNotIn('ChromiumPerf/speedometer', owner_dict)
def test_NonAdminAddsAndRemovesSelf_Succeeds(self): self.SetCurrentUser('*****@*****.**', is_admin=False) self._SetOwnersDict(_SAMPLE_OWNER_DICT) self.testapp.post( '/edit_test_owners', { 'action': 'add', 'item': 'ChromiumPerf/spaceport', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) owner_dict = layered_cache.GetExternal( test_owner._MASTER_OWNER_CACHE_KEY) self.assertIn('ChromiumPerf/spaceport', owner_dict) self.assertIn('*****@*****.**', owner_dict['ChromiumPerf/spaceport']) self.testapp.post( '/edit_test_owners', { 'action': 'remove', 'item': 'ChromiumPerf/spaceport', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) owner_dict = layered_cache.GetExternal( test_owner._MASTER_OWNER_CACHE_KEY) self.assertNotIn('ChromiumPerf/spaceport', owner_dict)
def testPost_AroundRevisionWithOneBot(self): """Tests generation of around_revision stats for only one bot.""" self._AddMockData() self.SetCurrentUser('*****@*****.**') # Post a request to get around_revision stats. self.testapp.post( '/stats', { 'bots': 'win7', 'type': 'around_revision', 'rev': '15040', 'num_around': '10', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.ExecuteTaskQueueTasks('/stats_around_revision', stats._QUEUE_NAME) containers = stats.StatContainer.query().fetch() self.assertEqual(1, len(containers)) self.assertEqual('around_revision', containers[0].stat_type) self.assertEqual(2, containers[0].num_stats) self.assertEqual({ 'name': None, 'revision': 15040, 'num_around': 10 }, containers[0].summary) individual_stats = stats.IndividualStat.query().fetch() self.assertEqual(2, len(individual_stats)) self.assertEqual('ChromiumPerf/win7/moz/times/page_load_time', individual_stats[0].details['test_path']) self.assertEqual('ChromiumPerf/win7/octane/Total/Score', individual_stats[1].details['test_path'])
def testEditSheriff_EditPatternsList(self): """Tests editing the patterns list of a Sheriff.""" self._AddSampleTestData() self._AddSheriff('Sheriff', patterns=['*/*/*/*']) self.testapp.post( '/edit_sheriffs', { 'add-edit': 'edit', 'edit-name': 'Sheriff', 'patterns': '*/*/*/ddd\n\n*/*/*/ccc', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) sheriff_entity = sheriff.Sheriff.query().fetch()[0] self.assertEqual(['*/*/*/ccc', '*/*/*/ddd'], sheriff_entity.patterns) # After the tasks get executed, the Test entities should also be updated. self.ExecuteTaskQueueTasks('/put_entities_task', edit_config_handler._TASK_QUEUE_NAME) aaa = utils.TestKey('TheMaster/TheBot/Suite1/aaa').get() bbb = utils.TestKey('TheMaster/TheBot/Suite1/bbb').get() ccc = utils.TestKey('TheMaster/TheBot/Suite2/ccc').get() ddd = utils.TestKey('TheMaster/TheBot/Suite2/ddd').get() self.assertIsNone(aaa.sheriff) self.assertIsNone(bbb.sheriff) self.assertEqual(sheriff_entity.key, ccc.sheriff) self.assertEqual(sheriff_entity.key, ddd.sheriff)
def testPost_EditExistingSheriff(self): """Tests editing the email, url, and summarize properties of a Sheriff.""" self._AddSampleTestData() self._AddSheriff('Old Sheriff') self.testapp.post( '/edit_sheriffs', { 'add-edit': 'edit', 'edit-name': 'Old Sheriff', 'email': '*****@*****.**', 'url': 'http://perf.com/mysheriff', 'internal-only': 'false', 'summarize': 'true', 'patterns': '*/*/Suite1/*\n', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) sheriff_entity = sheriff.Sheriff.query().fetch()[0] self.assertEqual('*****@*****.**', sheriff_entity.email) self.assertEqual('http://perf.com/mysheriff', sheriff_entity.url) self.assertEqual(['*/*/Suite1/*'], sheriff_entity.patterns) self.assertTrue(sheriff_entity.summarize) # After the tasks get executed, the Test entities should also be updated. self.ExecuteTaskQueueTasks('/put_entities_task', edit_config_handler._TASK_QUEUE_NAME) aaa = utils.TestKey('TheMaster/TheBot/Suite1/aaa').get() bbb = utils.TestKey('TheMaster/TheBot/Suite1/bbb').get() ccc = utils.TestKey('TheMaster/TheBot/Suite2/ccc').get() ddd = utils.TestKey('TheMaster/TheBot/Suite2/ddd').get() self.assertEqual(sheriff_entity.key, aaa.sheriff) self.assertEqual(sheriff_entity.key, bbb.sheriff) self.assertIsNone(ccc.sheriff) self.assertIsNone(ddd.sheriff)
def testPost_WithKey_UpdatesNonNamespacedValues(self): self.testapp.post('/edit_site_config', { 'key': 'foo', 'value': '[1, 2, 3]', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual([1, 2, 3], stored_object.Get('foo'))
def testPost_NoNameGivenWhenEditingSheriff_ShowsErrorMessage(self): response = self.testapp.post( '/edit_sheriffs', { 'add-edit': 'edit', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) expected_message = 'No name given' self.assertIn(expected_message, response.body)
def testPost_FeedbackRecorded(self): self.testapp.post('/bad_bisect?', { 'try_job_id': '1234', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) jobs = try_job.TryJob.query().fetch() self.assertEqual(1, len(jobs)) self.assertEqual({'*****@*****.**'}, jobs[0].bad_result_emails)
def testPost_LogAdded(self): self.testapp.post( '/bad_bisect?', { 'try_job_id': '1234', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) logs = quick_logger.Get('bad_bisect', 'report') self.assertEqual(1, len(logs))
def testPost_WithInvalidAddEditParameter_ShowsErrorMessage(self): response = self.testapp.post( '/edit_sheriffs', { 'add-edit': '', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) expected_message = 'Invalid value' self.assertIn(expected_message, response.body)
def testPost_ExternalUser_ShowsErrorMessage(self): self.SetCurrentUser('*****@*****.**') response = self.testapp.post('/edit_site_config', { 'key': 'foo', 'value': '[1, 2, 3]', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertIn('Only internal users', response.body)
def testPost_NameForExistingSheriffNotFound_ShowsErrorMessage(self): response = self.testapp.post( '/edit_sheriffs', { 'add-edit': 'edit', 'edit-name': 'X', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) expected_message = 'does not exist' self.assertIn(expected_message, response.body)
def testPost_InitializeWhitelist(self): self.SetCurrentUser('*****@*****.**', is_admin=True) self.testapp.post('/bot_whitelist', { 'bot_whitelist': 'linux-release\nandroid-gn\nchromium-rel-mac6', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) whitelist = ndb.Key('BotWhitelist', bot_whitelist.WHITELIST_KEY).get() self.assertEqual( ['linux-release', 'android-gn', 'chromium-rel-mac6'], whitelist.bots)
def testPost_LoggedIntoValidSheriffAccount_ChangesBugID(self): anomaly_keys = self._AddAnomaliesToDataStore() self.SetCurrentUser('*****@*****.**') self.testapp.post('/edit_anomalies', { 'keys': json.dumps([anomaly_keys[0].urlsafe()]), 'bug_id': 31337, 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual(31337, anomaly_keys[0].get().bug_id)
def testPost_LoggedIntoInvalidDomain_DoesNotModifyAnomaly(self): anomaly_keys = self._AddAnomaliesToDataStore() self.SetCurrentUser('*****@*****.**') self.testapp.post('/edit_anomalies', { 'keys': json.dumps([anomaly_keys[0].urlsafe()]), 'bug_id': 31337, 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }, status=403) self.assertIsNone(anomaly_keys[0].get().bug_id)
def testPost_WithInvalidActionParameter_ShowsErrorMessage(self): """If an invalid value is given for "add-edit", an error page is shown.""" response = self.testapp.post( '/edit_sheriffs', { 'add-edit': '', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) expected_message = 'Invalid value' self.assertIn(expected_message, response.body)
def testPost_WithSomeInvalidJSON_ShowsErrorAndDoesNotModify(self): stored_object.Set('foo', 'XXX') response = self.testapp.post('/edit_site_config', { 'key': 'foo', 'value': '[1, 2, this is not json', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertIn('Invalid JSON', response.body) self.assertEqual('XXX', stored_object.Get('foo'))
def testPost_NameForNewSheriffAlreadyUsed_ShowsErrorMessage(self): self._AddSheriff('X') response = self.testapp.post( '/edit_sheriffs', { 'add-edit': 'add', 'add-name': 'X', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) expected_message = 'already exists' self.assertIn(expected_message, response.body)
def testPost_ClearWhitelist(self): self.SetCurrentUser('*****@*****.**', is_admin=True) whitelist = bot_whitelist.BotWhitelist(id=bot_whitelist.WHITELIST_KEY, bots=['linux-release', 'android-gn']) self.testapp.post('/bot_whitelist', { 'bot_whitelist': '', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) whitelist = ndb.Key('BotWhitelist', bot_whitelist.WHITELIST_KEY).get() self.assertEqual([], whitelist.bots)
def testPost_WithKey_UpdatesNamespacedValues(self): namespaced_stored_object.Set('foo', 'XXXinternalYYY') namespaced_stored_object.SetExternal('foo', 'XXXYYY') self.testapp.post('/edit_site_config', { 'key': 'foo', 'external_value': '{"x": "y"}', 'internal_value': '{"x": "yz"}', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual({'x': 'yz'}, namespaced_stored_object.Get('foo')) self.assertEqual({'x': 'y'}, namespaced_stored_object.GetExternal('foo'))
def testPost_ChangeRevisions(self): anomaly_keys = self._AddAnomaliesToDataStore() self.SetCurrentUser('*****@*****.**') self.testapp.post('/edit_anomalies', { 'keys': json.dumps([anomaly_keys[0].urlsafe()]), 'new_start_revision': '123450', 'new_end_revision': '123455', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual(123450, anomaly_keys[0].get().start_revision) self.assertEqual(123455, anomaly_keys[0].get().end_revision)
def testPost_NoKeysGiven_Error(self): anomaly_keys = self._AddAnomaliesToDataStore() self.SetCurrentUser('*****@*****.**') response = self.testapp.post( '/edit_anomalies', { 'bug_id': 31337, 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual({'error': 'No alerts specified to add bugs to.'}, json.loads(response.body)) self.assertIsNone(anomaly_keys[0].get().bug_id)
def testPost_NonInternalUser_ShowsErrorMessage(self): """Tests that the stats page is only shown when logged in.""" self.SetCurrentUser('*****@*****.**') response = self.testapp.get('/stats') self.assertIn('Only logged-in internal users', response.body) # Same thing if an xsrf token is given. response = self.testapp.post('/stats', { 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertIn('Only logged-in internal users', response.body)
def testPost_IncompleteParametersGiven_ReturnsError(self): anomaly_keys = self._AddAnomaliesToDataStore() self.SetCurrentUser('*****@*****.**') response = self.testapp.post( '/edit_anomalies', { 'keys': json.dumps([anomaly_keys[0].urlsafe()]), 'new_start_revision': '123', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual({'error': 'No bug ID or new revision specified.'}, json.loads(response.body))
def testPost_RemoveBug(self): anomaly_keys = self._AddAnomaliesToDataStore() self.SetCurrentUser('*****@*****.**') a = anomaly_keys[0].get() a.bug_id = 12345 a.put() self.testapp.post('/edit_anomalies', { 'keys': json.dumps([anomaly_keys[0].urlsafe()]), 'bug_id': 'REMOVE', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertIsNone(anomaly_keys[0].get().bug_id)
def testBugLabelPattern(self): """Tests adding and removing a BugLabelPattern.""" self.testapp.post( '/edit_bug_labels', { 'action': 'add_buglabel_pattern', 'buglabel_to_add': 'Performance-1', 'pattern': '*/*/Suite1/*', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) # The list of patterns should now contain the pattern that was added. self.assertEqual( ['*/*/Suite1/*'], bug_label_patterns.GetBugLabelPatterns()['Performance-1']) # Add another pattern for the same bug label. self.testapp.post( '/edit_bug_labels', { 'action': 'add_buglabel_pattern', 'buglabel_to_add': 'Performance-1', 'pattern': '*/*/Suite2/*', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) # The list of patterns should now contain both patterns. self.assertEqual( ['*/*/Suite1/*', '*/*/Suite2/*'], bug_label_patterns.GetBugLabelPatterns()['Performance-1']) # Remove the BugLabelPattern entity. self.testapp.post( '/edit_bug_labels', { 'action': 'remove_buglabel_pattern', 'buglabel_to_remove': 'Performance-1', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) # It should now be absent from the datastore. self.assertNotIn('Performance-1', bug_label_patterns.GetBugLabelPatterns())
def testPost_ChangeBugIDToInvalidID_ReturnsError(self): anomaly_keys = self._AddAnomaliesToDataStore() self.SetCurrentUser('*****@*****.**') a = anomaly_keys[0].get() a.bug_id = 12345 a.put() response = self.testapp.post( '/edit_anomalies', { 'keys': json.dumps([anomaly_keys[0].urlsafe()]), 'bug_id': 'a', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual({'error': 'Invalid bug ID a'}, json.loads(response.body)) self.assertEqual(12345, anomaly_keys[0].get().bug_id)
def testPost_SendsNotificationEmail(self): self.testapp.post('/edit_site_config', { 'key': 'foo', 'external_value': '{"x": "y"}', 'internal_value': '{"x": "yz"}', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) messages = self.mail_stub.get_sent_messages() self.assertEqual(1, len(messages)) self.assertEqual('*****@*****.**', messages[0].sender) self.assertEqual('*****@*****.**', messages[0].to) self.assertEqual( 'Config "foo" changed by [email protected]', messages[0].subject) self.assertIn('{"x": "y"}', str(messages[0].body)) self.assertIn('{"x": "yz"}', str(messages[0].body))
def testPost_NudgeWithInvalidRevisions_ReturnsError(self): anomaly_keys = self._AddAnomaliesToDataStore() self.SetCurrentUser('*****@*****.**') start = anomaly_keys[0].get().start_revision end = anomaly_keys[0].get().end_revision response = self.testapp.post( '/edit_anomalies', { 'keys': json.dumps([anomaly_keys[0].urlsafe()]), 'new_start_revision': 'a', 'new_end_revision': 'b', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual(start, anomaly_keys[0].get().start_revision) self.assertEqual(end, anomaly_keys[0].get().end_revision) self.assertEqual({'error': 'Invalid revisions a, b'}, json.loads(response.body))
def testPost_AddNewSheriff(self): self.testapp.post( '/edit_sheriffs', { 'add-edit': 'add', 'add-name': 'New Sheriff', 'email': '*****@*****.**', 'internal-only': 'true', 'summarize': 'true', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) sheriffs = sheriff.Sheriff.query().fetch() self.assertEqual(1, len(sheriffs)) self.assertEqual('New Sheriff', sheriffs[0].key.string_id()) self.assertEqual('*****@*****.**', sheriffs[0].email) self.assertEqual([], sheriffs[0].patterns) self.assertTrue(sheriffs[0].internal_only) self.assertTrue(sheriffs[0].summarize)