diff --git a/lib/Cron/CronHelper.php b/lib/Cron/CronHelper.php index 27ad9c79e3..4668c14ac9 100644 --- a/lib/Cron/CronHelper.php +++ b/lib/Cron/CronHelper.php @@ -2,7 +2,7 @@ namespace MailPoet\Cron; use MailPoet\Models\Setting; -use MailPoet\Router\Endpoints\Queue as QueueEndpoint; +use MailPoet\Router\Endpoints\CronDaemon as CronDaemonEndpoint; use MailPoet\Router\Router; use MailPoet\Util\Security; @@ -46,11 +46,27 @@ class CronHelper { return Security::generateRandomString(); } + static function pingDaemon() { + $url = Router::buildRequest( + CronDaemonEndpoint::ENDPOINT, + CronDaemonEndpoint::ACTION_PING_RESPONSE + ); + $url = str_replace(home_url(), self::getSiteUrl(), $url); + $args = array( + 'blocking' => true, + 'sslverify' => false, + 'timeout' => self::DAEMON_REQUEST_TIMEOUT, + 'user-agent' => 'MailPoet (www.mailpoet.com) Cron' + ); + $result = wp_remote_get($url, $args); + return wp_remote_retrieve_body($result) === 'pong'; + } + static function accessDaemon($token, $timeout = self::DAEMON_REQUEST_TIMEOUT) { $data = array('token' => $token); $url = Router::buildRequest( - QueueEndpoint::ENDPOINT, - QueueEndpoint::ACTION_RUN, + CronDaemonEndpoint::ENDPOINT, + CronDaemonEndpoint::ACTION_RUN, $data ); $url = str_replace(home_url(), self::getSiteUrl(), $url); diff --git a/lib/Cron/Daemon.php b/lib/Cron/Daemon.php index 6b11d2ddff..dfaf58075c 100644 --- a/lib/Cron/Daemon.php +++ b/lib/Cron/Daemon.php @@ -20,6 +20,10 @@ class Daemon { $this->timer = microtime(true); } + function ping() { + $this->terminateRequest('pong'); + } + function run() { ignore_user_abort(true); if(!$this->request_data) { @@ -91,7 +95,7 @@ class Daemon { exit; } - function terminateRequest() { - exit; + function terminateRequest($message = false) { + die($message); } } \ No newline at end of file diff --git a/lib/Router/Endpoints/CronDaemon.php b/lib/Router/Endpoints/CronDaemon.php new file mode 100644 index 0000000000..89f4d07096 --- /dev/null +++ b/lib/Router/Endpoints/CronDaemon.php @@ -0,0 +1,38 @@ +data = $data; + } + + function run() { + $queue = new Daemon($this->data); + $queue->run(); + } + + function ping() { + die(CronHelper::pingDaemon()); + } + + function pingResponse() { + $queue = new Daemon(); + $queue->ping(); + } +} \ No newline at end of file diff --git a/lib/Router/Endpoints/Queue.php b/lib/Router/Endpoints/Queue.php deleted file mode 100644 index e0ee93ea30..0000000000 --- a/lib/Router/Endpoints/Queue.php +++ /dev/null @@ -1,22 +0,0 @@ -data = $data; - } - - function run() { - $queue = new Daemon($this->data); - $queue->run(); - } -} \ No newline at end of file diff --git a/lib/Router/Router.php b/lib/Router/Router.php index 8ec31c4b23..8b6e9c931e 100644 --- a/lib/Router/Router.php +++ b/lib/Router/Router.php @@ -57,14 +57,15 @@ class Router { return rtrim(base64_encode(json_encode($data)), '='); } - static function buildRequest($endpoint, $action, $data) { - $data = self::encodeRequestData($data); + static function buildRequest($endpoint, $action, $data = false) { $params = array( self::NAME => '', 'endpoint' => $endpoint, 'action' => $action, - 'data' => $data ); + if($data) { + $params['data'] = self::encodeRequestData($data); + } return add_query_arg($params, home_url()); } diff --git a/tests/unit/Cron/CronHelperTest.php b/tests/unit/Cron/CronHelperTest.php index 610946ffcc..ae0db54925 100644 --- a/tests/unit/Cron/CronHelperTest.php +++ b/tests/unit/Cron/CronHelperTest.php @@ -13,7 +13,7 @@ class CronHelperTest extends MailPoetTest { expect(CronHelper::DAEMON_SETTING)->equals('cron_daemon'); } - function testItCanCreateDaemon() { + function testItCreatesDaemon() { $token = 'create_token'; $time = time(); CronHelper::createDaemon($token); @@ -26,7 +26,7 @@ class CronHelperTest extends MailPoetTest { ); } - function testItCanRestartDaemon() { + function testItRestartsDaemon() { $token = 'restart_token'; $time = time(); CronHelper::restartDaemon($token); @@ -39,7 +39,7 @@ class CronHelperTest extends MailPoetTest { ); } - function testItLoadDaemon() { + function testItLoadsDaemon() { $daemon = array( 'token' => 'some_token', 'updated_at' => '12345678' @@ -51,7 +51,7 @@ class CronHelperTest extends MailPoetTest { expect(CronHelper::getDaemon())->equals($daemon); } - function testItCanSaveDaemon() { + function testItSavesDaemon() { // when saving daemon, 'updated_at' value should change $daemon = array( 'token' => 'some_token', @@ -67,7 +67,7 @@ class CronHelperTest extends MailPoetTest { expect(CronHelper::getDaemon())->equals($daemon); } - function testItCanCreateRandomToken() { + function testItCreatesRandomToken() { // random token is a string of 5 characters $token1 = CronHelper::createToken(); $token2 = CronHelper::createToken(); @@ -76,7 +76,7 @@ class CronHelperTest extends MailPoetTest { expect(strlen($token1))->equals(5); } - function testItCanGetSiteUrl() { + function testItGetsSiteUrl() { // 1. do nothing when the url does not contain port $site_url = 'http://example.com'; expect(CronHelper::getSiteUrl($site_url))->equals($site_url); @@ -100,7 +100,7 @@ class CronHelperTest extends MailPoetTest { } } - function testItCanEnforceExecutionLimit() { + function testItEnforcesExecutionLimit() { $time = microtime(true); expect(CronHelper::enforceExecutionLimit($time))->null(); try { @@ -111,6 +111,11 @@ class CronHelperTest extends MailPoetTest { } } + function testItPingsDaemon() { + if(getenv('WP_TEST_ENABLE_NETWORK_TESTS') !== 'true') return; + expect(CronHelper::pingDaemon())->true(); + } + function _after() { ORM::raw_execute('TRUNCATE ' . Setting::$_table); } diff --git a/tests/unit/Cron/DaemonTest.php b/tests/unit/Cron/DaemonTest.php index 62e998e309..0a6b1568e6 100644 --- a/tests/unit/Cron/DaemonTest.php +++ b/tests/unit/Cron/DaemonTest.php @@ -195,6 +195,15 @@ class DaemonTest extends MailPoetTest { expect(ignore_user_abort())->equals(1); } + function testItRespondsToPingRequest() { + $daemon = Stub::make(new Daemon(true), array( + 'terminateRequest' => Stub::exactly(1, function($message) { + expect($message)->equals('pong'); + }) + ), $this); + $daemon->ping(); + } + function _after() { ORM::raw_execute('TRUNCATE ' . Setting::$_table); }