blob: d959f2d95dbf7e0d5cd2c3b0426885ff22b97db9 [file] [log] [blame]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001#
2# BitBake Tests for the Event implementation (event.py)
3#
4# Copyright (C) 2017 Intel Corporation
5#
Brad Bishopc342db32019-05-15 21:57:59 -04006# SPDX-License-Identifier: GPL-2.0-only
Brad Bishopd7bf8c12018-02-25 22:55:05 -05007#
8
Andrew Geisslerc9f78652020-09-18 14:11:35 -05009import collections
Brad Bishopd7bf8c12018-02-25 22:55:05 -050010import importlib
Andrew Geisslerc9f78652020-09-18 14:11:35 -050011import logging
12import pickle
Brad Bishopd7bf8c12018-02-25 22:55:05 -050013import threading
14import time
Andrew Geisslerc9f78652020-09-18 14:11:35 -050015import unittest
Brad Bishopd7bf8c12018-02-25 22:55:05 -050016from unittest.mock import Mock
17from unittest.mock import call
Andrew Geisslerc9f78652020-09-18 14:11:35 -050018
19import bb
20import bb.event
Brad Bishop316dfdd2018-06-25 12:45:53 -040021from bb.msg import BBLogFormatter
Brad Bishopd7bf8c12018-02-25 22:55:05 -050022
23
Brad Bishop316dfdd2018-06-25 12:45:53 -040024class EventQueueStubBase(object):
25 """ Base class for EventQueueStub classes """
26 def __init__(self):
27 self.event_calls = []
28 return
29
30 def _store_event_data_string(self, event):
31 if isinstance(event, logging.LogRecord):
32 formatter = BBLogFormatter("%(levelname)s: %(message)s")
33 self.event_calls.append(formatter.format(event))
34 else:
35 self.event_calls.append(bb.event.getName(event))
36 return
37
38
39class EventQueueStub(EventQueueStubBase):
Brad Bishopd7bf8c12018-02-25 22:55:05 -050040 """ Class used as specification for UI event handler queue stub objects """
41 def __init__(self):
Brad Bishop316dfdd2018-06-25 12:45:53 -040042 super(EventQueueStub, self).__init__()
Brad Bishopd7bf8c12018-02-25 22:55:05 -050043
44 def send(self, event):
Brad Bishop316dfdd2018-06-25 12:45:53 -040045 super(EventQueueStub, self)._store_event_data_string(event)
Brad Bishopd7bf8c12018-02-25 22:55:05 -050046
47
Brad Bishop316dfdd2018-06-25 12:45:53 -040048class PickleEventQueueStub(EventQueueStubBase):
Brad Bishopd7bf8c12018-02-25 22:55:05 -050049 """ Class used as specification for UI event handler queue stub objects
50 with sendpickle method """
51 def __init__(self):
Brad Bishop316dfdd2018-06-25 12:45:53 -040052 super(PickleEventQueueStub, self).__init__()
Brad Bishopd7bf8c12018-02-25 22:55:05 -050053
54 def sendpickle(self, pickled_event):
Brad Bishop316dfdd2018-06-25 12:45:53 -040055 event = pickle.loads(pickled_event)
56 super(PickleEventQueueStub, self)._store_event_data_string(event)
Brad Bishopd7bf8c12018-02-25 22:55:05 -050057
58
Brad Bishop316dfdd2018-06-25 12:45:53 -040059class UIClientStub(object):
Brad Bishopd7bf8c12018-02-25 22:55:05 -050060 """ Class used as specification for UI event handler stub objects """
61 def __init__(self):
62 self.event = None
63
64
65class EventHandlingTest(unittest.TestCase):
66 """ Event handling test class """
Brad Bishop316dfdd2018-06-25 12:45:53 -040067
Brad Bishopd7bf8c12018-02-25 22:55:05 -050068
69 def setUp(self):
70 self._test_process = Mock()
71 ui_client1 = UIClientStub()
72 ui_client2 = UIClientStub()
73 self._test_ui1 = Mock(wraps=ui_client1)
74 self._test_ui2 = Mock(wraps=ui_client2)
75 importlib.reload(bb.event)
76
77 def _create_test_handlers(self):
78 """ Method used to create a test handler ordered dictionary """
Andrew Geisslerc9f78652020-09-18 14:11:35 -050079 test_handlers = collections.OrderedDict()
Brad Bishopd7bf8c12018-02-25 22:55:05 -050080 test_handlers["handler1"] = self._test_process.handler1
81 test_handlers["handler2"] = self._test_process.handler2
82 return test_handlers
83
84 def test_class_handlers(self):
85 """ Test set_class_handlers and get_class_handlers methods """
86 test_handlers = self._create_test_handlers()
87 bb.event.set_class_handlers(test_handlers)
88 self.assertEqual(test_handlers,
89 bb.event.get_class_handlers())
90
91 def test_handlers(self):
92 """ Test set_handlers and get_handlers """
93 test_handlers = self._create_test_handlers()
94 bb.event.set_handlers(test_handlers)
95 self.assertEqual(test_handlers,
96 bb.event.get_handlers())
97
98 def test_clean_class_handlers(self):
99 """ Test clean_class_handlers method """
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500100 cleanDict = collections.OrderedDict()
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500101 self.assertEqual(cleanDict,
102 bb.event.clean_class_handlers())
103
104 def test_register(self):
105 """ Test register method for class handlers """
106 result = bb.event.register("handler", self._test_process.handler)
107 self.assertEqual(result, bb.event.Registered)
108 handlers_dict = bb.event.get_class_handlers()
109 self.assertIn("handler", handlers_dict)
110
111 def test_already_registered(self):
112 """ Test detection of an already registed class handler """
113 bb.event.register("handler", self._test_process.handler)
114 handlers_dict = bb.event.get_class_handlers()
115 self.assertIn("handler", handlers_dict)
116 result = bb.event.register("handler", self._test_process.handler)
117 self.assertEqual(result, bb.event.AlreadyRegistered)
118
119 def test_register_from_string(self):
120 """ Test register method receiving code in string """
121 result = bb.event.register("string_handler", " return True")
122 self.assertEqual(result, bb.event.Registered)
123 handlers_dict = bb.event.get_class_handlers()
124 self.assertIn("string_handler", handlers_dict)
125
126 def test_register_with_mask(self):
127 """ Test register method with event masking """
128 mask = ["bb.event.OperationStarted",
129 "bb.event.OperationCompleted"]
130 result = bb.event.register("event_handler",
131 self._test_process.event_handler,
132 mask)
133 self.assertEqual(result, bb.event.Registered)
134 handlers_dict = bb.event.get_class_handlers()
135 self.assertIn("event_handler", handlers_dict)
136
137 def test_remove(self):
138 """ Test remove method for class handlers """
139 test_handlers = self._create_test_handlers()
140 bb.event.set_class_handlers(test_handlers)
141 count = len(test_handlers)
142 bb.event.remove("handler1", None)
143 test_handlers = bb.event.get_class_handlers()
144 self.assertEqual(len(test_handlers), count - 1)
145 with self.assertRaises(KeyError):
146 bb.event.remove("handler1", None)
147
148 def test_execute_handler(self):
149 """ Test execute_handler method for class handlers """
150 mask = ["bb.event.OperationProgress"]
151 result = bb.event.register("event_handler",
152 self._test_process.event_handler,
153 mask)
154 self.assertEqual(result, bb.event.Registered)
155 event = bb.event.OperationProgress(current=10, total=100)
156 bb.event.execute_handler("event_handler",
157 self._test_process.event_handler,
158 event,
159 None)
Andrew Geissler517393d2023-01-13 08:55:19 -0600160 self._test_process.event_handler.assert_called_once_with(event, None)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500161
162 def test_fire_class_handlers(self):
163 """ Test fire_class_handlers method """
164 mask = ["bb.event.OperationStarted"]
165 result = bb.event.register("event_handler1",
166 self._test_process.event_handler1,
167 mask)
168 self.assertEqual(result, bb.event.Registered)
169 result = bb.event.register("event_handler2",
170 self._test_process.event_handler2,
171 "*")
172 self.assertEqual(result, bb.event.Registered)
173 event1 = bb.event.OperationStarted()
174 event2 = bb.event.OperationCompleted(total=123)
175 bb.event.fire_class_handlers(event1, None)
176 bb.event.fire_class_handlers(event2, None)
177 bb.event.fire_class_handlers(event2, None)
Andrew Geissler517393d2023-01-13 08:55:19 -0600178 expected_event_handler1 = [call(event1, None)]
179 expected_event_handler2 = [call(event1, None),
180 call(event2, None),
181 call(event2, None)]
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500182 self.assertEqual(self._test_process.event_handler1.call_args_list,
183 expected_event_handler1)
184 self.assertEqual(self._test_process.event_handler2.call_args_list,
185 expected_event_handler2)
186
Brad Bishop316dfdd2018-06-25 12:45:53 -0400187 def test_class_handler_filters(self):
188 """ Test filters for class handlers """
189 mask = ["bb.event.OperationStarted"]
190 result = bb.event.register("event_handler1",
191 self._test_process.event_handler1,
192 mask)
193 self.assertEqual(result, bb.event.Registered)
194 result = bb.event.register("event_handler2",
195 self._test_process.event_handler2,
196 "*")
197 self.assertEqual(result, bb.event.Registered)
198 bb.event.set_eventfilter(
199 lambda name, handler, event, d :
200 name == 'event_handler2' and
201 bb.event.getName(event) == "OperationStarted")
202 event1 = bb.event.OperationStarted()
203 event2 = bb.event.OperationCompleted(total=123)
204 bb.event.fire_class_handlers(event1, None)
205 bb.event.fire_class_handlers(event2, None)
206 bb.event.fire_class_handlers(event2, None)
207 expected_event_handler1 = []
Andrew Geissler517393d2023-01-13 08:55:19 -0600208 expected_event_handler2 = [call(event1, None)]
Brad Bishop316dfdd2018-06-25 12:45:53 -0400209 self.assertEqual(self._test_process.event_handler1.call_args_list,
210 expected_event_handler1)
211 self.assertEqual(self._test_process.event_handler2.call_args_list,
212 expected_event_handler2)
213
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500214 def test_change_handler_event_mapping(self):
215 """ Test changing the event mapping for class handlers """
216 event1 = bb.event.OperationStarted()
217 event2 = bb.event.OperationCompleted(total=123)
218
219 # register handler for all events
220 result = bb.event.register("event_handler1",
221 self._test_process.event_handler1,
222 "*")
223 self.assertEqual(result, bb.event.Registered)
224 bb.event.fire_class_handlers(event1, None)
225 bb.event.fire_class_handlers(event2, None)
Andrew Geissler517393d2023-01-13 08:55:19 -0600226 expected = [call(event1, None), call(event2, None)]
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500227 self.assertEqual(self._test_process.event_handler1.call_args_list,
228 expected)
229
230 # unregister handler and register it only for OperationStarted
Brad Bishop316dfdd2018-06-25 12:45:53 -0400231 bb.event.remove("event_handler1",
232 self._test_process.event_handler1)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500233 mask = ["bb.event.OperationStarted"]
234 result = bb.event.register("event_handler1",
235 self._test_process.event_handler1,
236 mask)
237 self.assertEqual(result, bb.event.Registered)
238 bb.event.fire_class_handlers(event1, None)
239 bb.event.fire_class_handlers(event2, None)
Andrew Geissler517393d2023-01-13 08:55:19 -0600240 expected = [call(event1, None), call(event2, None), call(event1, None)]
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500241 self.assertEqual(self._test_process.event_handler1.call_args_list,
242 expected)
243
244 # unregister handler and register it only for OperationCompleted
Brad Bishop316dfdd2018-06-25 12:45:53 -0400245 bb.event.remove("event_handler1",
246 self._test_process.event_handler1)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500247 mask = ["bb.event.OperationCompleted"]
248 result = bb.event.register("event_handler1",
249 self._test_process.event_handler1,
250 mask)
251 self.assertEqual(result, bb.event.Registered)
252 bb.event.fire_class_handlers(event1, None)
253 bb.event.fire_class_handlers(event2, None)
Andrew Geissler517393d2023-01-13 08:55:19 -0600254 expected = [call(event1,None), call(event2, None), call(event1, None), call(event2, None)]
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500255 self.assertEqual(self._test_process.event_handler1.call_args_list,
256 expected)
257
258 def test_register_UIHhandler(self):
259 """ Test register_UIHhandler method """
260 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
261 self.assertEqual(result, 1)
262
263 def test_UIHhandler_already_registered(self):
264 """ Test registering an UIHhandler already existing """
265 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
266 self.assertEqual(result, 1)
267 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
268 self.assertEqual(result, 2)
269
270 def test_unregister_UIHhandler(self):
271 """ Test unregister_UIHhandler method """
272 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
273 self.assertEqual(result, 1)
274 result = bb.event.unregister_UIHhandler(1)
275 self.assertIs(result, None)
276
277 def test_fire_ui_handlers(self):
278 """ Test fire_ui_handlers method """
279 self._test_ui1.event = Mock(spec_set=EventQueueStub)
280 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
281 self.assertEqual(result, 1)
282 self._test_ui2.event = Mock(spec_set=PickleEventQueueStub)
283 result = bb.event.register_UIHhandler(self._test_ui2, mainui=True)
284 self.assertEqual(result, 2)
285 event1 = bb.event.OperationStarted()
286 bb.event.fire_ui_handlers(event1, None)
287 expected = [call(event1)]
288 self.assertEqual(self._test_ui1.event.send.call_args_list,
289 expected)
290 expected = [call(pickle.dumps(event1))]
291 self.assertEqual(self._test_ui2.event.sendpickle.call_args_list,
292 expected)
293
Brad Bishop316dfdd2018-06-25 12:45:53 -0400294 def test_ui_handler_mask_filter(self):
295 """ Test filters for UI handlers """
296 mask = ["bb.event.OperationStarted"]
297 debug_domains = {}
298 self._test_ui1.event = Mock(spec_set=EventQueueStub)
299 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
300 bb.event.set_UIHmask(result, logging.INFO, debug_domains, mask)
301 self._test_ui2.event = Mock(spec_set=PickleEventQueueStub)
302 result = bb.event.register_UIHhandler(self._test_ui2, mainui=True)
303 bb.event.set_UIHmask(result, logging.INFO, debug_domains, mask)
304
305 event1 = bb.event.OperationStarted()
306 event2 = bb.event.OperationCompleted(total=1)
307
308 bb.event.fire_ui_handlers(event1, None)
309 bb.event.fire_ui_handlers(event2, None)
310 expected = [call(event1)]
311 self.assertEqual(self._test_ui1.event.send.call_args_list,
312 expected)
313 expected = [call(pickle.dumps(event1))]
314 self.assertEqual(self._test_ui2.event.sendpickle.call_args_list,
315 expected)
316
317 def test_ui_handler_log_filter(self):
318 """ Test log filters for UI handlers """
319 mask = ["*"]
320 debug_domains = {'BitBake.Foo': logging.WARNING}
321
322 self._test_ui1.event = EventQueueStub()
323 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
324 bb.event.set_UIHmask(result, logging.ERROR, debug_domains, mask)
325 self._test_ui2.event = PickleEventQueueStub()
326 result = bb.event.register_UIHhandler(self._test_ui2, mainui=True)
327 bb.event.set_UIHmask(result, logging.ERROR, debug_domains, mask)
328
329 event1 = bb.event.OperationStarted()
330 bb.event.fire_ui_handlers(event1, None) # All events match
331
332 event_log_handler = bb.event.LogHandler()
333 logger = logging.getLogger("BitBake")
334 logger.addHandler(event_log_handler)
335 logger1 = logging.getLogger("BitBake.Foo")
336 logger1.warning("Test warning LogRecord1") # Matches debug_domains level
337 logger1.info("Test info LogRecord") # Filtered out
338 logger2 = logging.getLogger("BitBake.Bar")
339 logger2.error("Test error LogRecord") # Matches filter base level
340 logger2.warning("Test warning LogRecord2") # Filtered out
341 logger.removeHandler(event_log_handler)
342
343 expected = ['OperationStarted',
344 'WARNING: Test warning LogRecord1',
345 'ERROR: Test error LogRecord']
346 self.assertEqual(self._test_ui1.event.event_calls, expected)
347 self.assertEqual(self._test_ui2.event.event_calls, expected)
348
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500349 def test_fire(self):
350 """ Test fire method used to trigger class and ui event handlers """
351 mask = ["bb.event.ConfigParsed"]
352 result = bb.event.register("event_handler1",
353 self._test_process.event_handler1,
354 mask)
355
356 self._test_ui1.event = Mock(spec_set=EventQueueStub)
357 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
358 self.assertEqual(result, 1)
359
360 event1 = bb.event.ConfigParsed()
361 bb.event.fire(event1, None)
Andrew Geissler517393d2023-01-13 08:55:19 -0600362 expected = [call(event1, None)]
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500363 self.assertEqual(self._test_process.event_handler1.call_args_list,
364 expected)
Andrew Geissler517393d2023-01-13 08:55:19 -0600365 expected = [call(event1)]
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500366 self.assertEqual(self._test_ui1.event.send.call_args_list,
367 expected)
368
369 def test_fire_from_worker(self):
370 """ Test fire_from_worker method """
371 self._test_ui1.event = Mock(spec_set=EventQueueStub)
372 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
373 self.assertEqual(result, 1)
374 event1 = bb.event.ConfigParsed()
375 bb.event.fire_from_worker(event1, None)
376 expected = [call(event1)]
377 self.assertEqual(self._test_ui1.event.send.call_args_list,
378 expected)
379
Brad Bishop316dfdd2018-06-25 12:45:53 -0400380 def test_worker_fire(self):
381 """ Test the triggering of bb.event.worker_fire callback """
382 bb.event.worker_fire = Mock()
383 event = bb.event.Event()
384 bb.event.fire(event, None)
385 expected = [call(event, None)]
386 self.assertEqual(bb.event.worker_fire.call_args_list, expected)
387
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500388 def test_print_ui_queue(self):
389 """ Test print_ui_queue method """
390 event1 = bb.event.OperationStarted()
391 event2 = bb.event.OperationCompleted(total=123)
392 bb.event.fire(event1, None)
393 bb.event.fire(event2, None)
Brad Bishop316dfdd2018-06-25 12:45:53 -0400394 event_log_handler = bb.event.LogHandler()
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500395 logger = logging.getLogger("BitBake")
Brad Bishop316dfdd2018-06-25 12:45:53 -0400396 logger.addHandler(event_log_handler)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500397 logger.info("Test info LogRecord")
398 logger.warning("Test warning LogRecord")
399 with self.assertLogs("BitBake", level="INFO") as cm:
400 bb.event.print_ui_queue()
Brad Bishop316dfdd2018-06-25 12:45:53 -0400401 logger.removeHandler(event_log_handler)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500402 self.assertEqual(cm.output,
403 ["INFO:BitBake:Test info LogRecord",
404 "WARNING:BitBake:Test warning LogRecord"])
405
406 def _set_threadlock_test_mockups(self):
407 """ Create UI event handler mockups used in enable and disable
408 threadlock tests """
409 def ui1_event_send(event):
410 if type(event) is bb.event.ConfigParsed:
411 self._threadlock_test_calls.append("w1_ui1")
412 if type(event) is bb.event.OperationStarted:
413 self._threadlock_test_calls.append("w2_ui1")
414 time.sleep(2)
415
416 def ui2_event_send(event):
417 if type(event) is bb.event.ConfigParsed:
418 self._threadlock_test_calls.append("w1_ui2")
419 if type(event) is bb.event.OperationStarted:
420 self._threadlock_test_calls.append("w2_ui2")
421 time.sleep(2)
422
423 self._threadlock_test_calls = []
424 self._test_ui1.event = EventQueueStub()
425 self._test_ui1.event.send = ui1_event_send
426 result = bb.event.register_UIHhandler(self._test_ui1, mainui=True)
427 self.assertEqual(result, 1)
428 self._test_ui2.event = EventQueueStub()
429 self._test_ui2.event.send = ui2_event_send
430 result = bb.event.register_UIHhandler(self._test_ui2, mainui=True)
431 self.assertEqual(result, 2)
432
433 def _set_and_run_threadlock_test_workers(self):
434 """ Create and run the workers used to trigger events in enable and
435 disable threadlock tests """
436 worker1 = threading.Thread(target=self._thread_lock_test_worker1)
437 worker2 = threading.Thread(target=self._thread_lock_test_worker2)
438 worker1.start()
439 time.sleep(1)
440 worker2.start()
441 worker1.join()
442 worker2.join()
443
444 def _thread_lock_test_worker1(self):
445 """ First worker used to fire the ConfigParsed event for enable and
446 disable threadlocks tests """
447 bb.event.fire(bb.event.ConfigParsed(), None)
448
449 def _thread_lock_test_worker2(self):
450 """ Second worker used to fire the OperationStarted event for enable
451 and disable threadlocks tests """
452 bb.event.fire(bb.event.OperationStarted(), None)
453
Andrew Geissler517393d2023-01-13 08:55:19 -0600454 def test_event_threadlock(self):
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500455 """ Test enable_threadlock method """
456 self._set_threadlock_test_mockups()
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500457 self._set_and_run_threadlock_test_workers()
458 # Calls to UI handlers should be in order as all the registered
459 # handlers for the event coming from the first worker should be
460 # called before processing the event from the second worker.
461 self.assertEqual(self._threadlock_test_calls,
462 ["w1_ui1", "w1_ui2", "w2_ui1", "w2_ui2"])
463
Brad Bishop316dfdd2018-06-25 12:45:53 -0400464class EventClassesTest(unittest.TestCase):
465 """ Event classes test class """
466
467 _worker_pid = 54321
468
469 def setUp(self):
470 bb.event.worker_pid = EventClassesTest._worker_pid
471
472 def test_Event(self):
473 """ Test the Event base class """
474 event = bb.event.Event()
475 self.assertEqual(event.pid, EventClassesTest._worker_pid)
476
477 def test_HeartbeatEvent(self):
478 """ Test the HeartbeatEvent class """
479 time = 10
480 event = bb.event.HeartbeatEvent(time)
481 self.assertEqual(event.time, time)
482 self.assertEqual(event.pid, EventClassesTest._worker_pid)
483
484 def test_OperationStarted(self):
485 """ Test OperationStarted event class """
486 msg = "Foo Bar"
487 event = bb.event.OperationStarted(msg)
488 self.assertEqual(event.msg, msg)
489 self.assertEqual(event.pid, EventClassesTest._worker_pid)
490
491 def test_OperationCompleted(self):
492 """ Test OperationCompleted event class """
493 msg = "Foo Bar"
494 total = 123
495 event = bb.event.OperationCompleted(total, msg)
496 self.assertEqual(event.msg, msg)
497 self.assertEqual(event.total, total)
498 self.assertEqual(event.pid, EventClassesTest._worker_pid)
499
500 def test_OperationProgress(self):
501 """ Test OperationProgress event class """
502 msg = "Foo Bar"
503 total = 123
504 current = 111
505 event = bb.event.OperationProgress(current, total, msg)
506 self.assertEqual(event.msg, msg + ": %s/%s" % (current, total))
507 self.assertEqual(event.pid, EventClassesTest._worker_pid)
508
509 def test_ConfigParsed(self):
510 """ Test the ConfigParsed class """
511 event = bb.event.ConfigParsed()
512 self.assertEqual(event.pid, EventClassesTest._worker_pid)
513
514 def test_MultiConfigParsed(self):
515 """ Test MultiConfigParsed event class """
516 mcdata = {"foobar": "Foo Bar"}
517 event = bb.event.MultiConfigParsed(mcdata)
518 self.assertEqual(event.mcdata, mcdata)
519 self.assertEqual(event.pid, EventClassesTest._worker_pid)
520
521 def test_RecipeEvent(self):
522 """ Test RecipeEvent event base class """
523 callback = lambda a: 2 * a
524 event = bb.event.RecipeEvent(callback)
525 self.assertEqual(event.fn(1), callback(1))
526 self.assertEqual(event.pid, EventClassesTest._worker_pid)
527
528 def test_RecipePreFinalise(self):
529 """ Test RecipePreFinalise event class """
530 callback = lambda a: 2 * a
531 event = bb.event.RecipePreFinalise(callback)
532 self.assertEqual(event.fn(1), callback(1))
533 self.assertEqual(event.pid, EventClassesTest._worker_pid)
534
535 def test_RecipeTaskPreProcess(self):
536 """ Test RecipeTaskPreProcess event class """
537 callback = lambda a: 2 * a
538 tasklist = [("foobar", callback)]
539 event = bb.event.RecipeTaskPreProcess(callback, tasklist)
540 self.assertEqual(event.fn(1), callback(1))
541 self.assertEqual(event.tasklist, tasklist)
542 self.assertEqual(event.pid, EventClassesTest._worker_pid)
543
544 def test_RecipeParsed(self):
545 """ Test RecipeParsed event base class """
546 callback = lambda a: 2 * a
547 event = bb.event.RecipeParsed(callback)
548 self.assertEqual(event.fn(1), callback(1))
549 self.assertEqual(event.pid, EventClassesTest._worker_pid)
550
Brad Bishop316dfdd2018-06-25 12:45:53 -0400551 def test_BuildBase(self):
552 """ Test base class for bitbake build events """
553 name = "foo"
554 pkgs = ["bar"]
555 failures = 123
556 event = bb.event.BuildBase(name, pkgs, failures)
557 self.assertEqual(event.name, name)
558 self.assertEqual(event.pkgs, pkgs)
559 self.assertEqual(event.getFailures(), failures)
560 name = event.name = "bar"
561 pkgs = event.pkgs = ["foo"]
562 self.assertEqual(event.name, name)
563 self.assertEqual(event.pkgs, pkgs)
564 self.assertEqual(event.getFailures(), failures)
565 self.assertEqual(event.pid, EventClassesTest._worker_pid)
566
567 def test_BuildInit(self):
568 """ Test class for bitbake build invocation events """
569 event = bb.event.BuildInit()
570 self.assertEqual(event.name, None)
571 self.assertEqual(event.pkgs, [])
572 self.assertEqual(event.getFailures(), 0)
573 name = event.name = "bar"
574 pkgs = event.pkgs = ["foo"]
575 self.assertEqual(event.name, name)
576 self.assertEqual(event.pkgs, pkgs)
577 self.assertEqual(event.getFailures(), 0)
578 self.assertEqual(event.pid, EventClassesTest._worker_pid)
579
580 def test_BuildStarted(self):
581 """ Test class for build started events """
582 name = "foo"
583 pkgs = ["bar"]
584 failures = 123
585 event = bb.event.BuildStarted(name, pkgs, failures)
586 self.assertEqual(event.name, name)
587 self.assertEqual(event.pkgs, pkgs)
588 self.assertEqual(event.getFailures(), failures)
589 self.assertEqual(event.msg, "Building Started")
590 name = event.name = "bar"
591 pkgs = event.pkgs = ["foo"]
592 msg = event.msg = "foobar"
593 self.assertEqual(event.name, name)
594 self.assertEqual(event.pkgs, pkgs)
595 self.assertEqual(event.getFailures(), failures)
596 self.assertEqual(event.msg, msg)
597 self.assertEqual(event.pid, EventClassesTest._worker_pid)
598
599 def test_BuildCompleted(self):
600 """ Test class for build completed events """
601 total = 1000
602 name = "foo"
603 pkgs = ["bar"]
604 failures = 123
605 interrupted = 1
606 event = bb.event.BuildCompleted(total, name, pkgs, failures,
607 interrupted)
608 self.assertEqual(event.name, name)
609 self.assertEqual(event.pkgs, pkgs)
610 self.assertEqual(event.getFailures(), failures)
611 self.assertEqual(event.msg, "Building Failed")
612 event2 = bb.event.BuildCompleted(total, name, pkgs)
613 self.assertEqual(event2.name, name)
614 self.assertEqual(event2.pkgs, pkgs)
615 self.assertEqual(event2.getFailures(), 0)
616 self.assertEqual(event2.msg, "Building Succeeded")
617 self.assertEqual(event2.pid, EventClassesTest._worker_pid)
618
619 def test_DiskFull(self):
620 """ Test DiskFull event class """
621 dev = "/dev/foo"
622 type = "ext4"
623 freespace = "104M"
624 mountpoint = "/"
625 event = bb.event.DiskFull(dev, type, freespace, mountpoint)
626 self.assertEqual(event.pid, EventClassesTest._worker_pid)
627
628 def test_MonitorDiskEvent(self):
629 """ Test MonitorDiskEvent class """
630 available_bytes = 10000000
631 free_bytes = 90000000
632 total_bytes = 1000000000
633 du = bb.event.DiskUsageSample(available_bytes, free_bytes,
634 total_bytes)
635 event = bb.event.MonitorDiskEvent(du)
636 self.assertEqual(event.disk_usage.available_bytes, available_bytes)
637 self.assertEqual(event.disk_usage.free_bytes, free_bytes)
638 self.assertEqual(event.disk_usage.total_bytes, total_bytes)
639 self.assertEqual(event.pid, EventClassesTest._worker_pid)
640
641 def test_NoProvider(self):
642 """ Test NoProvider event class """
643 item = "foobar"
644 event1 = bb.event.NoProvider(item)
645 self.assertEqual(event1.getItem(), item)
646 self.assertEqual(event1.isRuntime(), False)
647 self.assertEqual(str(event1), "Nothing PROVIDES 'foobar'")
648 runtime = True
649 dependees = ["foo", "bar"]
650 reasons = None
651 close_matches = ["foibar", "footbar"]
652 event2 = bb.event.NoProvider(item, runtime, dependees, reasons,
653 close_matches)
654 self.assertEqual(event2.isRuntime(), True)
655 expected = ("Nothing RPROVIDES 'foobar' (but foo, bar RDEPENDS"
656 " on or otherwise requires it). Close matches:\n"
657 " foibar\n"
658 " footbar")
659 self.assertEqual(str(event2), expected)
660 reasons = ["Item does not exist on database"]
661 close_matches = ["foibar", "footbar"]
662 event3 = bb.event.NoProvider(item, runtime, dependees, reasons,
663 close_matches)
664 expected = ("Nothing RPROVIDES 'foobar' (but foo, bar RDEPENDS"
665 " on or otherwise requires it)\n"
666 "Item does not exist on database")
667 self.assertEqual(str(event3), expected)
668 self.assertEqual(event3.pid, EventClassesTest._worker_pid)
669
670 def test_MultipleProviders(self):
671 """ Test MultipleProviders event class """
672 item = "foobar"
673 candidates = ["foobarv1", "foobars"]
674 event1 = bb.event.MultipleProviders(item, candidates)
675 self.assertEqual(event1.isRuntime(), False)
676 self.assertEqual(event1.getItem(), item)
677 self.assertEqual(event1.getCandidates(), candidates)
678 expected = ("Multiple providers are available for foobar (foobarv1,"
679 " foobars)\n"
680 "Consider defining a PREFERRED_PROVIDER entry to match "
681 "foobar")
682 self.assertEqual(str(event1), expected)
683 runtime = True
684 event2 = bb.event.MultipleProviders(item, candidates, runtime)
685 self.assertEqual(event2.isRuntime(), runtime)
686 expected = ("Multiple providers are available for runtime foobar "
687 "(foobarv1, foobars)\n"
688 "Consider defining a PREFERRED_RPROVIDER entry to match "
689 "foobar")
690 self.assertEqual(str(event2), expected)
691 self.assertEqual(event2.pid, EventClassesTest._worker_pid)
692
693 def test_ParseStarted(self):
694 """ Test ParseStarted event class """
695 total = 123
696 event = bb.event.ParseStarted(total)
697 self.assertEqual(event.msg, "Recipe parsing Started")
698 self.assertEqual(event.total, total)
699 self.assertEqual(event.pid, EventClassesTest._worker_pid)
700
701 def test_ParseCompleted(self):
702 """ Test ParseCompleted event class """
703 cached = 10
704 parsed = 13
705 skipped = 7
706 virtuals = 2
707 masked = 1
708 errors = 0
709 total = 23
710 event = bb.event.ParseCompleted(cached, parsed, skipped, masked,
711 virtuals, errors, total)
712 self.assertEqual(event.msg, "Recipe parsing Completed")
713 expected = [cached, parsed, skipped, virtuals, masked, errors,
714 cached + parsed, total]
715 actual = [event.cached, event.parsed, event.skipped, event.virtuals,
716 event.masked, event.errors, event.sofar, event.total]
717 self.assertEqual(str(actual), str(expected))
718 self.assertEqual(event.pid, EventClassesTest._worker_pid)
719
720 def test_ParseProgress(self):
721 """ Test ParseProgress event class """
722 current = 10
723 total = 100
724 event = bb.event.ParseProgress(current, total)
725 self.assertEqual(event.msg,
726 "Recipe parsing" + ": %s/%s" % (current, total))
727 self.assertEqual(event.pid, EventClassesTest._worker_pid)
728
729 def test_CacheLoadStarted(self):
730 """ Test CacheLoadStarted event class """
731 total = 123
732 event = bb.event.CacheLoadStarted(total)
733 self.assertEqual(event.msg, "Loading cache Started")
734 self.assertEqual(event.total, total)
735 self.assertEqual(event.pid, EventClassesTest._worker_pid)
736
737 def test_CacheLoadProgress(self):
738 """ Test CacheLoadProgress event class """
739 current = 10
740 total = 100
741 event = bb.event.CacheLoadProgress(current, total)
742 self.assertEqual(event.msg,
743 "Loading cache" + ": %s/%s" % (current, total))
744 self.assertEqual(event.pid, EventClassesTest._worker_pid)
745
746 def test_CacheLoadCompleted(self):
747 """ Test CacheLoadCompleted event class """
748 total = 23
749 num_entries = 12
750 event = bb.event.CacheLoadCompleted(total, num_entries)
751 self.assertEqual(event.msg, "Loading cache Completed")
752 expected = [total, num_entries]
753 actual = [event.total, event.num_entries]
754 self.assertEqual(str(actual), str(expected))
755 self.assertEqual(event.pid, EventClassesTest._worker_pid)
756
757 def test_TreeDataPreparationStarted(self):
758 """ Test TreeDataPreparationStarted event class """
759 event = bb.event.TreeDataPreparationStarted()
760 self.assertEqual(event.msg, "Preparing tree data Started")
761 self.assertEqual(event.pid, EventClassesTest._worker_pid)
762
763 def test_TreeDataPreparationProgress(self):
764 """ Test TreeDataPreparationProgress event class """
765 current = 10
766 total = 100
767 event = bb.event.TreeDataPreparationProgress(current, total)
768 self.assertEqual(event.msg,
769 "Preparing tree data" + ": %s/%s" % (current, total))
770 self.assertEqual(event.pid, EventClassesTest._worker_pid)
771
772 def test_TreeDataPreparationCompleted(self):
773 """ Test TreeDataPreparationCompleted event class """
774 total = 23
775 event = bb.event.TreeDataPreparationCompleted(total)
776 self.assertEqual(event.msg, "Preparing tree data Completed")
777 self.assertEqual(event.total, total)
778 self.assertEqual(event.pid, EventClassesTest._worker_pid)
779
780 def test_DepTreeGenerated(self):
781 """ Test DepTreeGenerated event class """
782 depgraph = Mock()
783 event = bb.event.DepTreeGenerated(depgraph)
784 self.assertEqual(event.pid, EventClassesTest._worker_pid)
785
786 def test_TargetsTreeGenerated(self):
787 """ Test TargetsTreeGenerated event class """
788 model = Mock()
789 event = bb.event.TargetsTreeGenerated(model)
790 self.assertEqual(event.pid, EventClassesTest._worker_pid)
791
792 def test_ReachableStamps(self):
793 """ Test ReachableStamps event class """
794 stamps = [Mock(), Mock()]
795 event = bb.event.ReachableStamps(stamps)
796 self.assertEqual(event.stamps, stamps)
797 self.assertEqual(event.pid, EventClassesTest._worker_pid)
798
799 def test_FilesMatchingFound(self):
800 """ Test FilesMatchingFound event class """
801 pattern = "foo.*bar"
802 matches = ["foobar"]
803 event = bb.event.FilesMatchingFound(pattern, matches)
804 self.assertEqual(event.pid, EventClassesTest._worker_pid)
805
806 def test_ConfigFilesFound(self):
807 """ Test ConfigFilesFound event class """
808 variable = "FOO_BAR"
809 values = ["foo", "bar"]
810 event = bb.event.ConfigFilesFound(variable, values)
811 self.assertEqual(event.pid, EventClassesTest._worker_pid)
812
813 def test_ConfigFilePathFound(self):
814 """ Test ConfigFilePathFound event class """
815 path = "/foo/bar"
816 event = bb.event.ConfigFilePathFound(path)
817 self.assertEqual(event.pid, EventClassesTest._worker_pid)
818
819 def test_message_classes(self):
820 """ Test message event classes """
821 msg = "foobar foo bar"
822 event = bb.event.MsgBase(msg)
823 self.assertEqual(event.pid, EventClassesTest._worker_pid)
824 event = bb.event.MsgDebug(msg)
825 self.assertEqual(event.pid, EventClassesTest._worker_pid)
826 event = bb.event.MsgNote(msg)
827 self.assertEqual(event.pid, EventClassesTest._worker_pid)
828 event = bb.event.MsgWarn(msg)
829 self.assertEqual(event.pid, EventClassesTest._worker_pid)
830 event = bb.event.MsgError(msg)
831 self.assertEqual(event.pid, EventClassesTest._worker_pid)
832 event = bb.event.MsgFatal(msg)
833 self.assertEqual(event.pid, EventClassesTest._worker_pid)
834 event = bb.event.MsgPlain(msg)
835 self.assertEqual(event.pid, EventClassesTest._worker_pid)
836
837 def test_LogExecTTY(self):
838 """ Test LogExecTTY event class """
839 msg = "foo bar"
840 prog = "foo.sh"
841 sleep_delay = 10
842 retries = 3
843 event = bb.event.LogExecTTY(msg, prog, sleep_delay, retries)
844 self.assertEqual(event.msg, msg)
845 self.assertEqual(event.prog, prog)
846 self.assertEqual(event.sleep_delay, sleep_delay)
847 self.assertEqual(event.retries, retries)
848 self.assertEqual(event.pid, EventClassesTest._worker_pid)
849
850 def _throw_zero_division_exception(self):
851 a = 1 / 0
852 return
853
854 def _worker_handler(self, event, d):
855 self._returned_event = event
856 return
857
858 def test_LogHandler(self):
859 """ Test LogHandler class """
860 logger = logging.getLogger("TestEventClasses")
861 logger.propagate = False
862 handler = bb.event.LogHandler(logging.INFO)
863 logger.addHandler(handler)
864 bb.event.worker_fire = self._worker_handler
865 try:
866 self._throw_zero_division_exception()
867 except ZeroDivisionError as ex:
868 logger.exception(ex)
869 event = self._returned_event
870 try:
871 pe = pickle.dumps(event)
872 newevent = pickle.loads(pe)
873 except:
874 self.fail('Logged event is not serializable')
875 self.assertEqual(event.taskpid, EventClassesTest._worker_pid)
876
877 def test_MetadataEvent(self):
878 """ Test MetadataEvent class """
879 eventtype = "footype"
880 eventdata = {"foo": "bar"}
881 event = bb.event.MetadataEvent(eventtype, eventdata)
882 self.assertEqual(event.type, eventtype)
883 self.assertEqual(event.pid, EventClassesTest._worker_pid)
884
885 def test_ProcessStarted(self):
886 """ Test ProcessStarted class """
887 processname = "foo"
888 total = 9783128974
889 event = bb.event.ProcessStarted(processname, total)
890 self.assertEqual(event.processname, processname)
891 self.assertEqual(event.total, total)
892 self.assertEqual(event.pid, EventClassesTest._worker_pid)
893
894 def test_ProcessProgress(self):
895 """ Test ProcessProgress class """
896 processname = "foo"
897 progress = 243224
898 event = bb.event.ProcessProgress(processname, progress)
899 self.assertEqual(event.processname, processname)
900 self.assertEqual(event.progress, progress)
901 self.assertEqual(event.pid, EventClassesTest._worker_pid)
902
903 def test_ProcessFinished(self):
904 """ Test ProcessFinished class """
905 processname = "foo"
906 total = 1242342344
907 event = bb.event.ProcessFinished(processname)
908 self.assertEqual(event.processname, processname)
909 self.assertEqual(event.pid, EventClassesTest._worker_pid)
910
911 def test_SanityCheck(self):
912 """ Test SanityCheck class """
913 event1 = bb.event.SanityCheck()
914 self.assertEqual(event1.generateevents, True)
915 self.assertEqual(event1.pid, EventClassesTest._worker_pid)
916 generateevents = False
917 event2 = bb.event.SanityCheck(generateevents)
918 self.assertEqual(event2.generateevents, generateevents)
919 self.assertEqual(event2.pid, EventClassesTest._worker_pid)
920
921 def test_SanityCheckPassed(self):
922 """ Test SanityCheckPassed class """
923 event = bb.event.SanityCheckPassed()
924 self.assertEqual(event.pid, EventClassesTest._worker_pid)
925
926 def test_SanityCheckFailed(self):
927 """ Test SanityCheckFailed class """
928 msg = "The sanity test failed."
929 event1 = bb.event.SanityCheckFailed(msg)
930 self.assertEqual(event1.pid, EventClassesTest._worker_pid)
931 network_error = True
932 event2 = bb.event.SanityCheckFailed(msg, network_error)
933 self.assertEqual(event2.pid, EventClassesTest._worker_pid)
934
935 def test_network_event_classes(self):
936 """ Test network event classes """
937 event1 = bb.event.NetworkTest()
938 generateevents = False
939 self.assertEqual(event1.pid, EventClassesTest._worker_pid)
940 event2 = bb.event.NetworkTest(generateevents)
941 self.assertEqual(event2.pid, EventClassesTest._worker_pid)
942 event3 = bb.event.NetworkTestPassed()
943 self.assertEqual(event3.pid, EventClassesTest._worker_pid)
944 event4 = bb.event.NetworkTestFailed()
945 self.assertEqual(event4.pid, EventClassesTest._worker_pid)
946
947 def test_FindSigInfoResult(self):
948 """ Test FindSigInfoResult event class """
949 result = [Mock()]
950 event = bb.event.FindSigInfoResult(result)
951 self.assertEqual(event.result, result)
952 self.assertEqual(event.pid, EventClassesTest._worker_pid)