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

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

Issue 2427413005: Improve slave-preference function (Closed)
Patch Set: Improve slave preference function 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)
21
22
17 class MasterUtilsTest(unittest.TestCase): 23 class MasterUtilsTest(unittest.TestCase):
18 24
19 def testPartition(self): 25 def testPartition(self):
20 partitions = master_utils.Partition([(1, 'a'), 26 partitions = master_utils.Partition([(1, 'a'),
21 (2, 'b'), 27 (2, 'b'),
22 (3, 'c'), 28 (3, 'c'),
23 ], 2) 29 ], 2)
24 self.assertEquals([['a', 'b'], ['c']], partitions) 30 self.assertEquals([['a', 'b'], ['c']], partitions)
25 31
26 32
(...skipping 12 matching lines...) Expand all
39 self.name = name 45 self.name = name
40 self.slave = MockSlave(name, properties) 46 self.slave = MockSlave(name, properties)
41 47
42 class PreferredBuilderNextSlaveFuncTest(unittest.TestCase): 48 class PreferredBuilderNextSlaveFuncTest(unittest.TestCase):
43 def testNextSlave(self): 49 def testNextSlave(self):
44 builder1 = MockBuilder('builder1') 50 builder1 = MockBuilder('builder1')
45 builder2 = MockBuilder('builder2') 51 builder2 = MockBuilder('builder2')
46 builder3 = MockBuilder('builder3') 52 builder3 = MockBuilder('builder3')
47 53
48 slaves = [ 54 slaves = [
49 MockSlaveBuilder('slave1', {'preferred_builder': 'builder1'}), 55 MockSlaveBuilder('s1', {'preferred_builder': 'builder1'}),
50 MockSlaveBuilder('slave2', {'preferred_builder': 'builder2'}), 56 MockSlaveBuilder('s2', {'preferred_builder': 'builder2'}),
51 MockSlaveBuilder('slave3', {'preferred_builder': 'builder3'}), 57 MockSlaveBuilder('s3', {'preferred_builder': 'builder3'}),
58 MockSlaveBuilder('s4', {'preferred_builder': 'builder1'}),
59 MockSlaveBuilder('s5', {'preferred_builder': 'builder2'}),
60 MockSlaveBuilder('s6', {'preferred_builder': 'builder3'}),
61 # Fall-over pool with no preference.
62 MockSlaveBuilder('s7', {'preferred_builder': None}),
63 MockSlaveBuilder('s8', {'preferred_builder': None}),
52 ] 64 ]
53 65
54 f = master_utils.PreferredBuilderNextSlaveFunc() 66 f = lambda builder, slaves: (
55 self.assertEqual('slave1', f(builder1, slaves).name) 67 set([s.name for s in master_utils.PreferredBuilderNextSlaveFunc(
56 self.assertEqual('slave2', f(builder2, slaves).name) 68 mock_random_choice)(builder, slaves)]))
57 self.assertEqual('slave3', f(builder3, slaves).name) 69 self.assertEqual(set(['s1', 's4']), f(builder1, slaves))
70 self.assertEqual(set(['s2', 's5']), f(builder2, slaves))
71 self.assertEqual(set(['s3', 's6']), f(builder3, slaves))
58 72
59 # Remove slave 3. 73 # Remove slave 3.
60 del slaves[2] 74 del slaves[2]
61 75
62 # When there is no slave that matches preferred_builder, 76 # There's still a preferred slave left.
63 # any slave builder might be chosen. 77 self.assertEqual(set(['s6']), f(builder3, slaves))
64 self.assertTrue(f(builder3, slaves).name in ['slave1', 'slave2']) 78
79 # Remove slave 6.
80 del slaves[4]
tandrii(chromium) 2016/10/21 10:39:17 def remove(slaves): iterate and find and remove
Michael Achenbach 2016/10/21 13:17:43 Done.
81
82 # No preferred slave. Slave will be choosen from fall-over pool (i.e.
83 # slaves with no preference).
84 self.assertEqual(set(['s7', 's8']), f(builder3, slaves))
85
86 # Remove slaves 7 and 8.
87 del slaves[4]
88 del slaves[4]
89
90 # When the fall-over pool is depleted, slaves will be chosen from slave
91 # groups with most capacity (here: all the remaining ones are equal).
92 self.assertEqual(set(['s1', 's2', 's4', 's5']), f(builder3, slaves))
93
94 # Remove slave 1:
95 del slaves[0]
96
97 # Now only slaves preferring builder2 have most capacity.
98 self.assertEqual(set(['s2', 's5']), f(builder3, slaves))
65 99
66 def testNextSlaveEmpty(self): 100 def testNextSlaveEmpty(self):
67 builder = MockBuilder('builder') 101 builder = MockBuilder('builder')
68 slaves = [] 102 slaves = []
69 103
70 f = master_utils.PreferredBuilderNextSlaveFunc() 104 f = master_utils.PreferredBuilderNextSlaveFunc(mock_random_choice)
71 105
72 self.assertIsNone(f(builder, slaves)) 106 self.assertIsNone(f(builder, slaves))
73 107
74 108
75 if __name__ == '__main__': 109 if __name__ == '__main__':
76 unittest.main() 110 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