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
208 lines
6.6 KiB
Python
Executable File
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()
|