Xixuan Wu | 303a519 | 2017-08-29 11:10:42 -0700 | [diff] [blame] | 1 | # Copyright 2017 The Chromium OS Authors. All rights reserved. |
| 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | """Module for timed_event unittests.""" |
| 6 | |
| 7 | import datetime |
| 8 | import unittest |
| 9 | |
| 10 | import base_event |
| 11 | import config_reader |
| 12 | import datastore_client |
| 13 | import mock |
| 14 | import task |
| 15 | import time_converter |
| 16 | |
| 17 | from google.appengine.ext import ndb |
| 18 | from google.appengine.ext import testbed |
| 19 | |
| 20 | |
| 21 | # pylint: disable=unused-argument |
| 22 | class FakeTask(object): |
| 23 | |
| 24 | def __init__(self, name, success, lc_branches='', lc_targets=''): |
| 25 | self.name = name |
| 26 | self.success = success |
| 27 | self.launch_control_branches = lc_branches.split(',') |
| 28 | self.launch_control_targets = lc_targets.split(',') |
| 29 | |
| 30 | def schedule(self, lc_builds, cros_builds, lab_config, db_client=None): |
| 31 | if not self.success: |
| 32 | raise task.SchedulingError('Failed to run task.') |
| 33 | # pylint: enable=unused-argument |
| 34 | |
| 35 | |
| 36 | class BaseEventTestCase(unittest.TestCase): |
| 37 | |
| 38 | _KLASS = base_event.BaseEvent |
| 39 | |
| 40 | def setUp(self): |
| 41 | mock_utc_now = mock.patch('time_converter.utc_now') |
| 42 | self._mock_utc_now = mock_utc_now.start() |
| 43 | self.addCleanup(mock_utc_now.stop) |
| 44 | |
| 45 | self.testbed = testbed.Testbed() |
| 46 | self.testbed.activate() |
| 47 | self.addCleanup(self.testbed.deactivate) |
| 48 | self.testbed.init_datastore_v3_stub() |
| 49 | self.testbed.init_memcache_stub() |
| 50 | ndb.get_context().clear_cache() |
| 51 | |
| 52 | self.config = config_reader.ConfigReader(None) |
| 53 | |
| 54 | def testCreateEventWithAlwaysHandle(self): |
| 55 | """Create a base event with always_handle=True.""" |
| 56 | utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ) |
| 57 | event = self._KLASS( |
| 58 | config_reader.EventSettings(True, None), utc_now, utc_now) |
| 59 | |
| 60 | self.assertEqual(event.target_exec_utc, utc_now) |
| 61 | self.assertEqual(event.last_exec_utc, utc_now) |
| 62 | self.assertTrue(event.always_handle) |
| 63 | self.assertTrue(event.should_handle) |
| 64 | |
| 65 | def testCreateEventWithoutAlwaysHandle(self): |
| 66 | """Create a base event with always_handle=False.""" |
| 67 | utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ) |
| 68 | event = self._KLASS( |
| 69 | config_reader.EventSettings(False, None), utc_now, utc_now) |
| 70 | |
| 71 | self.assertEqual(event.target_exec_utc, utc_now) |
| 72 | self.assertEqual(event.last_exec_utc, utc_now) |
| 73 | self.assertFalse(event.always_handle) |
| 74 | self.assertFalse(event.should_handle) |
| 75 | |
| 76 | def testProcessTasks(self): |
| 77 | """Test process_tasks() for event.""" |
| 78 | utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ) |
| 79 | event = self._KLASS( |
| 80 | config_reader.EventSettings(True, None), utc_now, utc_now) |
| 81 | task_list = [FakeTask('test1', True), FakeTask('test2', False)] |
| 82 | event.set_task_list(task_list) |
| 83 | finished_tasks = event.process_tasks(None, None, None, None) |
| 84 | self.assertEqual(len(finished_tasks), 1) |
| 85 | self.assertEqual(finished_tasks[0], 'test1') |
| 86 | |
| 87 | def testEventFinish(self): |
| 88 | """Test finish() for event.""" |
| 89 | utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ) |
| 90 | last_exec_utc = utc_now - datetime.timedelta(hours=1) |
| 91 | last_exec_client = datastore_client.LastExecutionRecordStore() |
| 92 | last_exec_client.set_last_execute_time(self._KLASS.KEYWORD, last_exec_utc) |
| 93 | event = self._KLASS( |
| 94 | config_reader.EventSettings(True, None), last_exec_utc, utc_now) |
| 95 | |
| 96 | self.assertEqual( |
| 97 | last_exec_client.get_last_execute_time(self._KLASS.KEYWORD), |
| 98 | last_exec_utc) |
| 99 | |
| 100 | event.finish() |
| 101 | self.assertEqual( |
| 102 | last_exec_client.get_last_execute_time(self._KLASS.KEYWORD), |
| 103 | utc_now) |
| 104 | |
| 105 | def testPropertyLaunchControlBranchTargets(self): |
| 106 | """Test getter of property launch_control_branch_targets.""" |
| 107 | utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ) |
| 108 | event = self._KLASS( |
| 109 | config_reader.EventSettings(True, None), utc_now, utc_now) |
| 110 | task_list = [FakeTask('test1', True, 'b1', 't1,t2'), |
| 111 | FakeTask('test2', True, 'b2', 't3,t4'), |
| 112 | FakeTask('test3', True, 'b1', 't5,t6')] |
| 113 | event.set_task_list(task_list) |
| 114 | self.assertEqual(event.launch_control_branch_targets, |
| 115 | {'b1': ['t1', 't2', 't5', 't6'], |
| 116 | 'b2': ['t3', 't4']}) |
Xixuan Wu | a5a2944 | 2017-10-11 11:03:02 -0700 | [diff] [blame] | 117 | |
| 118 | def testGAETestingForShouldHandle(self): |
| 119 | """Verify that testing on GAE staging will cause event to handle.""" |
| 120 | utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ) |
| 121 | with mock.patch('global_config.GAE_TESTING', return_value=True): |
| 122 | event = self._KLASS( |
| 123 | config_reader.EventSettings(True, None), utc_now, utc_now) |
| 124 | self.assertTrue(event.should_handle) |