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