self.buildbot_url = url if url else self._default_url
self._builder_by_name = {}
- # If any core builder is red we should not be landing patches. Other
- # builders should be added to this list once they are known to be
- # reliable.
- # See https://bugs.webkit.org/show_bug.cgi?id=33296 and related bugs.
- self.core_builder_names_regexps = [
- "SnowLeopard.*Build",
- "SnowLeopard.*\(Test",
- "SnowLeopard.*\(WebKit2 Test",
- "Leopard.*\((?:Build|Test)",
- "Windows.*Build",
- "Windows.*\(Test",
- "WinCE",
- "EFL",
- "GTK.*32",
- "GTK.*64",
- "Qt",
- "Chromium.*(Mac|Linux|Win).*Release$",
- "Chromium.*(Mac|Linux|Win).*Release.*\(Tests",
- ]
-
def _parse_last_build_cell(self, builder, cell):
status_link = cell.find('a')
if status_link:
return True
return False
- # FIXME: Should move onto Builder
- def _is_core_builder(self, builder_name):
- return self._matches_regexps(builder_name, self.core_builder_names_regexps)
-
# FIXME: This method needs to die, but is used by a unit test at the moment.
def _builder_statuses_with_names_matching_regexps(self, builder_statuses, name_regexps):
return [builder for builder in builder_statuses if self._matches_regexps(builder["name"], name_regexps)]
- def red_core_builders(self):
- return [builder for builder in self.core_builder_statuses() if not builder["is_green"]]
-
- def red_core_builders_names(self):
- return [builder["name"] for builder in self.red_core_builders()]
-
- def idle_red_core_builders(self):
- return [builder for builder in self.red_core_builders() if builder["activity"] == "idle"]
-
- def core_builders_are_green(self):
- return not self.red_core_builders()
-
# FIXME: These _fetch methods should move to a networking class.
def _fetch_build_dictionary(self, builder, build_number):
# Note: filter=1 will remove None and {} and '', which cuts noise but can
soup = BeautifulSoup(self._fetch_one_box_per_builder())
return [self._parse_builder_status_from_row(status_row) for status_row in soup.find('table').findAll('tr')]
- def core_builder_statuses(self):
- return [builder for builder in self.builder_statuses() if self._is_core_builder(builder["name"])]
-
def builder_with_name(self, name):
builder = self._builder_by_name.get(name)
if not builder:
self._builder_by_name[name] = builder
return builder
- def failure_map(self, only_core_builders=True):
- builder_statuses = self.core_builder_statuses() if only_core_builders else self.builder_statuses()
+ def failure_map(self):
failure_map = FailureMap()
revision_to_failing_bots = {}
- for builder_status in builder_statuses:
+ for builder_status in self.builder_statuses():
if builder_status["is_green"]:
continue
builder = self.builder_with_name(builder_status["name"])
# This makes fewer requests than calling Builder.latest_build would. It grabs all builder
# statuses in one request using self.builder_statuses (fetching /one_box_per_builder instead of builder pages).
- def _latest_builds_from_builders(self, only_core_builders=True):
- builder_statuses = self.core_builder_statuses() if only_core_builders else self.builder_statuses()
+ def _latest_builds_from_builders(self):
+ builder_statuses = self.builder_statuses()
return [self.builder_with_name(status["name"]).build(status["build_number"]) for status in builder_statuses]
def _build_at_or_before_revision(self, build, revision):
return build
build = build.previous_build()
- def last_green_revision(self, only_core_builders=True):
- builds = self._latest_builds_from_builders(only_core_builders)
+ def last_green_revision(self):
+ builds = self._latest_builds_from_builders()
target_revision = builds[0].revision()
# An alternate way to do this would be to start at one revision and walk backwards
# checking builder.build_for_revision, however build_for_revision is very slow on first load.
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'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 Release (WebKit2 Tests)', },
- {'name': u'SnowLeopard Intel Leaks', },
- {'name': u'Windows Release (Build)', },
- {'name': u'Windows 7 Release (Tests)', },
- {'name': u'Windows Debug (Build)', },
- {'name': u'Windows XP Debug (Tests)', },
- {'name': u'Windows 7 Release (WebKit2 Tests)', },
- {'name': u'GTK Linux 32-bit Release', },
- {'name': u'GTK Linux 64-bit Release', },
- {'name': u'GTK Linux 64-bit Debug', },
- {'name': u'Qt Linux Release', },
- {'name': u'Qt Linux Release minimal', },
- {'name': u'Qt Linux ARMv7 Release', },
- {'name': u'Qt Windows 32-bit Release', },
- {'name': u'Qt Windows 32-bit Debug', },
- {'name': u'Chromium Android Release', },
- {'name': u'Chromium Win Release', },
- {'name': u'Chromium Win Release (Tests)', },
- {'name': u'Chromium Mac Release', },
- {'name': u'Chromium Mac Release (Tests)', },
- {'name': u'Chromium Linux Release', },
- {'name': u'Chromium Linux Release (Tests)', },
- {'name': u'Leopard Intel Release (NRWT)', },
- {'name': u'SnowLeopard Intel Release (NRWT)', },
- {'name': u'New run-webkit-tests', },
- {'name': u'WinCairo Debug (Build)', },
- {'name': u'WinCE Release (Build)', },
- {'name': u'EFL Linux Release (Build)', },
- ]
- name_regexps = [
- "SnowLeopard.*Build",
- "SnowLeopard.*\(Test",
- "SnowLeopard.*\(WebKit2 Test",
- "Leopard.*\((?:Build|Test)",
- "Windows.*Build",
- "Windows.*\(Test",
- "WinCE",
- "EFL",
- "GTK.*32",
- "GTK.*64",
- "Qt",
- "Chromium.*(Mac|Linux|Win).*Release$",
- "Chromium.*(Mac|Linux|Win).*Release.*\(Tests",
- ]
- 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'SnowLeopard Intel Release (Build)', },
- {'name': u'SnowLeopard Intel Release (Tests)', },
- {'name': u'SnowLeopard Intel Release (WebKit2 Tests)', },
- {'name': u'Windows Release (Build)', },
- {'name': u'Windows 7 Release (Tests)', },
- {'name': u'Windows Debug (Build)', },
- {'name': u'Windows XP Debug (Tests)', },
- {'name': u'GTK Linux 32-bit Release', },
- {'name': u'GTK Linux 64-bit Release', },
- {'name': u'GTK Linux 64-bit Debug', },
- {'name': u'Qt Linux Release', },
- {'name': u'Qt Linux Release minimal', },
- {'name': u'Qt Linux ARMv7 Release', },
- {'name': u'Qt Windows 32-bit Release', },
- {'name': u'Qt Windows 32-bit Debug', },
- {'name': u'Chromium Win Release', },
- {'name': u'Chromium Win Release (Tests)', },
- {'name': u'Chromium Mac Release', },
- {'name': u'Chromium Mac Release (Tests)', },
- {'name': u'Chromium Linux Release', },
- {'name': u'Chromium Linux Release (Tests)', },
- {'name': u'WinCE Release (Build)', },
- {'name': u'EFL Linux Release (Build)', },
- ]
-
- # 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)
-
def test_builder_with_name(self):
buildbot = BuildBot()
def test_last_green_revision(self):
buildbot = BuildBot()
- def mock_builds_from_builders(only_core_builders):
+
+ def mock_builds_from_builders():
return self._fake_builds_at_index(0)
+
buildbot._latest_builds_from_builders = mock_builds_from_builders
self.assertEqual(buildbot.last_green_revision(), 1)