roby 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. data/History.txt +7 -5
  2. data/Manifest.txt +91 -16
  3. data/README.txt +24 -24
  4. data/Rakefile +92 -64
  5. data/app/config/app.yml +42 -43
  6. data/app/config/init.rb +26 -0
  7. data/benchmark/alloc_misc.rb +123 -0
  8. data/benchmark/discovery_latency.rb +67 -0
  9. data/benchmark/garbage_collection.rb +48 -0
  10. data/benchmark/genom.rb +31 -0
  11. data/benchmark/transactions.rb +62 -0
  12. data/bin/roby +1 -1
  13. data/bin/roby-log +16 -6
  14. data/doc/guide/.gitignore +2 -0
  15. data/doc/guide/config.yaml +34 -0
  16. data/doc/guide/ext/init.rb +14 -0
  17. data/doc/guide/ext/previous_next.rb +40 -0
  18. data/doc/guide/ext/rdoc_links.rb +33 -0
  19. data/doc/guide/index.rdoc +16 -0
  20. data/doc/guide/overview.rdoc +62 -0
  21. data/doc/guide/plan_modifications.rdoc +67 -0
  22. data/doc/guide/src/abstraction/achieve_with.page +8 -0
  23. data/doc/guide/src/abstraction/forwarding.page +8 -0
  24. data/doc/guide/src/abstraction/hierarchy.page +19 -0
  25. data/doc/guide/src/abstraction/index.page +28 -0
  26. data/doc/guide/src/abstraction/task_models.page +13 -0
  27. data/doc/guide/src/basics.template +6 -0
  28. data/doc/guide/src/basics/app.page +139 -0
  29. data/doc/guide/src/basics/code_examples.page +33 -0
  30. data/doc/guide/src/basics/dry.page +69 -0
  31. data/doc/guide/src/basics/errors.page +443 -0
  32. data/doc/guide/src/basics/events.page +179 -0
  33. data/doc/guide/src/basics/hierarchy.page +275 -0
  34. data/doc/guide/src/basics/index.page +11 -0
  35. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  36. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  37. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  38. data/doc/guide/src/basics/log_replay/goForward_4.png +0 -0
  39. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  40. data/doc/guide/src/basics/log_replay/hierarchy_error_1.png +0 -0
  41. data/doc/guide/src/basics/log_replay/hierarchy_error_2.png +0 -0
  42. data/doc/guide/src/basics/log_replay/hierarchy_error_3.png +0 -0
  43. data/doc/guide/src/basics/log_replay/plan_repair_1.png +0 -0
  44. data/doc/guide/src/basics/log_replay/plan_repair_2.png +0 -0
  45. data/doc/guide/src/basics/log_replay/plan_repair_3.png +0 -0
  46. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  47. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  48. data/doc/guide/src/basics/log_replay/roby_log_relation_window.png +0 -0
  49. data/doc/guide/src/basics/log_replay/roby_replay_event_representation.png +0 -0
  50. data/doc/guide/src/basics/plan_objects.page +71 -0
  51. data/doc/guide/src/basics/relations_display.page +203 -0
  52. data/doc/guide/src/basics/roby_cycle_overview.png +0 -0
  53. data/doc/guide/src/basics/shell.page +102 -0
  54. data/doc/guide/src/basics/summary.page +32 -0
  55. data/doc/guide/src/basics/tasks.page +357 -0
  56. data/doc/guide/src/basics_shell_header.txt +16 -0
  57. data/doc/guide/src/cycle/cycle-overview.png +0 -0
  58. data/doc/guide/src/cycle/cycle-overview.svg +208 -0
  59. data/doc/guide/src/cycle/error_handling.page +168 -0
  60. data/doc/guide/src/cycle/error_instantaneous_repair.png +0 -0
  61. data/doc/guide/src/cycle/error_instantaneous_repair.svg +1224 -0
  62. data/doc/guide/src/cycle/garbage_collection.page +10 -0
  63. data/doc/guide/src/cycle/index.page +23 -0
  64. data/doc/guide/src/cycle/propagation.page +154 -0
  65. data/doc/guide/src/cycle/propagation_diamond.png +0 -0
  66. data/doc/guide/src/cycle/propagation_diamond.svg +1279 -0
  67. data/doc/guide/src/default.css +319 -0
  68. data/doc/guide/src/default.template +74 -0
  69. data/doc/guide/src/htmldoc.metainfo +20 -0
  70. data/doc/guide/src/htmldoc.virtual +18 -0
  71. data/doc/guide/src/images/bodybg.png +0 -0
  72. data/doc/guide/src/images/contbg.png +0 -0
  73. data/doc/guide/src/images/footerbg.png +0 -0
  74. data/doc/guide/src/images/gradient1.png +0 -0
  75. data/doc/guide/src/images/gradient2.png +0 -0
  76. data/doc/guide/src/index.page +7 -0
  77. data/doc/guide/src/introduction/index.page +29 -0
  78. data/doc/guide/src/introduction/install.page +133 -0
  79. data/doc/{papers.rdoc → guide/src/introduction/publications.page} +5 -2
  80. data/doc/{videos.rdoc → guide/src/introduction/videos.page} +4 -2
  81. data/doc/guide/src/plugins/fault_tolerance.page +44 -0
  82. data/doc/guide/src/plugins/index.page +11 -0
  83. data/doc/guide/src/plugins/subsystems.page +45 -0
  84. data/doc/guide/src/relations/dependency.page +89 -0
  85. data/doc/guide/src/relations/index.page +12 -0
  86. data/doc/misc/update_github +24 -0
  87. data/doc/tutorials/02-GoForward.rdoc +3 -3
  88. data/ext/graph/graph.cc +46 -0
  89. data/lib/roby.rb +57 -22
  90. data/lib/roby/app.rb +132 -112
  91. data/lib/roby/app/plugins/rake.rb +21 -0
  92. data/lib/roby/app/rake.rb +0 -7
  93. data/lib/roby/app/run.rb +1 -1
  94. data/lib/roby/app/scripts/distributed.rb +1 -2
  95. data/lib/roby/app/scripts/generate/bookmarks.rb +1 -1
  96. data/lib/roby/app/scripts/results.rb +2 -1
  97. data/lib/roby/app/scripts/run.rb +6 -2
  98. data/lib/roby/app/scripts/shell.rb +11 -11
  99. data/lib/roby/config.rb +1 -1
  100. data/lib/roby/decision_control.rb +62 -3
  101. data/lib/roby/distributed.rb +4 -0
  102. data/lib/roby/distributed/base.rb +8 -0
  103. data/lib/roby/distributed/communication.rb +12 -8
  104. data/lib/roby/distributed/connection_space.rb +61 -44
  105. data/lib/roby/distributed/distributed_object.rb +1 -1
  106. data/lib/roby/distributed/notifications.rb +22 -30
  107. data/lib/roby/distributed/peer.rb +13 -8
  108. data/lib/roby/distributed/proxy.rb +5 -5
  109. data/lib/roby/distributed/subscription.rb +4 -4
  110. data/lib/roby/distributed/transaction.rb +3 -3
  111. data/lib/roby/event.rb +176 -110
  112. data/lib/roby/exceptions.rb +12 -4
  113. data/lib/roby/execution_engine.rb +1604 -0
  114. data/lib/roby/external_process_task.rb +225 -0
  115. data/lib/roby/graph.rb +0 -6
  116. data/lib/roby/interface.rb +221 -137
  117. data/lib/roby/log/console.rb +5 -3
  118. data/lib/roby/log/data_stream.rb +94 -16
  119. data/lib/roby/log/dot.rb +8 -8
  120. data/lib/roby/log/event_stream.rb +13 -3
  121. data/lib/roby/log/file.rb +43 -18
  122. data/lib/roby/log/gui/basic_display_ui.rb +89 -0
  123. data/lib/roby/log/gui/chronicle_view_ui.rb +90 -0
  124. data/lib/roby/log/gui/data_displays.rb +4 -5
  125. data/lib/roby/log/gui/data_displays_ui.rb +146 -0
  126. data/lib/roby/log/gui/relations.rb +18 -18
  127. data/lib/roby/log/gui/relations_ui.rb +120 -0
  128. data/lib/roby/log/gui/relations_view_ui.rb +144 -0
  129. data/lib/roby/log/gui/replay.rb +41 -13
  130. data/lib/roby/log/gui/replay_controls.rb +3 -0
  131. data/lib/roby/log/gui/replay_controls.ui +133 -110
  132. data/lib/roby/log/gui/replay_controls_ui.rb +249 -0
  133. data/lib/roby/log/hooks.rb +19 -18
  134. data/lib/roby/log/logger.rb +7 -6
  135. data/lib/roby/log/notifications.rb +4 -4
  136. data/lib/roby/log/plan_rebuilder.rb +20 -22
  137. data/lib/roby/log/relations.rb +44 -16
  138. data/lib/roby/log/server.rb +1 -4
  139. data/lib/roby/log/timings.rb +88 -19
  140. data/lib/roby/plan-object.rb +135 -11
  141. data/lib/roby/plan.rb +408 -224
  142. data/lib/roby/planning/loops.rb +32 -25
  143. data/lib/roby/planning/model.rb +157 -51
  144. data/lib/roby/planning/task.rb +47 -20
  145. data/lib/roby/query.rb +128 -92
  146. data/lib/roby/relations.rb +254 -136
  147. data/lib/roby/relations/conflicts.rb +6 -9
  148. data/lib/roby/relations/dependency.rb +358 -0
  149. data/lib/roby/relations/ensured.rb +0 -1
  150. data/lib/roby/relations/error_handling.rb +0 -1
  151. data/lib/roby/relations/events.rb +0 -2
  152. data/lib/roby/relations/executed_by.rb +26 -11
  153. data/lib/roby/relations/planned_by.rb +14 -14
  154. data/lib/roby/robot.rb +46 -0
  155. data/lib/roby/schedulers/basic.rb +34 -0
  156. data/lib/roby/standalone.rb +4 -0
  157. data/lib/roby/standard_errors.rb +21 -15
  158. data/lib/roby/state/events.rb +5 -4
  159. data/lib/roby/support.rb +107 -6
  160. data/lib/roby/task-operations.rb +23 -19
  161. data/lib/roby/task.rb +522 -148
  162. data/lib/roby/task_index.rb +80 -0
  163. data/lib/roby/test/common.rb +283 -44
  164. data/lib/roby/test/distributed.rb +53 -37
  165. data/lib/roby/test/testcase.rb +9 -204
  166. data/lib/roby/test/tools.rb +3 -3
  167. data/lib/roby/transactions.rb +154 -111
  168. data/lib/roby/transactions/proxy.rb +40 -7
  169. data/manifest.xml +20 -0
  170. data/plugins/fault_injection/README.txt +0 -3
  171. data/plugins/fault_injection/Rakefile +2 -8
  172. data/plugins/fault_injection/app.rb +1 -1
  173. data/plugins/fault_injection/fault_injection.rb +3 -3
  174. data/plugins/fault_injection/test/test_fault_injection.rb +19 -25
  175. data/plugins/subsystems/README.txt +0 -3
  176. data/plugins/subsystems/Rakefile +2 -7
  177. data/plugins/subsystems/app.rb +27 -16
  178. data/plugins/subsystems/test/app/config/init.rb +3 -0
  179. data/plugins/subsystems/test/app/planners/main.rb +1 -1
  180. data/plugins/subsystems/test/app/tasks/services.rb +1 -1
  181. data/plugins/subsystems/test/test_subsystems.rb +23 -16
  182. data/test/distributed/test_communication.rb +32 -15
  183. data/test/distributed/test_connection.rb +28 -26
  184. data/test/distributed/test_execution.rb +59 -54
  185. data/test/distributed/test_mixed_plan.rb +34 -34
  186. data/test/distributed/test_plan_notifications.rb +26 -26
  187. data/test/distributed/test_protocol.rb +57 -48
  188. data/test/distributed/test_query.rb +11 -7
  189. data/test/distributed/test_remote_plan.rb +71 -71
  190. data/test/distributed/test_transaction.rb +50 -47
  191. data/test/mockups/external_process +28 -0
  192. data/test/planning/test_loops.rb +163 -119
  193. data/test/planning/test_model.rb +3 -3
  194. data/test/planning/test_task.rb +27 -7
  195. data/test/relations/test_conflicts.rb +3 -3
  196. data/test/relations/test_dependency.rb +324 -0
  197. data/test/relations/test_ensured.rb +2 -2
  198. data/test/relations/test_executed_by.rb +94 -19
  199. data/test/relations/test_planned_by.rb +11 -9
  200. data/test/suite_core.rb +6 -3
  201. data/test/suite_distributed.rb +1 -0
  202. data/test/suite_planning.rb +1 -0
  203. data/test/suite_relations.rb +2 -2
  204. data/test/tasks/test_external_process.rb +126 -0
  205. data/test/{test_thread_task.rb → tasks/test_thread_task.rb} +17 -20
  206. data/test/test_bgl.rb +21 -1
  207. data/test/test_event.rb +229 -155
  208. data/test/test_exceptions.rb +79 -80
  209. data/test/test_execution_engine.rb +987 -0
  210. data/test/test_gui.rb +1 -1
  211. data/test/test_interface.rb +11 -5
  212. data/test/test_log.rb +18 -7
  213. data/test/test_log_server.rb +1 -0
  214. data/test/test_plan.rb +229 -395
  215. data/test/test_query.rb +193 -35
  216. data/test/test_relations.rb +88 -8
  217. data/test/test_state.rb +55 -37
  218. data/test/test_support.rb +1 -1
  219. data/test/test_task.rb +371 -218
  220. data/test/test_testcase.rb +32 -16
  221. data/test/test_transactions.rb +211 -170
  222. data/test/test_transactions_proxy.rb +37 -19
  223. metadata +169 -71
  224. data/.gitignore +0 -29
  225. data/doc/styles/allison.css +0 -314
  226. data/doc/styles/allison.js +0 -316
  227. data/doc/styles/allison.rb +0 -276
  228. data/doc/styles/jamis.rb +0 -593
  229. data/lib/roby/control.rb +0 -746
  230. data/lib/roby/executives/simple.rb +0 -30
  231. data/lib/roby/propagation.rb +0 -562
  232. data/lib/roby/relations/hierarchy.rb +0 -239
  233. data/lib/roby/transactions/updates.rb +0 -139
  234. data/test/relations/test_hierarchy.rb +0 -158
  235. data/test/test_control.rb +0 -399
  236. data/test/test_propagation.rb +0 -210
@@ -1,4 +1,4 @@
1
- $LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
1
+ $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
2
  require 'roby/test/common'
3
3
  require 'roby/test/testcase'
4
4
  require 'roby/test/tasks/simple_task'
@@ -7,9 +7,25 @@ require 'flexmock'
7
7
  class TC_Test_TestCase < Test::Unit::TestCase
8
8
  include Roby::Test
9
9
  include Roby::Test::Assertions
10
+
11
+ def setup
12
+ Roby.app.setup_global_singletons
13
+
14
+ Roby.engine.at_cycle_end(&Test.method(:check_event_assertions))
15
+ Roby.engine.finalizers << Test.method(:finalize_event_assertions)
16
+ @plan = Roby.plan
17
+ @control = Roby.control
18
+ @engine = Roby.engine
19
+ super
20
+ end
21
+ def teardown
22
+ Roby.engine.at_cycle_end_handlers.delete(Test.method(:check_event_assertions))
23
+ Roby.engine.finalizers.delete(Test.method(:finalize_event_assertions))
24
+ super
25
+ end
10
26
 
11
27
  def test_assert_any_event
12
- plan.discover(t = SimpleTask.new)
28
+ plan.add(t = SimpleTask.new)
13
29
  t.start!
14
30
  assert_nothing_raised do
15
31
  assert_any_event(t.event(:start))
@@ -21,7 +37,7 @@ class TC_Test_TestCase < Test::Unit::TestCase
21
37
  assert_any_event([t.event(:success)], [t.event(:stop)])
22
38
  end
23
39
 
24
- plan.discover(t = SimpleTask.new)
40
+ plan.add(t = SimpleTask.new)
25
41
  t.start!
26
42
  t.failed!
27
43
  assert_raises(Test::Unit::AssertionFailedError) do
@@ -29,15 +45,15 @@ class TC_Test_TestCase < Test::Unit::TestCase
29
45
  end
30
46
 
31
47
  Roby.logger.level = Logger::FATAL
32
- Roby.control.run :detach => true
33
- plan.insert(t = SimpleTask.new)
48
+ Robot.logger.level = Logger::FATAL
49
+ engine.run
50
+ plan.add_permanent(t = SimpleTask.new)
34
51
  assert_any_event(t.event(:success)) do
35
52
  t.start!
36
53
  t.success!
37
54
  end
38
55
 
39
- # Make control quit and check that we get ControlQuitError
40
- plan.insert(t = SimpleTask.new)
56
+ plan.add_permanent(t = SimpleTask.new)
41
57
  assert_raises(Test::Unit::AssertionFailedError) do
42
58
  assert_any_event(t.event(:success)) do
43
59
  t.start!
@@ -47,8 +63,7 @@ class TC_Test_TestCase < Test::Unit::TestCase
47
63
 
48
64
  ## Same test, but check that the assertion succeeds since we *are*
49
65
  ## checking that +failed+ happens
50
- Roby.control.run :detach => true
51
- plan.insert(t = SimpleTask.new)
66
+ plan.add_permanent(t = SimpleTask.new)
52
67
  assert_nothing_raised do
53
68
  assert_any_event(t.event(:failed)) do
54
69
  t.start!
@@ -58,7 +73,7 @@ class TC_Test_TestCase < Test::Unit::TestCase
58
73
  end
59
74
 
60
75
  def test_assert_succeeds
61
- Roby.control.run :detach => true
76
+ engine.run
62
77
 
63
78
  task = Class.new(SimpleTask) do
64
79
  forward :start => :success
@@ -76,12 +91,13 @@ class TC_Test_TestCase < Test::Unit::TestCase
76
91
  end
77
92
 
78
93
  def test_sampling
79
- Roby.control.run :cycle => 0.1, :detach => true
94
+ engine.run
80
95
 
81
96
  i = 0
97
+ # Sampling of 1s, every 100ms (== 1 cycle)
82
98
  samples = Roby::Test.sampling(1, 0.1, :time_test, :index, :dummy) do
83
99
  i += 1
84
- [Roby.control.cycle_start, rand / 10 - 0.05 + i, rand / 10 + 0.95]
100
+ [engine.cycle_start, i + rand / 10 - 0.05, rand / 10 + 0.95]
85
101
  end
86
102
  cur_size = samples.size
87
103
 
@@ -106,17 +122,17 @@ class TC_Test_TestCase < Test::Unit::TestCase
106
122
  samples = test_sampling
107
123
  stats = Roby::Test.stats(samples, :dummy => :absolute)
108
124
  assert_in_delta(1, stats.index.mean, 0.05)
109
- assert_in_delta(0.025, stats.index.stddev, 0.026)
125
+ assert_in_delta(0.025, stats.index.stddev, 0.1)
110
126
  assert_in_delta(1, stats.dummy.mean, 0.05)
111
- assert_in_delta(0.025, stats.dummy.stddev, 0.026)
127
+ assert_in_delta(0.025, stats.dummy.stddev, 0.1)
112
128
  assert_in_delta(0.1, stats.dt.mean, 0.001, stats.dt)
113
129
  assert_in_delta(0, stats.dt.stddev, 0.001)
114
130
 
115
131
  stats = Roby::Test.stats(samples, :index => :rate, :dummy => :absolute_rate)
116
132
  assert_in_delta(10, stats.index.mean, 1)
117
- assert_in_delta(0.25, stats.index.stddev, 0.25)
133
+ assert_in_delta(0.25, stats.index.stddev, 0.5)
118
134
  assert_in_delta(10, stats.dummy.mean, 1)
119
- assert_in_delta(0.25, stats.dummy.stddev, 0.25)
135
+ assert_in_delta(0.25, stats.dummy.stddev, 0.5)
120
136
  end
121
137
  end
122
138
 
@@ -1,20 +1,23 @@
1
- $LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
1
+ $LOAD_PATH.unshift File.expand_path('.', File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
3
  require 'roby/test/common'
3
4
  require 'roby/test/tasks/simple_task'
4
5
  require 'flexmock'
5
6
 
6
- require 'test/test_plan'
7
+ require 'test_plan'
7
8
 
8
9
  # Check that a transaction behaves like a plan
9
10
  class TC_TransactionAsPlan < Test::Unit::TestCase
10
11
  include TC_PlanStatic
11
12
  include Roby::Test
12
13
 
13
- alias :real_plan :plan
14
+ attr_reader :real_plan
14
15
  attr_reader :plan
16
+ def engine; (real_plan || plan).engine end
15
17
  def setup
16
- @plan = Transaction.new(real_plan)
17
18
  super
19
+ @real_plan = @plan
20
+ @plan = Transaction.new(real_plan)
18
21
  end
19
22
  def teardown
20
23
  @plan.discard_transaction
@@ -33,10 +36,84 @@ module TC_TransactionBehaviour
33
36
 
34
37
  SimpleTask = Roby::Test::SimpleTask
35
38
 
39
+ def test_proxy_creation
40
+ plan.add(t = SimpleTask.new)
41
+ transaction_commit(plan) do |trsc|
42
+ assert !trsc[t, false]
43
+ assert trsc.known_tasks.empty?
44
+
45
+ assert(proxy = trsc[t, true])
46
+ assert(trsc.include?(proxy))
47
+ assert_same(proxy, trsc[t, false])
48
+ end
49
+ end
50
+
51
+ def test_remove_object
52
+ plan.add(t = SimpleTask.new)
53
+ transaction_commit(plan, t) do |trsc, p|
54
+ trsc.remove_object(p)
55
+ assert_same(nil, trsc[t, false])
56
+ assert(!trsc.include?(p))
57
+ end
58
+
59
+ t1, t2, t3 = prepare_plan :missions => 1, :add => 1, :tasks => 1
60
+ t1.depends_on t2
61
+ transaction_commit(plan, t1, t2) do |trsc, p1, p2|
62
+ p1.depends_on(t3)
63
+ trsc.remove_object(p1)
64
+ end
65
+ assert(plan.include?(t1))
66
+ assert_equal([t2], t1.children.to_a)
67
+
68
+ t3 = SimpleTask.new
69
+ transaction_commit(plan, t1, t2) do |trsc, p1, p2|
70
+ p1.depends_on t3
71
+ p1.remove_child p2
72
+ trsc.remove_object(p1)
73
+ end
74
+ assert(plan.include?(t1))
75
+ assert_equal([t2], t1.children.to_a)
76
+ end
77
+
78
+ def test_add_tasks_from_plan
79
+ plan.add(t = SimpleTask.new)
80
+ transaction_commit(plan) do |trsc|
81
+ assert_raises(Roby::ModelViolation) { trsc.add(t) }
82
+ end
83
+ end
84
+
85
+ def test_object_transaction_stack
86
+ plan.add(t = SimpleTask.new)
87
+ transaction_commit(plan, t) do |trsc1, p1|
88
+ assert_equal([trsc1, plan], p1.transaction_stack)
89
+ transaction_commit(trsc1, p1) do |trsc2, p2|
90
+ assert_equal([trsc2, trsc1, plan], p2.transaction_stack)
91
+ end
92
+ end
93
+ end
94
+
95
+ def test_merged_relations
96
+ t1, t2, t3 = prepare_plan :add => 3
97
+ t1.depends_on t2
98
+ t2.depends_on t3
99
+
100
+ transaction_commit(plan, t2) do |trsc, p2|
101
+ assert_equal [t1], p2.merged_relations(:each_parent_task, true).map(&:__getobj__)
102
+ assert_equal [t3], p2.merged_relations(:each_child, true).map(&:__getobj__)
103
+ end
104
+
105
+ transaction_commit(plan, t2) do |trsc, p2|
106
+ assert_equal [[t2, t1]], p2.merged_relations(:each_parent_task, false).to_a
107
+ assert_equal [[t2, t3]], p2.merged_relations(:each_child, false).to_a
108
+ assert !trsc[t1, false]
109
+ assert !trsc[t3, false]
110
+ end
111
+ end
112
+
36
113
  def transaction_op(plan, op, *needed_proxies)
37
114
  trsc = Roby::Transaction.new(plan)
38
115
  proxies = needed_proxies.map do |o|
39
- plan.discover(o) unless o.plan
116
+ plan.add(o) unless o.plan
40
117
 
41
118
  p = trsc[o]
42
119
  assert_not_equal(p, o)
@@ -80,28 +157,28 @@ module TC_TransactionBehaviour
80
157
  def test_commit_task
81
158
  t = prepare_plan :tasks => 1
82
159
  transaction_commit(plan, t) do |trsc, p|
83
- trsc.discover(p)
160
+ trsc.add(p)
84
161
  assert(p.event(:start).child_object?(p.event(:updated_data), Roby::EventStructure::Precedence))
85
162
  assert(p.event(:failed).child_object?(p.event(:stop), Roby::EventStructure::Forwarding))
86
163
  end
87
164
  assert(t.event(:start).child_object?(t.event(:updated_data), Roby::EventStructure::Precedence))
88
165
  assert(t.event(:failed).child_object?(t.event(:stop), Roby::EventStructure::Forwarding))
89
166
 
90
- t = prepare_plan :discover => 1
167
+ t = prepare_plan :add => 1
91
168
  transaction_commit(plan, t) do |trsc, p|
92
- trsc.insert(p)
169
+ trsc.add_mission(p)
93
170
  end
94
171
  assert(t.event(:start).child_object?(t.event(:updated_data), Roby::EventStructure::Precedence))
95
172
  assert(t.event(:failed).child_object?(t.event(:stop), Roby::EventStructure::Forwarding))
96
173
  end
97
174
 
98
175
  def test_commit_arguments
99
- (t1, t2), t = prepare_plan :discover => 2, :tasks => 1
176
+ (t1, t2), t = prepare_plan :add => 2, :tasks => 1
100
177
  t1.arguments[:first] = 10
101
178
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
102
179
  p1.arguments[:first] = 20
103
180
  p1.arguments[:second] = p2
104
- trsc.discover(t)
181
+ trsc.add(t)
105
182
  t.arguments[:task] = p2
106
183
  end
107
184
 
@@ -129,7 +206,7 @@ module TC_TransactionBehaviour
129
206
 
130
207
  transaction_commit(plan) do |trsc|
131
208
  assert(!trsc.include?(t3))
132
- trsc.discover(t3)
209
+ trsc.add(t3)
133
210
  assert(trsc.include?(t3))
134
211
  assert(!trsc.mission?(t3))
135
212
  assert(!plan.include?(t3))
@@ -140,7 +217,7 @@ module TC_TransactionBehaviour
140
217
 
141
218
  transaction_commit(plan) do |trsc|
142
219
  assert(!trsc.include?(t2))
143
- trsc.insert(t2)
220
+ trsc.add_mission(t2)
144
221
  assert(trsc.include?(t2))
145
222
  assert(trsc.mission?(t2))
146
223
  assert(!plan.include?(t2))
@@ -151,7 +228,7 @@ module TC_TransactionBehaviour
151
228
 
152
229
  transaction_commit(plan, t2) do |trsc, p2|
153
230
  assert(trsc.mission?(p2))
154
- trsc.discard(p2)
231
+ trsc.unmark_mission(p2)
155
232
  assert(trsc.include?(p2))
156
233
  assert(!trsc.mission?(p2))
157
234
  assert(plan.include?(t2))
@@ -160,48 +237,79 @@ module TC_TransactionBehaviour
160
237
  assert(plan.include?(t2))
161
238
  assert(!plan.mission?(t2))
162
239
 
240
+ plan.add_mission(t3)
163
241
  transaction_commit(plan, t3) do |trsc, p3|
164
242
  assert(trsc.include?(p3))
165
243
  trsc.remove_object(p3)
166
244
  assert(!trsc.include?(p3))
167
- assert(!trsc.wrap(t3, false))
168
- assert(!trsc.include?(t3))
169
245
  assert(plan.include?(t3))
170
246
  end
171
- assert(!plan.include?(t3))
172
- assert(!plan.mission?(t3))
247
+ assert(plan.include?(t3))
248
+ assert(plan.mission?(t3))
173
249
 
174
- plan.permanent(t3 = Roby::Task.new)
250
+ plan.add_permanent(t3 = Roby::Task.new)
175
251
  transaction_commit(plan, t3) do |trsc, p3|
176
252
  assert(trsc.permanent?(p3))
177
- trsc.auto(t3)
253
+ trsc.unmark_permanent(t3)
178
254
  assert(!trsc.permanent?(p3))
179
255
  assert(plan.permanent?(t3))
180
256
  end
181
257
  assert(!plan.permanent?(t3))
182
258
 
183
259
  transaction_commit(plan, t3) do |trsc, p3|
184
- trsc.permanent(p3)
260
+ trsc.add_permanent(p3)
185
261
  assert(trsc.permanent?(p3))
186
262
  assert(!plan.permanent?(t3))
187
263
  end
188
264
  assert(plan.permanent?(t3))
189
265
  end
266
+
267
+ # Tests insertion and removal of free events
268
+ def test_commit_plan_events
269
+ e1, e2 = (1..2).map { Roby::EventGenerator.new }
270
+ plan.add_permanent(e1)
271
+ plan.add(e2)
272
+
273
+ transaction_commit(plan, e1, e2) do |trsc, p1, p2|
274
+ assert(trsc.include?(p1))
275
+ assert(trsc.permanent?(p1))
276
+ assert(trsc.include?(p2))
277
+ assert(!trsc.permanent?(p2))
278
+
279
+ trsc.unmark_permanent(p1)
280
+ assert(!trsc.permanent?(p1))
281
+ end
282
+ assert(!plan.permanent?(e1))
283
+
284
+ e3, e4 = (1..2).map { Roby::EventGenerator.new }
285
+ transaction_commit(plan) do |trsc|
286
+ trsc.add_permanent(e3)
287
+ trsc.add(e4)
288
+ assert(trsc.permanent?(e3))
289
+ assert(trsc.include?(e4))
290
+ assert(!trsc.permanent?(e4))
291
+ end
292
+ assert(plan.include?(e3))
293
+ assert(plan.permanent?(e3))
294
+ assert(plan.include?(e4))
295
+ assert(!plan.permanent?(e4))
296
+ end
297
+
190
298
 
191
299
  def test_commit_task_relations
192
300
  (t1, t2), (t3, t4) = prepare_plan(:missions => 2, :tasks => 2)
193
- t1.realized_by t2
301
+ t1.depends_on t2
194
302
 
195
303
  transaction_commit(plan) do |trsc|
196
- trsc.discover t3
197
- trsc.discover t4
304
+ trsc.add t3
305
+ trsc.add t4
198
306
  t3.planned_by t4
199
307
  end
200
308
  assert(PlannedBy.linked?(t3, t4))
201
309
 
202
310
  t = Roby::Task.new
203
311
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
204
- t.realized_by p1
312
+ t.depends_on p1
205
313
  assert(Hierarchy.linked?(t, p1))
206
314
  assert(!Hierarchy.linked?(t, t1))
207
315
  end
@@ -209,7 +317,7 @@ module TC_TransactionBehaviour
209
317
 
210
318
  t = Roby::Task.new
211
319
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
212
- p2.realized_by t
320
+ p2.depends_on t
213
321
  assert(Hierarchy.linked?(p2, t))
214
322
  assert(!Hierarchy.linked?(t2, t))
215
323
  end
@@ -223,37 +331,37 @@ module TC_TransactionBehaviour
223
331
  assert(!Hierarchy.linked?(t1, t2))
224
332
 
225
333
  transaction_commit(plan, t3, t4) do |trsc, p3, p4|
226
- trsc.remove_task(p3)
334
+ trsc.remove_object(p3)
227
335
  assert(!trsc.include?(p3))
228
336
  assert(!PlannedBy.linked?(p3, p4))
229
337
  assert(PlannedBy.linked?(t3, t4))
230
338
  end
231
- assert(!PlannedBy.linked?(t3, t4))
339
+ assert(PlannedBy.linked?(t3, t4))
232
340
  end
233
341
 
234
342
  def test_commit_event_relations
235
343
  (t1, t2), (t3, t4) = prepare_plan :missions => 2, :tasks => 2,
236
344
  :model => SimpleTask
237
- t1.on(:start, t2, :success)
345
+ t1.signals(:start, t2, :success)
238
346
 
239
347
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
240
- trsc.discover t3
241
- t3.event(:stop).on p2.event(:start)
348
+ trsc.add t3
349
+ t3.signals(:stop, p2, :start)
242
350
  assert(Signal.linked?(t3.event(:stop), p2.event(:start)))
243
351
  assert(!Signal.linked?(t3.event(:stop), t2.event(:start)))
244
352
  end
245
353
  assert(Signal.linked?(t3.event(:stop), t2.event(:start)))
246
354
 
247
355
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
248
- p1.event(:stop).on p2.event(:start)
356
+ p1.signals(:stop, p2, :start)
249
357
  assert(Signal.linked?(p1.event(:stop), p2.event(:start)))
250
358
  assert(!Signal.linked?(t1.event(:stop), t2.event(:start)))
251
359
  end
252
360
  assert(Signal.linked?(t1.event(:stop), t2.event(:start)))
253
361
 
254
362
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
255
- trsc.discover t4
256
- p1.event(:stop).on t4.event(:start)
363
+ trsc.add t4
364
+ p1.signals(:stop, t4, :start)
257
365
  assert(Signal.linked?(p1.event(:stop), t4.event(:start)))
258
366
  end
259
367
  assert(Signal.linked?(t1.event(:stop), t4.event(:start)))
@@ -268,12 +376,12 @@ module TC_TransactionBehaviour
268
376
 
269
377
  def test_commit_replace
270
378
  task, (planned, mission, child, r) = prepare_plan :missions => 1, :tasks => 4, :model => SimpleTask
271
- mission.realized_by task
379
+ mission.depends_on task, :model => SimpleTask
272
380
  planned.planned_by task
273
- task.realized_by child
274
- task.on(:stop, mission, :stop)
275
- task.forward(:stop, planned, :success)
276
- task.on(:start, child, :start)
381
+ task.depends_on child
382
+ task.signals(:stop, mission, :stop)
383
+ task.forward_to(:stop, planned, :success)
384
+ task.signals(:start, child, :start)
277
385
 
278
386
  transaction_commit(plan, mission, planned, task, child) do |trsc, pm, pp, pt, pc|
279
387
  trsc.replace(pt, r)
@@ -310,47 +418,26 @@ module TC_TransactionBehaviour
310
418
  def test_relation_validation
311
419
  t1, t2 = prepare_plan :tasks => 2
312
420
  transaction_commit(plan, t1) do |trsc, p1|
313
- trsc.insert(t2)
421
+ trsc.add_mission(t2)
314
422
  assert_equal(plan, t1.plan)
315
423
  assert_equal(trsc, p1.plan)
316
424
  assert_equal(trsc, t2.plan)
317
- assert_raises(RuntimeError) { t1.realized_by t2 }
425
+ assert_raises(RuntimeError) { t1.depends_on t2 }
318
426
  assert_equal(plan, t1.event(:start).plan)
319
427
  assert_equal(trsc, p1.event(:start).plan)
320
428
  assert_equal(trsc, t2.event(:start).plan)
321
- assert_raises(RuntimeError) { t1.event(:start).on t2.event(:start) }
429
+ assert_raises(RuntimeError) { t1.signals(:start, t2, :start) }
322
430
  end
323
431
  end
324
432
 
325
- def test_discard_modifications
326
- t1, t2, t3 = prepare_plan :missions => 1, :discover => 1, :tasks => 1
327
- t1.realized_by t2
328
- transaction_commit(plan, t1, t2) do |trsc, p1, p2|
329
- p1.realized_by(t3)
330
- trsc.remove_object(p1)
331
- trsc.discard_modifications(t1)
332
- end
333
- assert(plan.include?(t1))
334
- assert_equal([t2], t1.children.to_a)
335
-
336
- t3 = SimpleTask.new
337
- transaction_commit(plan, t1, t2) do |trsc, p1, p2|
338
- p1.realized_by t3
339
- p1.remove_child p2
340
- trsc.discard_modifications(t1)
341
- end
342
- assert(plan.include?(t1))
343
- assert_equal([t2], t1.children.to_a)
344
- end
345
-
346
433
  def test_plan_finalized_task
347
- t1, t2, t3 = prepare_plan :missions => 1, :discover => 1
348
- t1.realized_by t2
434
+ t1, t2, t3 = prepare_plan :missions => 1, :add => 1
435
+ t1.depends_on t2
349
436
 
350
437
  t3 = SimpleTask.new
351
438
  assert_raises(Roby::InvalidTransaction) do
352
439
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
353
- p1.realized_by(t3)
440
+ p1.depends_on(t3)
354
441
  assert(trsc.wrap(t1, false))
355
442
  plan.remove_object(t1)
356
443
  assert(trsc.invalid?)
@@ -360,138 +447,79 @@ module TC_TransactionBehaviour
360
447
  end
361
448
 
362
449
  def test_plan_add_remove_invalidate
363
- t1 = prepare_plan :discover => 1
450
+ t1 = prepare_plan :add => 1
364
451
  assert_raises(Roby::InvalidTransaction) do
365
452
  transaction_commit(plan, t1) do |trsc, p1|
366
- trsc.conflict_solver = :invalidate
367
453
  plan.remove_object(t1)
454
+ assert(!plan.include?(t1))
368
455
  assert(trsc.invalid?)
369
456
  end
370
457
  end
371
458
 
372
- t1 = prepare_plan :discover => 1
373
- assert_nothing_raised do
374
- transaction_commit(plan, t1) do |trsc, p1|
375
- trsc.conflict_solver = :invalidate
376
- trsc.remove_object(p1)
377
- plan.remove_object(t1)
378
- assert(!trsc.invalid?)
379
- end
380
- end
459
+ # Test for a special case: the task is removed from the transaction and
460
+ # then removed from the plan. We should not invalidate in that case
461
+ t1 = prepare_plan :add => 1
462
+ transaction_commit(plan, t1) do |trsc, p1|
463
+ trsc.remove_object(p1)
464
+ plan.remove_object(t1)
465
+ assert(!trsc.invalid?)
466
+ end
381
467
  end
382
468
 
383
469
  def test_plan_relation_update_invalidate
384
- t1, t2 = prepare_plan :discover => 2
470
+ t1, t2 = prepare_plan :add => 2
385
471
 
386
- t1.realized_by t2
472
+ t1.depends_on t2
387
473
  assert_raises(Roby::InvalidTransaction) do
388
474
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
389
- trsc.conflict_solver = :invalidate
390
475
  assert(p1.child_object?(p2, Roby::TaskStructure::Hierarchy))
391
476
  t1.remove_child t2
392
477
  assert(trsc.invalid?)
393
478
  end
394
479
  end
395
480
 
396
- t1.realized_by t2
397
- assert_nothing_raised do
398
- transaction_commit(plan, t1, t2) do |trsc, p1, p2|
399
- trsc.conflict_solver = :invalidate
400
- p1.remove_child p2
401
- t1.remove_child t2
402
- assert(!trsc.invalid?)
403
- end
404
- end
481
+ t1.depends_on t2
482
+ transaction_commit(plan, t1, t2) do |trsc, p1, p2|
483
+ p1.remove_child p2
484
+ t1.remove_child t2
485
+ assert(!trsc.invalid?)
486
+ end
405
487
 
406
488
  t1.remove_child t2
407
489
  assert_raises(Roby::InvalidTransaction) do
408
490
  transaction_commit(plan, t1, t2) do |trsc, p1, p2|
409
- trsc.conflict_solver = :invalidate
410
- t1.realized_by(t2)
491
+ t1.depends_on(t2)
411
492
  assert(trsc.invalid?)
412
493
  end
413
494
  end
414
495
 
415
496
  t1.remove_child t2
416
- assert_nothing_raised do
417
- transaction_commit(plan, t1, t2) do |trsc, p1, p2|
418
- trsc.conflict_solver = :invalidate
419
- p1.realized_by p2
420
- t1.realized_by t2
421
- assert(!trsc.invalid?)
422
- end
423
- end
497
+ transaction_commit(plan, t1, t2) do |trsc, p1, p2|
498
+ p1.depends_on p2
499
+ t1.depends_on t2
500
+ assert(!trsc.invalid?)
501
+ end
424
502
  end
425
-
426
- def test_plan_relation_update_solver
427
- solver = Roby::SolverIgnoreUpdate.new
428
-
429
- t1, t2, t3 = (1..3).map { SimpleTask.new }
430
- t1.realized_by t2
431
- plan.insert(t1)
432
-
433
- assert_nothing_raised do
434
- transaction_commit(plan, t1, t2) do |trsc, p1, p2|
435
- trsc.conflict_solver = solver
436
- p1.realized_by(t3)
437
- t1.remove_child(t2)
438
- assert(!trsc.invalid?)
439
- end
440
- end
441
-
442
- t3 = SimpleTask.new
443
- t1.remove_child t2
444
- assert_nothing_raised do
445
- transaction_commit(plan, t1) do |trsc, p1|
446
- trsc.conflict_solver = solver
447
- p1.realized_by(t3)
448
- t1.realized_by(t2)
449
- assert(!trsc.invalid?)
450
- end
451
- end
452
- end
453
-
454
- def test_plan_relation_update_update
455
- t1, t2, t3 = (1..3).map { SimpleTask.new }
456
- t1.realized_by t2
457
- plan.insert(t1)
458
-
459
- transaction_commit(plan, t1, t2) do |trsc, p1, p2|
460
- trsc.conflict_solver = :update
461
- p1.realized_by(t3)
462
- assert(p1.child_object?(p2))
463
- t1.remove_child(t2)
464
- assert(!trsc.invalid?)
465
- assert(!p1.child_object?(p2))
466
- end
467
-
468
- t3 = SimpleTask.new
469
- t1.remove_child t2
470
- transaction_commit(plan, t1, t2) do |trsc, p1, p2|
471
- trsc.conflict_solver = :update
472
- p1.realized_by(t3)
473
- assert(!p1.child_object?(p2))
474
-
475
- t1.realized_by(t2)
476
- assert(p1.child_object?(p2))
477
- assert(!trsc.invalid?)
478
- end
479
- end
480
-
481
503
  end
482
504
 
483
505
  class TC_Transactions < Test::Unit::TestCase
484
506
  include TC_TransactionBehaviour
485
507
  include Roby::Test
486
508
 
509
+ def test_real_plan
510
+ transaction_commit(plan) do |trsc|
511
+ assert_equal(plan, trsc.real_plan)
512
+ end
513
+ end
514
+
487
515
  def test_and_event_aggregator
488
516
  t1, t2, t3 = (1..3).map { SimpleTask.new }
489
517
  transaction_commit(plan, t1) do |trsc, p1|
490
- trsc.insert(t2)
491
- trsc.insert(t3)
518
+ trsc.add_mission(t2)
519
+ trsc.add_mission(t3)
492
520
  and_generator = (p1.event(:start) & t2.event(:start))
493
521
  assert_equal(trsc, and_generator.plan)
494
- and_generator.on t3.event(:start)
522
+ and_generator.signals t3.event(:start)
495
523
  end
496
524
 
497
525
  t1.start!
@@ -503,18 +531,18 @@ class TC_Transactions < Test::Unit::TestCase
503
531
  def test_or_event_aggregator
504
532
  t1, t2, t3 = (1..3).map { SimpleTask.new }
505
533
  transaction_commit(plan, t1) do |trsc, p1|
506
- trsc.insert(t2)
507
- trsc.insert(t3)
508
- (p1.event(:start) | t2.event(:start)).on t3.event(:start)
534
+ trsc.add_mission(t2)
535
+ trsc.add_mission(t3)
536
+ (p1.event(:start) | t2.event(:start)).signals t3.event(:start)
509
537
  end
510
538
 
511
539
  t1.start!
512
540
  assert(t3.running?)
513
- assert_nothing_raised { t2.start! }
541
+ t2.start!
514
542
  end
515
543
 
516
544
  def test_commit_event_handlers
517
- plan.discover(e = Roby::EventGenerator.new(true))
545
+ plan.add(e = Roby::EventGenerator.new(true))
518
546
  def e.called_by_handler(mock)
519
547
  mock.called_by_handler
520
548
  end
@@ -537,10 +565,10 @@ class TC_Transactions < Test::Unit::TestCase
537
565
  ev = nil
538
566
  transaction_commit(plan, t1) do |trsc, p1|
539
567
  ev = EventGenerator.new do
540
- p1.forward(:start, t2, :start)
541
- p1.on(:start, t3, :start)
568
+ p1.forward_to(:start, t2, :start)
569
+ p1.signals(:start, t3, :start)
542
570
  end
543
- trsc.discover(ev)
571
+ trsc.add(ev)
544
572
  ev
545
573
  end
546
574
  ev.call
@@ -554,16 +582,29 @@ class TC_RecursiveTransaction < Test::Unit::TestCase
554
582
  include TC_TransactionBehaviour
555
583
  include Roby::Test
556
584
 
557
- alias :real_plan :plan
558
- attr_reader :plan
585
+ attr_reader :real_plan
586
+ def engine; (real_plan || plan).engine end
559
587
  def setup
560
- @plan = Roby::Transaction.new(real_plan)
561
588
  super
589
+ @real_plan = @plan
590
+ @plan = Roby::Transaction.new(real_plan)
562
591
  end
563
592
  def teardown
564
- plan.discard_transaction
565
- real_plan.clear
593
+ plan.discard_transaction
594
+ real_plan.clear
566
595
  super
567
596
  end
597
+
598
+ def test_real_plan
599
+ transaction_commit(plan) do |trsc|
600
+ assert_equal(real_plan, trsc.real_plan)
601
+ end
602
+ end
603
+
604
+ def test_transaction_stack
605
+ transaction_commit(plan) do |trsc|
606
+ assert_equal([trsc, plan, real_plan], trsc.transaction_stack)
607
+ end
608
+ end
568
609
  end
569
610