| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # coding: utf-8 | 2 # coding: utf-8 |
| 3 # Copyright 2015 The LUCI Authors. All rights reserved. | 3 # Copyright 2015 The LUCI Authors. All rights reserved. |
| 4 # Use of this source code is governed under the Apache License, Version 2.0 | 4 # Use of this source code is governed under the Apache License, Version 2.0 |
| 5 # that can be found in the LICENSE file. | 5 # that can be found in the LICENSE file. |
| 6 | 6 |
| 7 import base64 | 7 import base64 |
| 8 import datetime | 8 import datetime |
| 9 import logging | 9 import logging |
| 10 import os | 10 import os |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 def test_poll_conflicting_dimensions(self): | 427 def test_poll_conflicting_dimensions(self): |
| 428 params = self.do_handshake() | 428 params = self.do_handshake() |
| 429 self.assertEqual(params['dimensions']['pool'], ['default']) | 429 self.assertEqual(params['dimensions']['pool'], ['default']) |
| 430 | 430 |
| 431 cfg = bot_groups_config.BotGroupConfig( | 431 cfg = bot_groups_config.BotGroupConfig( |
| 432 version='default', | 432 version='default', |
| 433 require_luci_machine_token=False, | 433 require_luci_machine_token=False, |
| 434 require_service_account=None, | 434 require_service_account=None, |
| 435 ip_whitelist=None, | 435 ip_whitelist=None, |
| 436 owners=None, | 436 owners=None, |
| 437 dimensions={u'pool': [u'server-side']}) | 437 dimensions={u'pool': [u'server-side']}, |
| 438 bot_config_script='') |
| 438 self.mock(bot_auth, 'validate_bot_id_and_fetch_config', | 439 self.mock(bot_auth, 'validate_bot_id_and_fetch_config', |
| 439 lambda *args, **kwargs: cfg) | 440 lambda *args, **kwargs: cfg) |
| 440 | 441 |
| 441 actions = [] | 442 actions = [] |
| 442 self.mock(stats, 'add_entry', lambda **kwargs: actions.append(kwargs)) | 443 self.mock(stats, 'add_entry', lambda **kwargs: actions.append(kwargs)) |
| 443 | 444 |
| 444 # Bot sends 'default' pool, but server config defined it as 'server-side'. | 445 # Bot sends 'default' pool, but server config defined it as 'server-side'. |
| 445 response = self.post_json('/swarming/api/v1/bot/poll', params) | 446 response = self.post_json('/swarming/api/v1/bot/poll', params) |
| 446 self.assertTrue(response.pop(u'duration')) | 447 self.assertTrue(response.pop(u'duration')) |
| 447 expected = { | 448 expected = { |
| 448 u'cmd': u'sleep', | 449 u'cmd': u'sleep', |
| 449 u'quarantined': False, | 450 u'quarantined': False, |
| 450 } | 451 } |
| 451 self.assertEqual(expected, response) | 452 self.assertEqual(expected, response) |
| 452 | 453 |
| 453 # 'server-side' was actually used. | 454 # 'server-side' was actually used. |
| 454 self.assertEqual([{ | 455 self.assertEqual([{ |
| 455 'action': 'bot_active', | 456 'action': 'bot_active', |
| 456 'bot_id': u'bot1', | 457 'bot_id': u'bot1', |
| 457 'dimensions': { | 458 'dimensions': { |
| 458 u'id': [u'bot1'], | 459 u'id': [u'bot1'], |
| 459 u'os': [u'Amiga'], | 460 u'os': [u'Amiga'], |
| 460 u'pool': [u'server-side'], | 461 u'pool': [u'server-side'], |
| 461 }, | 462 }, |
| 462 }], actions) | 463 }], actions) |
| 463 | 464 |
| 465 def test_poll_missing_extra_bot_config(self): |
| 466 cfg = bot_groups_config.BotGroupConfig( |
| 467 version='default', |
| 468 require_luci_machine_token=False, |
| 469 require_service_account=None, |
| 470 ip_whitelist=None, |
| 471 owners=None, |
| 472 dimensions={}, |
| 473 bot_config_script='foo.py') |
| 474 self.mock(bot_auth, 'validate_bot_id_and_fetch_config', |
| 475 lambda *args, **kwargs: cfg) |
| 476 self.do_handshake(status=503) |
| 477 |
| 478 def test_poll_extra_bot_config(self): |
| 479 cfg = bot_groups_config.BotGroupConfig( |
| 480 version='default', |
| 481 require_luci_machine_token=False, |
| 482 require_service_account=None, |
| 483 ip_whitelist=None, |
| 484 owners=None, |
| 485 dimensions={}, |
| 486 bot_config_script='foo.py') |
| 487 self.mock(bot_auth, 'validate_bot_id_and_fetch_config', |
| 488 lambda *args, **kwargs: cfg) |
| 489 # Inject the script. |
| 490 def get_self_config(name, store_last_good): |
| 491 self.assertEqual(True, store_last_good) |
| 492 if name == 'scripts/bot_config.py': |
| 493 return None, None |
| 494 self.assertEqual('scripts/foo.py', name) |
| 495 return '1', 'import sys; sys.exit(1)' |
| 496 self.mock(handlers_bot.config.config, 'get_self_config', get_self_config) |
| 497 params = self.do_handshake() |
| 498 self.assertEqual(u'import sys; sys.exit(1)', params['bot_config']) |
| 499 |
| 464 def test_complete_task_isolated(self): | 500 def test_complete_task_isolated(self): |
| 465 # Successfully poll a task. | 501 # Successfully poll a task. |
| 466 self.mock(random, 'getrandbits', lambda _: 0x88) | 502 self.mock(random, 'getrandbits', lambda _: 0x88) |
| 467 now = datetime.datetime(2010, 1, 2, 3, 4, 5) | 503 now = datetime.datetime(2010, 1, 2, 3, 4, 5) |
| 468 self.mock_now(now) | 504 self.mock_now(now) |
| 469 str_now = unicode(now.strftime(DATETIME_FORMAT)) | 505 str_now = unicode(now.strftime(DATETIME_FORMAT)) |
| 470 # A bot polls, gets a task, updates it, completes it. | 506 # A bot polls, gets a task, updates it, completes it. |
| 471 params = self.do_handshake() | 507 params = self.do_handshake() |
| 472 # Enqueue a task. | 508 # Enqueue a task. |
| 473 _, task_id = self.client_create_task_isolated() | 509 _, task_id = self.client_create_task_isolated() |
| (...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1111 self.app.get('/bot_code?tok=%s' % tok, status=200) | 1147 self.app.get('/bot_code?tok=%s' % tok, status=200) |
| 1112 | 1148 |
| 1113 | 1149 |
| 1114 if __name__ == '__main__': | 1150 if __name__ == '__main__': |
| 1115 if '-v' in sys.argv: | 1151 if '-v' in sys.argv: |
| 1116 unittest.TestCase.maxDiff = None | 1152 unittest.TestCase.maxDiff = None |
| 1117 logging.basicConfig( | 1153 logging.basicConfig( |
| 1118 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL, | 1154 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL, |
| 1119 format='%(levelname)-7s %(filename)s:%(lineno)3d %(message)s') | 1155 format='%(levelname)-7s %(filename)s:%(lineno)3d %(message)s') |
| 1120 unittest.main() | 1156 unittest.main() |
| OLD | NEW |