/test/TestCommon.php

https://github.com/apinstein/jqjobs · PHP · 204 lines · 173 code · 24 blank · 7 comment · 2 complexity · 0b6be1158c7f81cbb431458bd0d1715a MD5 · raw file

  1. <?php
  2. require_once dirname(__FILE__) . '/../src/JQJobs/JQJobs.php';
  3. const JQJOB_ID_DOES_NOT_EXIST = 999999;
  4. $composerAutoloader = dirname(__FILE__) . '/../vendor/autoload.php';
  5. if (file_exists($composerAutoloader))
  6. {
  7. ini_set('include_path', dirname(__FILE__) . "/../lib/propel");
  8. require_once $composerAutoloader;
  9. }
  10. else
  11. {
  12. ini_set('include_path',
  13. dirname(__FILE__) . "/../externals/pear/php"
  14. . ":" . dirname(__FILE__) . "/../lib/propel"
  15. );
  16. require_once 'propel/Propel.php';
  17. }
  18. class JQJobs_TestHelper
  19. {
  20. /**
  21. * Utility function to help bootstrap states for testing.
  22. */
  23. public static function moveJobToStatus($mJob, $targetStatus)
  24. {
  25. // map on how to bootstrap a job to the "FROM" state
  26. $pathForSetup = array(
  27. JQManagedJob::STATUS_UNQUEUED => array(),
  28. JQManagedJob::STATUS_QUEUED => array(JQManagedJob::STATUS_QUEUED),
  29. JQManagedJob::STATUS_RUNNING => array(JQManagedJob::STATUS_QUEUED, JQManagedJob::STATUS_RUNNING),
  30. JQManagedJob::STATUS_WAIT_ASYNC => array(JQManagedJob::STATUS_QUEUED, JQManagedJob::STATUS_RUNNING, JQManagedJob::STATUS_WAIT_ASYNC),
  31. JQManagedJob::STATUS_COMPLETED => array(JQManagedJob::STATUS_QUEUED, JQManagedJob::STATUS_RUNNING, JQManagedJob::STATUS_COMPLETED),
  32. JQManagedJob::STATUS_FAILED => array(JQManagedJob::STATUS_QUEUED, JQManagedJob::STATUS_RUNNING, JQManagedJob::STATUS_FAILED),
  33. );
  34. foreach ($pathForSetup[$targetStatus] as $s) {
  35. $mJob->setStatus($s);
  36. }
  37. }
  38. }
  39. Propel::init(dirname(__FILE__) . "/../lib/propel/jqjobs-conf.php");
  40. /************** JQStore_Propel Genterator (TEST DB) ********************/
  41. function getTestJQStore()
  42. {
  43. return new JQStore_Propel('JQStoreManagedJob', Propel::getConnection(JQStoreManagedJobPeer::DATABASE_NAME));
  44. }
  45. /************** TEST JOBS ****************/
  46. // A simple no-op job that uses a test queue for other test jobs to override
  47. class JQTestJob implements JQJob
  48. {
  49. private $enqueueOptions = array(
  50. 'priority' => 0,
  51. 'maxAttempts' => 1,
  52. 'queueName' => 'test',
  53. );
  54. function __construct($enqueueOptions = array())
  55. {
  56. $this->setEnqueueOptions( $enqueueOptions );
  57. }
  58. function getEnqueueOptions() { return $this->enqueueOptions; }
  59. function setEnqueueOption($key, $value)
  60. {
  61. $this->setEnqueueOptions( array($key => $value) );
  62. }
  63. function setEnqueueOptions($newOptions)
  64. {
  65. $this->enqueueOptions = array_merge( $this->enqueueOptions, $newOptions );
  66. }
  67. function run(JQManagedJob $mJob) { return JQManagedJob::STATUS_COMPLETED; }
  68. function cleanup() { }
  69. function coalesceId() { }
  70. function statusDidChange(JQManagedJob $mJob, $oldStatus, $message) { }
  71. function description() { }
  72. }
  73. class ConcurrencyTestJob extends JQTestJob
  74. {
  75. protected $jobId;
  76. function __construct($jobid)
  77. {
  78. $this->jobId = $jobid;
  79. parent::__construct( array('queueName' => 'concurrency-test') );
  80. }
  81. function run(JQManagedJob $mJob)
  82. {
  83. print "running job {$this->jobId}";
  84. return JQManagedJob::STATUS_COMPLETED;
  85. }
  86. function description() { return "job {$this->jobId}"; }
  87. }
  88. class QuietSimpleJob extends JQTestJob
  89. {
  90. protected $job;
  91. function __construct($jobid, $enqueueOptions=array())
  92. {
  93. parent::__construct($enqueueOptions);
  94. $this->job=$jobid;
  95. }
  96. function run(JQManagedJob $mJob) { return JQManagedJob::STATUS_COMPLETED; }
  97. function description() { return "job {$this->job}"; }
  98. }
  99. class SampleJobCounter
  100. {
  101. private static $counter = 0;
  102. public static function reset() { self::$counter = 0; }
  103. public static function count() { return self::$counter; }
  104. public static function increment() { self::$counter++; }
  105. }
  106. class SampleJob extends JQTestJob
  107. {
  108. function run(JQManagedJob $mJob) // no-op
  109. {
  110. SampleJobCounter::increment();
  111. return JQManagedJob::STATUS_COMPLETED;
  112. }
  113. function description() { return "Sample job"; }
  114. }
  115. class SampleCoalescingJob extends SampleJob
  116. {
  117. function __construct($id)
  118. {
  119. $this->id = $id;
  120. parent::__construct();
  121. }
  122. function run(JQManagedJob $mJob) { return JQManagedJob::STATUS_COMPLETED; }
  123. function coalesceId() { return $this->id; }
  124. function description() { return "Coalescing job {$this->id}"; }
  125. }
  126. class SampleFailJob extends JQTestJob
  127. {
  128. function __construct($enqueueOptions = array())
  129. {
  130. parent::__construct($enqueueOptions);
  131. }
  132. function run(JQManagedJob $mJob)
  133. {
  134. trigger_error("something went boom", E_USER_ERROR);
  135. return JQManagedJob::STATUS_FAILED;
  136. }
  137. function description() { return "Sample FAIL job"; }
  138. }
  139. class SampleLoggingJob extends JQTestJob
  140. {
  141. function run(JQManagedJob $mJob) { return JQManagedJob::STATUS_COMPLETED; }
  142. function statusDidChange(JQManagedJob $mJob, $oldStatus, $message)
  143. {
  144. print "Status change: {$oldStatus} => {$mJob->getStatus()}\n";
  145. }
  146. function description() { return "Sample logging job"; }
  147. }
  148. class SampleCallbackJob extends JQTestJob
  149. {
  150. function __construct($callback) { $this->callback = $callback; }
  151. function run(JQManagedJob $mJob) { return call_user_func($this->callback); }
  152. function description() { return "Sample callback job"; }
  153. }
  154. class SampleAsyncJob extends JQTestJob
  155. {
  156. function __construct($info, $enqueueOptions = array())
  157. {
  158. $this->info = $info;
  159. parent::__construct($enqueueOptions);
  160. }
  161. function run(JQManagedJob $mJob) { return JQManagedJob::STATUS_WAIT_ASYNC; }
  162. function resolveWaitAsyncJob($goToState)
  163. {
  164. if ($goToState === 'SampleAsyncJob_ResolveException') throw new SampleAsyncJob_ResolveException();
  165. return $goToState;
  166. }
  167. function description() { return "Sample async job"; }
  168. }
  169. class SampleAsyncJob_ResolveException extends Exception {}
  170. class SampleExceptionalUnserializerJob extends JQTestJob
  171. {
  172. public $data = NULL;
  173. function __construct($someData) {
  174. $this->data = $someData;
  175. parent::__construct();
  176. }
  177. function run(JQManagedJob $mJob) { return JQManagedJob::STATUS_WAIT_ASYNC; }
  178. function description() { return "I throw an exception when unserialized."; }
  179. function __wakeup() { throw new Exception("__wakeup failed"); }
  180. }