TaskManagerTest.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:7k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. # A unit test for TaskManager.
  2. package TaskManagerTest;
  3. use strict;
  4. use Test::More;
  5. use Task;
  6. use Task::Testing;
  7. use TaskManager;
  8. sub start {
  9. print "### Starting TaskManagerTestn";
  10. testStaticMutexes();
  11. testDynamicMutexes();
  12. testImmediateStop();
  13. testDeferredStop();
  14. testMisc();
  15. }
  16. # Test a case in which task mutexes are static (do not change during the task's life time).
  17. sub testStaticMutexes {
  18. my $tm = new TaskManager();
  19. my ($taskA, $taskB, $taskC);
  20. print "Testing case with static mutexes...n";
  21. print "aaan";$tm->add($taskA = createTask(name => "A"));print "bbbn";
  22. $tm->add($taskB = createTask(name => "B"));
  23. $tm->add($taskC = createTask(name => "C"));
  24. $tm->reschedule();
  25. assertActiveTasks($tm, "A,B,C", "Active tasks: A,B,C");
  26. assertInactiveTasks($tm, "", "Inactive tasks: none");
  27. $taskA->markDone();
  28. $taskB->markDone();
  29. $taskC->markDone();
  30. $tm->iterate();
  31. assertActiveTasks($tm, "", "Active tasks: none");
  32. assertInactiveTasks($tm, "", "Inactive tasks: none");
  33. is($tm->countTasksByName('A'), 0);
  34. is($tm->countTasksByName('B'), 0);
  35. is($tm->countTasksByName('C'), 0);
  36. $tm = new TaskManager();
  37. $tm->add($taskA = createTask(name => "A", mutexes => ["1", "2"]));
  38. $tm->add($taskB = createTask(name => "B"));
  39. $tm->add($taskC = createTask(name => "C"));
  40. $tm->reschedule();
  41. assertActiveTasks($tm, "A,B,C", "Active tasks: A,B,C");
  42. assertInactiveTasks($tm, "", "Inactive tasks: none");
  43. is($tm->countTasksByName('A'), 1);
  44. is($tm->countTasksByName('B'), 1);
  45. is($tm->countTasksByName('C'), 1);
  46. $tm = new TaskManager();
  47. $tm->add($taskA = createTask(name => "A", mutexes => ["1", "2"]));
  48. $tm->add($taskB = createTask(name => "B"));
  49. $tm->add($taskC = createTask(name => "C", mutexes => ["2"]));
  50. $tm->reschedule();
  51. assertActiveTasks($tm, "A,B", "Active tasks: A,B");
  52. assertInactiveTasks($tm, "C", "Inactive tasks: C");
  53. $tm = new TaskManager();
  54. $tm->add($taskA = createTask(name => "A", mutexes => ["1", "2"]));
  55. $tm->add($taskB = createTask(name => "B", mutexes => ["1"]));
  56. $tm->add($taskC = createTask(name => "C", mutexes => ["2"], priority => Task::HIGH_PRIORITY));
  57. $tm->reschedule();
  58. assertActiveTasks($tm, "C", "Active tasks: C");
  59. assertInactiveTasks($tm, "A,B", "Inactive tasks: A,B");
  60. is($tm->countTasksByName('A'), 1);
  61. is($tm->countTasksByName('B'), 1);
  62. is($tm->countTasksByName('C'), 1);
  63. is($tm->countTasksByName('D'), 0);
  64. $taskC->markDone();
  65. $tm->iterate();
  66. $tm->reschedule();
  67. assertActiveTasks($tm, "B", "Active tasks: B");
  68. assertInactiveTasks($tm, "A", "Inactive tasks: A");
  69. is($tm->countTasksByName('A'), 1);
  70. is($tm->countTasksByName('B'), 1);
  71. is($tm->countTasksByName('C'), 0);
  72. is($tm->countTasksByName('D'), 0);
  73. $tm->add(createTask(name => "D", mutexes => ["3"]));
  74. $tm->iterate();
  75. assertActiveTasks($tm, "B,D", "Active tasks after setting non-conflicting mutexes: B,D");
  76. assertInactiveTasks($tm, "A", "Inactive tasks: A");
  77. is($tm->countTasksByName('A'), 1);
  78. is($tm->countTasksByName('B'), 1);
  79. is($tm->countTasksByName('C'), 0);
  80. is($tm->countTasksByName('D'), 1);
  81. }
  82. # Test a case in which task mutexes are dynamic (do change during the task's life time).
  83. sub testDynamicMutexes {
  84. print "Testing case with dynamic mutexes...n";
  85. my $tm = new TaskManager();
  86. my $taskA = createTask(name => "A");
  87. my $taskB = createTask(name => "B");
  88. my $taskC = createTask(name => "C");
  89. $tm->add($taskA);
  90. $tm->add($taskB);
  91. $tm->add($taskC);
  92. $tm->iterate();
  93. assertActiveTasks($tm, "A,B,C", "Active tasks: A,B,C");
  94. assertInactiveTasks($tm, "", "Inactive tasks: none");
  95. $taskA->setMutexes("1", "2");
  96. $tm->iterate();
  97. assertActiveTasks($tm, "A,B,C", "Active tasks after setting mutexes {1,2} for A: A,B,C");
  98. assertInactiveTasks($tm, "", "Inactive tasks: none");
  99. $taskC->setMutexes("2");
  100. $tm->iterate();
  101. assertActiveTasks($tm, "A,B", "Active tasks after setting mutex {2} for C: A,B");
  102. assertInactiveTasks($tm, "C", "Inactive tasks: C");
  103. $taskC->setMutexes();
  104. $tm->iterate();
  105. assertActiveTasks($tm, "A,B,C", "Active tasks after removing mutex from C: A,B,C");
  106. assertInactiveTasks($tm, "", "Inactive tasks: none");
  107. $taskB->setMutexes("3", "4");
  108. $tm->iterate();
  109. assertActiveTasks($tm, "A,B,C", "Active tasks after setting non-conflicting mutexes: A,B,C");
  110. assertInactiveTasks($tm, "", "Inactive tasks: none");
  111. $tm->add(createTask(name => "D", mutexes => ["1", "2", "3"], priority => Task::HIGH_PRIORITY));
  112. $tm->iterate();
  113. assertActiveTasks($tm, "C,D");
  114. assertInactiveTasks($tm, "A,B");
  115. $taskC->setMutexes('3');
  116. $taskC->setMutexes();
  117. $tm->iterate();
  118. assertActiveTasks($tm, "C,D");
  119. assertInactiveTasks($tm, "A,B");
  120. }
  121. # Test stopping of tasks that can stop immediately.
  122. sub testImmediateStop {
  123. print "Testing immediate stopping of tasks...n";
  124. my $tm = new TaskManager();
  125. my $taskA = createTask(name => "A");
  126. my $taskB = createTask(name => "B");
  127. my $taskC = createTask(name => "C");
  128. $tm->add($taskA);
  129. $tm->add($taskB);
  130. $tm->add($taskC);
  131. $tm->iterate();
  132. $taskB->stop();
  133. $tm->iterate();
  134. assertActiveTasks($tm, "A,C", "Stopping task B works.");
  135. assertInactiveTasks($tm, "");
  136. $taskA->stop();
  137. $taskC->stop();
  138. $tm->iterate();
  139. assertActiveTasks($tm, "", "Stopping task A and C works.");
  140. assertInactiveTasks($tm, "");
  141. $taskA = createTask(name => "A", mutexes => ['1', '2']);
  142. $taskB = createTask(name => "B", mutexes => ['2']);
  143. $tm->add($taskA);
  144. $tm->add($taskB);
  145. $tm->iterate();
  146. assertActiveTasks($tm, "A", "A is active.");
  147. assertInactiveTasks($tm, "B", "B is inactive.");
  148. $tm->stopAll();
  149. $tm->iterate();
  150. assertActiveTasks($tm, "", "Stopping active A and inactive B works.");
  151. assertInactiveTasks($tm, "");
  152. }
  153. # Test stopping of tasks that do not immediately stop.
  154. sub testDeferredStop {
  155. print "Testing deferred stopping of tasks...n";
  156. my $tm = new TaskManager();
  157. my $taskA = createTask(name => "A", mutexes => ['1', '2']);
  158. my $taskB = createTask(name => "B", mutexes => ['1'], autostop => 0);
  159. $tm->add($taskA);
  160. $tm->add($taskB);
  161. $tm->iterate();
  162. $tm->stopAll();
  163. $tm->iterate();
  164. assertActiveTasks($tm, "", "A is stopped.");
  165. assertInactiveTasks($tm, "B", "B is still inactive.");
  166. is($taskB->getStatus(), Task::INACTIVE, "B's status is INACTIVE.");
  167. $taskB->setStopped();
  168. $tm->iterate();
  169. assertActiveTasks($tm, "", "A and B are stopped.");
  170. assertInactiveTasks($tm, "");
  171. is($taskB->getStatus(), Task::STOPPED);
  172. }
  173. sub testMisc {
  174. my $tm = new TaskManager();
  175. my $taskA = createTask(name => "A");
  176. $tm->add($taskA);
  177. $tm->iterate();
  178. is($tm->activeMutexesString(), "", "No mutexes are active.");
  179. $taskA->setMutexes("movement");
  180. $tm->iterate();
  181. is($tm->activeMutexesString(), "movement (<- A)", "The 'movement' mutex is active.");
  182. $taskA->setMutexes();
  183. $tm->iterate();
  184. is($tm->activeMutexesString(), "", "No mutexes are active.");
  185. $tm->stopAll();
  186. $tm->iterate();
  187. is($tm->activeMutexesString(), "", "No mutexes are active.");
  188. $taskA = createTask(name => "A");
  189. my $taskB = createTask(name => "B");
  190. }
  191. ##########################
  192. sub createTask {
  193. return new Task::Testing(@_);
  194. }
  195. sub assertActiveTasks {
  196. my ($taskManager, $tasksString, $diagnostics) = @_;
  197. my @names;
  198. foreach my $task (@{$taskManager->{activeTasks}}) {
  199. push @names, $task->getName();
  200. }
  201. @names = sort @names;
  202. is(join(',', @names), $tasksString, $diagnostics);
  203. }
  204. sub assertInactiveTasks {
  205. my ($taskManager, $tasksString, $diagnostics) = @_;
  206. my @names;
  207. foreach my $task (@{$taskManager->{inactiveTasks}}) {
  208. push @names, $task->getName();
  209. }
  210. @names = sort @names;
  211. is(join(',', @names), $tasksString, $diagnostics);
  212. }
  213. 1;