# Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import json import unittest import webapp2 import webtest from google.appengine.ext import ndb from dashboard import report from dashboard import testing_common from dashboard import update_test_suites from dashboard.models import page_state class ReportTest(testing_common.TestCase): def setUp(self): super(ReportTest, self).setUp() app = webapp2.WSGIApplication( [('/report', report.ReportHandler), ('/update_test_suites', update_test_suites.UpdateTestSuitesHandler)]) self.testapp = webtest.TestApp(app) def _AddTestSuites(self): """Adds sample data and sets the list of test suites.""" # Mock out some data for a test. masters = [ 'ChromiumPerf', 'ChromiumGPU', ] bots = [ 'chromium-rel-win7-gpu-ati', 'linux-release', ] tests = { 'scrolling_benchmark': { 'a_first_listed_test': {}, 'average_commit_time': { 'answers.yahoo.com': {}, 'www.cnn.com': {}, }, 'average_commit_time_ref': {}, }, 'dromaeo': {}, } testing_common.AddTests(masters, bots, tests) for m in masters: for b in bots: for t in tests: t = ndb.Key('Master', m, 'Bot', b, 'Test', t).get() t.description = 'This should show up' t.put() # Before the test suites data gets generated, the cached test suites # data must be updated. self.testapp.post('/update_test_suites') def testPost_ContainsTestSuites(self): self._AddTestSuites() # We expect to have this JavaScript in the rendered HTML. expected_suites = { 'scrolling_benchmark': { 'mas': { 'ChromiumPerf': { 'chromium-rel-win7-gpu-ati': False, 'linux-release': False, }, 'ChromiumGPU': { 'chromium-rel-win7-gpu-ati': False, 'linux-release': False, }, }, 'des': 'This should show up', }, 'dromaeo': { 'mas': { 'ChromiumPerf': { 'chromium-rel-win7-gpu-ati': False, 'linux-release': False, }, 'ChromiumGPU': { 'chromium-rel-win7-gpu-ati': False, 'linux-release': False, }, }, 'des': 'This should show up', }, } response = self.testapp.post('/report') actual_suites = self.GetJsonValue(response, 'test_suites') self.assertEqual(expected_suites, actual_suites) def testGet(self): response = self.testapp.get('/report') self.assertEqual('text/html', response.content_type) self.assertIn('Chrome Performance Dashboard', response.body) def testGet_OldUri(self): expected_state = { 'charts': [ [['ChromiumGPU/linux/scrolling/num_layers', ['num_layers']]], [['ChromiumGPU/linux/scrolling/num_layers/about.com', ['num_layers']]], [['ChromiumGPU/win/scrolling/num_layers', ['num_layers']]], [['ChromiumGPU/win/scrolling/num_layers/about.com', ['num_layers']]], ] } response = self.testapp.get( '/report' '?masters=ChromiumGPU&bots=linux,win' '&tests=scrolling/num_layers,scrolling/num_layers/about.com' '&checked=num_layers') # We expect to get a URL redirect with an sid. location = response.headers.get('location') self.assertIn('sid=', location) state_id = location.split('sid=')[1] state = ndb.Key(page_state.PageState, state_id).get() self.assertEqual(json.dumps(expected_state, separators=(',', ':')), state.value) def testGet_OldUriMissingTestParam(self): response = self.testapp.get( '/report' '?masters=ChromiumGPU&bots=linux,win' '&checked=num_layers') location = response.headers.get('location') self.assertIsNone(location) states = page_state.PageState.query().fetch() self.assertEqual(0, len(states)) def testGet_OldUriMissingSubTest(self): self._AddTestSuites() testing_common.AddRows( 'ChromiumGPU/linux-release/scrolling_benchmark/a_first_listed_test', {200}) expected_state = { 'charts': [ [[('ChromiumGPU/linux-release/scrolling_benchmark/' 'a_first_listed_test'), ['a_first_listed_test']]], ] } response = self.testapp.get( '/report' '?masters=ChromiumGPU&bots=linux-release' '&tests=scrolling_benchmark') # We expect to get a URL redirect with an sid. location = response.headers.get('location') self.assertIn('sid=', location) state_id = location.split('sid=')[1] state = ndb.Key(page_state.PageState, state_id).get() self.assertEqual(json.dumps(expected_state, separators=(',', ':')), state.value) def testGet_OldUriWithRevisionParams(self): response = self.testapp.get( '/report' '?masters=ChromiumGPU&bots=linux,win' '&tests=scrolling/num_layers,scrolling/num_layers/about.com' '&checked=num_layers&start_rev=1234&end_rev=5678') location = response.headers.get('location') self.assertIn('sid=', location) self.assertIn('start_rev=1234', location) self.assertIn('end_rev=5678', location) def testGet_OldUriWithNestedSubtestAndMissingSubTestParam(self): self._AddTestSuites() testing_common.AddRows( ('ChromiumGPU/linux-release/scrolling_benchmark/average_commit_time/' 'answers.yahoo.com'), {200}) expected_state = { 'charts': [ [[('ChromiumGPU/linux-release/scrolling_benchmark/' 'average_commit_time/answers.yahoo.com'), ['answers.yahoo.com']]], ] } response = self.testapp.get( '/report' '?masters=ChromiumGPU&bots=linux-release' '&tests=scrolling_benchmark') # We expect to get a URL redirect with an sid. location = response.headers.get('location') self.assertIn('sid=', location) state_id = location.split('sid=')[1] state = ndb.Key(page_state.PageState, state_id).get() self.assertEqual(json.dumps(expected_state, separators=(',', ':')), state.value) if __name__ == '__main__': unittest.main()