diff --git a/application/datamodel.application.xml b/application/datamodel.application.xml index d43320574..89b9e3c30 100644 --- a/application/datamodel.application.xml +++ b/application/datamodel.application.xml @@ -500,7 +500,7 @@ A document has been downloaded from the GUI - ormDocument + Document diff --git a/core/config.class.inc.php b/core/config.class.inc.php index 83fcaf382..ac0d4ccc0 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -129,6 +129,22 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], + 'event_service.debug.filter_events' => [ + 'type' => 'array', + 'description' => 'Filter Event Service debug by events', + 'default' => '', + 'value' => '', + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], + 'event_service.debug.filter_sources' => [ + 'type' => 'array', + 'description' => 'Filter Event Service debug by event sources', + 'default' => '', + 'value' => '', + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], 'app_env_label' => [ 'type' => 'string', 'description' => 'Label displayed to describe the current application environment, defaults to the environment name (e.g. "production")', diff --git a/pages/schema.php b/pages/schema.php index 53a19c647..f7d50ab2e 100644 --- a/pages/schema.php +++ b/pages/schema.php @@ -335,9 +335,9 @@ function DisplayEvents(WebPage $oPage, $sClass) continue; } } - $sListener = $sListenerClass.'->'.$aListener['callback'][1].'(Combodo\iTop\Service\EventData $oEventData)'; + $sListener = $sListenerClass.'->'.$aListener['callback'][1].'(\Combodo\iTop\Service\EventData $oEventData)'; } else { - $sListener = $aListener['callback'][0].'::'.$aListener['callback'][1].'(Combodo\iTop\Service\EventData $oEventData)'; + $sListener = $aListener['callback'][0].'::'.$aListener['callback'][1].'(\Combodo\iTop\Service\EventData $oEventData)'; } $aRows[] = [ 'event' => $aListener['event'], diff --git a/test/service/EventTest.php b/test/service/EventTest.php index 432a59b2a..0a871a724 100644 --- a/test/service/EventTest.php +++ b/test/service/EventTest.php @@ -25,7 +25,7 @@ class EventTest extends ItopTestCase private static $iEventCalls; - protected function setUp() + protected function setUp(): void { parent::setUp(); self::$iEventCalls = 0; @@ -61,6 +61,7 @@ class EventTest extends ItopTestCase self::IncrementCallCount(); }); $this->debug("Registered $sId"); + EventService::RegisterEvent('event', [], 'test'); EventService::FireEvent(new EventData('event')); $this->assertEquals(1, self::$iEventCalls); } @@ -74,6 +75,7 @@ class EventTest extends ItopTestCase */ public function testMethodCallbackFunction(callable $callback) { + EventService::RegisterEvent('event', [], 'test'); $sId = EventService::RegisterListener('event', $callback); $this->debug("Registered $sId"); EventService::FireEvent(new EventData('event')); @@ -95,6 +97,7 @@ class EventTest extends ItopTestCase public function testBrokenCallback() { + EventService::RegisterEvent('event_a', [], 'test'); $oReceiver = new TestEventReceiver(); EventService::RegisterListener('event_a', array($oReceiver, 'BrokenCallback')); @@ -104,6 +107,7 @@ class EventTest extends ItopTestCase public function testRemovedCallback() { + EventService::RegisterEvent('event_a', [], 'test'); $oReceiver = new TestEventReceiver(); EventService::RegisterListener('event_a', array($oReceiver, 'OnEvent1')); @@ -116,6 +120,8 @@ class EventTest extends ItopTestCase public function testMultiEvent() { + EventService::RegisterEvent('event_a', [], 'test'); + EventService::RegisterEvent('event_b', [], 'test'); $oReceiver = new TestEventReceiver(); EventService::RegisterListener('event_a', array($oReceiver, 'OnEvent1')); EventService::RegisterListener('event_a', array($oReceiver, 'OnEvent2')); @@ -135,6 +141,7 @@ class EventTest extends ItopTestCase public function testMultiSameEvent() { + EventService::RegisterEvent('event1', [], 'test'); $oReceiver = new TestEventReceiver(); $sId = EventService::RegisterListener('event1', array($oReceiver, 'OnEvent1')); $this->debug("Registered $sId"); @@ -151,6 +158,7 @@ class EventTest extends ItopTestCase public function testData() { + EventService::RegisterEvent('event1', [], 'test'); $oReceiver = new TestEventReceiver(); EventService::RegisterListener('event1', [$oReceiver, 'OnEventWithData'], ''); EventService::RegisterListener('event1', [$oReceiver, 'OnEventWithData'], ''); @@ -160,6 +168,8 @@ class EventTest extends ItopTestCase public function testPriority() { + EventService::RegisterEvent('event1', [], 'test'); + EventService::RegisterEvent('event2', [], 'test'); $oReceiver = new TestEventReceiver(); EventService::RegisterListener('event1', [$oReceiver, 'OnEvent1'], '', null, null, 0); EventService::RegisterListener('event1', [$oReceiver, 'OnEvent2'], '', null, null, 1); @@ -173,8 +183,19 @@ class EventTest extends ItopTestCase $this->assertEquals(4, self::$iEventCalls); } + public function testNoRegisterEvent() + { + try { + EventService::FireEvent(new EventData('event1')); + $this->assertTrue(false); + } catch (\CoreException $e) { + $this->assertTrue(true); + } + } + public function testContext() { + EventService::RegisterEvent('event1', [], 'test'); $oReceiver = new TestEventReceiver(); EventService::RegisterListener('event1', [$oReceiver, 'OnEvent1'], '', null, null, 0); EventService::RegisterListener('event1', [$oReceiver, 'OnEvent2'], '', null, 'test_context', 1); @@ -187,6 +208,8 @@ class EventTest extends ItopTestCase public function testEventSource() { + EventService::RegisterEvent('event1', [], 'test'); + EventService::RegisterEvent('event2', [], 'test'); $oReceiver = new TestEventReceiver(); EventService::RegisterListener('event1', [$oReceiver, 'OnEvent1'], 'A', null, null, 0); EventService::RegisterListener('event1', [$oReceiver, 'OnEvent2'], 'A', null, null, 1); @@ -212,6 +235,8 @@ class EventTest extends ItopTestCase public function testUnRegisterEvent() { + EventService::RegisterEvent('event1', [], 'test'); + EventService::RegisterEvent('event2', [], 'test'); $oReceiver = new TestEventReceiver(); $sId = EventService::RegisterListener('event1', array($oReceiver, 'OnEvent1')); $this->debug("Registered $sId"); @@ -239,6 +264,8 @@ class EventTest extends ItopTestCase public function testUnRegisterAll() { + EventService::RegisterEvent('event1', [], 'test'); + EventService::RegisterEvent('event2', [], 'test'); $oReceiver = new TestEventReceiver(); $sId = EventService::RegisterListener('event1', array($oReceiver, 'OnEvent1')); $this->debug("Registered $sId"); @@ -266,6 +293,8 @@ class EventTest extends ItopTestCase public function testUnRegisterCallback() { + EventService::RegisterEvent('event1', [], 'test'); + EventService::RegisterEvent('event2', [], 'test'); $oReceiver = new TestEventReceiver(); $sIdToRemove = EventService::RegisterListener('event1', array($oReceiver, 'OnEvent1')); $this->debug("Registered $sIdToRemove"); @@ -296,157 +325,6 @@ class EventTest extends ItopTestCase self::$iEventCalls++; } - /** - * @dataProvider ReentranceProvider - */ - public function testReentrance($aClasses, $iEventCount) - { - foreach ($aClasses as $sName => $aClass) { - new TestReentrance($sName, $aClass['prio'], $aClass['events'], $aClass['permanent_protection']); - } - EventService::FireEvent(new EventData('event1', 'main')); - $this->assertEquals($iEventCount, self::$iEventCalls); - } - - public function ReentranceProvider() - { - return [ - '1 class' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => true, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => false]]], - ], - 'iEventCount' => 1, - ], - '2 classes - 1' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => true, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => false]]], - ], - 'iEventCount' => 3, - ], - '2 classes - 2' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => true, 'event2' => true], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => false]]], - ], - 'iEventCount' => 4, - ], - '2 classes - 3' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => true], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => true]]], - ], - 'iEventCount' => 3, - ], - '3 classes - 1' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => true], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => true], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class C' => ['prio' => 20, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => true], 'listener2' => ['event1' => false, 'event2' => true]]], - ], - 'iEventCount' => 11, - ], - '3 classes - non permanent' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => false, 'events' => ['listener1' => ['event1' => false, 'event2' => true], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => true], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class C' => ['prio' => 20, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => false, 'event2' => true], 'listener2' => ['event1' => false, 'event2' => true]]], - ], - 'iEventCount' => 12, - ], - '2 classes - loop' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => true, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => true, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => false]]], - ], - 'iEventCount' => 4, - ], - '2 classes - loop2' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => false, 'events' => ['listener1' => ['event1' => true, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['event1' => true, 'event2' => false], 'listener2' => ['event1' => false, 'event2' => false]]], - ], - 'iEventCount' => 5, - ], - ]; - } - - /** - * @dataProvider ReentranceCRUDProvider - */ - public function testReentranceCRUD($aClasses, $iEventCount) - { - foreach ($aClasses as $sName => $aClass) { - new TestReentranceCRUD($sName, $aClass['prio'], $aClass['events'], $aClass['permanent_protection']); - } - $oObject = new TestCRUDObject(); - $oObject->DBInsert('main'); - $this->assertEquals($iEventCount, self::$iEventCalls); - } - - public function ReentranceCRUDProvider() - { - return [ - '1 class' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => false]]], - ], - 'iEventCount' => 1, - ], - '2 classes - 1' => [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => false]]], - ], - 'iEventCount' => 2, - ], - '2 classes - 2'=> [ - 'aClasses' => [ - 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => true], 'listener2' => ['update' => false]]], - 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => false]]], - ], - 'iEventCount' => 4, - ], -// '2 classes - 3' => [ -// 'aClasses' => [ -// 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => true], 'listener2' => ['update' => false]]], -// 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => true]]], -// ], -// 'iEventCount' => 3, -// ], -// '3 classes - 1' => [ -// 'aClasses' => [ -// 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => true], 'listener2' => ['update' => false]]], -// 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => true], 'listener2' => ['update' => false]]], -// 'Class C' => ['prio' => 20, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => true], 'listener2' => ['update' => true]]], -// ], -// 'iEventCount' => 11, -// ], -// '3 classes - non permanent' => [ -// 'aClasses' => [ -// 'Class A' => ['prio' => 0, 'permanent_protection' => false, 'events' => ['listener1' => ['update' => true], 'listener2' => ['update' => false]]], -// 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => true], 'listener2' => ['update' => false]]], -// 'Class C' => ['prio' => 20, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => true], 'listener2' => ['update' => true]]], -// ], -// 'iEventCount' => 12, -// ], -// '2 classes - loop' => [ -// 'aClasses' => [ -// 'Class A' => ['prio' => 0, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => false]]], -// 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => false]]], -// ], -// 'iEventCount' => 4, -// ], -// '2 classes - loop2' => [ -// 'aClasses' => [ -// 'Class A' => ['prio' => 0, 'permanent_protection' => false, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => false]]], -// 'Class B' => ['prio' => 10, 'permanent_protection' => true, 'events' => ['listener1' => ['update' => false], 'listener2' => ['update' => false]]], -// ], -// 'iEventCount' => 5, -// ], - ]; - } - /** * static version of the debug to be accessible from other objects * @@ -701,18 +579,14 @@ class TestReentrance extends TestClassesWithDebug if ($this->aSendEvent['listener1']['event1']) { $this->Debug("$sName: Fire event 'event1'"); self::$iIndent1 += 1; - EventService::EnableReentranceProtection($this->sEvent1, $this->bPermanentProtection); EventService::FireEvent(new EventData('event1', $sName)); - EventService::DisableReentranceProtection($this->sEvent1); self::$iIndent1 -= 1; $this->Debug("$sName: End of event 'event1'"); } if ($this->aSendEvent['listener1']['event2']) { $this->Debug("$sName: Fire event 'event2'"); self::$iIndent2 += 1; - EventService::EnableReentranceProtection($this->sEvent2, $this->bPermanentProtection); EventService::FireEvent(new EventData('event2', $sName)); - EventService::DisableReentranceProtection($this->sEvent2); self::$iIndent2 -= 1; $this->Debug("$sName: End of event 'event2'"); } @@ -729,18 +603,14 @@ class TestReentrance extends TestClassesWithDebug if ($this->aSendEvent['listener2']['event1']) { $this->Debug("$sName: Fire event 'event1'"); self::$iIndent1 += 1; - EventService::EnableReentranceProtection($this->sEvent1, $this->bPermanentProtection); EventService::FireEvent(new EventData('event1', $sName)); - EventService::DisableReentranceProtection($this->sEvent1); self::$iIndent1 -= 1; $this->Debug("$sName: End of event 'event1'"); } if ($this->aSendEvent['listener2']['event2']) { $this->Debug("$sName: Fire event 'event2'"); self::$iIndent2 += 1; - EventService::EnableReentranceProtection($this->sEvent2, $this->bPermanentProtection); EventService::FireEvent(new EventData('event2', $sName)); - EventService::DisableReentranceProtection($this->sEvent2); self::$iIndent2 -= 1; $this->Debug("$sName: End of event 'event2'"); }