From 057d192c529323e56063b27bda639d726b977f5e Mon Sep 17 00:00:00 2001 From: Pete Houston Date: Wed, 26 Sep 2018 11:48:18 +0700 Subject: [PATCH 1/5] Provide error status and event tracking for worker. --- Service/Worker/AbstractWorker.php | 46 ++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/Service/Worker/AbstractWorker.php b/Service/Worker/AbstractWorker.php index fbe26d5..8defb2c 100644 --- a/Service/Worker/AbstractWorker.php +++ b/Service/Worker/AbstractWorker.php @@ -10,6 +10,9 @@ */ abstract class AbstractWorker { + /** @var string Worker error message after processing. */ + private $error = null; + /** * @param Message $message * @@ -27,10 +30,14 @@ final public function process(Message $message) try { $result = $this->execute($message); } catch (\Exception $e) { - return false; + $result = false; + $this->error = $e->getMessage(); } $this->postExecute($message); + // Let worker does something on success or failure + $result === true ? $this->onSucceeded() : $this->onFailed(); + return $result; } @@ -43,6 +50,8 @@ protected function preExecute(Message $message) } /** + * Do something via post execution. It is better to proceed with task related to message. + * * @param Message $message */ protected function postExecute(Message $message) @@ -56,4 +65,39 @@ protected function postExecute(Message $message) * @return boolean */ abstract protected function execute(Message $message); + + /** + * Event fired when worker has processed message successfully. + * + * @return void + */ + abstract protected function onSucceeded(); + + /** + * Event fired when worker has failed to process message. + * + * @return void + */ + abstract protected function onFailed(); + + /** + * Check if worker has error after processing. + * By default, error is set to null. + * + * @return bool + */ + public function hasError() + { + return $this->error !== null; + } + + /** + * Get worker error message. + * + * @return string + */ + public function error() + { + return $this->error; + } } From 4c33779efab64a329cab34882533d46251299b90 Mon Sep 17 00:00:00 2001 From: Pete Houston Date: Wed, 26 Sep 2018 11:49:52 +0700 Subject: [PATCH 2/5] Verify event callbacks. --- Tests/Unit/Service/Worker/AbstractWorkerTest.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Tests/Unit/Service/Worker/AbstractWorkerTest.php b/Tests/Unit/Service/Worker/AbstractWorkerTest.php index 9e48822..a1bb0f1 100644 --- a/Tests/Unit/Service/Worker/AbstractWorkerTest.php +++ b/Tests/Unit/Service/Worker/AbstractWorkerTest.php @@ -51,9 +51,16 @@ public function testProcessWithNormalMessage() ->method('execute') ->with($message) ->willReturn(true); + $worker->expects($this->once()) + ->method('onSucceeded'); + $worker->expects($this->never()) + ->method('onFailed'); $result = $worker->process($message); + $this->assertTrue($result); + $this->assertFalse($worker->hasError()); + $this->assertNull($worker->error()); } /** @@ -68,8 +75,15 @@ public function testProcessInFailure() ->method('execute') ->with($message) ->willThrowException(new \Exception()); + $worker->expects($this->once()) + ->method('onFailed'); + $worker->expects($this->never()) + ->method('onSucceeded'); $result = $worker->process($message); + $this->assertFalse($result); + $this->assertTrue($worker->hasError()); + $this->assertNotNull($worker->error()); } } From 335438c2515ae88fd16d5949bf8903d36e85198a Mon Sep 17 00:00:00 2001 From: Pete Houston Date: Wed, 26 Sep 2018 11:50:20 +0700 Subject: [PATCH 3/5] Update for event callbacks. --- Tests/app/Worker/BasicWorker.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Tests/app/Worker/BasicWorker.php b/Tests/app/Worker/BasicWorker.php index b95b75c..6ca9859 100644 --- a/Tests/app/Worker/BasicWorker.php +++ b/Tests/app/Worker/BasicWorker.php @@ -16,4 +16,20 @@ protected function execute(Message $message) { return true; } + + /** + * Handle worker on success. + */ + protected function onSucceeded() + { + + } + + /** + * Handle worker on failure. + */ + protected function onFailed() + { + + } } \ No newline at end of file From 4ba7a3bfdafb41b6a213765677cc32347c9624cd Mon Sep 17 00:00:00 2001 From: Pete Houston Date: Wed, 26 Sep 2018 14:01:22 +0700 Subject: [PATCH 4/5] Remove abstraction. --- Service/Worker/AbstractWorker.php | 10 ++++++++-- Tests/Unit/Service/Worker/AbstractWorkerTest.php | 8 -------- Tests/app/Worker/BasicWorker.php | 16 ---------------- 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/Service/Worker/AbstractWorker.php b/Service/Worker/AbstractWorker.php index 8defb2c..af38e51 100644 --- a/Service/Worker/AbstractWorker.php +++ b/Service/Worker/AbstractWorker.php @@ -71,14 +71,20 @@ abstract protected function execute(Message $message); * * @return void */ - abstract protected function onSucceeded(); + protected function onSucceeded() + { + // Do something here + } /** * Event fired when worker has failed to process message. * * @return void */ - abstract protected function onFailed(); + protected function onFailed() + { + // Do something here + } /** * Check if worker has error after processing. diff --git a/Tests/Unit/Service/Worker/AbstractWorkerTest.php b/Tests/Unit/Service/Worker/AbstractWorkerTest.php index a1bb0f1..70e4939 100644 --- a/Tests/Unit/Service/Worker/AbstractWorkerTest.php +++ b/Tests/Unit/Service/Worker/AbstractWorkerTest.php @@ -51,10 +51,6 @@ public function testProcessWithNormalMessage() ->method('execute') ->with($message) ->willReturn(true); - $worker->expects($this->once()) - ->method('onSucceeded'); - $worker->expects($this->never()) - ->method('onFailed'); $result = $worker->process($message); @@ -75,10 +71,6 @@ public function testProcessInFailure() ->method('execute') ->with($message) ->willThrowException(new \Exception()); - $worker->expects($this->once()) - ->method('onFailed'); - $worker->expects($this->never()) - ->method('onSucceeded'); $result = $worker->process($message); diff --git a/Tests/app/Worker/BasicWorker.php b/Tests/app/Worker/BasicWorker.php index 6ca9859..b95b75c 100644 --- a/Tests/app/Worker/BasicWorker.php +++ b/Tests/app/Worker/BasicWorker.php @@ -16,20 +16,4 @@ protected function execute(Message $message) { return true; } - - /** - * Handle worker on success. - */ - protected function onSucceeded() - { - - } - - /** - * Handle worker on failure. - */ - protected function onFailed() - { - - } } \ No newline at end of file From 8b83f7d19db487f4e299853b861517f2aa50e52f Mon Sep 17 00:00:00 2001 From: Pete Houston Date: Wed, 26 Sep 2018 14:54:22 +0700 Subject: [PATCH 5/5] Catch method calls. --- Tests/Unit/Service/Worker/AbstractWorkerTest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Tests/Unit/Service/Worker/AbstractWorkerTest.php b/Tests/Unit/Service/Worker/AbstractWorkerTest.php index 70e4939..843d95d 100644 --- a/Tests/Unit/Service/Worker/AbstractWorkerTest.php +++ b/Tests/Unit/Service/Worker/AbstractWorkerTest.php @@ -19,6 +19,7 @@ private function getAbstractWorker() { /** @var \PHPUnit_Framework_MockObject_MockObject|AbstractWorker $client */ $worker = $this->getMockBuilder(AbstractWorker::class) + ->setMethods(['preExecute', 'postExecute', 'onSucceeded', 'onFailed']) ->getMockForAbstractClass(); return $worker; @@ -51,6 +52,10 @@ public function testProcessWithNormalMessage() ->method('execute') ->with($message) ->willReturn(true); + $worker->expects($this->once())->method(('preExecute'))->with($message); + $worker->expects($this->once())->method(('postExecute'))->with($message); + $worker->expects($this->once())->method('onSucceeded'); + $worker->expects($this->never())->method('onFailed'); $result = $worker->process($message); @@ -71,6 +76,10 @@ public function testProcessInFailure() ->method('execute') ->with($message) ->willThrowException(new \Exception()); + $worker->expects($this->once())->method(('preExecute'))->with($message); + $worker->expects($this->once())->method(('postExecute'))->with($message); + $worker->expects($this->once())->method('onFailed'); + $worker->expects($this->never())->method('onSucceeded'); $result = $worker->process($message);