From 06a34fe417dcf1e1b03f72a175efa0ff27d0eb13 Mon Sep 17 00:00:00 2001 From: Jan Tvrdik Date: Mon, 10 Apr 2017 14:48:03 +0200 Subject: [PATCH] FallbackMailer: shuffle mailers with given probability --- src/Mail/FallbackMailer.php | 10 ++++++++-- tests/Mail/FallbackMailer.phpt | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Mail/FallbackMailer.php b/src/Mail/FallbackMailer.php index c2a9d00..e770654 100644 --- a/src/Mail/FallbackMailer.php +++ b/src/Mail/FallbackMailer.php @@ -31,10 +31,16 @@ class FallbackMailer implements IMailer /** * @param IMailer[] - * @param int $retryWaitTime in miliseconds + * @param int + * @param int $retryWaitTime in miliseconds + * @param float $shuffleProbability probability that mailers will be shuffled */ - public function __construct(array $mailers, int $retryCount = 3, int $retryWaitTime = 1000) + public function __construct(array $mailers, int $retryCount = 3, int $retryWaitTime = 1000, float $shuffleProbability = 0.0) { + if ($shuffleProbability > 0.0 && mt_rand() / mt_getrandmax() < $shuffleProbability) { + shuffle($mailers); + } + $this->mailers = $mailers; $this->retryCount = $retryCount; $this->retryWaitTime = $retryWaitTime; diff --git a/tests/Mail/FallbackMailer.phpt b/tests/Mail/FallbackMailer.phpt index c100dd1..1f265c1 100644 --- a/tests/Mail/FallbackMailer.phpt +++ b/tests/Mail/FallbackMailer.phpt @@ -84,3 +84,18 @@ test(function () { $mailer->send(new Message); Assert::null($onFailureCalls); }); + + +test(function () { + $subMailerA = new FailingMailer(0); + $subMailerB = new FailingMailer(1); + + mt_srand(5); + $mailer = new FallbackMailer([$subMailerA, $subMailerB], 3, 10, 0.5); + $mailer->onFailure[] = function (FallbackMailer $sender, SendException $e, IMailer $mailer, Message $mail) use (&$onFailureCalls) { + $onFailureCalls[] = $mailer; + }; + + $mailer->send(new Message); + Assert::same([$subMailerB], $onFailureCalls); +});