PageRenderTime 28ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/app/protected/modules/zurmo/tests/unit/benchmark/GroupBenchmarkTest.php

https://bitbucket.org/zurmo/zurmo/
PHP | 350 lines | 253 code | 52 blank | 45 comment | 10 complexity | 46af46e476635439127503fd00935c0f MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, GPL-2.0, LGPL-3.0, LGPL-2.1, BSD-2-Clause
  1. <?php
  2. /*********************************************************************************
  3. * Zurmo is a customer relationship management program developed by
  4. * Zurmo, Inc. Copyright (C) 2015 Zurmo Inc.
  5. *
  6. * Zurmo is free software; you can redistribute it and/or modify it under
  7. * the terms of the GNU Affero General Public License version 3 as published by the
  8. * Free Software Foundation with the addition of the following permission added
  9. * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
  10. * IN WHICH THE COPYRIGHT IS OWNED BY ZURMO, ZURMO DISCLAIMS THE WARRANTY
  11. * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
  12. *
  13. * Zurmo is distributed in the hope that it will be useful, but WITHOUT
  14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  15. * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public License along with
  19. * this program; if not, see http://www.gnu.org/licenses or write to the Free
  20. * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  21. * 02110-1301 USA.
  22. *
  23. * You can contact Zurmo, Inc. with a mailing address at 27 North Wacker Drive
  24. * Suite 370 Chicago, IL 60606. or at email address contact@zurmo.com.
  25. *
  26. * The interactive user interfaces in original and modified versions
  27. * of this program must display Appropriate Legal Notices, as required under
  28. * Section 5 of the GNU Affero General Public License version 3.
  29. *
  30. * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
  31. * these Appropriate Legal Notices must retain the display of the Zurmo
  32. * logo and Zurmo copyright notice. If the display of the logo is not reasonably
  33. * feasible for technical reasons, the Appropriate Legal Notices must display the words
  34. * "Copyright Zurmo Inc. 2015. All rights reserved".
  35. ********************************************************************************/
  36. class GroupBenchmarkTest extends ZurmoBaseTest
  37. {
  38. public static function setUpBeforeClass()
  39. {
  40. parent::setUpBeforeClass();
  41. SecurityTestHelper::createSuperAdmin();
  42. }
  43. public function setUp()
  44. {
  45. parent::setUp();
  46. Yii::app()->user->userModel = User::getByUsername('super');
  47. }
  48. public function testSaveAndLoadGroup()
  49. {
  50. $u = array();
  51. for ($i = 0; $i < 5; $i++)
  52. {
  53. $user = new User();
  54. $user->setScenario('createUser');
  55. $user->username = "uuuuu$i";
  56. $user->title->value = 'Mr.';
  57. $user->firstName = "Uuuuuu{$i}";
  58. $user->lastName = "Uuuuuu{$i}son";
  59. $user->setPassword("uuuuu$i");
  60. $this->assertTrue($user->save());
  61. $u[] = $user;
  62. }
  63. $a = new Group();
  64. $a->name = 'AAA';
  65. $this->assertTrue($a->save());
  66. $this->assertEquals(0, $a->users ->count());
  67. $this->assertEquals(0, $a->groups->count());
  68. $b = new Group();
  69. $b->name = 'BBB';
  70. $this->assertTrue($b->save());
  71. $this->assertEquals(0, $b->users ->count());
  72. $this->assertEquals(0, $b->groups->count());
  73. $a->users ->add($u[0]);
  74. $a->groups->add($b);
  75. $this->assertTrue($a->save());
  76. $this->assertEquals(1, $a->users ->count());
  77. $b->forget();
  78. unset($b);
  79. $a->forget();
  80. unset($a);
  81. }
  82. /**
  83. * @depends testSaveAndLoadGroup
  84. */
  85. public function testGroupsContainingGroupsAndContains()
  86. {
  87. ZurmoDatabaseCompatibilityUtil::dropStoredFunctionsAndProcedures();
  88. $u = array();
  89. for ($i = 0; $i < 5; $i++)
  90. {
  91. $u[$i] = User::getByUsername("uuuuu$i");
  92. }
  93. $a = Group::getByName('AAA');
  94. $b = Group::getByName('BBB');
  95. $c = new Group();
  96. $c->name = 'CCC';
  97. $this->assertTrue($c->save());
  98. $this->assertEquals(0, $c->users ->count());
  99. $this->assertEquals(0, $c->groups->count());
  100. $d = new Group();
  101. $d->name = 'DDD';
  102. $this->assertTrue($d->save());
  103. $this->assertEquals(0, $d->users ->count());
  104. $this->assertEquals(0, $d->groups->count());
  105. $b->users->add($u[1]);
  106. $b->users->add($u[2]);
  107. $b->groups->add($c);
  108. $b->groups->add($d);
  109. $this->assertTrue($b->save());
  110. $c->users->add($u[3]);
  111. $this->assertTrue($c->save());
  112. $d->users->add($u[4]);
  113. $this->assertTrue($d->save());
  114. unset($a);
  115. unset($b);
  116. unset($c);
  117. unset($d);
  118. RedBeanModel::forgetAll();
  119. $a = Group::getByName('AAA');
  120. $b = Group::getByName('BBB');
  121. $c = Group::getByName('CCC');
  122. $d = Group::getByName('DDD');
  123. $this->assertEquals(1, $a->users->count());
  124. $this->assertEquals(2, $b->users->count());
  125. $this->assertEquals(1, $c->users->count());
  126. $this->assertEquals(1, $d->users->count());
  127. $this->assertEquals(1, $a->groups->count());
  128. $this->assertEquals(2, $b->groups->count());
  129. $this->assertEquals(0, $c->groups->count());
  130. $this->assertEquals(0, $d->groups->count());
  131. $this->assertTrue($a->contains($u[0]));
  132. $this->assertTrue($a->contains($u[1]));
  133. $this->assertTrue($a->contains($u[2]));
  134. $this->assertTrue($a->contains($u[3]));
  135. $this->assertTrue($a->contains($u[4]));
  136. $this->assertTrue($a->contains($b));
  137. $this->assertTrue($a->contains($c));
  138. $this->assertTrue($a->contains($d));
  139. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $u[0]->id));
  140. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $u[1]->id));
  141. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $u[2]->id));
  142. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $u[3]->id));
  143. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $u[4]->id));
  144. $this->assertTrue($b->contains($u[1]));
  145. $this->assertTrue($b->contains($u[2]));
  146. $this->assertTrue($b->contains($u[3]));
  147. $this->assertTrue($b->contains($u[4]));
  148. $this->assertTrue($b->contains($c));
  149. $this->assertTrue($b->contains($d));
  150. $this->assertTrue(self::fastContainsUserByGroupName('BBB', $u[1]->id));
  151. $this->assertTrue(self::fastContainsUserByGroupName('BBB', $u[2]->id));
  152. $this->assertTrue(self::fastContainsUserByGroupName('BBB', $u[3]->id));
  153. $this->assertTrue(self::fastContainsUserByGroupName('BBB', $u[4]->id));
  154. $this->assertTrue($c->contains($u[3]));
  155. $this->assertTrue($d->contains($u[4]));
  156. $this->assertTrue(self::fastContainsUserByGroupName('CCC', $u[3]->id));
  157. $this->assertTrue(self::fastContainsUserByGroupName('DDD', $u[4]->id));
  158. $this->assertFalse($b->contains($u[0]));
  159. $this->assertFalse(self::fastContainsUserByGroupName('BBB', $u[0]->id));
  160. $this->assertFalse($c->contains($u[0]));
  161. $this->assertFalse($c->contains($u[1]));
  162. $this->assertFalse($c->contains($u[2]));
  163. $this->assertFalse($c->contains($u[4]));
  164. $this->assertFalse(self::fastContainsUserByGroupName('CCC', $u[0]->id));
  165. $this->assertFalse(self::fastContainsUserByGroupName('CCC', $u[1]->id));
  166. $this->assertFalse(self::fastContainsUserByGroupName('CCC', $u[2]->id));
  167. $this->assertFalse(self::fastContainsUserByGroupName('CCC', $u[4]->id));
  168. $this->assertFalse($d->contains($u[0]));
  169. $this->assertFalse($d->contains($u[1]));
  170. $this->assertFalse($d->contains($u[2]));
  171. $this->assertFalse($d->contains($u[3]));
  172. $this->assertFalse(self::fastContainsUserByGroupName('DDD', $u[0]->id));
  173. $this->assertFalse(self::fastContainsUserByGroupName('DDD', $u[1]->id));
  174. $this->assertFalse(self::fastContainsUserByGroupName('DDD', $u[2]->id));
  175. $this->assertFalse(self::fastContainsUserByGroupName('DDD', $u[3]->id));
  176. $this->assertFalse($b->contains($a));
  177. $this->assertFalse($c->contains($a));
  178. $this->assertFalse($d->contains($a));
  179. $this->assertFalse($c->contains($a));
  180. $this->assertFalse($c->contains($b));
  181. $this->assertFalse($d->contains($a));
  182. $this->assertFalse($d->contains($b));
  183. $a->forget();
  184. $b->forget();
  185. $c->forget();
  186. $d->forget();
  187. unset($a);
  188. unset($b);
  189. unset($c);
  190. unset($d);
  191. }
  192. protected static function fastContainsUserByGroupName($groupName, $userId)
  193. {
  194. // Optimizations work on the database,
  195. // anything not saved will not work.
  196. assert('$userId > 0'); // Not Coding Standard
  197. assert('is_string($groupName) && $groupName != ""'); // Not Coding Standard
  198. assert('is_int($userId) && $userId > 0'); // Not Coding Standard
  199. return intval(ZurmoDatabaseCompatibilityUtil::
  200. callFunction("named_group_contains_user('$groupName', $userId)")) == 1;
  201. }
  202. protected static function fastContainsUserByGroupId($groupId, $userId)
  203. {
  204. assert('is_int($groupId) && $groupId > 0'); // Not Coding Standard
  205. assert('is_int($userId) && $userId > 0'); // Not Coding Standard
  206. return ZurmoRedBean::getCell("select group_contains_user($groupId, $userId);") == 1;
  207. }
  208. /**
  209. * @depends testGroupsContainingGroupsAndContains
  210. */
  211. public function testPerformanceOfFastContainsUserByGroupName()
  212. {
  213. $runs = 10;
  214. $u = array();
  215. for ($i = 0; $i < 5; $i++)
  216. {
  217. $u[$i] = User::getByUsername("uuuuu$i");
  218. }
  219. $startTime = microtime(true);
  220. for ($i = 0; $i < $runs; $i++)
  221. {
  222. RedBeanModel::forgetAll();
  223. $a = Group::getByName('AAA');
  224. $this->assertTrue($a->contains($u[0]));
  225. $this->assertTrue($a->contains($u[1]));
  226. $this->assertTrue($a->contains($u[2]));
  227. $this->assertTrue($a->contains($u[3]));
  228. $this->assertTrue($a->contains($u[4]));
  229. }
  230. $endTime = microtime(true);
  231. $totalTimeSlow = $endTime - $startTime;
  232. $userId0 = User::getByUsername("uuuuu0")->id;
  233. $userId1 = User::getByUsername("uuuuu1")->id;
  234. $userId2 = User::getByUsername("uuuuu2")->id;
  235. $userId3 = User::getByUsername("uuuuu3")->id;
  236. $userId4 = User::getByUsername("uuuuu4")->id;
  237. $startTime = microtime(true);
  238. for ($i = 0; $i < $runs; $i++)
  239. {
  240. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $userId0));
  241. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $userId1));
  242. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $userId2));
  243. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $userId3));
  244. $this->assertTrue(self::fastContainsUserByGroupName('AAA', $userId4));
  245. }
  246. $endTime = microtime(true);
  247. $totalTimeOptimized = $endTime - $startTime;
  248. $ratio = $totalTimeSlow / $totalTimeOptimized;
  249. $expectedMinimumRatio = 20;
  250. $this->assertGreaterThan($expectedMinimumRatio, $ratio);
  251. }
  252. /**
  253. * @depends testGroupsContainingGroupsAndContains
  254. */
  255. public function testPerformanceOfFastContainsUserByGroupId()
  256. {
  257. $runs = 10;
  258. $u = array();
  259. for ($i = 0; $i < 5; $i++)
  260. {
  261. $u[$i] = User::getByUsername("uuuuu$i");
  262. }
  263. $startTime = microtime(true);
  264. for ($i = 0; $i < $runs; $i++)
  265. {
  266. RedBeanModel::forgetAll();
  267. $a = Group::getByName('AAA');
  268. $this->assertTrue($a->contains($u[0]));
  269. $this->assertTrue($a->contains($u[1]));
  270. $this->assertTrue($a->contains($u[2]));
  271. $this->assertTrue($a->contains($u[3]));
  272. $this->assertTrue($a->contains($u[4]));
  273. }
  274. $endTime = microtime(true);
  275. $totalTimeSlow = $endTime - $startTime;
  276. $groupId = Group::getByName('AAA')->id;
  277. $userId0 = User::getByUsername("uuuuu0")->id;
  278. $userId1 = User::getByUsername("uuuuu1")->id;
  279. $userId2 = User::getByUsername("uuuuu2")->id;
  280. $userId3 = User::getByUsername("uuuuu3")->id;
  281. $userId4 = User::getByUsername("uuuuu4")->id;
  282. $startTime = microtime(true);
  283. for ($i = 0; $i < $runs; $i++)
  284. {
  285. $this->assertTrue(self::fastContainsUserByGroupId($groupId, $userId0));
  286. $this->assertTrue(self::fastContainsUserByGroupId($groupId, $userId1));
  287. $this->assertTrue(self::fastContainsUserByGroupId($groupId, $userId2));
  288. $this->assertTrue(self::fastContainsUserByGroupId($groupId, $userId3));
  289. $this->assertTrue(self::fastContainsUserByGroupId($groupId, $userId4));
  290. }
  291. $endTime = microtime(true);
  292. $totalTimeOptimized = $endTime - $startTime;
  293. $ratio = $totalTimeSlow / $totalTimeOptimized;
  294. $expectedMinimumRatio = 20;
  295. $this->assertGreaterThan($expectedMinimumRatio, $ratio);
  296. }
  297. }
  298. ?>