test_scatterEventTracing.py (4385B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\script\sys\test\test_scatterEventTracing.py 2 import mock 3 import uthread 4 import bluepy 5 from carbon.common.script.sys.serviceConst import SERVICE_RUNNING 6 from testsuites.testcases import ROLE_SERVER, ServerTestCase, init_prefs 7 init_prefs(ROLE_SERVER) 8 from carbon.common.script.sys import serviceManager 9 from carbon.common.script.sys.service import Service 10 EVENT = 'OnScatterEventTracingCoverage' 11 FLAG = bluepy.STACKLESS_TRACING_ENABLED_KEY 12 _SERVICE_MANAGER = None 13 14 def _service_manager(): 15 global _SERVICE_MANAGER 16 if _SERVICE_MANAGER is None: 17 _SERVICE_MANAGER = serviceManager.ServiceManager() 18 return _SERVICE_MANAGER 19 20 21 class _Listener(object): 22 23 def __init__(self): 24 self.calls = [] 25 26 def OnScatterEventTracingCoverage(self, *args, **keywords): 27 self.calls.append((args, keywords)) 28 29 30 class _Observer(_Listener): 31 __notifyevents__ = [EVENT] 32 33 34 class _ServiceListener(Service, _Listener): 35 __guid__ = 'svc.scatterEventTracingCoverage' 36 __notifyevents__ = [EVENT] 37 38 def __init__(self): 39 Service.__init__(self) 40 _Listener.__init__(self) 41 self.state = SERVICE_RUNNING 42 43 44 class _ScatterTestCase(ServerTestCase): 45 listener_class = None 46 47 def setUp(self): 48 super(_ScatterTestCase, self).setUp() 49 self.serviceManager = _service_manager() 50 self.listener = self.listener_class() 51 self.serviceManager.RegisterNotify(self.listener) 52 53 def tearDown(self): 54 self.serviceManager.UnregisterNotify(self.listener) 55 super(_ScatterTestCase, self).tearDown() 56 57 58 class ObserverPathTests(_ScatterTestCase): 59 listener_class = _Observer 60 61 def _worker_keywords(self, keywords = None): 62 with mock.patch.object(uthread, 'workerWithoutTheStars') as worker: 63 self.serviceManager.ScatterEventWithoutTheStars(EVENT, (), keywords) 64 self.assertEqual(1, worker.call_count, 'the observer should have been dispatched once') 65 return worker.call_args[0][3] 66 67 def test_declines_tracing_by_default(self): 68 self.assertFalse(self._worker_keywords()[FLAG]) 69 70 def test_traces_when_the_sender_opts_in(self): 71 self.assertTrue(self._worker_keywords({FLAG: True})[FLAG]) 72 73 def test_the_caller_keywords_are_not_mutated(self): 74 keywords = {'alpha': 1} 75 passed = self._worker_keywords(keywords) 76 self.assertEqual({'alpha': 1}, keywords, "the caller's dict was modified in place") 77 self.assertEqual(1, passed['alpha'], "the listener's own keywords were dropped") 78 79 def test_the_listener_never_sees_the_flag(self): 80 with mock.patch.object(bluepy, 'TaskletExt') as taskletExt: 81 self.serviceManager.ScatterEventWithoutTheStars(EVENT, (7,), {'alpha': 1}) 82 self.assertFalse(taskletExt.call_args[1]['stackless_tracing_enabled']) 83 applied = taskletExt.return_value.call_args 84 self.assertEqual((7,), applied[0]) 85 self.assertEqual({'alpha': 1}, applied[1]) 86 87 88 class ServicePathTests(_ScatterTestCase): 89 listener_class = _ServiceListener 90 91 def _worker_call(self, keywords = None): 92 with mock.patch.object(uthread, 'worker') as worker: 93 self.serviceManager.ScatterEventWithoutTheStars(EVENT, (), keywords) 94 self.assertEqual(1, worker.call_count, 'the service should have been dispatched once') 95 return worker.call_args 96 97 def test_declines_tracing_by_default(self): 98 self.assertFalse(self._worker_call()[1]['stackless_tracing_enabled']) 99 100 def test_traces_when_the_sender_opts_in(self): 101 self.assertTrue(self._worker_call({FLAG: True})[1]['stackless_tracing_enabled']) 102 103 def test_the_flag_stays_out_of_the_listener_keywords(self): 104 listenerKeywords = self._worker_call({'alpha': 1})[0][6] 105 self.assertNotIn(FLAG, listenerKeywords) 106 self.assertEqual({'alpha': 1}, listenerKeywords) 107 108 def test_the_listener_never_sees_the_flag(self): 109 with mock.patch.object(bluepy, 'TaskletExt') as taskletExt: 110 self.serviceManager.ScatterEventWithoutTheStars(EVENT, (7,), {'alpha': 1}) 111 self.assertFalse(taskletExt.call_args[1]['stackless_tracing_enabled']) 112 self.serviceManager.MollycoddledUthread(*taskletExt.return_value.call_args[0]) 113 self.assertEqual([((7,), {'alpha': 1})], self.listener.calls)