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

Unified 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 side-by-side diff with in-line comments
Download patch
« scripts/master/master_utils.py ('K') | « scripts/master/master_utils.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: scripts/master/unittests/master_utils_test.py
diff --git a/scripts/master/unittests/master_utils_test.py b/scripts/master/unittests/master_utils_test.py
index 6ac5a3031ddb8662898c31bd9b4c43ade68a27df..88fa792c1bec9e8512f2e6f6e2a6c3ffcf6dcca6 100755
--- a/scripts/master/unittests/master_utils_test.py
+++ b/scripts/master/unittests/master_utils_test.py
@@ -14,6 +14,19 @@ from buildbot.process.properties import Properties
from master import master_utils
+# Use this instead of random.choice on function return for determinism
+# and to check the full choice range.
+def mock_random_choice(iterable):
+ 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.
+
+
+def remove_slave(slaves, name):
+ for i, s in enumerate(slaves):
+ if s.name == name:
+ del(slaves[i])
+ 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.
+
+
class MasterUtilsTest(unittest.TestCase):
def testPartition(self):
@@ -57,7 +70,7 @@ class PreferredBuilderNextSlaveFuncTest(unittest.TestCase):
self.assertEqual('slave3', f(builder3, slaves).name)
# Remove slave 3.
- del slaves[2]
+ remove_slave(slaves, 'slave3')
# When there is no slave that matches preferred_builder,
# any slave builder might be chosen.
@@ -71,6 +84,63 @@ class PreferredBuilderNextSlaveFuncTest(unittest.TestCase):
self.assertIsNone(f(builder, slaves))
+ def testNextSlaveNG(self):
+ builder1 = MockBuilder('builder1')
+ builder2 = MockBuilder('builder2')
+ builder3 = MockBuilder('builder3')
+
+ slaves = [
+ MockSlaveBuilder('s1', {'preferred_builder': 'builder1'}),
+ MockSlaveBuilder('s2', {'preferred_builder': 'builder2'}),
+ MockSlaveBuilder('s3', {'preferred_builder': 'builder3'}),
+ MockSlaveBuilder('s4', {'preferred_builder': 'builder1'}),
+ MockSlaveBuilder('s5', {'preferred_builder': 'builder2'}),
+ MockSlaveBuilder('s6', {'preferred_builder': 'builder3'}),
+ # Fall-over pool with no preference.
+ MockSlaveBuilder('s7', {'preferred_builder': None}),
+ MockSlaveBuilder('s8', {'preferred_builder': None}),
+ ]
+
+ f = lambda builder, slaves: (
+ set([s.name for s in master_utils.PreferredBuilderNextSlaveFuncNG(
+ mock_random_choice)(builder, slaves)]))
+
+ self.assertEqual(set(['s1', 's4']), f(builder1, slaves))
+ self.assertEqual(set(['s2', 's5']), f(builder2, slaves))
+ self.assertEqual(set(['s3', 's6']), f(builder3, slaves))
+
+ # Remove slave 3.
tandrii(chromium) 2016/10/21 13:39:45 no need for comment.
Michael Achenbach 2016/10/21 13:56:24 Done.
+ remove_slave(slaves, 's3')
+
+ # There's still a preferred slave left.
+ self.assertEqual(set(['s6']), f(builder3, slaves))
+
+ # Remove slave 6.
tandrii(chromium) 2016/10/21 13:39:45 ditto
Michael Achenbach 2016/10/21 13:56:24 Done.
+ remove_slave(slaves, 's6')
+
+ # No preferred slave. Slave will be choosen from fall-over pool (i.e.
+ # slaves with no preference).
+ self.assertEqual(set(['s7', 's8']), f(builder3, slaves))
+
+ # We could also test the case where two slave sets are equal (e.g.
+ # removing now 7 and 8), but that'd require making the most_common
+ # method deterministic.
+
+ # Remove slaves 1, 7 and 8.
tandrii(chromium) 2016/10/21 13:39:46 ditto
Michael Achenbach 2016/10/21 13:56:24 Done.
+ remove_slave(slaves, 's1')
+ remove_slave(slaves, 's7')
+ remove_slave(slaves, 's8')
+
+ # Now only slaves preferring builder2 have most capacity.
+ self.assertEqual(set(['s2', 's5']), f(builder3, slaves))
+
+ def testNextSlaveEmptyNG(self):
+ builder = MockBuilder('builder')
+ slaves = []
+
+ f = master_utils.PreferredBuilderNextSlaveFuncNG(mock_random_choice)
+
+ self.assertIsNone(f(builder, slaves))
if __name__ == '__main__':
unittest.main()
« 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