abundance 1.2.6 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/garden.rb CHANGED
@@ -38,25 +38,15 @@ class Garden
38
38
  set_my_socket_as_a(:garden)
39
39
 
40
40
  loop do
41
- seed_if_row_available
42
-
43
- message_block = socket_recv
44
- case message_block[0]
45
- when :seed
46
- place_seed_in_queue(message_block)
47
- when :row
48
- this_row_is_available(message_block)
49
- when :crop
50
- save_crop_for(message_block)
51
- when :growth
52
- report_growth(message_block)
53
- when :harvest
54
- harvest_some(message_block)
55
- when :close
56
- close_all(message_block)
57
- else
58
- message_block[2] = false
59
- socket_send(message_block)
41
+ route_message_blocks
42
+ seed_available_rows
43
+
44
+ ready = select(@reader[:sockets],@writer[:sockets],nil,10)
45
+ unless ready.nil?
46
+ readable, writable = ready[0..1]
47
+
48
+ crop_writable(writable) if writable
49
+ sprout_readable(readable) if readable
60
50
  end
61
51
  end
62
52
  end
data/lib/garden_cycles.rb CHANGED
@@ -10,46 +10,98 @@ class Garden
10
10
  def set_my_containers
11
11
  @close_message_block = nil; @full_crop_message_block = nil
12
12
  @init_message_block = nil; @seed_all_message_block = nil
13
- @harvest_queue = []; @waiting_rows = []; @id = 0
14
- @seeds = []; @sprouts = []; @crops = []
13
+ @harvest_queue = []; @waiting_rows = []; @message_block_queue = []
14
+ @seeds = []; @sprouts = []; @crops = []; @id = 0
15
15
  end
16
16
 
17
- def seed_if_row_available
18
- catch :fill_rows do
19
- loop do
20
- if @seed_all_message_block && ! @waiting_rows.empty? && @seed_all_message_block[4][:row_done].size != @seed_all_message_block[1]
21
- row_socket_path = @waiting_rows.shift
22
- unless @seed_all_message_block[4][:row_done].include?( row_socket_path )
23
- socket_send([:seed,:all,@seed_all_message_block[2],row_socket_path])
24
- @seed_all_message_block[4][:row_done] << row_socket_path
25
- else
26
- @waiting_rows << row_socket_path
27
- end
28
- elsif @init_message_block && ! @waiting_rows.empty? && @init_message_block[4][:row_done].size != @init_message_block[2]
29
- row_socket_path = @waiting_rows.shift
30
- unless @init_message_block[4][:row_done].include?( row_socket_path )
31
- socket_send([:seed,:init,'init_status',row_socket_path])
32
- @init_message_block[4][:row_done] << row_socket_path
33
- else
34
- @waiting_rows << row_socket_path
35
- end
36
- elsif ! @seeds.empty? && ! @waiting_rows.empty?
37
- seed = @seeds.shift; @sprouts[seed[:id]] = seed
38
- socket_send([:seed,:sprout,seed,@waiting_rows.shift])
39
- elsif @close_message_block && ! @waiting_rows.empty?
40
- socket_send([:seed,:quit,nil,@waiting_rows.shift])
41
- else
42
- throw :fill_rows
43
- end
44
- end
45
- end
17
+ def sprout_readable(readable)
18
+ readable.each do |i_socket|
19
+ if i_socket == @my_socket
20
+ add_readable(i_socket)
21
+ else
22
+ readable_main(i_socket)
23
+ end
24
+ end
25
+ end
26
+
27
+ def crop_writable(writable)
28
+ writable.each do |o_socket|
29
+ if @writer[:buffer][o_socket.to_s] == '' || @writer[:buffer][o_socket.to_s] == nil
30
+ remove_writable(o_socket)
31
+ else
32
+ write_raw(o_socket)
33
+ end
34
+ end
35
+ end
36
+
37
+ def route_message_blocks
38
+ until @message_block_queue.empty?
39
+ message_block = @message_block_queue.shift
40
+ case message_block[0]
41
+ when :seed
42
+ place_seed_in_queue(message_block)
43
+ when :row
44
+ this_row_is_available(message_block)
45
+ when :crop
46
+ save_crop_for(message_block)
47
+ when :growth
48
+ report_growth(message_block)
49
+ when :harvest
50
+ harvest_some(message_block)
51
+ when :close
52
+ close_all(message_block)
53
+ else
54
+ message_block[2] = false
55
+ add_writable(message_block)
56
+ end
57
+ end
58
+ end
59
+
60
+ def seed_available_rows
61
+ catch :fill_rows do
62
+ loop do
63
+ throw :fill_rows if @waiting_rows.empty?
64
+ if @seed_all_message_block && @seed_all_message_block[4][:row_done].size != @seed_all_message_block[1]
65
+ row_socket_path = @waiting_rows.shift
66
+ unless @seed_all_message_block[4][:row_done].include?( row_socket_path )
67
+ add_writable([:seed,:all,@seed_all_message_block[2],row_socket_path])
68
+ @seed_all_message_block[4][:row_done] << row_socket_path
69
+ else
70
+ @waiting_rows << row_socket_path
71
+ end
72
+ elsif @init_message_block && @init_message_block[4][:row_done].size != @init_message_block[2]
73
+ row_socket_path = @waiting_rows.shift
74
+ unless @init_message_block[4][:row_done].include?( row_socket_path )
75
+ add_writable([:seed,:init,'init_status',row_socket_path])
76
+ @init_message_block[4][:row_done] << row_socket_path
77
+ else
78
+ @waiting_rows << row_socket_path
79
+ end
80
+ elsif ! @seeds.empty?
81
+ seed = @seeds.shift; @sprouts[seed[:id]] = seed
82
+ add_writable([:seed,:sprout,seed,@waiting_rows.shift])
83
+ elsif @close_message_block && ! @waiting_rows.empty?
84
+ add_writable([:seed,:quit,nil,@waiting_rows.shift])
85
+ else
86
+ throw :fill_rows
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ private
93
+
94
+ def readable_main(i_socket)
95
+ message_block = read_message_block(i_socket)
96
+ @message_block_queue << message_block
97
+ @reader[:sockets].delete(i_socket) if @reader[:sockets].include?(i_socket)
46
98
  end
47
99
 
48
100
  def place_seed_in_queue(message_block)
49
101
  case message_block[1]
50
102
  when :one
51
103
  @id += 1; @seeds << {:id => @id , :seed => message_block[2]}
52
- message_block[2] = @id; socket_send(message_block)
104
+ message_block[2] = @id; add_writable(message_block)
53
105
  else
54
106
  @seed_all_message_block = Array.new(message_block)
55
107
  @seed_all_message_block[4] = {:row_done => [], :crops => []}
@@ -72,7 +124,7 @@ class Garden
72
124
  seed = @seeds.shift; @sprouts[seed[:id]] = seed
73
125
  message_block = [:row, :sprout, seed, message_block[3]]
74
126
  end
75
- socket_send(message_block)
127
+ add_writable(message_block)
76
128
  end
77
129
 
78
130
  def save_crop_for(message_block)
@@ -81,23 +133,23 @@ class Garden
81
133
  @sprouts[message_block[2][:id]] = nil
82
134
  @crops[message_block[2][:id]] = message_block[2]
83
135
  if @harvest_queue[message_block[2][:id]]
84
- socket_send(message_block[0..2]+[@harvest_queue[message_block[2][:id]]])
136
+ add_writable(message_block[0..2]+[@harvest_queue[message_block[2][:id]]])
85
137
  @crops[message_block[2][:id]] = @harvest_queue[message_block[2][:id]] = nil
86
138
  elsif @full_crop_message_block && @seeds.compact.empty? && @sprouts.compact.empty?
87
- socket_send(message_block[0..1]+[@crops.compact,@full_crop_message_block[3]])
139
+ add_writable(message_block[0..1]+[@crops.compact,@full_crop_message_block[3]])
88
140
  @crops.clear; @full_crop_message_block = nil
89
141
  end
90
142
  when :seed_all
91
143
  @seed_all_message_block[4][:crops] << message_block[2]
92
144
  if @seed_all_message_block[4][:crops].size == @seed_all_message_block[1]
93
145
  @seed_all_message_block[2] = @seed_all_message_block[4][:crops]; @seed_all_message_block[4] = nil
94
- socket_send(@seed_all_message_block.compact); @seed_all_message_block = nil
146
+ add_writable(@seed_all_message_block.compact); @seed_all_message_block = nil
95
147
  end
96
148
  when :init
97
149
  @init_message_block[4][:crops] << message_block[2]
98
150
  if @init_message_block[4][:crops].size == @init_message_block[2]
99
151
  @init_message_block[2] = @init_message_block[4][:crops]; @init_message_block[4] = nil
100
- socket_send(@init_message_block.compact); @init_message_block = nil
152
+ add_writable(@init_message_block.compact); @init_message_block = nil
101
153
  end
102
154
  end
103
155
  end
@@ -117,7 +169,7 @@ class Garden
117
169
  else
118
170
  message_block[2] = false
119
171
  end
120
- socket_send(message_block)
172
+ add_writable(message_block)
121
173
  end
122
174
 
123
175
  def harvest_some(message_block)
@@ -125,26 +177,26 @@ class Garden
125
177
  when :one
126
178
  unless message_block[2].nil?
127
179
  if @crops[message_block[2]]
128
- socket_send(message_block[0..1]+[@crops[message_block[2]],message_block[3]])
180
+ add_writable(message_block[0..1]+[@crops[message_block[2]],message_block[3]])
129
181
  @crops[message_block[2]] = nil
130
182
  else
131
183
  @harvest_queue[message_block[2]] = message_block[3]
132
184
  end
133
185
  else
134
- message_block[2] = false; socket_send(message_block)
186
+ message_block[2] = false; add_writable(message_block)
135
187
  end
136
188
  when :all
137
189
  message_block[2] = {:seeds => @seeds, :sprouts => @sprouts.compact, :crops => @crops.compact}
138
- socket_send(message_block)
190
+ add_writable(message_block)
139
191
  when :seed
140
- message_block[2] = @seeds; socket_send(message_block)
192
+ message_block[2] = @seeds; add_writable(message_block)
141
193
  when :sprout
142
- message_block[2] = @sprouts.compact; socket_send(message_block)
194
+ message_block[2] = @sprouts.compact; add_writable(message_block)
143
195
  when :crop
144
- message_block[2] = @crops.compact; socket_send(message_block); @crops.clear
196
+ message_block[2] = @crops.compact; add_writable(message_block); @crops.clear
145
197
  when :full_crop
146
198
  if @seeds.compact.empty? && @sprouts.compact.empty?
147
- message_block[2] = @crops.compact; socket_send(message_block); @crops.clear
199
+ message_block[2] = @crops.compact; add_writable(message_block); @crops.clear
148
200
  else
149
201
  @full_crop_message_block = Array.new(message_block)
150
202
  end
@@ -152,7 +204,7 @@ class Garden
152
204
  @init_message_block = Array.new(message_block)
153
205
  @init_message_block[4] = {:row_done => [], :crops => []}
154
206
  else
155
- message_block[2] = false; socket_send(message_block)
207
+ message_block[2] = false; add_writable(message_block)
156
208
  end
157
209
  end
158
210
 
data/lib/rows.rb CHANGED
@@ -52,7 +52,7 @@ class Garden
52
52
  t2 = Thread.new do
53
53
  loop do
54
54
  if $seed.nil?
55
- message_block = socket_duplex([:row,:row,my_socket_path,@garden_path])
55
+ message_block = socket_duplex([:row,:row,@my_socket_path,@garden_path])
56
56
  case message_block[1]
57
57
  when :sprout
58
58
  sprout(message_block)
data/lib/rows_paths.rb CHANGED
@@ -22,7 +22,7 @@ class Garden
22
22
  end
23
23
 
24
24
  def init
25
- $init = {:seed => 'init_status', :message => 'No Init Message', :id => Process.pid} if $init.nil?
25
+ $init = {:seed => 'init_status', :success => false, :message => 'No Init Message', :id => Process.pid} if $init.nil?
26
26
  socket_send([:crop,:init,$init,@garden_path])
27
27
  end
28
28
 
data/lib/toolshed.rb CHANGED
@@ -32,10 +32,12 @@ module Toolshed
32
32
  case role
33
33
  when :garden
34
34
  set_my_socket(Process.pid.to_s)
35
+ @reader = {:sockets => [@my_socket], :buffer => {}}
36
+ @writer = {:sockets => [], :buffer => {}}
35
37
  when :gardener
36
38
  set_garden_path(garden_pid)
37
39
  set_my_socket(Process.pid.to_s + Time.now.to_i.to_s + rand(10000).to_s)
38
- else
40
+ when :row
39
41
  set_garden_path(garden_pid)
40
42
  set_my_socket(Process.pid.to_s)
41
43
  end
@@ -63,12 +65,43 @@ module Toolshed
63
65
  # * _server_socket_path_ = a UNIXServer socket path for the packets to be sent to
64
66
  def socket_duplex(message_block)
65
67
  send_block(message_block)
66
- Marshal.load(recv_whole_block)
68
+ client = @my_socket.accept
69
+ recv_whole_block(client)
67
70
  end
68
71
 
69
72
  # The +socket_recv+ method calls _accept_ on a UNIXServer socket, receives all the packets from a UNIXSocket sender, join the packets back as the original block message.
70
73
  def socket_recv
71
- Marshal.load(recv_whole_block)
74
+ client = @my_socket.accept
75
+ recv_whole_block(client)
76
+ end
77
+
78
+ def add_readable(socket)
79
+ client = socket.accept
80
+ @reader[:sockets] << client
81
+ end
82
+
83
+ def add_writable(message_block)
84
+ client = UNIXSocket.open(message_block[3])
85
+ @writer[:sockets] << client
86
+ @writer[:buffer][client.to_s] = Marshal.dump(message_block)
87
+ end
88
+
89
+ def remove_writable(client)
90
+ @writer[:sockets].delete(client)
91
+ @writer[:buffer].delete(client.to_s)
92
+ client.close
93
+ end
94
+
95
+ def read_raw(client)
96
+ client.recvfrom(@@block_size)[0]
97
+ end
98
+
99
+ def write_raw(client)
100
+ client.send(@writer[:buffer][client.to_s].slice!(0..@@block_size-1),0)
101
+ end
102
+
103
+ def read_message_block(client)
104
+ recv_whole_block(client)
72
105
  end
73
106
 
74
107
  private
@@ -96,10 +129,28 @@ module Toolshed
96
129
  @garden_path = socket_path(garden_pid.to_s)
97
130
  end
98
131
 
132
+ # The +send_block+ method sends a block to a server socket.
133
+ # === Parameters
134
+ # * _command_ = command part of the sent packet
135
+ # * _data_ = data part of the sent packet
136
+ # * _server_socket_path_ = the UNIXServer socket path to send to
137
+ def send_block(message_block)
138
+ begin
139
+ client = UNIXSocket.open(message_block[3])
140
+ block = Marshal.dump(message_block[0..2] + [@my_socket_path])
141
+ client.send(block,0)
142
+ client.close
143
+ rescue Errno::EADDRINUSE
144
+ retry
145
+ rescue Errno::ECONNREFUSED
146
+ retry
147
+ end
148
+ end
149
+
99
150
  # The +recv_whole_block+ method loops receiving a sent block as packets, rebuilding the whole block and joining it.
100
- def recv_whole_block
151
+ def recv_whole_block(client)
152
+ block = String.new
101
153
  begin
102
- client = @my_socket.accept; block = []
103
154
  catch :whole_block do
104
155
  loop do
105
156
  packet = client.recvfrom(@@block_size)[0]
@@ -110,26 +161,10 @@ module Toolshed
110
161
  end
111
162
  end
112
163
  end
113
- return block.join
114
- rescue Errno::EADDRINUSE
115
- retry
116
- end
117
- end
118
-
119
- # The +send_block+ method sends a block to a server socket.
120
- # === Parameters
121
- # * _command_ = command part of the sent packet
122
- # * _data_ = data part of the sent packet
123
- # * _server_socket_path_ = the UNIXServer socket path to send to
124
- def send_block(message_block)
125
- begin
126
- client = UNIXSocket.open(message_block[3])
127
- client.send(Marshal.dump(message_block[0..2] + [@my_socket_path]),0)
128
- client.close
164
+ message_block = Marshal.load(block)
165
+ return message_block
129
166
  rescue Errno::EADDRINUSE
130
167
  retry
131
- rescue Errno::ECONNREFUSED
132
- retry
133
168
  end
134
169
  end
135
170
 
data/test/tc_burst.rb CHANGED
@@ -2,7 +2,7 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
2
  require 'test/unit'
3
3
  require 'abundance'
4
4
 
5
- class TestHighAPI < Test::Unit::TestCase
5
+ class TestBurst < Test::Unit::TestCase
6
6
 
7
7
  def test_burst1
8
8
  check_init
data/test/tc_high_api.rb CHANGED
@@ -24,11 +24,11 @@ class TestHighAPI < Test::Unit::TestCase
24
24
 
25
25
  def teardown
26
26
  final = @g.close
27
- assert_kind_of(Hash,final)
28
- assert_equal(3,final.size)
29
- assert_not_nil(final[:seeds])
30
- assert_not_nil(final[:sprouts])
31
- assert_not_nil(final[:crops])
27
+ assert_kind_of(Hash,final,"close method didn't return a Hash, it returned: #{final.inspect}")
28
+ assert_equal(3,final.size,"Hash returned on close has wrong size, here it is: #{final.inspect}")
29
+ assert_not_nil(final[:seeds],"close Hash has Nil value for :seeds instead of an Array")
30
+ assert_not_nil(final[:sprouts],"close Hash has Nil value for :sprouts instead of an Array")
31
+ assert_not_nil(final[:crops],"close Hash has Nil value for :crops instead of an Array")
32
32
  end
33
33
 
34
34
  private
@@ -37,7 +37,11 @@ class TestHighAPI < Test::Unit::TestCase
37
37
  @g = Abundance.gardener(:rows => @rows, :init_timeout => 3) do
38
38
  Abundance.init_status(true,Process.pid)
39
39
  Abundance.grow do |seed|
40
- seed.crop(true, "gardener: #{seed.sprout}")
40
+ if seed.sprout.nil?
41
+ seed.crop(false, "gardener has no seed")
42
+ else
43
+ seed.crop(true, "gardener: #{seed.sprout}")
44
+ end
41
45
  end
42
46
  end
43
47
  end
@@ -45,7 +49,8 @@ class TestHighAPI < Test::Unit::TestCase
45
49
  def reality_check
46
50
  assert_instance_of(Gardener,@g)
47
51
 
48
- check_init
52
+ check_init
53
+ check_false
49
54
  check_seed_harvest # leaves no crops in the queue
50
55
  check_full_harvest # also leaves no crops in the queue
51
56
  check_deep_harvest # may leave crap behind, so needs to come last of the harvest
@@ -56,25 +61,31 @@ class TestHighAPI < Test::Unit::TestCase
56
61
 
57
62
  def check_init
58
63
  @g.init_status.each do |init|
59
- assert_not_nil(init[:message])
60
- assert_not_nil(init[:success])
61
- assert_not_nil(init[:pid])
64
+ assert_not_nil(init[:message],"init :message value is Nil instead of String")
65
+ assert_not_nil(init[:success],"init :success value is Nil instead of True || False")
66
+ assert_not_nil(init[:pid],"init :pid value is Nil instead of Numeric")
62
67
 
63
- assert_not_equal(Process.pid,init[:message])
64
- assert_equal(init[:message],init[:pid])
68
+ assert_not_equal(Process.pid,init[:message],"init has same pid than test process, something has gone wrong in the forking...")
69
+ assert_equal(init[:message],init[:pid],"init :pid should be the row pid, it isn't")
65
70
  end
66
71
  end
67
72
 
73
+ def check_false
74
+ id = @g.seed(nil)
75
+ answer = @g.harvest(:one,id)
76
+ assert_equal(false,answer[:success],"failed returning a seed for which :success value was false")
77
+ end
78
+
68
79
  def check_seed_harvest
69
80
  id = @g.seed(Process.pid)
70
- assert_kind_of(Integer,id)
81
+ assert_kind_of(Integer,id,"seed method failed returning and Integer")
71
82
 
72
83
  answer = @g.harvest(:one,id)
73
- assert_kind_of(Hash,answer)
74
- assert_equal(Process.pid,answer[:seed])
75
- assert_equal(id,answer[:id])
76
- assert_equal(true,answer[:success])
77
- assert_equal("gardener: #{Process.pid}",answer[:message])
84
+ assert_kind_of(Hash,answer,"harvest :one method failed to return a seed Hash, got #{answer.inspect} instead.")
85
+ assert_equal(Process.pid,answer[:seed], "harvesting showed a problem with seeding flow, seed[:seed] had wrong return value")
86
+ assert_equal(id,answer[:id], "harvesting showed a problem with seeding flow, seed[:id] had wrong return value")
87
+ assert_equal(true,answer[:success], "harvesting showed a problem with seeding flow, seed[:success] had wrong return value")
88
+ assert_equal("gardener: #{Process.pid}",answer[:message], "harvesting showed a problem with seeding flow, seed[:message] had wrong return value")
78
89
  end
79
90
 
80
91
  def check_full_harvest
@@ -83,7 +94,7 @@ class TestHighAPI < Test::Unit::TestCase
83
94
  queue_items[num] = @g.seed(num)
84
95
  end
85
96
  full_crop = @g.harvest(:full_crop)
86
- assert_equal(25,full_crop.size)
97
+ assert_equal(25,full_crop.size, "a :full_crop harvest has shown some seeds were lost during processing")
87
98
  results = []
88
99
  queue_items.each do |num,id|
89
100
  success = false
@@ -92,20 +103,20 @@ class TestHighAPI < Test::Unit::TestCase
92
103
  end
93
104
  results << success
94
105
  end
95
- assert(results[0] == true && results.uniq.size == 1)
106
+ assert(results[0] == true && results.uniq.size == 1, "a :full_crop harvest has shown processing to be inconsistent amongst rows")
96
107
  end
97
108
 
98
109
  def check_growth
99
110
  progress = @g.growth(:progress)
100
- assert_kind_of(String,progress)
101
- assert(progress.to_f >= 0 && progress.to_f <= 1)
111
+ assert_kind_of(String,progress, "the growth :progress method doesn't return proper value")
112
+ assert(progress.to_f >= 0 && progress.to_f <= 1, "the growth :progress method doesn't return a value between 0 and 1")
102
113
 
103
114
  seeds_growth = @g.growth(:seed)
104
- assert_kind_of(Integer,seeds_growth)
115
+ assert_kind_of(Integer,seeds_growth, "the growth :seed method doesn't return proper value")
105
116
  sprouts_growth = @g.growth(:sprout)
106
- assert_kind_of(Integer,sprouts_growth)
117
+ assert_kind_of(Integer,sprouts_growth, "the growth :sprout method doesn't return proper value")
107
118
  crops_growth = @g.growth(:crop)
108
- assert_kind_of(Integer,crops_growth)
119
+ assert_kind_of(Integer,crops_growth, "the growth :crop method doesn't return proper value")
109
120
  end
110
121
 
111
122
  def check_deep_harvest
@@ -115,11 +126,11 @@ class TestHighAPI < Test::Unit::TestCase
115
126
  end
116
127
 
117
128
  all = @g.harvest(:all)
118
- assert_kind_of(Hash,all)
119
- assert_equal(25,all[:seeds].size + all[:sprouts].size + all[:crops].size)
120
- seeds_harvest = @g.harvest(:seed); assert_kind_of(Array,seeds_harvest)
121
- sprouts_harvest = @g.harvest(:sprout); assert_kind_of(Array,sprouts_harvest)
122
- crops_harvest = @g.harvest(:crop); assert_kind_of(Array,crops_harvest)
129
+ assert_kind_of(Hash,all, "the harvest :all method doesn't return a Hash as supposed")
130
+ assert_equal(25,all[:seeds].size + all[:sprouts].size + all[:crops].size, "the harvest :all method returns a total of items not coherent with amount of seeded items")
131
+ seeds_harvest = @g.harvest(:seed); assert_kind_of(Array,seeds_harvest, "the harvest :seed method doesn't return an Array as supposed")
132
+ sprouts_harvest = @g.harvest(:sprout); assert_kind_of(Array,sprouts_harvest, "the harvest :sprout method doesn't return an Array as supposed")
133
+ crops_harvest = @g.harvest(:crop); assert_kind_of(Array,crops_harvest, "the harvest :crop method doesn't return an Array as supposed")
123
134
  results = []
124
135
  queue_items.each do |num,id|
125
136
  success = false
@@ -134,14 +145,14 @@ class TestHighAPI < Test::Unit::TestCase
134
145
  end
135
146
  results << success
136
147
  end
137
- assert(results[0] == true && results.uniq.size == 1)
148
+ assert(results[0] == true && results.uniq.size == 1, "the harvest :all method has shown processing to be inconsistent amongst rows")
138
149
  end
139
150
 
140
151
  def check_seed_all
141
152
  all = @g.seed_all("all")
142
- assert_equal(@rows,all.size)
153
+ assert_equal(@rows,all.size, "the seed_all method has missed some rows in its seeding, harvesting, or both")
143
154
  all.map! { |seed| seed[:message] == "gardener: all" }
144
- assert( all.uniq.size == 1 && all[0] == true )
155
+ assert( all.uniq.size == 1 && all[0] == true, "the seed_all method shows an inconsistency amongst row processing")
145
156
  end
146
157
 
147
158
  end
@@ -2,7 +2,7 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
2
  require 'test/unit'
3
3
  require 'abundance'
4
4
 
5
- class TestHighAPI < Test::Unit::TestCase
5
+ class TestMultiGardener < Test::Unit::TestCase
6
6
 
7
7
  def test_two_gardeners
8
8
  @rows = 2
@@ -43,9 +43,11 @@ class TestHighAPI < Test::Unit::TestCase
43
43
  answer1 = @g1.harvest(:one,id1)
44
44
  answer2 = @g2.harvest(:one,id2)
45
45
 
46
- assert(answer1[:message] != answer2[:message])
47
- assert(answer1[:message] =~ /gardener1.*/)
48
- assert(answer2[:message] =~ /gardener2.*/)
46
+ assert_not_equal(answer1[:message],answer2[:message], "trouble getting two gardeners have their own answers... maybe it only one after all!")
47
+ assert_match(/gardener1.*/, answer1[:message], "looks like one of the gardener has got its answer wrong")
48
+ assert_match(/gardener2.*/, answer2[:message], "looks like one of the gardener has got its answer wrong")
49
+ assert_no_match(/gardener2.*/, answer1[:message], "looks like the gardeners are having trouble keeping their identities, one reference the other")
50
+ assert_no_match(/gardener1.*/, answer2[:message], "looks like the gardeners are having trouble keeping their identities, one reference the other")
49
51
  end
50
52
 
51
53
  end
@@ -2,7 +2,7 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
2
  require 'test/unit'
3
3
  require 'abundance'
4
4
 
5
- class TestHighAPI < Test::Unit::TestCase
5
+ class TestRobustness < Test::Unit::TestCase
6
6
 
7
7
  def test_abundance_robust
8
8
  @seed_size = 124
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abundance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.6
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Louis-Philippe Perron
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-18 00:00:00 -05:00
12
+ date: 2009-01-24 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15