Index: infra/tools/builder_alerts/test/gatekeeper_extras_test.py |
diff --git a/infra/tools/builder_alerts/test/gatekeeper_extras_test.py b/infra/tools/builder_alerts/test/gatekeeper_extras_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e5d810311b0f6fb149e969e1a481ebfca94d3689 |
--- /dev/null |
+++ b/infra/tools/builder_alerts/test/gatekeeper_extras_test.py |
@@ -0,0 +1,136 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import mock |
+import unittest |
+ |
+from infra.tools.builder_alerts import gatekeeper_extras |
+ |
+ |
+class GatekeeperExtrasTest(unittest.TestCase): |
+ def test_excluded_builders(self): |
+ self.assertEqual(gatekeeper_extras.excluded_builders([{}]), set()) |
+ self.assertEqual(gatekeeper_extras.excluded_builders([{'*': {}}]), set()) |
+ self.assertEqual( |
+ gatekeeper_extras.excluded_builders( |
+ [{'*': { |
+ 'excluded_builders': set(['test_builder1', 'test_builder2']) |
+ }}]), |
+ set(['test_builder1', 'test_builder2'])) |
+ |
+ @mock.patch('infra.tools.builder_alerts.gatekeeper_extras.excluded_builders', |
+ lambda config: ['Ignored']) |
+ @mock.patch('infra.tools.builder_alerts.gatekeeper_extras.would_close_tree', |
+ lambda config, builder, step: True) |
+ @mock.patch('infra.tools.builder_alerts.gatekeeper_extras.tree_for_master', |
+ lambda master_url, trees_config: 'test-tree') |
+ def test_apply_gatekeeper_rules(self): |
+ gatekeeper_cfg = {'http://build.chromium.org/p/chromium': {'key': 'value'}} |
+ gatekeeper_trees_cfg = {} |
+ alerts = [ |
+ {'master_url': 'http://build.chromium.org/p/project.without.config', |
+ 'builder_name': 'Linux', |
+ 'step_name': 'test_xyz'}, |
+ {'master_url': 'http://build.chromium.org/p/chromium', |
+ 'builder_name': 'Ignored', |
+ 'step_name': 'bot_update'}, |
+ {'master_url': 'http://build.chromium.org/p/chromium', |
+ 'builder_name': 'Win', |
+ 'step_name': 'bot_update'} |
+ ] |
+ |
+ filtered_alerts = gatekeeper_extras.apply_gatekeeper_rules( |
+ alerts, gatekeeper_cfg, gatekeeper_trees_cfg) |
+ |
+ self.assertEqual(len(filtered_alerts), 2) |
+ self.assertIn({'master_url': 'http://build.chromium.org/p/chromium', |
+ 'builder_name': 'Win', |
+ 'step_name': 'bot_update', |
+ 'would_close_tree': True, |
+ 'tree': 'test-tree'}, filtered_alerts) |
+ self.assertIn( |
+ {'master_url': 'http://build.chromium.org/p/project.without.config', |
+ 'builder_name': 'Linux', |
+ 'step_name': 'test_xyz'}, |
+ filtered_alerts) |
+ |
+ def test_tree_for_master_returns_tree_name(self): |
+ gatekeeper_trees = { |
+ "blink": { "masters": [ |
+ "https://build.chromium.org/p/chromium.webkit" |
+ ]}, |
+ "chromium": { "masters": [ |
+ "https://build.chromium.org/p/chromium.linux", |
+ "https://build.chromium.org/p/chromium.gpu", |
+ ]}, |
+ "non-closers": { "masters": [ |
+ "https://build.chromium.org/p/chromium.lkgr", |
+ ]} |
+ } |
+ |
+ self.assertEqual('chromium', gatekeeper_extras.tree_for_master( |
+ 'https://build.chromium.org/p/chromium.gpu', gatekeeper_trees)) |
+ self.assertEqual('blink', gatekeeper_extras.tree_for_master( |
+ 'https://build.chromium.org/p/chromium.webkit', gatekeeper_trees)) |
+ self.assertEqual('non-closers', gatekeeper_extras.tree_for_master( |
+ 'https://build.chromium.org/p/chromium.lkgr', gatekeeper_trees)) |
+ |
+ @mock.patch( # pragma: no cover (decorators are run before coverage is loaded) |
+ 'infra.tools.builder_alerts.buildbot.master_name_from_url', |
+ lambda url: 'foo.bar') |
+ def test_tree_for_master_falls_back_to_master_name(self): |
+ self.assertEqual('foo.bar', gatekeeper_extras.tree_for_master( |
+ 'https://build.chromium.org/p/foo.bar', {})) |
+ |
+ def test_fetch_master_urls(self): |
+ class MockArgs: |
+ def __init__(self, master_filter): |
+ self.master_filter = master_filter |
+ |
+ gatekeeper = {'test_master1': {}, 'test_master2': {}, 'filtered_master': {}} |
+ self.assertEqual( |
+ set(gatekeeper_extras.fetch_master_urls(gatekeeper, |
+ MockArgs('filtered'))), |
+ set(['test_master1', 'test_master2'])) |
+ self.assertEqual( |
+ set(gatekeeper_extras.fetch_master_urls(gatekeeper, MockArgs(None))), |
+ set(['test_master1', 'test_master2', 'filtered_master'])) |
+ |
+ def test_would_close_tree_uses_asterisk_builder_config(self): |
+ self.assertFalse(gatekeeper_extras.would_close_tree( |
+ [{'*': {'close_tree': False}}], None, 'test_step')) |
+ self.assertTrue(gatekeeper_extras.would_close_tree( |
+ [{'*': {'closing_steps': set(['*'])}}], None, 'test_step')) |
+ |
+ def test_would_close_tree_respects_close_tree_flag_field(self): |
+ self.assertFalse(gatekeeper_extras.would_close_tree( |
+ [{'test_builder': {'close_tree': False}}], 'test_builder', 'test_step')) |
+ |
+ def test_would_close_tree_respects_excluded_steps_field(self): |
+ self.assertFalse(gatekeeper_extras.would_close_tree( |
+ [{'test_builder': {'excluded_steps': ['test_step']}}], |
+ 'test_builder', 'test_step')) |
+ |
+ def test_would_close_tree_only_considers_closing_steps(self): |
+ self.assertFalse(gatekeeper_extras.would_close_tree( |
+ [{'test_builder': {'closing_steps': set(['other_step'])}}], |
+ 'test_builder', 'test_step')) |
+ |
+ def test_would_close_tree_assumes_no_closing_steps_when_missing_field(self): |
+ self.assertFalse(gatekeeper_extras.would_close_tree( |
+ [{'test_builder': {}}], 'test_builder', 'test_step')) |
+ |
+ def test_would_close_tree_returns_true_if_step_is_in_closing_steps(self): |
+ self.assertTrue(gatekeeper_extras.would_close_tree( |
+ [{'test_builder': {'closing_steps': set(['test_step'])}}], |
+ 'test_builder', 'test_step')) |
+ |
+ def test_would_close_tree_returns_true_if_all_steps_are_closing(self): |
+ self.assertTrue(gatekeeper_extras.would_close_tree( |
+ [{'test_builder': {'closing_steps': set(['*'])}}], |
+ 'test_builder', 'test_step')) |
+ |
+ |
+if __name__ == '__main__': |
+ unittest.main() |