Refactor Daemon to use DI

[MAILPOET-1571]
This commit is contained in:
Pavel Dohnal
2018-12-10 15:30:09 +01:00
parent 195efad742
commit 75761d57ed
4 changed files with 87 additions and 34 deletions

View File

@@ -1,20 +1,19 @@
<?php <?php
namespace MailPoet\Cron; namespace MailPoet\Cron;
use MailPoet\Cron\Workers\Scheduler as SchedulerWorker;
use MailPoet\Cron\Workers\SendingQueue\Migration as MigrationWorker; use MailPoet\Cron\Workers\WorkersFactory;
use MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker;
use MailPoet\Cron\Workers\Bounce as BounceWorker;
use MailPoet\Cron\Workers\KeyCheck\PremiumKeyCheck as PremiumKeyCheckWorker;
use MailPoet\Cron\Workers\KeyCheck\SendingServiceKeyCheck as SendingServiceKeyCheckWorker;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class Daemon { class Daemon {
public $timer; public $timer;
function __construct() { /** @var WorkersFactory */
private $workers_factory;
function __construct(WorkersFactory $workers_factory) {
$this->timer = microtime(true); $this->timer = microtime(true);
$this->workers_factory = $workers_factory;
} }
function run($settings_daemon_data) { function run($settings_daemon_data) {
@@ -35,32 +34,32 @@ class Daemon {
} }
function executeScheduleWorker() { function executeScheduleWorker() {
$scheduler = new SchedulerWorker($this->timer); $scheduler = $this->workers_factory->createScheduleWorker($this->timer);
return $scheduler->process(); return $scheduler->process();
} }
function executeQueueWorker() { function executeQueueWorker() {
$queue = new SendingQueueWorker(new SendingErrorHandler(), $this->timer); $queue = $this->workers_factory->createQueueWorker($this->timer);
return $queue->process(); return $queue->process();
} }
function executeSendingServiceKeyCheckWorker() { function executeSendingServiceKeyCheckWorker() {
$worker = new SendingServiceKeyCheckWorker($this->timer); $worker = $this->workers_factory->createSendingServiceKeyCheckWorker($this->timer);
return $worker->process(); return $worker->process();
} }
function executePremiumKeyCheckWorker() { function executePremiumKeyCheckWorker() {
$worker = new PremiumKeyCheckWorker($this->timer); $worker = $this->workers_factory->createPremiumKeyCheckWorker($this->timer);
return $worker->process(); return $worker->process();
} }
function executeBounceWorker() { function executeBounceWorker() {
$bounce = new BounceWorker($this->timer); $bounce = $this->workers_factory->createBounceWorker($this->timer);
return $bounce->process(); return $bounce->process();
} }
function executeMigrationWorker() { function executeMigrationWorker() {
$migration = new MigrationWorker($this->timer); $migration = $this->workers_factory->createMigrationWorker($this->timer);
return $migration->process(); return $migration->process();
} }

View File

@@ -0,0 +1,52 @@
<?php
namespace MailPoet\Cron\Workers;
use MailPoet\Cron\Workers\Scheduler as SchedulerWorker;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker;
use MailPoet\Cron\Workers\SendingQueue\Migration as MigrationWorker;
use MailPoet\Cron\Workers\Bounce as BounceWorker;
use MailPoet\Cron\Workers\KeyCheck\PremiumKeyCheck as PremiumKeyCheckWorker;
use MailPoet\Cron\Workers\KeyCheck\SendingServiceKeyCheck as SendingServiceKeyCheckWorker;
use MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler;
class WorkersFactory {
/** @var SendingErrorHandler */
private $sending_error_handler;
public function __construct(SendingErrorHandler $sending_error_handler) {
$this->sending_error_handler = $sending_error_handler;
}
/** @return SchedulerWorker */
function createScheduleWorker($timer) {
return new SchedulerWorker($timer);
}
/** @return SendingQueueWorker */
function createQueueWorker($timer) {
return new SendingQueueWorker($this->sending_error_handler, $timer);
}
/** @return SendingServiceKeyCheckWorker */
function createSendingServiceKeyCheckWorker($timer) {
return new SendingServiceKeyCheckWorker($timer);
}
/** @return PremiumKeyCheckWorker */
function createPremiumKeyCheckWorker($timer) {
return new PremiumKeyCheckWorker($timer);
}
/** @return BounceWorker */
function createBounceWorker($timer) {
return new BounceWorker($timer);
}
/** @return MigrationWorker */
function createMigrationWorker($timer) {
return new MigrationWorker($timer);
}
}

View File

@@ -6,6 +6,8 @@ use Codeception\Stub\Expected;
use MailPoet\Cron\CronHelper; use MailPoet\Cron\CronHelper;
use MailPoet\Cron\Daemon; use MailPoet\Cron\Daemon;
use MailPoet\Cron\DaemonHttpRunner; use MailPoet\Cron\DaemonHttpRunner;
use MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler;
use MailPoet\Cron\Workers\WorkersFactory;
use MailPoet\Models\Setting; use MailPoet\Models\Setting;
class DaemonHttpRunnerTest extends \MailPoetTest { class DaemonHttpRunnerTest extends \MailPoetTest {
@@ -21,7 +23,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
function testItDoesNotRunWithoutRequestData() { function testItDoesNotRunWithoutRequestData() {
$daemon = Stub::construct( $daemon = Stub::construct(
new DaemonHttpRunner(new Daemon()), new DaemonHttpRunner(new Daemon(new WorkersFactory(new SendingErrorHandler()))),
array(), array(),
array( array(
'abortWithError' => function($message) { 'abortWithError' => function($message) {
@@ -34,7 +36,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
function testItDoesNotRunWhenThereIsInvalidOrMissingToken() { function testItDoesNotRunWhenThereIsInvalidOrMissingToken() {
$daemon = Stub::construct( $daemon = Stub::construct(
new DaemonHttpRunner(new Daemon()), new DaemonHttpRunner(new Daemon(new WorkersFactory(new SendingErrorHandler()))),
array(), array(),
array( array(
'abortWithError' => function($message) { 'abortWithError' => function($message) {
@@ -52,7 +54,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
$data = array( $data = array(
'token' => 123 'token' => 123
); );
$daemon = Stub::make(new Daemon(), array( $daemon = Stub::construct(Daemon::class, [new WorkersFactory(new SendingErrorHandler())], array(
'executeScheduleWorker' => function() { 'executeScheduleWorker' => function() {
throw new \Exception('Message'); throw new \Exception('Message');
}, },
@@ -72,7 +74,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
} }
function testItCanPauseExecution() { function testItCanPauseExecution() {
$daemon = Stub::make(new Daemon(), array( $daemon = Stub::construct(Daemon::class, [new WorkersFactory(new SendingErrorHandler())], array(
'executeScheduleWorker' => null, 'executeScheduleWorker' => null,
'executeQueueWorker' => null, 'executeQueueWorker' => null,
), $this); ), $this);
@@ -93,7 +95,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
function testItTerminatesExecutionWhenDaemonIsDeleted() { function testItTerminatesExecutionWhenDaemonIsDeleted() {
$daemon = Stub::make(new DaemonHttpRunner(new Daemon()), array( $daemon = Stub::make(DaemonHttpRunner::class, array(
'executeScheduleWorker' => function() { 'executeScheduleWorker' => function() {
Setting::deleteValue(CronHelper::DAEMON_SETTING); Setting::deleteValue(CronHelper::DAEMON_SETTING);
}, },
@@ -105,12 +107,12 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct(new Daemon()); $daemon->__construct(new Daemon(new WorkersFactory(new SendingErrorHandler())));
$daemon->run($data); $daemon->run($data);
} }
function testItTerminatesExecutionWhenDaemonTokenChangesAndKeepsChangedToken() { function testItTerminatesExecutionWhenDaemonTokenChangesAndKeepsChangedToken() {
$daemon = Stub::make(new DaemonHttpRunner(new Daemon()), array( $daemon = Stub::make(DaemonHttpRunner::class, array(
'executeScheduleWorker' => function() { 'executeScheduleWorker' => function() {
Setting::setValue( Setting::setValue(
CronHelper::DAEMON_SETTING, CronHelper::DAEMON_SETTING,
@@ -125,14 +127,14 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct(new Daemon()); $daemon->__construct(new Daemon(new WorkersFactory(new SendingErrorHandler())));
$daemon->run($data); $daemon->run($data);
$data_after_run = Setting::getValue(CronHelper::DAEMON_SETTING); $data_after_run = Setting::getValue(CronHelper::DAEMON_SETTING);
expect($data_after_run['token'], 567); expect($data_after_run['token'], 567);
} }
function testItTerminatesExecutionWhenDaemonIsDeactivated() { function testItTerminatesExecutionWhenDaemonIsDeactivated() {
$daemon = Stub::make(new DaemonHttpRunner(new Daemon()), [ $daemon = Stub::make(DaemonHttpRunner::class, [
'executeScheduleWorker' => null, 'executeScheduleWorker' => null,
'executeQueueWorker' => null, 'executeQueueWorker' => null,
'pauseExecution' => null, 'pauseExecution' => null,
@@ -143,12 +145,12 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'status' => CronHelper::DAEMON_STATUS_INACTIVE, 'status' => CronHelper::DAEMON_STATUS_INACTIVE,
]; ];
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct(new Daemon()); $daemon->__construct(new Daemon(new WorkersFactory(new SendingErrorHandler())));
$daemon->run($data); $daemon->run($data);
} }
function testItUpdatesDaemonTokenDuringExecution() { function testItUpdatesDaemonTokenDuringExecution() {
$daemon_http_runner = Stub::make(new DaemonHttpRunner(new Daemon()), array( $daemon_http_runner = Stub::make(DaemonHttpRunner::class, array(
'executeScheduleWorker' => null, 'executeScheduleWorker' => null,
'executeQueueWorker' => null, 'executeQueueWorker' => null,
'pauseExecution' => null, 'pauseExecution' => null,
@@ -158,14 +160,14 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon_http_runner->__construct(new Daemon()); $daemon_http_runner->__construct(new Daemon(new WorkersFactory(new SendingErrorHandler())));
$daemon_http_runner->run($data); $daemon_http_runner->run($data);
$updated_daemon = Setting::getValue(CronHelper::DAEMON_SETTING); $updated_daemon = Setting::getValue(CronHelper::DAEMON_SETTING);
expect($updated_daemon['token'])->equals($daemon_http_runner->token); expect($updated_daemon['token'])->equals($daemon_http_runner->token);
} }
function testItUpdatesTimestampsDuringExecution() { function testItUpdatesTimestampsDuringExecution() {
$daemon = Stub::make(new Daemon(), array( $daemon = Stub::construct(Daemon::class, [new WorkersFactory(new SendingErrorHandler())], array(
'executeScheduleWorker' => function() { 'executeScheduleWorker' => function() {
sleep(2); sleep(2);
}, },
@@ -192,7 +194,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
function testItCanRun() { function testItCanRun() {
ignore_user_abort(0); ignore_user_abort(0);
expect(ignore_user_abort())->equals(0); expect(ignore_user_abort())->equals(0);
$daemon = Stub::make(new DaemonHttpRunner(new Daemon()), array( $daemon = Stub::make(DaemonHttpRunner::class, array(
'pauseExecution' => null, 'pauseExecution' => null,
// workers should be executed // workers should be executed
'executeScheduleWorker' => Expected::exactly(1), 'executeScheduleWorker' => Expected::exactly(1),
@@ -204,13 +206,13 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct(new Daemon()); $daemon->__construct(new Daemon(new WorkersFactory(new SendingErrorHandler())));
$daemon->run($data); $daemon->run($data);
expect(ignore_user_abort())->equals(1); expect(ignore_user_abort())->equals(1);
} }
function testItRespondsToPingRequest() { function testItRespondsToPingRequest() {
$daemon = Stub::make(new DaemonHttpRunner(new Daemon()), array( $daemon = Stub::make(DaemonHttpRunner::class, array(
'terminateRequest' => Expected::exactly(1, function($message) { 'terminateRequest' => Expected::exactly(1, function($message) {
expect($message)->equals('pong'); expect($message)->equals('pong');
}) })

View File

@@ -6,12 +6,14 @@ use Codeception\Stub\Expected;
use MailPoet\Cron\CronHelper; use MailPoet\Cron\CronHelper;
use MailPoet\Cron\DaemonHttpRunner; use MailPoet\Cron\DaemonHttpRunner;
use MailPoet\Cron\Daemon; use MailPoet\Cron\Daemon;
use MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler;
use MailPoet\Cron\Workers\WorkersFactory;
use MailPoet\Models\Setting; use MailPoet\Models\Setting;
class DaemonTest extends \MailPoetTest { class DaemonTest extends \MailPoetTest {
function testItCanExecuteWorkers() { function testItCanExecuteWorkers() {
$daemon = Stub::make(new Daemon(), array( $daemon = Stub::construct(Daemon::class, [new WorkersFactory(new SendingErrorHandler())], array(
'executeScheduleWorker' => Expected::exactly(1), 'executeScheduleWorker' => Expected::exactly(1),
'executeQueueWorker' => Expected::exactly(1), 'executeQueueWorker' => Expected::exactly(1),
'pauseExecution' => null, 'pauseExecution' => null,
@@ -21,12 +23,11 @@ class DaemonTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct($data);
$daemon->run([]); $daemon->run([]);
} }
function testItCanRun() { function testItCanRun() {
$daemon = Stub::make(new Daemon(), array( $daemon = Stub::construct(Daemon::class, [new WorkersFactory(new SendingErrorHandler())], array(
'pauseExecution' => null, 'pauseExecution' => null,
// workers should be executed // workers should be executed
'executeScheduleWorker' => Expected::exactly(1), 'executeScheduleWorker' => Expected::exactly(1),
@@ -38,7 +39,6 @@ class DaemonTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct();
$daemon->run($data); $daemon->run($data);
} }