| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # coding: utf-8 | 2 # coding: utf-8 |
| 3 # Copyright 2013 The LUCI Authors. All rights reserved. | 3 # Copyright 2013 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 datetime | 7 import datetime |
| 8 import itertools | 8 import itertools |
| 9 import json | 9 import json |
| 10 import logging | 10 import logging |
| 11 import os | 11 import os |
| 12 import re | 12 import re |
| 13 import sys | 13 import sys |
| 14 import unittest | 14 import unittest |
| 15 import urllib | 15 import urllib |
| 16 | 16 |
| 17 # Setups environment. | 17 # Setups environment. |
| 18 import test_env_handlers | 18 import test_env_handlers |
| 19 | 19 |
| 20 import webtest | 20 import webtest |
| 21 | 21 |
| 22 from google.appengine.ext import deferred | 22 from google.appengine.ext import deferred |
| 23 | 23 |
| 24 import handlers_frontend | 24 import handlers_frontend |
| 25 from components import template | 25 from components import template |
| 26 from server import bot_code | 26 from server import bot_code |
| 27 from server import bot_management | 27 from server import bot_management |
| 28 | 28 from server import task_result |
| 29 | 29 |
| 30 class AppTestBase(test_env_handlers.AppTestBase): | 30 class AppTestBase(test_env_handlers.AppTestBase): |
| 31 def setUp(self): | 31 def setUp(self): |
| 32 super(AppTestBase, self).setUp() | 32 super(AppTestBase, self).setUp() |
| 33 # By default requests in tests are coming from bot with fake IP. | 33 # By default requests in tests are coming from bot with fake IP. |
| 34 app = handlers_frontend.create_application(True) | 34 app = handlers_frontend.create_application(True) |
| 35 app.router.add(('/_ah/queue/deferred', deferred.TaskHandler)) | 35 app.router.add(('/_ah/queue/deferred', deferred.TaskHandler)) |
| 36 self.app = webtest.TestApp( | 36 self.app = webtest.TestApp( |
| 37 app, | 37 app, |
| 38 extra_environ={ | 38 extra_environ={ |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 | 473 |
| 474 # Only cron job requests can be gets for this handler. | 474 # Only cron job requests can be gets for this handler. |
| 475 response = self.app.get(cron_job_url, status=403) | 475 response = self.app.get(cron_job_url, status=403) |
| 476 self.assertEqual( | 476 self.assertEqual( |
| 477 '403 Forbidden\n\nAccess was denied to this resource.\n\n ' | 477 '403 Forbidden\n\nAccess was denied to this resource.\n\n ' |
| 478 'Only internal cron jobs can do this ', | 478 'Only internal cron jobs can do this ', |
| 479 response.body) | 479 response.body) |
| 480 # The actual number doesn't matter, just make sure they are unqueued. | 480 # The actual number doesn't matter, just make sure they are unqueued. |
| 481 self.execute_tasks() | 481 self.execute_tasks() |
| 482 | 482 |
| 483 | |
| 484 def testCronBotsAggregateTask(self): | 483 def testCronBotsAggregateTask(self): |
| 485 # Tests that the aggregation works | 484 # Tests that the aggregation works |
| 486 now = datetime.datetime(2010, 1, 2, 3, 4, 5) | 485 now = datetime.datetime(2010, 1, 2, 3, 4, 5) |
| 487 self.mock_now(now) | 486 self.mock_now(now) |
| 488 | 487 |
| 489 bot_management.bot_event( | 488 bot_management.bot_event( |
| 490 event_type='bot_connected', bot_id='id1', | 489 event_type='bot_connected', bot_id='id1', |
| 491 external_ip='8.8.4.4', authenticated_as='bot:whitelisted-ip', | 490 external_ip='8.8.4.4', authenticated_as='bot:whitelisted-ip', |
| 492 dimensions={'foo': ['beta'], 'id': ['id1']}, state={'ram': 65}, | 491 dimensions={'foo': ['beta'], 'id': ['id1']}, state={'ram': 65}, |
| 493 version='123456789', quarantined=False, task_id=None, task_name=None) | 492 version='123456789', quarantined=False, task_id=None, task_name=None) |
| 494 bot_management.bot_event( | 493 bot_management.bot_event( |
| 495 event_type='bot_connected', bot_id='id2', | 494 event_type='bot_connected', bot_id='id2', |
| 496 external_ip='8.8.4.4', authenticated_as='bot:whitelisted-ip', | 495 external_ip='8.8.4.4', authenticated_as='bot:whitelisted-ip', |
| 497 dimensions={'foo': ['alpha'], 'id': ['id2']}, state={'ram': 65}, | 496 dimensions={'foo': ['alpha'], 'id': ['id2']}, state={'ram': 65}, |
| 498 version='123456789', quarantined=True, task_id='987', task_name=None) | 497 version='123456789', quarantined=True, task_id='987', task_name=None) |
| 499 | 498 |
| 500 self.app.get('/internal/cron/aggregate_bots_dimensions', | 499 self.app.get('/internal/cron/aggregate_bots_dimensions', |
| 501 headers={'X-AppEngine-Cron': 'true'}, status=200) | 500 headers={'X-AppEngine-Cron': 'true'}, status=200) |
| 502 actual = bot_management.DimensionAggregation.KEY.get() | 501 actual = bot_management.DimensionAggregation.KEY.get() |
| 503 expected = bot_management.DimensionAggregation( | 502 expected = bot_management.DimensionAggregation( |
| 504 key=bot_management.DimensionAggregation.KEY, | 503 key=bot_management.DimensionAggregation.KEY, |
| 505 dimensions=[ | 504 dimensions=[ |
| 506 bot_management.DimensionValues( | 505 bot_management.DimensionValues( |
| 507 dimension='foo', values=['alpha', 'beta']) | 506 dimension='foo', values=['alpha', 'beta']) |
| 508 ], | 507 ], |
| 509 ts=now) | 508 ts=now) |
| 510 self.assertEqual(expected, actual) | 509 self.assertEqual(expected, actual) |
| 511 | 510 |
| 511 def testCronTagsAggregateTask(self): |
| 512 self.set_as_admin() |
| 513 now = datetime.datetime(2011, 1, 2, 3, 4, 5) |
| 514 self.mock_now(now) |
| 515 |
| 516 self.client_create_task_raw(tags=['alpha:beta', 'gamma:delta']) |
| 517 self.client_create_task_raw(tags=['alpha:epsilon', 'zeta:theta']) |
| 518 |
| 519 self.app.get('/internal/cron/aggregate_tasks_tags', |
| 520 headers={'X-AppEngine-Cron': 'true'}, status=200) |
| 521 actual = task_result.TagAggregation.KEY.get() |
| 522 expected = task_result.TagAggregation( |
| 523 key=task_result.TagAggregation.KEY, |
| 524 tags=[ |
| 525 task_result.TagValues(tag='alpha', values=['beta', 'epsilon']), |
| 526 task_result.TagValues(tag='gamma', values=['delta']), |
| 527 task_result.TagValues(tag='os', values=['Amiga']), |
| 528 task_result.TagValues(tag='pool', values=['default']), |
| 529 task_result.TagValues(tag='priority', values=['10']), |
| 530 task_result.TagValues(tag='user', values=['joe@localhost']), |
| 531 task_result.TagValues(tag='zeta', values=['theta']), |
| 532 |
| 533 ], |
| 534 ts=now) |
| 535 self.assertEqual(expected, actual) |
| 536 |
| 512 def testCronTriggerTask(self): | 537 def testCronTriggerTask(self): |
| 513 triggers = ( | 538 triggers = ( |
| 514 '/internal/cron/trigger_cleanup_data', | 539 '/internal/cron/trigger_cleanup_data', |
| 515 ) | 540 ) |
| 516 | 541 |
| 517 for url in triggers: | 542 for url in triggers: |
| 518 response = self.app.get( | 543 response = self.app.get( |
| 519 url, headers={'X-AppEngine-Cron': 'true'}, status=200) | 544 url, headers={'X-AppEngine-Cron': 'true'}, status=200) |
| 520 self.assertEqual('Success.', response.body) | 545 self.assertEqual('Success.', response.body) |
| 521 self.assertEqual(1, self.execute_tasks()) | 546 self.assertEqual(1, self.execute_tasks()) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 541 url, headers={'X-AppEngine-QueueName': 'bogus name'}, status=403) | 566 url, headers={'X-AppEngine-QueueName': 'bogus name'}, status=403) |
| 542 | 567 |
| 543 | 568 |
| 544 if __name__ == '__main__': | 569 if __name__ == '__main__': |
| 545 if '-v' in sys.argv: | 570 if '-v' in sys.argv: |
| 546 unittest.TestCase.maxDiff = None | 571 unittest.TestCase.maxDiff = None |
| 547 logging.basicConfig( | 572 logging.basicConfig( |
| 548 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL, | 573 level=logging.DEBUG if '-v' in sys.argv else logging.CRITICAL, |
| 549 format='%(levelname)-7s %(filename)s:%(lineno)3d %(message)s') | 574 format='%(levelname)-7s %(filename)s:%(lineno)3d %(message)s') |
| 550 unittest.main() | 575 unittest.main() |
| OLD | NEW |