Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: scripts/master/unittests/master_utils_test.py

Issue 2427413005: Improve slave-preference function (Closed)
Patch Set: Test readability Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2013 The Chromium Authors. All rights reserved. 2 # Copyright 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Source file for master_utils testcases.""" 6 """Source file for master_utils testcases."""
7 7
8 8
9 import unittest 9 import unittest
10 10
11 import test_env # pylint: disable=W0611,W0403 11 import test_env # pylint: disable=W0611,W0403
12 12
13 from buildbot.process.properties import Properties 13 from buildbot.process.properties import Properties
14 from master import master_utils 14 from master import master_utils
15 15
16 16
17 # Use this instead of random.choice on function return for determinism
18 # and to check the full choice range.
19 def mock_random_choice(iterable):
20 return list(iterable)
tandrii(chromium) 2016/10/21 13:39:45 imo, use lambda x: list(x) in place of actual need
Michael Achenbach 2016/10/21 13:56:24 Done.
21
22
23 def remove_slave(slaves, name):
24 for i, s in enumerate(slaves):
25 if s.name == name:
26 del(slaves[i])
27 break
tandrii(chromium) 2016/10/21 13:39:45 for ... ... else: assert False, 'slave %s does
Michael Achenbach 2016/10/21 13:56:24 Done.
28
29
17 class MasterUtilsTest(unittest.TestCase): 30 class MasterUtilsTest(unittest.TestCase):
18 31
19 def testPartition(self): 32 def testPartition(self):
20 partitions = master_utils.Partition([(1, 'a'), 33 partitions = master_utils.Partition([(1, 'a'),
21 (2, 'b'), 34 (2, 'b'),
22 (3, 'c'), 35 (3, 'c'),
23 ], 2) 36 ], 2)
24 self.assertEquals([['a', 'b'], ['c']], partitions) 37 self.assertEquals([['a', 'b'], ['c']], partitions)
25 38
26 39
(...skipping 23 matching lines...) Expand all
50 MockSlaveBuilder('slave2', {'preferred_builder': 'builder2'}), 63 MockSlaveBuilder('slave2', {'preferred_builder': 'builder2'}),
51 MockSlaveBuilder('slave3', {'preferred_builder': 'builder3'}), 64 MockSlaveBuilder('slave3', {'preferred_builder': 'builder3'}),
52 ] 65 ]
53 66
54 f = master_utils.PreferredBuilderNextSlaveFunc() 67 f = master_utils.PreferredBuilderNextSlaveFunc()
55 self.assertEqual('slave1', f(builder1, slaves).name) 68 self.assertEqual('slave1', f(builder1, slaves).name)
56 self.assertEqual('slave2', f(builder2, slaves).name) 69 self.assertEqual('slave2', f(builder2, slaves).name)
57 self.assertEqual('slave3', f(builder3, slaves).name) 70 self.assertEqual('slave3', f(builder3, slaves).name)
58 71
59 # Remove slave 3. 72 # Remove slave 3.
60 del slaves[2] 73 remove_slave(slaves, 'slave3')
61 74
62 # When there is no slave that matches preferred_builder, 75 # When there is no slave that matches preferred_builder,
63 # any slave builder might be chosen. 76 # any slave builder might be chosen.
64 self.assertTrue(f(builder3, slaves).name in ['slave1', 'slave2']) 77 self.assertTrue(f(builder3, slaves).name in ['slave1', 'slave2'])
65 78
66 def testNextSlaveEmpty(self): 79 def testNextSlaveEmpty(self):
67 builder = MockBuilder('builder') 80 builder = MockBuilder('builder')
68 slaves = [] 81 slaves = []
69 82
70 f = master_utils.PreferredBuilderNextSlaveFunc() 83 f = master_utils.PreferredBuilderNextSlaveFunc()
71 84
72 self.assertIsNone(f(builder, slaves)) 85 self.assertIsNone(f(builder, slaves))
73 86
87 def testNextSlaveNG(self):
88 builder1 = MockBuilder('builder1')
89 builder2 = MockBuilder('builder2')
90 builder3 = MockBuilder('builder3')
91
92 slaves = [
93 MockSlaveBuilder('s1', {'preferred_builder': 'builder1'}),
94 MockSlaveBuilder('s2', {'preferred_builder': 'builder2'}),
95 MockSlaveBuilder('s3', {'preferred_builder': 'builder3'}),
96 MockSlaveBuilder('s4', {'preferred_builder': 'builder1'}),
97 MockSlaveBuilder('s5', {'preferred_builder': 'builder2'}),
98 MockSlaveBuilder('s6', {'preferred_builder': 'builder3'}),
99 # Fall-over pool with no preference.
100 MockSlaveBuilder('s7', {'preferred_builder': None}),
101 MockSlaveBuilder('s8', {'preferred_builder': None}),
102 ]
103
104 f = lambda builder, slaves: (
105 set([s.name for s in master_utils.PreferredBuilderNextSlaveFuncNG(
106 mock_random_choice)(builder, slaves)]))
107
108 self.assertEqual(set(['s1', 's4']), f(builder1, slaves))
109 self.assertEqual(set(['s2', 's5']), f(builder2, slaves))
110 self.assertEqual(set(['s3', 's6']), f(builder3, slaves))
111
112 # Remove slave 3.
tandrii(chromium) 2016/10/21 13:39:45 no need for comment.
Michael Achenbach 2016/10/21 13:56:24 Done.
113 remove_slave(slaves, 's3')
114
115 # There's still a preferred slave left.
116 self.assertEqual(set(['s6']), f(builder3, slaves))
117
118 # Remove slave 6.
tandrii(chromium) 2016/10/21 13:39:45 ditto
Michael Achenbach 2016/10/21 13:56:24 Done.
119 remove_slave(slaves, 's6')
120
121 # No preferred slave. Slave will be choosen from fall-over pool (i.e.
122 # slaves with no preference).
123 self.assertEqual(set(['s7', 's8']), f(builder3, slaves))
124
125 # We could also test the case where two slave sets are equal (e.g.
126 # removing now 7 and 8), but that'd require making the most_common
127 # method deterministic.
128
129 # Remove slaves 1, 7 and 8.
tandrii(chromium) 2016/10/21 13:39:46 ditto
Michael Achenbach 2016/10/21 13:56:24 Done.
130 remove_slave(slaves, 's1')
131 remove_slave(slaves, 's7')
132 remove_slave(slaves, 's8')
133
134 # Now only slaves preferring builder2 have most capacity.
135 self.assertEqual(set(['s2', 's5']), f(builder3, slaves))
136
137 def testNextSlaveEmptyNG(self):
138 builder = MockBuilder('builder')
139 slaves = []
140
141 f = master_utils.PreferredBuilderNextSlaveFuncNG(mock_random_choice)
142
143 self.assertIsNone(f(builder, slaves))
74 144
75 if __name__ == '__main__': 145 if __name__ == '__main__':
76 unittest.main() 146 unittest.main()
OLDNEW
« scripts/master/master_utils.py ('K') | « scripts/master/master_utils.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698