blob: 3a7b7c15602864c06d63d0c2cc1c9b4a410887ce [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.')
33# pylint: enable=unused-argument
34
35
36class 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 Wua5a29442017-10-11 11:03:02 -0700117
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)