PageRenderTime 52ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/include/phpgacl/test_suite/stress_test.php

https://github.com/radicaldesigns/amp
PHP | 419 lines | 262 code | 112 blank | 45 comment | 28 complexity | 8c7212e4f55414c72f721a29fe6e33f9 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0, BSD-3-Clause, LGPL-2.0, CC-BY-SA-3.0, AGPL-1.0
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>Stress Test</title>
  5. </head>
  6. <body>
  7. <pre>
  8. <?php
  9. /*! var
  10. test scale
  11. This script will create:
  12. $scale * 10 ACOs
  13. $scale * 10 ARO groups
  14. $scale * 1000 AROs
  15. $scale * 10 AXO groups
  16. $scale * 1000 AXOs
  17. $scale * 10 ACLs
  18. 1 normal ~5 seconds
  19. 10 heavy ~1 minute
  20. 100 crazy ~1 hour
  21. !*/
  22. $scale = 10;
  23. set_time_limit (6000);
  24. /*! function
  25. get time accurate to the nearest microsecond, used for script timing
  26. !*/
  27. function getmicrotime ()
  28. {
  29. list ($usec, $sec) = explode (' ', microtime ());
  30. return (float)$usec + (float)$sec;
  31. }
  32. /*! function
  33. a better array_rand, this one actually works on windows
  34. !*/
  35. function array_mt_rand ($array, $items)
  36. {
  37. $keys = array_keys ($array);
  38. $max = count ($keys) - 1;
  39. if ( $items == 1 )
  40. {
  41. return $keys[mt_rand (0, $max)];
  42. }
  43. $return = array ();
  44. for ( $i = 1; $i <= $items; $i++ )
  45. {
  46. $return[] = $keys[mt_rand (0, $max)];
  47. }
  48. return $return;
  49. }
  50. // require gacl
  51. require_once (dirname (__FILE__) . '/../admin/gacl_admin.inc.php');
  52. /*
  53. * Let's get ready to RUMBLE!!!
  54. */
  55. echo '<b>Stress Test</b>' . "\n";
  56. echo ' Scale: ' . $scale . "\n\n";
  57. $overall_start = getmicrotime ();
  58. mt_srand ((double)microtime () *10000);
  59. $gacl_api->add_object_section ('System', 'system', 0, 0, 'ACO');
  60. echo "<b>Create ACOs</b>\n";
  61. flush ();
  62. $start_time = getmicrotime ();
  63. $start = 1;
  64. $max = 10 * $scale;
  65. for ( $i = $start; $i <= $max; $i++ )
  66. {
  67. if ( $gacl_api->add_object ('system', 'ACO: ' . $i, $i, 10, 0, 'ACO') == FALSE )
  68. {
  69. echo " Error creating ACO: $i.\n";
  70. echo ' ' . $gacl_api->_debug_msg . "\n";
  71. }
  72. }
  73. $elapsed = getmicrotime () - $start_time;
  74. echo "Done\n";
  75. echo ' Count: ' . $max . "\n";
  76. echo ' Time: ' . $elapsed . " s\n";
  77. echo ' Average: ' . $elapsed/$max . " s\n\n";
  78. $gacl_api->add_object_section ('Users', 'users', 0, 0, 'ARO');
  79. echo "<b>Create many ARO Groups.</b>\n";
  80. flush ();
  81. $start_time = getmicrotime ();
  82. $query = 'SELECT id FROM '.$gacl_api->_db_table_prefix.'aro_groups';
  83. $ids = $gacl_api->db->GetCol($query);
  84. // print_r ($ids);
  85. $start = 1;
  86. $max = 10 * $scale;
  87. // function add_group ($name, $parent_id=0, $group_type='ARO') {
  88. for ( $i = $start; $i <= $max; $i++ )
  89. {
  90. // Find a random parent
  91. if ( !empty ($ids) ) {
  92. $parent_id = $ids[array_mt_rand ($ids, 1)];
  93. } else {
  94. $parent_id = 0;
  95. }
  96. $result = $gacl_api->add_group ('aro_group'.$i,'ARO Group: '. $i, $parent_id, 'ARO');
  97. if ( $result == FALSE )
  98. {
  99. echo " Error creating ARO Group: $i.\n";
  100. echo ' ' . $gacl_api->_debug_msg . "\n";
  101. }
  102. else
  103. {
  104. $ids[] = $result;
  105. }
  106. }
  107. $elapsed = getmicrotime () - $start_time;
  108. echo "Done\n";
  109. echo ' Count: ' . $max . "\n";
  110. echo ' Time: ' . $elapsed . " s\n";
  111. echo ' Average: ' . $elapsed/$max . " s\n\n";
  112. echo "<b>Create AROs & assign to ARO Groups</b>\n";
  113. flush ();
  114. $start_time = getmicrotime ();
  115. $start = 1;
  116. $max = 1000 * $scale;
  117. $groups = array_keys ($gacl_api->format_groups ($gacl_api->sort_groups ('ARO'), 'ARRAY'));
  118. $randmax = count ($groups) - 1;
  119. for ( $i = $start; $i <= $max; $i++ )
  120. {
  121. if ( $gacl_api->add_object ('users', 'ARO: '. $i, $i, 10, 0, 'ARO') == FALSE )
  122. {
  123. echo " Error creating ARO: $i.<br />\n";
  124. echo ' ' . $gacl_api->_debug_msg . "\n";
  125. }
  126. else
  127. {
  128. // Assign to random groups.
  129. $rand_key = $groups[mt_rand (0, $randmax)];
  130. $gacl_api->add_group_object ($rand_key, 'users', $i, 'ARO');
  131. }
  132. }
  133. $elapsed = getmicrotime () - $start_time;
  134. echo "Done\n";
  135. echo ' Count: ' . $max . "\n";
  136. echo ' Time: ' . $elapsed . " s\n";
  137. echo ' Average: ' . $elapsed/$max . " s\n\n";
  138. $gacl_api->add_object_section ('Users', 'users', 0, 0, 'AXO');
  139. echo "<b>Create many AXO Groups.</b>\n";
  140. flush ();
  141. $start_time = getmicrotime ();
  142. $query = 'SELECT id FROM '.$gacl_api->_db_table_prefix.'axo_groups';
  143. $ids = $gacl_api->db->GetCol($query);
  144. $start = 1;
  145. $max = 10 * $scale;
  146. // function add_group ($name, $parent_id=0, $group_type='ARO') {
  147. for ( $i = $start; $i <= $max; $i++ )
  148. {
  149. // Find a random parent
  150. if ( !empty ($ids) ) {
  151. $parent_id = $ids[array_mt_rand ($ids, 1)];
  152. } else {
  153. $parent_id = 0;
  154. }
  155. $result = $gacl_api->add_group ('axo_group'.$i,'AXO Group: '. $i, $parent_id, 'AXO');
  156. if ( $result == FALSE )
  157. {
  158. echo " Error creating AXO Group: $i.\n";
  159. echo ' ' . $gacl_api->_debug_msg . "\n";
  160. }
  161. else
  162. {
  163. $ids[] = $result;
  164. }
  165. }
  166. $elapsed = getmicrotime () - $start_time;
  167. echo "Done\n";
  168. echo ' Count: ' . $max . "\n";
  169. echo ' Time: ' . $elapsed . " s\n";
  170. echo ' Average: ' . $elapsed/$max . " s\n\n";
  171. echo "<b>Create AXOs & assign to AXO Groups</b>\n";
  172. flush ();
  173. $start_time = getmicrotime ();
  174. $start = 1;
  175. $max = 1000 * $scale;
  176. // $groups = array_keys ($gacl_api->format_groups ($gacl_api->sort_groups ('AXO'), 'ARRAY'));
  177. $rand_max = count ($groups) - 1;
  178. for ( $i = $start; $i <= $max; $i++ )
  179. {
  180. if ( $gacl_api->add_object ('users', 'AXO: ' . $i, $i, 10, 0, 'AXO') == FALSE )
  181. {
  182. echo " Error creating ARO: $i.<br />\n";
  183. echo ' ' . $gacl_api->_debug_msg . "\n";
  184. }
  185. else
  186. {
  187. // Assign to random groups.
  188. $rand_key = $groups[mt_rand (0, $rand_max)];
  189. $gacl_api->add_group_object ($rand_key, 'users', $i, 'AXO');
  190. }
  191. }
  192. $elapsed = getmicrotime () - $start_time;
  193. echo "Done\n";
  194. echo ' Count: ' . $max . "\n";
  195. echo ' Time: ' . $elapsed . " s\n";
  196. echo ' Average: ' . $elapsed/$max . " s\n\n";
  197. echo "<b>Generate random ACLs now.</b>\n";
  198. flush ();
  199. $start_time = getmicrotime ();
  200. $start = 1;
  201. $max = 10 * $scale;
  202. $aco_list = $gacl_api->get_object ('system', 1, 'ACO');
  203. $query = 'SELECT id, name FROM '.$gacl_api->_db_table_prefix.''. $gacl_.'aro_groups ORDER BY parent_id DESC LIMIT 100';
  204. $rs = $gacl_api->db->Execute($query);
  205. $aro_groups = $rs->GetAssoc();
  206. $query = 'SELECT id, name FROM '.$gacl_api->_db_table_prefix.'axo_groups ORDER BY parent_id DESC LIMIT 100';
  207. $rs = $gacl_api->db->Execute($query);
  208. $axo_groups = $rs->GetAssoc();
  209. // $aro_groups = $gacl_api->format_groups ($gacl_api->sort_groups ('ARO'), 'ARRAY');
  210. print_r ($aro_groups);
  211. // $axo_groups = $gacl_api->format_groups ($gacl_api->sort_groups ('AXO'), 'ARRAY');
  212. print_r ($axo_groups);
  213. for ( $i = $start; $i <= $max; $i++ )
  214. {
  215. $rand_aco_key = array_mt_rand ($aco_list, mt_rand (2, 10));
  216. $rand_aro_key = array_mt_rand ($aro_groups, mt_rand(2,10));
  217. $rand_axo_key = array_mt_rand ($axo_groups, mt_rand(2,10));
  218. $aco_array = array ();
  219. foreach ( $rand_aco_key as $aco_key )
  220. {
  221. $aco_data = $gacl_api->get_object_data ($aco_list[$aco_key], 'ACO');
  222. $aco_array[$aco_data[0][0]][] = $aco_data[0][1];
  223. }
  224. // Randomly create ACLs with AXOs assigned to them.
  225. // if ($i % 2 == 0) {
  226. $axo_array = $rand_axo_key;
  227. // }
  228. if ( $gacl_api->add_acl ($aco_array, NULL, $rand_aro_key, NULL, $axo_array) == FALSE )
  229. {
  230. echo " Error creating ACL: $i.\n";
  231. echo ' ' . $gacl_api->_debug_msg . "\n";
  232. // print_r (array_slice ($gacl_api->_debug_msg, -2));
  233. }
  234. unset ($axo_array);
  235. }
  236. $elapsed = getmicrotime () - $start_time;
  237. echo "Done\n";
  238. echo ' Count: ' . $max . "\n";
  239. echo ' Time: ' . $elapsed . " s\n";
  240. echo ' Average: ' . $elapsed/$max . " s\n\n";
  241. echo "<b>Generating Test Data Set</b>\n";
  242. flush ();
  243. $start_time = getmicrotime ();
  244. $start = 1;
  245. $max = 5 * $scale;
  246. // $max = 1;
  247. $check = array ();
  248. for ( $i = $start; $i <= $max; $i++ )
  249. {
  250. $rand_aco_key = mt_rand (10,10 * $scale);
  251. $rand_aro_key = mt_rand (10,1000 * $scale);
  252. $rand_axo_key = mt_rand (10,1000 * $scale);
  253. // echo ' Rand ACO: '. $rand_aco_key .' ARO: '. $rand_aro_key . ' AXO: ' . $rand_axo_key . "\n";
  254. $aco_data = &$gacl_api->get_object_data ($rand_aco_key, 'ACO');
  255. $aro_data = &$gacl_api->get_object_data ($rand_aro_key, 'ARO');
  256. $axo_data = &$gacl_api->get_object_data ($rand_axo_key, 'AXO');
  257. $check[$i] = array (
  258. 'aco' => $aco_data[0],
  259. 'aro' => $aro_data[0],
  260. 'axo' => $axo_data[0]
  261. );
  262. }
  263. $elapsed = getmicrotime () - $start_time;
  264. echo "Done\n\n";
  265. echo ' Count: ' . $max . "\n";
  266. echo ' Time: ' . $elapsed . " s\n";
  267. echo ' Average: ' . $elapsed/$max . " s\n\n";
  268. echo "<b>Testing...</b>\n";
  269. flush ();
  270. $best = 99999;
  271. $worst = 0;
  272. $total = 0;
  273. foreach ( $check as $i => $data )
  274. {
  275. echo ' Trying: ACO Section: '. $data['aco'][0] .' Value: '. $data['aco'][1] .' ARO Section: '. $data['aro'][0] .' Value: '. $data['aro'][1] . ' ARO Section: '. $data['axo'][0] .' Value: '. $data['axo'][1] . "\n";
  276. $check_start = getmicrotime ();
  277. $allow = $gacl_api->acl_check ($data['aco'][0],$data['aco'][1],$data['aro'][0],$data['aro'][1],$data['axo'][0],$data['axo'][1]);
  278. $check_time = getmicrotime () - $check_start;
  279. if ( $allow ) {
  280. echo '<font color="#00ff00"> ' . $i . ". Access Granted!</font>";
  281. } else {
  282. echo '<font color="#ff0000"> ' . $i . ". Access Denied!</font>";
  283. }
  284. echo ' - ' . $check_time . " s\n";
  285. $best = min ($best, $check_time);
  286. $worst = max ($worst, $check_time);
  287. $total = $total + $check_time;
  288. }
  289. echo "Done\n";
  290. echo ' Count: ' . $max . "\n\n";
  291. echo ' Total: ' . $total . " s\n";
  292. echo ' Average: ' . $total/$max . " s\n\n";
  293. echo ' Best: ' . $best . " s\n";
  294. echo ' Worst: ' . $worst . " s\n\n";
  295. // print_r ($gacl_api->db);
  296. $elapsed = getmicrotime () - $overall_start;
  297. echo '<b>All Finished</b>' . "\n";
  298. echo ' Total Time: ' . $elapsed . " s\n";
  299. /*
  300. * end of script
  301. */
  302. ?>
  303. </pre>
  304. </body>
  305. </html>