# Copyright (C) 2009 Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. # * Neither the name of Google Inc. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import unittest from webkitpy.buildbot import BuildBot from webkitpy.BeautifulSoup import BeautifulSoup class BuildBotTest(unittest.TestCase): _example_one_box_status = '''
Windows Debug (Tests) 47380
build
successful
building
ETA in
~ 14 mins
at 13:40
SnowLeopard Intel Release no build building
< 1 min
Qt Linux Release 47383
failed
compile-webkit
idle
''' _expected_example_one_box_parsings = [ { 'builder_url': u'http://build.webkit.org/builders/Windows%20Debug%20%28Tests%29', 'build_url': u'http://build.webkit.org/builders/Windows%20Debug%20%28Tests%29/builds/3693', 'is_green': True, 'name': u'Windows Debug (Tests)', 'built_revision': 47380 }, { 'builder_url': u'http://build.webkit.org/builders/SnowLeopard%20Intel%20Release', 'is_green': False, 'name': u'SnowLeopard Intel Release', }, { 'builder_url': u'http://build.webkit.org/builders/Qt%20Linux%20Release', 'build_url': u'http://build.webkit.org/builders/Qt%20Linux%20Release/builds/654', 'is_green': False, 'name': u'Qt Linux Release', 'built_revision': 47383 }, ] def test_status_parsing(self): buildbot = BuildBot() soup = BeautifulSoup(self._example_one_box_status) status_table = soup.find("table") input_rows = status_table.findAll('tr') for x in range(len(input_rows)): status_row = input_rows[x] expected_parsing = self._expected_example_one_box_parsings[x] builder = buildbot._parse_builder_status_from_row(status_row) # Make sure we aren't parsing more or less than we expect self.assertEquals(builder.keys(), expected_parsing.keys()) for key, expected_value in expected_parsing.items(): self.assertEquals(builder[key], expected_value, ("Builder %d parse failure for key: %s: Actual='%s' Expected='%s'" % (x, key, builder[key], expected_value))) def test_core_builder_methods(self): buildbot = BuildBot() # Override builder_statuses function to not touch the network. def example_builder_statuses(): # We could use instancemethod() to bind 'self' but we don't need to. return BuildBotTest._expected_example_one_box_parsings buildbot.builder_statuses = example_builder_statuses buildbot.core_builder_names_regexps = [ 'Leopard', "Windows.*Build" ] self.assertEquals(buildbot.red_core_builders_names(), []) self.assertTrue(buildbot.core_builders_are_green()) buildbot.core_builder_names_regexps = [ 'SnowLeopard', 'Qt' ] self.assertEquals(buildbot.red_core_builders_names(), [ u'SnowLeopard Intel Release', u'Qt Linux Release' ]) self.assertFalse(buildbot.core_builders_are_green()) def test_builder_name_regexps(self): buildbot = BuildBot() # For complete testing, this list should match the list of builders at build.webkit.org: example_builders = [ { 'name': u'Tiger Intel Release', }, { 'name': u'Leopard Intel Release (Build)', }, { 'name': u'Leopard Intel Release (Tests)', }, { 'name': u'Leopard Intel Debug (Build)', }, { 'name': u'Leopard Intel Debug (Tests)', }, { 'name': u'SnowLeopard Intel Release (Build)', }, { 'name': u'SnowLeopard Intel Release (Tests)', }, { 'name': u'SnowLeopard Intel Leaks', }, { 'name': u'Windows Release (Build)', }, { 'name': u'Windows Release (Tests)', }, { 'name': u'Windows Debug (Build)', }, { 'name': u'Windows Debug (Tests)', }, { 'name': u'Qt Linux Release', }, { 'name': u'Gtk Linux Release', }, { 'name': u'Gtk Linux 32-bit Debug', }, { 'name': u'Gtk Linux 64-bit Debug', }, { 'name': u'Chromium Linux Release', }, { 'name': u'Chromium Mac Release', }, { 'name': u'Chromium Win Release', }, ] name_regexps = [ "Leopard", "Windows.*Build", "Chromium" ] expected_builders = [ { 'name': u'Leopard Intel Release (Build)', }, { 'name': u'Leopard Intel Release (Tests)', }, { 'name': u'Leopard Intel Debug (Build)', }, { 'name': u'Leopard Intel Debug (Tests)', }, { 'name': u'Windows Release (Build)', }, { 'name': u'Windows Debug (Build)', }, { 'name': u'Chromium Linux Release', }, { 'name': u'Chromium Mac Release', }, { 'name': u'Chromium Win Release', }, ] # This test should probably be updated if the default regexp list changes self.assertEquals(buildbot.core_builder_names_regexps, name_regexps) builders = buildbot._builder_statuses_with_names_matching_regexps(example_builders, name_regexps) self.assertEquals(builders, expected_builders) if __name__ == '__main__': unittest.main()