openwferu 0.9.13 → 0.9.14
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/bigflow.rb +19 -0
- data/examples/csv_weather.rb +23 -0
- data/examples/engine_template.rb +7 -0
- data/lib/openwfe/contextual.rb +0 -2
- data/lib/openwfe/engine/engine.rb +137 -34
- data/lib/openwfe/engine/file_persisted_engine.rb +0 -5
- data/lib/openwfe/exceptions.rb +0 -2
- data/lib/openwfe/expool/errorjournal.rb +83 -7
- data/lib/openwfe/expool/expressionpool.rb +279 -60
- data/lib/openwfe/expool/expstorage.rb +7 -6
- data/lib/openwfe/expool/yamlexpstorage.rb +17 -14
- data/lib/openwfe/expressions/condition.rb +10 -7
- data/lib/openwfe/expressions/environment.rb +11 -1
- data/lib/openwfe/expressions/fe_command.rb +14 -1
- data/lib/openwfe/expressions/fe_cron.rb +29 -14
- data/lib/openwfe/expressions/fe_define.rb +26 -1
- data/lib/openwfe/expressions/fe_iterator.rb +2 -0
- data/lib/openwfe/expressions/fe_losfor.rb +20 -15
- data/lib/openwfe/expressions/fe_misc.rb +0 -2
- data/lib/openwfe/expressions/fe_participant.rb +78 -24
- data/lib/openwfe/expressions/fe_reserve.rb +0 -2
- data/lib/openwfe/expressions/fe_sleep.rb +0 -4
- data/lib/openwfe/expressions/fe_subprocess.rb +34 -0
- data/lib/openwfe/expressions/fe_value.rb +46 -4
- data/lib/openwfe/expressions/fe_wait.rb +0 -2
- data/lib/openwfe/expressions/flowexpression.rb +39 -9
- data/lib/openwfe/expressions/raw.rb +73 -48
- data/lib/openwfe/expressions/raw_prog.rb +45 -15
- data/lib/openwfe/expressions/simplerep.rb +54 -7
- data/lib/openwfe/expressions/time.rb +5 -2
- data/lib/openwfe/expressions/timeout.rb +0 -2
- data/lib/openwfe/flowexpressionid.rb +26 -2
- data/lib/openwfe/participants/enoparticipants.rb +6 -1
- data/lib/openwfe/participants/participant.rb +0 -2
- data/lib/openwfe/participants/participantmap.rb +21 -7
- data/lib/openwfe/participants/participants.rb +29 -0
- data/lib/openwfe/rest/exception.rb +0 -2
- data/lib/openwfe/storage/yamlfilestorage.rb +4 -1
- data/lib/openwfe/util/dollar.rb +0 -2
- data/lib/openwfe/util/lru.rb +0 -2
- data/lib/openwfe/util/observable.rb +1 -1
- data/lib/openwfe/util/scheduler.rb +4 -4
- data/lib/openwfe/util/schedulers.rb +0 -2
- data/lib/openwfe/util/workqueue.rb +34 -91
- data/lib/openwfe/utils.rb +35 -28
- data/lib/openwfe/version.rb +1 -1
- data/lib/openwfe/workitem.rb +1 -1
- data/test/clone_test.rb +51 -0
- data/test/concurrence_test.rb +78 -0
- data/test/cron_test_2.rb +50 -0
- data/test/flowtestbase.rb +40 -12
- data/test/ft_21_cron.rb +32 -6
- data/test/ft_26_load.rb +8 -2
- data/test/ft_26c_load.rb +19 -0
- data/test/ft_27_getflowpos.rb +4 -4
- data/test/ft_2_concurrence.rb +14 -9
- data/test/ft_32_journal.rb +1 -1
- data/test/ft_32c_journal.rb +3 -2
- data/test/ft_32d_journal.rb +2 -1
- data/test/ft_34_cancelwfid.rb +7 -3
- data/test/ft_35_localdefs.rb +13 -0
- data/test/ft_38_tag.rb +8 -6
- data/test/ft_49_condition.rb +7 -1
- data/test/ft_55_ptimeout.rb +13 -14
- data/test/ft_57_a.rb +17 -0
- data/test/ft_58_ejournal.rb +3 -3
- data/test/ft_59_ps.rb +6 -6
- data/test/ft_60_ecancel.rb +3 -5
- data/test/ft_61_elsub.rb +2 -4
- data/test/ft_63_pause.rb +122 -0
- data/test/ft_64_alias.rb +102 -0
- data/test/ft_64_clone.rb +69 -0
- data/test/ft_65_stringlaunch.rb +61 -0
- data/test/ft_66_subforget.rb +70 -0
- data/test/ft_67_schedlaunch.rb +102 -0
- data/test/ft_68_ifparticipant.rb +70 -0
- data/test/ft_69_cancelmissing.rb +49 -0
- data/test/ft_6_lambda.rb +23 -3
- data/test/ft_70_lookupvar.rb +55 -0
- data/test/ft_7_lose.rb +1 -1
- data/test/ft_tests.rb +10 -1
- data/test/hparticipant_test.rb +6 -6
- data/test/param_test.rb +1 -1
- data/test/{rake_test.rb → rake_ltest.rb} +9 -2
- data/test/rake_qtest.rb +3 -1
- data/test/raw_prog_test.rb +11 -3
- data/test/restart_sleep_test.rb +44 -6
- data/test/ruby_procdef_test.rb +129 -0
- data/test/rutest_utils.rb +1 -0
- data/test/sec_test.rb +3 -3
- metadata +19 -4
@@ -51,7 +51,7 @@ module OpenWFE
|
|
51
51
|
# A very simple directory of participants
|
52
52
|
#
|
53
53
|
class ParticipantMap < Service
|
54
|
-
include
|
54
|
+
include OwfeObservable
|
55
55
|
|
56
56
|
attr_accessor \
|
57
57
|
:participants
|
@@ -64,6 +64,14 @@ module OpenWFE
|
|
64
64
|
@observers = {}
|
65
65
|
end
|
66
66
|
|
67
|
+
#
|
68
|
+
# Returns how many participants are currently registered here.
|
69
|
+
#
|
70
|
+
def size
|
71
|
+
|
72
|
+
@participants.size
|
73
|
+
end
|
74
|
+
|
67
75
|
#
|
68
76
|
# Adds a participant to this map.
|
69
77
|
# This method is called by the engine's own register_participant()
|
@@ -121,7 +129,7 @@ module OpenWFE
|
|
121
129
|
|
122
130
|
@participants << [ regex, participant ]
|
123
131
|
|
124
|
-
|
132
|
+
participant
|
125
133
|
end
|
126
134
|
|
127
135
|
#
|
@@ -137,6 +145,7 @@ module OpenWFE
|
|
137
145
|
@participants.each do |tuple|
|
138
146
|
return tuple[1] if tuple[0].match(participant_name)
|
139
147
|
end
|
148
|
+
|
140
149
|
nil
|
141
150
|
end
|
142
151
|
|
@@ -158,17 +167,20 @@ module OpenWFE
|
|
158
167
|
end
|
159
168
|
|
160
169
|
#
|
161
|
-
# Dispatches to the given participant
|
170
|
+
# Dispatches to the given participant (participant name (string) or
|
162
171
|
# The workitem will be fed to the consume() method of that participant.
|
163
172
|
# If it's a cancelitem and the participant has a cancel() method,
|
164
173
|
# it will get called instead.
|
165
174
|
#
|
166
|
-
def dispatch (participant_name, workitem)
|
175
|
+
def dispatch (participant, participant_name, workitem)
|
176
|
+
|
177
|
+
unless participant
|
167
178
|
|
168
|
-
|
179
|
+
participant = lookup_participant participant_name
|
169
180
|
|
170
|
-
|
171
|
-
|
181
|
+
raise "there is no participant named '#{participant_name}'" \
|
182
|
+
unless participant
|
183
|
+
end
|
172
184
|
|
173
185
|
workitem.participant_name = participant_name
|
174
186
|
|
@@ -184,6 +196,8 @@ module OpenWFE
|
|
184
196
|
|
185
197
|
onotify :dispatch, :before_consume, workitem
|
186
198
|
|
199
|
+
workitem.dispatch_time = Time.now
|
200
|
+
|
187
201
|
participant.consume(workitem)
|
188
202
|
|
189
203
|
onotify :dispatch, :after_consume, workitem
|
@@ -177,6 +177,35 @@ module OpenWFE
|
|
177
177
|
end
|
178
178
|
end
|
179
179
|
|
180
|
+
#
|
181
|
+
# Simply aliasing a participant.
|
182
|
+
#
|
183
|
+
# engine.register_participant "toto" do |workitem|
|
184
|
+
# workitem.toto_message = "toto was here"
|
185
|
+
# end
|
186
|
+
# engine.register_participant "user_.*", AliasParticipant.new("toto")
|
187
|
+
#
|
188
|
+
# Workitems for participant whose name starts with 'user_' will be handled
|
189
|
+
# by participant 'toto'.
|
190
|
+
# Note that you can't use use a regex as the aliased name ("toto" in the
|
191
|
+
# example).
|
192
|
+
#
|
193
|
+
class AliasParticipant
|
194
|
+
include LocalParticipant
|
195
|
+
|
196
|
+
attr_reader :aliased_name
|
197
|
+
|
198
|
+
def initialize (aliased_name)
|
199
|
+
|
200
|
+
@aliased_name = aliased_name
|
201
|
+
end
|
202
|
+
|
203
|
+
def consume (workitem)
|
204
|
+
|
205
|
+
get_participant_map.dispatch(nil, @aliased_name, workitem)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
180
209
|
#
|
181
210
|
# The NullParticipant never replies, it simply discards the workitems
|
182
211
|
# it receives.
|
@@ -140,8 +140,10 @@ module OpenWFE
|
|
140
140
|
fei_path = compute_file_path(fei)
|
141
141
|
|
142
142
|
if not File.exist?(fei_path)
|
143
|
+
|
143
144
|
ldebug { "[] didn't find file at #{fei_path}" }
|
144
145
|
#puts "[] didn't find file at #{fei_path}"
|
146
|
+
|
145
147
|
return nil
|
146
148
|
end
|
147
149
|
|
@@ -184,7 +186,8 @@ module OpenWFE
|
|
184
186
|
|
185
187
|
count += 1 if OpenWFE::ends_with(path, ".yaml")
|
186
188
|
end
|
187
|
-
|
189
|
+
|
190
|
+
count
|
188
191
|
end
|
189
192
|
|
190
193
|
#
|
data/lib/openwfe/util/dollar.rb
CHANGED
data/lib/openwfe/util/lru.rb
CHANGED
@@ -30,8 +30,6 @@
|
|
30
30
|
# POSSIBILITY OF SUCH DAMAGE.
|
31
31
|
#++
|
32
32
|
#
|
33
|
-
# $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
|
34
|
-
#
|
35
33
|
|
36
34
|
#
|
37
35
|
# "made in Japan"
|
@@ -601,6 +599,8 @@ module OpenWFE
|
|
601
599
|
|
602
600
|
@last_cron_minute = minute
|
603
601
|
|
602
|
+
#puts "step() @cron_entries.size #{@cron_entries.size}"
|
603
|
+
|
604
604
|
@cron_entries.each do |cron_id, cron_entry|
|
605
605
|
#puts "step() cron_id : #{cron_id}"
|
606
606
|
trigger(cron_entry) if cron_entry.matches? now
|
@@ -729,9 +729,9 @@ module OpenWFE
|
|
729
729
|
|
730
730
|
super(cron_id, &block)
|
731
731
|
|
732
|
-
if line.kind_of?
|
732
|
+
if line.kind_of?(String)
|
733
733
|
@cron_line = CronLine.new(line)
|
734
|
-
elsif line.kind_of?
|
734
|
+
elsif line.kind_of?(CronLine)
|
735
735
|
@cron_line = line
|
736
736
|
else
|
737
737
|
raise \
|
@@ -43,133 +43,76 @@ require 'openwfe/utils'
|
|
43
43
|
|
44
44
|
module OpenWFE
|
45
45
|
|
46
|
+
#
|
47
|
+
# This mixin provides a workqueue and a thread for executing tasks
|
48
|
+
# pushed onto it. It uses the thread.rb Queue class.
|
49
|
+
#
|
50
|
+
# It is currently only used by the ExpressionPool (maybe it'll get
|
51
|
+
# merged back into it later).
|
52
|
+
#
|
46
53
|
module WorkqueueMixin
|
47
54
|
|
48
|
-
WQF_LOW = 0.500
|
49
|
-
|
50
55
|
#
|
51
|
-
#
|
56
|
+
# Creates and starts the workqueue.
|
52
57
|
#
|
53
58
|
def start_workqueue
|
54
59
|
|
55
|
-
@
|
56
|
-
|
57
|
-
@
|
60
|
+
@workqueue = Queue.new
|
61
|
+
|
62
|
+
@workstopped = false
|
58
63
|
|
59
64
|
OpenWFE::call_in_thread "workqueue", self do
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
do_process_workqueue
|
65
|
+
loop do
|
66
|
+
do_process_workelement @workqueue.pop
|
67
|
+
break if @workstopped and @workqueue.empty?
|
64
68
|
end
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
68
72
|
#
|
69
|
-
# Returns true if there is or there just was activity for the
|
73
|
+
# Returns true if there is or there just was activity for the
|
70
74
|
# work queue.
|
71
75
|
#
|
72
76
|
def is_workqueue_busy?
|
73
|
-
|
77
|
+
|
78
|
+
@workqueue.size > 0
|
74
79
|
end
|
75
80
|
|
76
81
|
#
|
77
82
|
# Stops the workqueue.
|
78
83
|
#
|
79
84
|
def stop_workqueue
|
80
|
-
|
81
|
-
|
82
|
-
#
|
83
|
-
# maybe could process the work queue until it's really empty
|
85
|
+
|
86
|
+
@workstopped = true
|
84
87
|
end
|
85
88
|
|
86
89
|
#
|
87
90
|
# the method called by the mixer to actually queue the work.
|
88
91
|
#
|
89
92
|
def queue_work (*args)
|
90
|
-
@workqueue_mutex.synchronize do
|
91
|
-
|
92
|
-
if @workqueue
|
93
|
-
@workqueue.push args
|
94
|
-
#
|
95
|
-
# work will be done later (millisec order)
|
96
|
-
# by the work thread
|
97
|
-
else
|
98
|
-
do_process_workelement args
|
99
|
-
#
|
100
|
-
# degraded mode : as if there were no workqueue
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
#
|
106
|
-
# Returns the current workqueue size
|
107
|
-
#
|
108
|
-
def workqueue_size
|
109
|
-
return 0 unless @workqueue
|
110
|
-
@workqueue.size
|
111
|
-
end
|
112
|
-
|
113
|
-
#
|
114
|
-
# Called by the workqueue thread, copies the workqueue and clears
|
115
|
-
# it, and then processes the elt in the copied workqueue.
|
116
|
-
# (meanwhile, the empty workqueue gets filled by queue_work()
|
117
|
-
# calls)
|
118
|
-
#
|
119
|
-
# This method calls the do_process_workelement() method of
|
120
|
-
# its 'mixer' with each work element queued.
|
121
|
-
#
|
122
|
-
def do_process_workqueue
|
123
|
-
|
124
|
-
q = nil
|
125
93
|
|
126
|
-
@
|
94
|
+
if @workqueue_stopped
|
127
95
|
|
128
|
-
|
129
|
-
increment_workqueue_frequency
|
130
|
-
return
|
131
|
-
end
|
132
|
-
|
133
|
-
q = Array.new(@workqueue)
|
134
|
-
@workqueue.clear
|
135
|
-
|
136
|
-
@workqueue_frequency = 0
|
96
|
+
do_process_workelement args
|
137
97
|
#
|
138
|
-
#
|
139
|
-
|
98
|
+
# degraded mode : as if there were no workqueue
|
99
|
+
else
|
140
100
|
|
141
|
-
|
142
|
-
|
143
|
-
q.each do |elt|
|
144
|
-
|
145
|
-
do_process_workelement elt
|
101
|
+
@workqueue.push args
|
146
102
|
#
|
147
|
-
#
|
148
|
-
#
|
103
|
+
# work will be done later (millisec order)
|
104
|
+
# by the work thread
|
149
105
|
end
|
150
|
-
|
151
|
-
# TODO : have a pool of workers handle that
|
152
|
-
|
153
|
-
#q.size
|
154
106
|
end
|
155
107
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
@workqueue_frequency *= 3
|
166
|
-
|
167
|
-
if @workqueue_frequency == 0
|
168
|
-
@workqueue_frequency = 0.001
|
169
|
-
elsif @workqueue_frequency > WQF_LOW
|
170
|
-
@workqueue_frequency = WQF_LOW
|
171
|
-
end
|
172
|
-
end
|
108
|
+
#--
|
109
|
+
# Returns the current workqueue size
|
110
|
+
#
|
111
|
+
#def workqueue_size
|
112
|
+
# return 0 unless @workqueue
|
113
|
+
# @workqueue.size
|
114
|
+
#end
|
115
|
+
#++
|
173
116
|
end
|
174
117
|
end
|
175
118
|
|
data/lib/openwfe/utils.rb
CHANGED
@@ -65,37 +65,20 @@ module OpenWFE
|
|
65
65
|
exit 1
|
66
66
|
end
|
67
67
|
|
68
|
-
#
|
69
|
-
# Attempts a deep cloning of the object
|
70
|
-
#
|
71
|
-
def OpenWFE.copy (object)
|
72
|
-
|
73
|
-
return nil if object == nil
|
74
|
-
|
75
|
-
if object.kind_of?(Array)
|
76
|
-
result = []
|
77
|
-
object.each do |i|
|
78
|
-
result << copy(i)
|
79
|
-
end
|
80
|
-
return result
|
81
|
-
end
|
82
|
-
|
83
|
-
if object.kind_of?(Hash)
|
84
|
-
result = {}
|
85
|
-
object.each do |k, v|
|
86
|
-
result[copy(k)] = copy(v)
|
87
|
-
end
|
88
|
-
return result
|
89
|
-
end
|
90
|
-
|
91
|
-
return object.dup
|
92
|
-
end
|
93
|
-
|
94
68
|
#
|
95
69
|
# see
|
96
70
|
# http://wiki.rubygarden.org/Ruby/page/show/Make_A_Deep_Copy_Of_An_Object
|
97
71
|
#
|
72
|
+
# It's not perfect (that's why fulldup() uses it only in certain cases).
|
73
|
+
#
|
74
|
+
# For example :
|
75
|
+
#
|
76
|
+
# TypeError: singleton can't be dumped
|
77
|
+
# ./lib/openwfe/utils.rb:74:in `dump'
|
78
|
+
# ./lib/openwfe/utils.rb:74:in `deep_clone'
|
79
|
+
#
|
98
80
|
def OpenWFE.deep_clone (object)
|
81
|
+
|
99
82
|
Marshal::load(Marshal.dump(object))
|
100
83
|
end
|
101
84
|
|
@@ -125,7 +108,13 @@ module OpenWFE
|
|
125
108
|
return d.root
|
126
109
|
end
|
127
110
|
|
128
|
-
o =
|
111
|
+
o = nil
|
112
|
+
|
113
|
+
begin
|
114
|
+
o = object.class.new
|
115
|
+
rescue ArgumentError
|
116
|
+
return deep_clone(object)
|
117
|
+
end
|
129
118
|
|
130
119
|
#
|
131
120
|
# some kind of collection ?
|
@@ -136,7 +125,7 @@ module OpenWFE
|
|
136
125
|
end
|
137
126
|
elsif object.kind_of?(Hash)
|
138
127
|
object.each do |k, v|
|
139
|
-
o[
|
128
|
+
o[fulldup(k)] = fulldup(v)
|
140
129
|
end
|
141
130
|
end
|
142
131
|
|
@@ -194,6 +183,8 @@ module OpenWFE
|
|
194
183
|
#
|
195
184
|
def OpenWFE.parse_uri (string)
|
196
185
|
|
186
|
+
return nil if string.split("\n").size > 1
|
187
|
+
|
197
188
|
begin
|
198
189
|
return URI::parse(string)
|
199
190
|
rescue Exception => e
|
@@ -459,6 +450,22 @@ module OpenWFE
|
|
459
450
|
container[key[i+1..-1]] = value
|
460
451
|
end
|
461
452
|
|
453
|
+
#
|
454
|
+
# Returns true if this host is currently online (has access to the web /
|
455
|
+
# internet).
|
456
|
+
#
|
457
|
+
def online?
|
458
|
+
|
459
|
+
require 'open-uri'
|
460
|
+
|
461
|
+
begin
|
462
|
+
open("http://www.openwfe.org")
|
463
|
+
true
|
464
|
+
rescue SocketError => se
|
465
|
+
false
|
466
|
+
end
|
467
|
+
end
|
468
|
+
|
462
469
|
protected
|
463
470
|
|
464
471
|
def pop_key (key)
|
data/lib/openwfe/version.rb
CHANGED
data/lib/openwfe/workitem.rb
CHANGED
data/test/clone_test.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# Testing OpenWFEru
|
4
|
+
#
|
5
|
+
# John Mettraux at openwfe.org
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'test/unit'
|
9
|
+
|
10
|
+
require 'openwfe/utils'
|
11
|
+
|
12
|
+
|
13
|
+
class FullDupTest < Test::Unit::TestCase
|
14
|
+
|
15
|
+
#def setup
|
16
|
+
#end
|
17
|
+
|
18
|
+
#def teardown
|
19
|
+
#end
|
20
|
+
|
21
|
+
class MyClass
|
22
|
+
|
23
|
+
attr_reader :name
|
24
|
+
|
25
|
+
def initialize (name)
|
26
|
+
@name = name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_fulldup
|
31
|
+
|
32
|
+
o0 = MyClass.new("cow")
|
33
|
+
|
34
|
+
o1 = OpenWFE.fulldup(o0)
|
35
|
+
|
36
|
+
assert_not_equal o0.object_id, o1.object_id
|
37
|
+
assert_equal o0.name, o1.name
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_yaml
|
41
|
+
|
42
|
+
require 'yaml'
|
43
|
+
|
44
|
+
o0 = MyClass.new("pig")
|
45
|
+
o1 = YAML.load(o0.to_yaml)
|
46
|
+
|
47
|
+
assert_not_equal o0.object_id, o1.object_id
|
48
|
+
assert_equal o0.name, o1.name
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
#
|
2
|
+
# Testing OpenWFE
|
3
|
+
#
|
4
|
+
# John Mettraux at openwfe.org
|
5
|
+
#
|
6
|
+
# Sun Oct 29 15:41:44 JST 2006
|
7
|
+
#
|
8
|
+
# Kita Yokohama
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'test/unit'
|
12
|
+
|
13
|
+
#require 'openwfe/workitem'
|
14
|
+
#require 'openwfe/flowexpressionid'
|
15
|
+
require 'openwfe/engine/engine'
|
16
|
+
require 'openwfe/expressions/raw_prog'
|
17
|
+
require 'openwfe/worklist/storeparticipant'
|
18
|
+
|
19
|
+
include OpenWFE
|
20
|
+
|
21
|
+
|
22
|
+
class ConcurrenceAndParticipantTest < Test::Unit::TestCase
|
23
|
+
|
24
|
+
def setup
|
25
|
+
@engine = Engine.new()
|
26
|
+
end
|
27
|
+
|
28
|
+
#def teardown
|
29
|
+
#end
|
30
|
+
|
31
|
+
#
|
32
|
+
# concurrence test
|
33
|
+
|
34
|
+
class Hpc0 < ProcessDefinition
|
35
|
+
concurrence do
|
36
|
+
#participant :alice
|
37
|
+
#participant :bob
|
38
|
+
alice
|
39
|
+
bob
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_hpc_0
|
44
|
+
|
45
|
+
@hpAlice = HashParticipant.new
|
46
|
+
@hpBob = HashParticipant.new
|
47
|
+
|
48
|
+
@engine.register_participant(:alice, @hpAlice)
|
49
|
+
@engine.register_participant(:bob, @hpBob)
|
50
|
+
|
51
|
+
@engine.launch(Hpc0)
|
52
|
+
|
53
|
+
sleep 0.100
|
54
|
+
|
55
|
+
assert_equal @hpAlice.size, 1
|
56
|
+
assert_equal @hpBob.size, 1
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_1
|
60
|
+
|
61
|
+
@engine.register_participant :alice do |workitem|
|
62
|
+
puts "alice in"
|
63
|
+
sleep 0.100
|
64
|
+
puts "alice out"
|
65
|
+
end
|
66
|
+
@engine.register_participant :bob do |workitem|
|
67
|
+
puts "bob in"
|
68
|
+
sleep 0.100
|
69
|
+
puts "bob out"
|
70
|
+
end
|
71
|
+
|
72
|
+
@engine.launch Hpc0
|
73
|
+
|
74
|
+
sleep 2
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
data/test/cron_test_2.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# Testing OpenWFE
|
4
|
+
#
|
5
|
+
# John Mettraux at openwfe.org
|
6
|
+
#
|
7
|
+
# Sun Oct 29 16:18:25 JST 2006
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'test/unit'
|
11
|
+
|
12
|
+
require 'openwfe/util/otime'
|
13
|
+
require 'openwfe/util/scheduler'
|
14
|
+
|
15
|
+
|
16
|
+
#
|
17
|
+
# testing otime and the scheduler (its cron aspect)
|
18
|
+
#
|
19
|
+
class CronTest2 < Test::Unit::TestCase
|
20
|
+
|
21
|
+
#def setup
|
22
|
+
#end
|
23
|
+
|
24
|
+
#def teardown
|
25
|
+
#end
|
26
|
+
|
27
|
+
def t_0
|
28
|
+
|
29
|
+
$var = 0
|
30
|
+
|
31
|
+
scheduler = OpenWFE::Scheduler.new
|
32
|
+
scheduler.start
|
33
|
+
|
34
|
+
scheduler.schedule '* * * * *' do
|
35
|
+
$var += 1
|
36
|
+
end
|
37
|
+
|
38
|
+
sleep 1
|
39
|
+
scheduler.stop
|
40
|
+
|
41
|
+
puts Time.now
|
42
|
+
puts "XXX #{$var}" if $var != 0
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_0
|
46
|
+
300.times do
|
47
|
+
t_0
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|