roby 0.7.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -5
- data/Manifest.txt +91 -16
- data/README.txt +24 -24
- data/Rakefile +92 -64
- data/app/config/app.yml +42 -43
- data/app/config/init.rb +26 -0
- data/benchmark/alloc_misc.rb +123 -0
- data/benchmark/discovery_latency.rb +67 -0
- data/benchmark/garbage_collection.rb +48 -0
- data/benchmark/genom.rb +31 -0
- data/benchmark/transactions.rb +62 -0
- data/bin/roby +1 -1
- data/bin/roby-log +16 -6
- data/doc/guide/.gitignore +2 -0
- data/doc/guide/config.yaml +34 -0
- data/doc/guide/ext/init.rb +14 -0
- data/doc/guide/ext/previous_next.rb +40 -0
- data/doc/guide/ext/rdoc_links.rb +33 -0
- data/doc/guide/index.rdoc +16 -0
- data/doc/guide/overview.rdoc +62 -0
- data/doc/guide/plan_modifications.rdoc +67 -0
- data/doc/guide/src/abstraction/achieve_with.page +8 -0
- data/doc/guide/src/abstraction/forwarding.page +8 -0
- data/doc/guide/src/abstraction/hierarchy.page +19 -0
- data/doc/guide/src/abstraction/index.page +28 -0
- data/doc/guide/src/abstraction/task_models.page +13 -0
- data/doc/guide/src/basics.template +6 -0
- data/doc/guide/src/basics/app.page +139 -0
- data/doc/guide/src/basics/code_examples.page +33 -0
- data/doc/guide/src/basics/dry.page +69 -0
- data/doc/guide/src/basics/errors.page +443 -0
- data/doc/guide/src/basics/events.page +179 -0
- data/doc/guide/src/basics/hierarchy.page +275 -0
- data/doc/guide/src/basics/index.page +11 -0
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/basics/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/basics/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/basics/plan_objects.page +71 -0
- data/doc/guide/src/basics/relations_display.page +203 -0
- data/doc/guide/src/basics/roby_cycle_overview.png +0 -0
- data/doc/guide/src/basics/shell.page +102 -0
- data/doc/guide/src/basics/summary.page +32 -0
- data/doc/guide/src/basics/tasks.page +357 -0
- data/doc/guide/src/basics_shell_header.txt +16 -0
- data/doc/guide/src/cycle/cycle-overview.png +0 -0
- data/doc/guide/src/cycle/cycle-overview.svg +208 -0
- data/doc/guide/src/cycle/error_handling.page +168 -0
- data/doc/guide/src/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/src/cycle/error_instantaneous_repair.svg +1224 -0
- data/doc/guide/src/cycle/garbage_collection.page +10 -0
- data/doc/guide/src/cycle/index.page +23 -0
- data/doc/guide/src/cycle/propagation.page +154 -0
- data/doc/guide/src/cycle/propagation_diamond.png +0 -0
- data/doc/guide/src/cycle/propagation_diamond.svg +1279 -0
- data/doc/guide/src/default.css +319 -0
- data/doc/guide/src/default.template +74 -0
- data/doc/guide/src/htmldoc.metainfo +20 -0
- data/doc/guide/src/htmldoc.virtual +18 -0
- data/doc/guide/src/images/bodybg.png +0 -0
- data/doc/guide/src/images/contbg.png +0 -0
- data/doc/guide/src/images/footerbg.png +0 -0
- data/doc/guide/src/images/gradient1.png +0 -0
- data/doc/guide/src/images/gradient2.png +0 -0
- data/doc/guide/src/index.page +7 -0
- data/doc/guide/src/introduction/index.page +29 -0
- data/doc/guide/src/introduction/install.page +133 -0
- data/doc/{papers.rdoc → guide/src/introduction/publications.page} +5 -2
- data/doc/{videos.rdoc → guide/src/introduction/videos.page} +4 -2
- data/doc/guide/src/plugins/fault_tolerance.page +44 -0
- data/doc/guide/src/plugins/index.page +11 -0
- data/doc/guide/src/plugins/subsystems.page +45 -0
- data/doc/guide/src/relations/dependency.page +89 -0
- data/doc/guide/src/relations/index.page +12 -0
- data/doc/misc/update_github +24 -0
- data/doc/tutorials/02-GoForward.rdoc +3 -3
- data/ext/graph/graph.cc +46 -0
- data/lib/roby.rb +57 -22
- data/lib/roby/app.rb +132 -112
- data/lib/roby/app/plugins/rake.rb +21 -0
- data/lib/roby/app/rake.rb +0 -7
- data/lib/roby/app/run.rb +1 -1
- data/lib/roby/app/scripts/distributed.rb +1 -2
- data/lib/roby/app/scripts/generate/bookmarks.rb +1 -1
- data/lib/roby/app/scripts/results.rb +2 -1
- data/lib/roby/app/scripts/run.rb +6 -2
- data/lib/roby/app/scripts/shell.rb +11 -11
- data/lib/roby/config.rb +1 -1
- data/lib/roby/decision_control.rb +62 -3
- data/lib/roby/distributed.rb +4 -0
- data/lib/roby/distributed/base.rb +8 -0
- data/lib/roby/distributed/communication.rb +12 -8
- data/lib/roby/distributed/connection_space.rb +61 -44
- data/lib/roby/distributed/distributed_object.rb +1 -1
- data/lib/roby/distributed/notifications.rb +22 -30
- data/lib/roby/distributed/peer.rb +13 -8
- data/lib/roby/distributed/proxy.rb +5 -5
- data/lib/roby/distributed/subscription.rb +4 -4
- data/lib/roby/distributed/transaction.rb +3 -3
- data/lib/roby/event.rb +176 -110
- data/lib/roby/exceptions.rb +12 -4
- data/lib/roby/execution_engine.rb +1604 -0
- data/lib/roby/external_process_task.rb +225 -0
- data/lib/roby/graph.rb +0 -6
- data/lib/roby/interface.rb +221 -137
- data/lib/roby/log/console.rb +5 -3
- data/lib/roby/log/data_stream.rb +94 -16
- data/lib/roby/log/dot.rb +8 -8
- data/lib/roby/log/event_stream.rb +13 -3
- data/lib/roby/log/file.rb +43 -18
- data/lib/roby/log/gui/basic_display_ui.rb +89 -0
- data/lib/roby/log/gui/chronicle_view_ui.rb +90 -0
- data/lib/roby/log/gui/data_displays.rb +4 -5
- data/lib/roby/log/gui/data_displays_ui.rb +146 -0
- data/lib/roby/log/gui/relations.rb +18 -18
- data/lib/roby/log/gui/relations_ui.rb +120 -0
- data/lib/roby/log/gui/relations_view_ui.rb +144 -0
- data/lib/roby/log/gui/replay.rb +41 -13
- data/lib/roby/log/gui/replay_controls.rb +3 -0
- data/lib/roby/log/gui/replay_controls.ui +133 -110
- data/lib/roby/log/gui/replay_controls_ui.rb +249 -0
- data/lib/roby/log/hooks.rb +19 -18
- data/lib/roby/log/logger.rb +7 -6
- data/lib/roby/log/notifications.rb +4 -4
- data/lib/roby/log/plan_rebuilder.rb +20 -22
- data/lib/roby/log/relations.rb +44 -16
- data/lib/roby/log/server.rb +1 -4
- data/lib/roby/log/timings.rb +88 -19
- data/lib/roby/plan-object.rb +135 -11
- data/lib/roby/plan.rb +408 -224
- data/lib/roby/planning/loops.rb +32 -25
- data/lib/roby/planning/model.rb +157 -51
- data/lib/roby/planning/task.rb +47 -20
- data/lib/roby/query.rb +128 -92
- data/lib/roby/relations.rb +254 -136
- data/lib/roby/relations/conflicts.rb +6 -9
- data/lib/roby/relations/dependency.rb +358 -0
- data/lib/roby/relations/ensured.rb +0 -1
- data/lib/roby/relations/error_handling.rb +0 -1
- data/lib/roby/relations/events.rb +0 -2
- data/lib/roby/relations/executed_by.rb +26 -11
- data/lib/roby/relations/planned_by.rb +14 -14
- data/lib/roby/robot.rb +46 -0
- data/lib/roby/schedulers/basic.rb +34 -0
- data/lib/roby/standalone.rb +4 -0
- data/lib/roby/standard_errors.rb +21 -15
- data/lib/roby/state/events.rb +5 -4
- data/lib/roby/support.rb +107 -6
- data/lib/roby/task-operations.rb +23 -19
- data/lib/roby/task.rb +522 -148
- data/lib/roby/task_index.rb +80 -0
- data/lib/roby/test/common.rb +283 -44
- data/lib/roby/test/distributed.rb +53 -37
- data/lib/roby/test/testcase.rb +9 -204
- data/lib/roby/test/tools.rb +3 -3
- data/lib/roby/transactions.rb +154 -111
- data/lib/roby/transactions/proxy.rb +40 -7
- data/manifest.xml +20 -0
- data/plugins/fault_injection/README.txt +0 -3
- data/plugins/fault_injection/Rakefile +2 -8
- data/plugins/fault_injection/app.rb +1 -1
- data/plugins/fault_injection/fault_injection.rb +3 -3
- data/plugins/fault_injection/test/test_fault_injection.rb +19 -25
- data/plugins/subsystems/README.txt +0 -3
- data/plugins/subsystems/Rakefile +2 -7
- data/plugins/subsystems/app.rb +27 -16
- data/plugins/subsystems/test/app/config/init.rb +3 -0
- data/plugins/subsystems/test/app/planners/main.rb +1 -1
- data/plugins/subsystems/test/app/tasks/services.rb +1 -1
- data/plugins/subsystems/test/test_subsystems.rb +23 -16
- data/test/distributed/test_communication.rb +32 -15
- data/test/distributed/test_connection.rb +28 -26
- data/test/distributed/test_execution.rb +59 -54
- data/test/distributed/test_mixed_plan.rb +34 -34
- data/test/distributed/test_plan_notifications.rb +26 -26
- data/test/distributed/test_protocol.rb +57 -48
- data/test/distributed/test_query.rb +11 -7
- data/test/distributed/test_remote_plan.rb +71 -71
- data/test/distributed/test_transaction.rb +50 -47
- data/test/mockups/external_process +28 -0
- data/test/planning/test_loops.rb +163 -119
- data/test/planning/test_model.rb +3 -3
- data/test/planning/test_task.rb +27 -7
- data/test/relations/test_conflicts.rb +3 -3
- data/test/relations/test_dependency.rb +324 -0
- data/test/relations/test_ensured.rb +2 -2
- data/test/relations/test_executed_by.rb +94 -19
- data/test/relations/test_planned_by.rb +11 -9
- data/test/suite_core.rb +6 -3
- data/test/suite_distributed.rb +1 -0
- data/test/suite_planning.rb +1 -0
- data/test/suite_relations.rb +2 -2
- data/test/tasks/test_external_process.rb +126 -0
- data/test/{test_thread_task.rb → tasks/test_thread_task.rb} +17 -20
- data/test/test_bgl.rb +21 -1
- data/test/test_event.rb +229 -155
- data/test/test_exceptions.rb +79 -80
- data/test/test_execution_engine.rb +987 -0
- data/test/test_gui.rb +1 -1
- data/test/test_interface.rb +11 -5
- data/test/test_log.rb +18 -7
- data/test/test_log_server.rb +1 -0
- data/test/test_plan.rb +229 -395
- data/test/test_query.rb +193 -35
- data/test/test_relations.rb +88 -8
- data/test/test_state.rb +55 -37
- data/test/test_support.rb +1 -1
- data/test/test_task.rb +371 -218
- data/test/test_testcase.rb +32 -16
- data/test/test_transactions.rb +211 -170
- data/test/test_transactions_proxy.rb +37 -19
- metadata +169 -71
- data/.gitignore +0 -29
- data/doc/styles/allison.css +0 -314
- data/doc/styles/allison.js +0 -316
- data/doc/styles/allison.rb +0 -276
- data/doc/styles/jamis.rb +0 -593
- data/lib/roby/control.rb +0 -746
- data/lib/roby/executives/simple.rb +0 -30
- data/lib/roby/propagation.rb +0 -562
- data/lib/roby/relations/hierarchy.rb +0 -239
- data/lib/roby/transactions/updates.rb +0 -139
- data/test/relations/test_hierarchy.rb +0 -158
- data/test/test_control.rb +0 -399
- data/test/test_propagation.rb +0 -210
data/test/test_testcase.rb
CHANGED
@@ -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.
|
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.
|
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
|
-
|
33
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
[
|
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.
|
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.
|
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.
|
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.
|
135
|
+
assert_in_delta(0.25, stats.dummy.stddev, 0.5)
|
120
136
|
end
|
121
137
|
end
|
122
138
|
|
data/test/test_transactions.rb
CHANGED
@@ -1,20 +1,23 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('
|
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 '
|
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
|
-
|
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.
|
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.
|
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 :
|
167
|
+
t = prepare_plan :add => 1
|
91
168
|
transaction_commit(plan, t) do |trsc, p|
|
92
|
-
trsc.
|
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 :
|
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.
|
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.
|
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.
|
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.
|
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(
|
172
|
-
assert(
|
247
|
+
assert(plan.include?(t3))
|
248
|
+
assert(plan.mission?(t3))
|
173
249
|
|
174
|
-
plan.
|
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.
|
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.
|
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.
|
301
|
+
t1.depends_on t2
|
194
302
|
|
195
303
|
transaction_commit(plan) do |trsc|
|
196
|
-
trsc.
|
197
|
-
trsc.
|
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.
|
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.
|
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.
|
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(
|
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.
|
345
|
+
t1.signals(:start, t2, :success)
|
238
346
|
|
239
347
|
transaction_commit(plan, t1, t2) do |trsc, p1, p2|
|
240
|
-
trsc.
|
241
|
-
|
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
|
-
|
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.
|
256
|
-
p1.
|
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.
|
379
|
+
mission.depends_on task, :model => SimpleTask
|
272
380
|
planned.planned_by task
|
273
|
-
task.
|
274
|
-
task.
|
275
|
-
task.
|
276
|
-
task.
|
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.
|
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.
|
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.
|
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, :
|
348
|
-
t1.
|
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.
|
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 :
|
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
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
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 :
|
470
|
+
t1, t2 = prepare_plan :add => 2
|
385
471
|
|
386
|
-
t1.
|
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.
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
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
|
-
|
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
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
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.
|
491
|
-
trsc.
|
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.
|
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.
|
507
|
-
trsc.
|
508
|
-
(p1.event(:start) | t2.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
|
-
|
541
|
+
t2.start!
|
514
542
|
end
|
515
543
|
|
516
544
|
def test_commit_event_handlers
|
517
|
-
plan.
|
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.
|
541
|
-
p1.
|
568
|
+
p1.forward_to(:start, t2, :start)
|
569
|
+
p1.signals(:start, t3, :start)
|
542
570
|
end
|
543
|
-
trsc.
|
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
|
-
|
558
|
-
|
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
|
-
|
565
|
-
|
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
|
|