Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / orm / tests / Doctrine / Tests / ORM / Functional / Locking / GearmanLockTest.php
1 <?php
2
3 namespace Doctrine\Tests\ORM\Functional\Locking;
4
5 use Doctrine\Tests\Models\CMS\CmsArticle,
6     Doctrine\Tests\Models\CMS\CmsUser,
7     Doctrine\DBAL\LockMode,
8     Doctrine\ORM\EntityManager;
9
10 require_once __DIR__ . '/../../../TestInit.php';
11
12 /**
13  * @group locking_functional
14  */
15 class GearmanLockTest extends \Doctrine\Tests\OrmFunctionalTestCase
16 {
17     private $gearman = null;
18     private $maxRunTime = 0;
19     private $articleId;
20
21     protected function setUp()
22     {
23         if (!class_exists('GearmanClient', false)) {
24             $this->markTestSkipped('pecl/gearman is required for this test to run.');
25         }
26
27         $this->useModelSet('cms');
28         parent::setUp();
29         $this->tasks = array();
30
31         $this->gearman = new \GearmanClient();
32         $this->gearman->addServer();
33         $this->gearman->setCompleteCallback(array($this, "gearmanTaskCompleted"));
34
35         $article = new CmsArticle();
36         $article->text = "my article";
37         $article->topic = "Hello";
38
39         $this->_em->persist($article);
40         $this->_em->flush();
41
42         $this->articleId = $article->id;
43     }
44
45     public function gearmanTaskCompleted($task)
46     {
47         $this->maxRunTime = max($this->maxRunTime, $task->data());
48     }
49
50     public function testFindWithLock()
51     {
52         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
53         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
54
55         $this->assertLockWorked();
56     }
57
58     public function testFindWithWriteThenReadLock()
59     {
60         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
61         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_READ);
62
63         $this->assertLockWorked();
64     }
65
66     public function testFindWithReadThenWriteLock()
67     {
68         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_READ);
69         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
70
71         $this->assertLockWorked();
72     }
73
74     public function testFindWithOneLock()
75     {
76         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
77         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::NONE);
78
79         $this->assertLockDoesNotBlock();
80     }
81
82     public function testDqlWithLock()
83     {
84         $this->asyncDqlWithLock('SELECT a FROM Doctrine\Tests\Models\CMS\CmsArticle a', array(), LockMode::PESSIMISTIC_WRITE);
85         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
86
87         $this->assertLockWorked();
88     }
89
90     public function testLock()
91     {
92         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
93         $this->asyncLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
94
95         $this->assertLockWorked();
96     }
97
98     public function testLock2()
99     {
100         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
101         $this->asyncLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_READ);
102
103         $this->assertLockWorked();
104     }
105
106     public function testLock3()
107     {
108         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_READ);
109         $this->asyncLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
110
111         $this->assertLockWorked();
112     }
113
114     public function testLock4()
115     {
116         $this->asyncFindWithLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::NONE);
117         $this->asyncLock('Doctrine\Tests\Models\CMS\CmsArticle', $this->articleId, LockMode::PESSIMISTIC_WRITE);
118
119         $this->assertLockDoesNotBlock();
120     }
121
122     protected function assertLockDoesNotBlock()
123     {
124         $this->assertLockWorked($onlyForSeconds = 1);
125     }
126
127     protected function assertLockWorked($forTime = 2, $notLongerThan = null)
128     {
129         if ($notLongerThan === null) {
130             $notLongerThan = $forTime + 1;
131         }
132
133         $this->gearman->runTasks();
134
135         $this->assertTrue($this->maxRunTime > $forTime,
136             "Because of locking this tests should have run at least " . $forTime . " seconds, ".
137             "but only did for " . $this->maxRunTime . " seconds.");
138         $this->assertTrue($this->maxRunTime < $notLongerThan,
139             "The longest task should not run longer than " . $notLongerThan . " seconds, ".
140             "but did for " . $this->maxRunTime . " seconds."
141         );
142     }
143
144     protected function asyncFindWithLock($entityName, $entityId, $lockMode)
145     {
146         $this->startJob('findWithLock', array(
147             'entityName' => $entityName,
148             'entityId' => $entityId,
149             'lockMode' => $lockMode,
150         ));
151     }
152
153     protected function asyncDqlWithLock($dql, $params, $lockMode)
154     {
155         $this->startJob('dqlWithLock', array(
156             'dql' => $dql,
157             'dqlParams' => $params,
158             'lockMode' => $lockMode,
159         ));
160     }
161
162     protected function asyncLock($entityName, $entityId, $lockMode)
163     {
164         $this->startJob('lock', array(
165             'entityName' => $entityName,
166             'entityId' => $entityId,
167             'lockMode' => $lockMode,
168         ));
169     }
170
171     protected function startJob($fn, $fixture)
172     {
173         $this->gearman->addTask($fn, serialize(array(
174             'conn' => $this->_em->getConnection()->getParams(),
175             'fixture' => $fixture
176         )));
177
178         $this->assertEquals(GEARMAN_SUCCESS, $this->gearman->returnCode());
179     }
180 }