#!/usr/bin/env python
#-*- coding: utf-8 -*-
#  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
#
#  Use of this source code is governed by a BSD-style license
#  that can be found in the LICENSE file in the root of the source
#  tree. An additional intellectual property rights grant can be found
#  in the file PATENTS.  All contributing project authors may
#  be found in the AUTHORS file in the root of the source tree.

"""Contains functions for parsing the build master's transposed grid page."""

__author__ = 'phoglund@webrtc.org (Patrik Höglund)'

import unittest

import tgrid_parser


SAMPLE_FILE = """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html
 xmlns="http://www.w3.org/1999/xhtml"
 lang="en"
 xml:lang="en">
<head>
 <title>Buildbot</title>
 <link href="buildbot.css" rel="stylesheet" type="text/css" />
</head>

<body vlink="#800080">
<table class="Grid" border="0" cellspacing="0">
<tr>
<td valign="bottom" class="sourcestamp">1570</td>
<td class="build warnings"><a href="builders/Chrome/builds/109">warnings</a>
<br />
make chrome</td>
<td class="build success">
  <a href="builders/Android/builds/121">OK</a></td>
<td class="build success">
  <a href="builders/ChromeOS/builds/578">OK</a></td>
<td class="build success">
  <a href="builders/Linux32bitDBG/builds/564">OK</a></td>
<td class="build success">
  <a href="builders/Linux32bitRelease/builds/684">OK</a></td>
<td class="build success">
  <a href="builders/Linux64bitDBG/builds/680">OK</a></td>
<td class="build success">
  <a href="builders/Linux64bitDBG-GCC4.6/builds/5">OK</a></td>
<td class="build success">
  <a href="builders/Linux64bitRelease/builds/570">OK</a></td>
<td class="build success">
  <a href="builders/LinuxCLANG/builds/259">OK</a></td>
<td class="build success">
  <a href="builders/LinuxVideoTest/builds/345">OK</a></td>
<td class="build success">
  <a href="builders/MacOS/builds/670">OK</a></td>
<td class="build success">
  <a href="builders/Win32Debug/builds/432">OK</a></td>
<td class="build success">
  <a href="builders/Win32Release/builds/440">OK</a></td>
</tr>
<tr>
<td valign="bottom" class="sourcestamp">1571</td>
<td class="build warnings"><a href="builders/Chrome/builds/109">warnings</a>
<br />
make chrome</td>
<td class="build success">
  <a href="builders/Android/builds/122">OK</a></td>
<td class="build success">
  <a href="builders/ChromeOS/builds/579">OK</a></td>
<td class="build success">
  <a href="builders/Linux32bitDBG/builds/565">OK</a></td>
<td class="build success">
  <a href="builders/Linux32bitRelease/builds/685">OK</a></td>
<td class="build success">
  <a href="builders/Linux64bitDBG/builds/681">OK</a></td>
<td class="build success">
  <a href="builders/Linux64bitDBG-GCC4.6/builds/6">OK</a></td>
<td class="build success">
  <a href="builders/Linux64bitRelease/builds/571">OK</a></td>
<td class="build success">
  <a href="builders/LinuxCLANG/builds/260">OK</a></td>
<td class="build failure">
  <a href="builders/LinuxVideoTest/builds/346">failed</a><br />
voe_auto_test</td>
<td class="build success">
  <a href="builders/MacOS/builds/671">OK</a></td>
<td class="build running">
  <a href="builders/Win32Debug/builds/441">building</a></td>
<td class="build success">
  <a href="builders/Win32Release/builds/441">OK</a></td>
</tr>
</table>
</body>
</html>
"""

MINIMAL_OK = """
<tr>
<td valign="bottom" class="sourcestamp">1570</td>
<td class="build success">
<a href="builders/Android/builds/121">OK</a></td>
</tr>
"""

MINIMAL_FAIL = """
<tr>
<td valign="bottom" class="sourcestamp">1573</td>
<td class="build failure">
<a href="builders/LinuxVideoTest/builds/347">failed</a><br />
voe_auto_test</td>
</tr>
"""

MINIMAL_BUILDING = """
<tr>
<td valign="bottom" class="sourcestamp">1576</td>
<td class="build running">
<a href="builders/Win32Debug/builds/434">building</a></td>
voe_auto_test</td>
</tr>
"""

MINIMAL_WARNED = """
<tr>
<td valign="bottom" class="sourcestamp">1576</td>
<td class="build warnings">
<a href="builders/Chrome/builds/109">warnings</a><br />
make chrome</td>
</tr>
"""

class TGridParserTest(unittest.TestCase):
  def test_parser_throws_exception_on_empty_html(self):
    self.assertRaises(tgrid_parser.FailedToParseBuildStatus,
                      tgrid_parser.parse_tgrid_page, '');

  def test_parser_finds_successful_bot(self):
    result = tgrid_parser.parse_tgrid_page(MINIMAL_OK)

    self.assertEqual(1, len(result), 'There is only one bot in the sample.')
    first_mapping = result.items()[0]

    self.assertEqual('1570--Android', first_mapping[0])
    self.assertEqual('121--OK', first_mapping[1])

  def test_parser_finds_failed_bot(self):
    result = tgrid_parser.parse_tgrid_page(MINIMAL_FAIL)

    self.assertEqual(1, len(result), 'There is only one bot in the sample.')
    first_mapping = result.items()[0]

    self.assertEqual('1573--LinuxVideoTest', first_mapping[0])
    self.assertEqual('347--failed', first_mapping[1])

  def test_parser_finds_building_bot(self):
    result = tgrid_parser.parse_tgrid_page(MINIMAL_BUILDING)

    self.assertEqual(1, len(result), 'There is only one bot in the sample.')
    first_mapping = result.items()[0]

    self.assertEqual('1576--Win32Debug', first_mapping[0])
    self.assertEqual('434--building', first_mapping[1])

  def test_parser_finds_warned_bot(self):
    result = tgrid_parser.parse_tgrid_page(MINIMAL_WARNED)

    self.assertEqual(1, len(result), 'There is only one bot in the sample.')
    first_mapping = result.items()[0]

    self.assertEqual('1576--Chrome', first_mapping[0])
    self.assertEqual('109--warnings', first_mapping[1])

  def test_parser_finds_all_bots_and_revisions(self):
    result = tgrid_parser.parse_tgrid_page(SAMPLE_FILE)

    # 2 * 13 = 26 bots in sample
    self.assertEqual(26, len(result))

    # Make some samples
    self.assertTrue(result.has_key('1570--ChromeOS'))
    self.assertEquals('578--OK', result['1570--ChromeOS'])

    self.assertTrue(result.has_key('1570--Chrome'))
    self.assertEquals('109--warnings', result['1570--Chrome'])

    self.assertTrue(result.has_key('1570--LinuxCLANG'))
    self.assertEquals('259--OK', result['1570--LinuxCLANG'])

    self.assertTrue(result.has_key('1570--Win32Release'))
    self.assertEquals('440--OK', result['1570--Win32Release'])

    self.assertTrue(result.has_key('1571--ChromeOS'))
    self.assertEquals('579--OK', result['1571--ChromeOS'])

    self.assertTrue(result.has_key('1571--LinuxVideoTest'))
    self.assertEquals('346--failed', result['1571--LinuxVideoTest'])

    self.assertTrue(result.has_key('1571--Win32Debug'))
    self.assertEquals('441--building', result['1571--Win32Debug'])


if __name__ == '__main__':
  unittest.main()
