OLD | NEW |
(Empty) | |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 import mock |
| 6 import unittest |
| 7 |
| 8 from infra.tools.builder_alerts import gatekeeper_extras |
| 9 |
| 10 |
| 11 class GatekeeperExtrasTest(unittest.TestCase): |
| 12 def test_excluded_builders(self): |
| 13 self.assertEqual(gatekeeper_extras.excluded_builders([{}]), set()) |
| 14 self.assertEqual(gatekeeper_extras.excluded_builders([{'*': {}}]), set()) |
| 15 self.assertEqual( |
| 16 gatekeeper_extras.excluded_builders( |
| 17 [{'*': { |
| 18 'excluded_builders': set(['test_builder1', 'test_builder2']) |
| 19 }}]), |
| 20 set(['test_builder1', 'test_builder2'])) |
| 21 |
| 22 @mock.patch('infra.tools.builder_alerts.gatekeeper_extras.excluded_builders', |
| 23 lambda config: ['Ignored']) |
| 24 @mock.patch('infra.tools.builder_alerts.gatekeeper_extras.would_close_tree', |
| 25 lambda config, builder, step: True) |
| 26 @mock.patch('infra.tools.builder_alerts.gatekeeper_extras.tree_for_master', |
| 27 lambda master_url, trees_config: 'test-tree') |
| 28 def test_apply_gatekeeper_rules(self): |
| 29 gatekeeper_cfg = {'http://build.chromium.org/p/chromium': {'key': 'value'}} |
| 30 gatekeeper_trees_cfg = {} |
| 31 alerts = [ |
| 32 {'master_url': 'http://build.chromium.org/p/project.without.config', |
| 33 'builder_name': 'Linux', |
| 34 'step_name': 'test_xyz'}, |
| 35 {'master_url': 'http://build.chromium.org/p/chromium', |
| 36 'builder_name': 'Ignored', |
| 37 'step_name': 'bot_update'}, |
| 38 {'master_url': 'http://build.chromium.org/p/chromium', |
| 39 'builder_name': 'Win', |
| 40 'step_name': 'bot_update'} |
| 41 ] |
| 42 |
| 43 filtered_alerts = gatekeeper_extras.apply_gatekeeper_rules( |
| 44 alerts, gatekeeper_cfg, gatekeeper_trees_cfg) |
| 45 |
| 46 self.assertEqual(len(filtered_alerts), 2) |
| 47 self.assertIn({'master_url': 'http://build.chromium.org/p/chromium', |
| 48 'builder_name': 'Win', |
| 49 'step_name': 'bot_update', |
| 50 'would_close_tree': True, |
| 51 'tree': 'test-tree'}, filtered_alerts) |
| 52 self.assertIn( |
| 53 {'master_url': 'http://build.chromium.org/p/project.without.config', |
| 54 'builder_name': 'Linux', |
| 55 'step_name': 'test_xyz'}, |
| 56 filtered_alerts) |
| 57 |
| 58 def test_tree_for_master_returns_tree_name(self): |
| 59 gatekeeper_trees = { |
| 60 "blink": { "masters": [ |
| 61 "https://build.chromium.org/p/chromium.webkit" |
| 62 ]}, |
| 63 "chromium": { "masters": [ |
| 64 "https://build.chromium.org/p/chromium.linux", |
| 65 "https://build.chromium.org/p/chromium.gpu", |
| 66 ]}, |
| 67 "non-closers": { "masters": [ |
| 68 "https://build.chromium.org/p/chromium.lkgr", |
| 69 ]} |
| 70 } |
| 71 |
| 72 self.assertEqual('chromium', gatekeeper_extras.tree_for_master( |
| 73 'https://build.chromium.org/p/chromium.gpu', gatekeeper_trees)) |
| 74 self.assertEqual('blink', gatekeeper_extras.tree_for_master( |
| 75 'https://build.chromium.org/p/chromium.webkit', gatekeeper_trees)) |
| 76 self.assertEqual('non-closers', gatekeeper_extras.tree_for_master( |
| 77 'https://build.chromium.org/p/chromium.lkgr', gatekeeper_trees)) |
| 78 |
| 79 @mock.patch( # pragma: no cover (decorators are run before coverage is loaded) |
| 80 'infra.tools.builder_alerts.buildbot.master_name_from_url', |
| 81 lambda url: 'foo.bar') |
| 82 def test_tree_for_master_falls_back_to_master_name(self): |
| 83 self.assertEqual('foo.bar', gatekeeper_extras.tree_for_master( |
| 84 'https://build.chromium.org/p/foo.bar', {})) |
| 85 |
| 86 def test_fetch_master_urls(self): |
| 87 class MockArgs: |
| 88 def __init__(self, master_filter): |
| 89 self.master_filter = master_filter |
| 90 |
| 91 gatekeeper = {'test_master1': {}, 'test_master2': {}, 'filtered_master': {}} |
| 92 self.assertEqual( |
| 93 set(gatekeeper_extras.fetch_master_urls(gatekeeper, |
| 94 MockArgs('filtered'))), |
| 95 set(['test_master1', 'test_master2'])) |
| 96 self.assertEqual( |
| 97 set(gatekeeper_extras.fetch_master_urls(gatekeeper, MockArgs(None))), |
| 98 set(['test_master1', 'test_master2', 'filtered_master'])) |
| 99 |
| 100 def test_would_close_tree_uses_asterisk_builder_config(self): |
| 101 self.assertFalse(gatekeeper_extras.would_close_tree( |
| 102 [{'*': {'close_tree': False}}], None, 'test_step')) |
| 103 self.assertTrue(gatekeeper_extras.would_close_tree( |
| 104 [{'*': {'closing_steps': set(['*'])}}], None, 'test_step')) |
| 105 |
| 106 def test_would_close_tree_respects_close_tree_flag_field(self): |
| 107 self.assertFalse(gatekeeper_extras.would_close_tree( |
| 108 [{'test_builder': {'close_tree': False}}], 'test_builder', 'test_step')) |
| 109 |
| 110 def test_would_close_tree_respects_excluded_steps_field(self): |
| 111 self.assertFalse(gatekeeper_extras.would_close_tree( |
| 112 [{'test_builder': {'excluded_steps': ['test_step']}}], |
| 113 'test_builder', 'test_step')) |
| 114 |
| 115 def test_would_close_tree_only_considers_closing_steps(self): |
| 116 self.assertFalse(gatekeeper_extras.would_close_tree( |
| 117 [{'test_builder': {'closing_steps': set(['other_step'])}}], |
| 118 'test_builder', 'test_step')) |
| 119 |
| 120 def test_would_close_tree_assumes_no_closing_steps_when_missing_field(self): |
| 121 self.assertFalse(gatekeeper_extras.would_close_tree( |
| 122 [{'test_builder': {}}], 'test_builder', 'test_step')) |
| 123 |
| 124 def test_would_close_tree_returns_true_if_step_is_in_closing_steps(self): |
| 125 self.assertTrue(gatekeeper_extras.would_close_tree( |
| 126 [{'test_builder': {'closing_steps': set(['test_step'])}}], |
| 127 'test_builder', 'test_step')) |
| 128 |
| 129 def test_would_close_tree_returns_true_if_all_steps_are_closing(self): |
| 130 self.assertTrue(gatekeeper_extras.would_close_tree( |
| 131 [{'test_builder': {'closing_steps': set(['*'])}}], |
| 132 'test_builder', 'test_step')) |
| 133 |
| 134 |
| 135 if __name__ == '__main__': |
| 136 unittest.main() |
OLD | NEW |