public function testMaxRetries()
 {
     $queue1 = $this->em->getRepository('Heri\\Bundle\\JobQueueBundle\\Entity\\Queue')->findOneByName($this->queueName . '1');
     $queue1->setTimeout(0);
     $queue1->setMaxRetries(2);
     $this->assertNotNull($queue1, 'Queue created');
     $this->em->persist($queue1);
     $this->em->flush();
     $messages = $this->getMessages($queue1);
     $this->assertEquals(0, count($messages), 'Count number of messages');
     // Queue 1 demo:great command
     $command2 = ['command' => 'demo:great', 'argument' => ['name' => 'Alexandre', '--yell' => true]];
     $this->queue->highPriority()->push($command2);
     $messages = $this->getMessages($queue1);
     $this->assertEquals(1, count($messages), 'Count number of messages');
     $this->assertEquals(false, $messages[0]->getFailed());
     $this->assertEquals(0, $messages[0]->getNumRetries());
     $this->assertNull($messages[0]->getTimeout());
     $exceptions = $this->getMessageLogs();
     $this->assertEquals(0, count($exceptions), 'Exception logged from demo:great');
     // 1st try
     $this->queue->receive($this->maxMessages);
     $messages = $this->getMessages($queue1);
     $this->assertEquals(true, $messages[0]->getFailed());
     $this->assertEquals(0, $messages[0]->getNumRetries());
     $this->assertNotNull($messages[0]->getTimeout());
     $previousTimeout = $messages[0]->getTimeout();
     $exceptions = $this->getMessageLogs();
     $this->assertEquals(1, count($exceptions), 'Exception logged from demo:great');
     // 2nd try (1st retry)
     usleep(1000000);
     // bypass timeout
     $this->queue->receive($this->maxMessages, 0);
     $messages = $this->getMessages($queue1);
     $this->assertEquals(true, $messages[0]->getFailed());
     $this->assertEquals(1, $messages[0]->getNumRetries());
     $this->assertGreaterThan($previousTimeout, $messages[0]->getTimeout());
     $previousTimeout = $messages[0]->getTimeout();
     $exceptions = $this->getMessageLogs();
     $this->assertEquals(2, count($exceptions), 'Exception logged from demo:great');
     // 3rd try (2nd retry)
     usleep(1000000);
     // bypass timeout
     $this->queue->receive($this->maxMessages, 0);
     $messages = $this->getMessages($queue1);
     $this->assertEquals(true, $messages[0]->getFailed());
     $this->assertEquals(2, $messages[0]->getNumRetries());
     $this->assertGreaterThan($previousTimeout, $messages[0]->getTimeout());
     $previousTimeout = $messages[0]->getTimeout();
     $exceptions = $this->getMessageLogs();
     $this->assertEquals(3, count($exceptions), 'Exception logged from demo:great');
     // No more retries for this message
     usleep(1000000);
     // bypass timeout
     $this->queue->receive($this->maxMessages, 0);
     $messages = $this->getMessages($queue1);
     $this->assertEquals(true, $messages[0]->getFailed());
     $this->assertEquals(2, $messages[0]->getNumRetries());
     $this->assertEquals($previousTimeout, $messages[0]->getTimeout());
     $exceptions = $this->getMessageLogs();
     $this->assertEquals(3, count($exceptions), 'Exception logged from demo:great');
     // Retry failed message
     $this->queue->retry();
     $messages = $this->getMessages($queue1);
     $this->assertEquals(true, $messages[0]->getFailed());
     $this->assertEquals(0, $messages[0]->getNumRetries());
     $this->assertNotNull($messages[0]->getTimeout());
     $exceptions = $this->getMessageLogs();
     $this->assertEquals(3, count($exceptions), 'Exception logged from demo:great');
     // Forget a failed message
     usleep(1000000);
     // bypass timeout
     $messages = $this->getMessages($queue1);
     $this->assertEquals(1, count($messages), 'Count number of messages');
     $this->queue->forget($messages[0]->getId());
     $messages = $this->getMessages($queue1);
     $this->assertEquals(0, count($messages), 'Count number of messages');
 }