blob: feae81c25993ffe106602802dd31215ccd128486 [file] [log] [blame]
Xixuan Wu303a5192017-08-29 11:10:42 -07001# 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
7import datetime
8import unittest
9
10import base_event
11import config_reader
12import datastore_client
13import mock
14import task
15import time_converter
16
17from google.appengine.ext import ndb
18from google.appengine.ext import testbed
19
20
21# pylint: disable=unused-argument
22class 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.')
Xixuan Wu5451a662017-10-17 10:57:40 -070033
34 return self.success
Xixuan Wu303a5192017-08-29 11:10:42 -070035# pylint: enable=unused-argument
36
37
38class BaseEventTestCase(unittest.TestCase):
39
40 _KLASS = base_event.BaseEvent
41
42 def setUp(self):
43 mock_utc_now = mock.patch('time_converter.utc_now')
44 self._mock_utc_now = mock_utc_now.start()
45 self.addCleanup(mock_utc_now.stop)
46
47 self.testbed = testbed.Testbed()
48 self.testbed.activate()
49 self.addCleanup(self.testbed.deactivate)
50 self.testbed.init_datastore_v3_stub()
51 self.testbed.init_memcache_stub()
52 ndb.get_context().clear_cache()
53
54 self.config = config_reader.ConfigReader(None)
55
56 def testCreateEventWithAlwaysHandle(self):
57 """Create a base event with always_handle=True."""
58 utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ)
59 event = self._KLASS(
60 config_reader.EventSettings(True, None), utc_now, utc_now)
61
62 self.assertEqual(event.target_exec_utc, utc_now)
63 self.assertEqual(event.last_exec_utc, utc_now)
64 self.assertTrue(event.always_handle)
65 self.assertTrue(event.should_handle)
66
67 def testCreateEventWithoutAlwaysHandle(self):
68 """Create a base event with always_handle=False."""
69 utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ)
70 event = self._KLASS(
71 config_reader.EventSettings(False, None), utc_now, utc_now)
72
73 self.assertEqual(event.target_exec_utc, utc_now)
74 self.assertEqual(event.last_exec_utc, utc_now)
75 self.assertFalse(event.always_handle)
76 self.assertFalse(event.should_handle)
77
78 def testProcessTasks(self):
79 """Test process_tasks() for event."""
80 utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ)
81 event = self._KLASS(
82 config_reader.EventSettings(True, None), utc_now, utc_now)
83 task_list = [FakeTask('test1', True), FakeTask('test2', False)]
84 event.set_task_list(task_list)
85 finished_tasks = event.process_tasks(None, None, None, None)
86 self.assertEqual(len(finished_tasks), 1)
87 self.assertEqual(finished_tasks[0], 'test1')
88
89 def testEventFinish(self):
90 """Test finish() for event."""
91 utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ)
92 last_exec_utc = utc_now - datetime.timedelta(hours=1)
93 last_exec_client = datastore_client.LastExecutionRecordStore()
94 last_exec_client.set_last_execute_time(self._KLASS.KEYWORD, last_exec_utc)
95 event = self._KLASS(
96 config_reader.EventSettings(True, None), last_exec_utc, utc_now)
97
98 self.assertEqual(
99 last_exec_client.get_last_execute_time(self._KLASS.KEYWORD),
100 last_exec_utc)
101
102 event.finish()
103 self.assertEqual(
104 last_exec_client.get_last_execute_time(self._KLASS.KEYWORD),
105 utc_now)
106
107 def testPropertyLaunchControlBranchTargets(self):
108 """Test getter of property launch_control_branch_targets."""
109 utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ)
110 event = self._KLASS(
111 config_reader.EventSettings(True, None), utc_now, utc_now)
112 task_list = [FakeTask('test1', True, 'b1', 't1,t2'),
113 FakeTask('test2', True, 'b2', 't3,t4'),
114 FakeTask('test3', True, 'b1', 't5,t6')]
115 event.set_task_list(task_list)
116 self.assertEqual(event.launch_control_branch_targets,
117 {'b1': ['t1', 't2', 't5', 't6'],
118 'b2': ['t3', 't4']})
Xixuan Wua5a29442017-10-11 11:03:02 -0700119
120 def testGAETestingForShouldHandle(self):
121 """Verify that testing on GAE staging will cause event to handle."""
122 utc_now = datetime.datetime(2017, 8, 1, 4, tzinfo=time_converter.UTC_TZ)
123 with mock.patch('global_config.GAE_TESTING', return_value=True):
124 event = self._KLASS(
125 config_reader.EventSettings(True, None), utc_now, utc_now)
126 self.assertTrue(event.should_handle)