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

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

Issue 2427413005: Improve slave-preference function (Closed)
Patch Set: Presubmit Created 4 years, 1 month 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
« no previous file with comments | « scripts/master/master_utils.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 def remove_slave(slaves, name):
18 for i, s in enumerate(slaves):
19 if s.name == name:
20 del(slaves[i])
21 break
22 else:
23 assert False, 'slave %s does not exist' % name
24
25
17 class MasterUtilsTest(unittest.TestCase): 26 class MasterUtilsTest(unittest.TestCase):
18 27
19 def testPartition(self): 28 def testPartition(self):
20 partitions = master_utils.Partition([(1, 'a'), 29 partitions = master_utils.Partition([(1, 'a'),
21 (2, 'b'), 30 (2, 'b'),
22 (3, 'c'), 31 (3, 'c'),
23 ], 2) 32 ], 2)
24 self.assertEquals([['a', 'b'], ['c']], partitions) 33 self.assertEquals([['a', 'b'], ['c']], partitions)
25 34
26 35
(...skipping 22 matching lines...) Expand all
49 MockSlaveBuilder('slave1', {'preferred_builder': 'builder1'}), 58 MockSlaveBuilder('slave1', {'preferred_builder': 'builder1'}),
50 MockSlaveBuilder('slave2', {'preferred_builder': 'builder2'}), 59 MockSlaveBuilder('slave2', {'preferred_builder': 'builder2'}),
51 MockSlaveBuilder('slave3', {'preferred_builder': 'builder3'}), 60 MockSlaveBuilder('slave3', {'preferred_builder': 'builder3'}),
52 ] 61 ]
53 62
54 f = master_utils.PreferredBuilderNextSlaveFunc() 63 f = master_utils.PreferredBuilderNextSlaveFunc()
55 self.assertEqual('slave1', f(builder1, slaves).name) 64 self.assertEqual('slave1', f(builder1, slaves).name)
56 self.assertEqual('slave2', f(builder2, slaves).name) 65 self.assertEqual('slave2', f(builder2, slaves).name)
57 self.assertEqual('slave3', f(builder3, slaves).name) 66 self.assertEqual('slave3', f(builder3, slaves).name)
58 67
59 # Remove slave 3. 68 remove_slave(slaves, 'slave3')
60 del slaves[2]
61 69
62 # When there is no slave that matches preferred_builder, 70 # When there is no slave that matches preferred_builder,
63 # any slave builder might be chosen. 71 # any slave builder might be chosen.
64 self.assertTrue(f(builder3, slaves).name in ['slave1', 'slave2']) 72 self.assertTrue(f(builder3, slaves).name in ['slave1', 'slave2'])
65 73
66 def testNextSlaveEmpty(self): 74 def testNextSlaveEmpty(self):
67 builder = MockBuilder('builder') 75 builder = MockBuilder('builder')
68 slaves = [] 76 slaves = []
69 77
70 f = master_utils.PreferredBuilderNextSlaveFunc() 78 f = master_utils.PreferredBuilderNextSlaveFunc()
71 79
72 self.assertIsNone(f(builder, slaves)) 80 self.assertIsNone(f(builder, slaves))
73 81
82 def testNextSlaveNG(self):
83 builder1 = MockBuilder('builder1')
84 builder2 = MockBuilder('builder2')
85 builder3 = MockBuilder('builder3')
86
87 slaves = [
88 MockSlaveBuilder('s1', {'preferred_builder': 'builder1'}),
89 MockSlaveBuilder('s2', {'preferred_builder': 'builder2'}),
90 MockSlaveBuilder('s3', {'preferred_builder': 'builder3'}),
91 MockSlaveBuilder('s4', {'preferred_builder': 'builder1'}),
92 MockSlaveBuilder('s5', {'preferred_builder': 'builder2'}),
93 MockSlaveBuilder('s6', {'preferred_builder': 'builder3'}),
94 # Fall-over pool with no preference.
95 MockSlaveBuilder('s7', {'preferred_builder': None}),
96 MockSlaveBuilder('s8', {'preferred_builder': None}),
97 ]
98
99 # Mock random.choice on function return for determinism and to check the
100 # full choice range.
101 f = lambda builder, slaves: (
102 set([s.name for s in master_utils.PreferredBuilderNextSlaveFuncNG(
103 choice=list)(builder, slaves)]))
104
105 self.assertEqual(set(['s1', 's4']), f(builder1, slaves))
106 self.assertEqual(set(['s2', 's5']), f(builder2, slaves))
107 self.assertEqual(set(['s3', 's6']), f(builder3, slaves))
108
109 remove_slave(slaves, 's3')
110
111 # There's still a preferred slave left.
112 self.assertEqual(set(['s6']), f(builder3, slaves))
113
114 remove_slave(slaves, 's6')
115
116 # No preferred slave. Slave will be choosen from fall-over pool (i.e.
117 # slaves with no preference).
118 self.assertEqual(set(['s7', 's8']), f(builder3, slaves))
119
120 # We could also test the case where two slave sets are equal (e.g.
121 # removing now 7 and 8), but that'd require making the most_common
122 # method deterministic.
123
124 remove_slave(slaves, 's1')
125 remove_slave(slaves, 's7')
126 remove_slave(slaves, 's8')
127
128 # Now only slaves preferring builder2 have most capacity.
129 self.assertEqual(set(['s2', 's5']), f(builder3, slaves))
130
131 def testNextSlaveEmptyNG(self):
132 builder = MockBuilder('builder')
133 slaves = []
134
135 f = master_utils.PreferredBuilderNextSlaveFuncNG(choice=list)
136
137 self.assertIsNone(f(builder, slaves))
74 138
75 if __name__ == '__main__': 139 if __name__ == '__main__':
76 unittest.main() 140 unittest.main()
OLDNEW
« no previous file with comments | « scripts/master/master_utils.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698