Files
webrtc/tools/quality_tracking/tgrid_parser_test.py
phoglund@webrtc.org 914ef27c63 Made the necessary adaptations for the dashboard launch and fixed some bugs (already live).
Will now recognize warnings as a status. Returns proper HTTP status codes for the most common errors now. Will be more strict when checking build status data (no newlines in bot names).

Prepared cron scripts.

Prepared dashboard for production use.

BUG=
TEST=

Review URL: https://webrtc-codereview.appspot.com/404003

git-svn-id: http://webrtc.googlecode.com/svn/trunk@1772 4adac7df-926f-26a2-2b94-8c16560cd09d
2012-02-27 15:42:25 +00:00

208 lines
6.6 KiB
Python
Executable File

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