iron_mq 5.0.1 → 6.0.0.pre1
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +19 -17
- data/README.md +420 -70
- data/iron_mq.gemspec +2 -1
- data/lib/iron_mq/client.rb +38 -14
- data/lib/iron_mq/messages.rb +22 -8
- data/lib/iron_mq/queues.rb +105 -66
- data/lib/iron_mq/response.rb +2 -2
- data/lib/iron_mq/subscribers.rb +7 -2
- data/lib/iron_mq/version.rb +1 -1
- data/test/Rakefile +33 -0
- data/test/quick_run.rb +4 -4
- data/test/quick_run2.rb +2 -2
- data/test/test_alerts.rb +79 -32
- data/test/test_base.rb +6 -4
- data/test/test_bulk.rb +1 -1
- data/test/test_iron_mq.rb +183 -141
- data/test/test_mq_worker_subscribers.rb +2 -2
- data/test/test_performance.rb +29 -0
- data/test/test_push_queues.rb +85 -116
- data/test/tmp.rb +2 -0
- metadata +48 -32
- data/test/test_beanstalkd.rb +0 -243
data/lib/iron_mq/response.rb
CHANGED
data/lib/iron_mq/subscribers.rb
CHANGED
@@ -10,6 +10,10 @@ module IronMQ
|
|
10
10
|
@options = options
|
11
11
|
end
|
12
12
|
|
13
|
+
def name
|
14
|
+
@raw['name']
|
15
|
+
end
|
16
|
+
|
13
17
|
def url
|
14
18
|
@raw['url']
|
15
19
|
end
|
@@ -20,7 +24,8 @@ module IronMQ
|
|
20
24
|
|
21
25
|
# `options` was kept for backward compatibility
|
22
26
|
def delete(options = {})
|
23
|
-
@message.call_api_and_parse_response(:delete, path
|
27
|
+
@message.call_api_and_parse_response(:delete, path,
|
28
|
+
{subscriber_name: name})
|
24
29
|
rescue Rest::HttpError => ex
|
25
30
|
#if ex.code == 404
|
26
31
|
# Rest.logger.info("Delete got 404, safe to ignore.")
|
@@ -36,7 +41,7 @@ module IronMQ
|
|
36
41
|
private
|
37
42
|
|
38
43
|
def path
|
39
|
-
"/subscribers/#{
|
44
|
+
"/subscribers/#{name}"
|
40
45
|
end
|
41
46
|
end
|
42
47
|
|
data/lib/iron_mq/version.rb
CHANGED
data/test/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
Dir.chdir(File.dirname(__FILE__) + '/..')
|
5
|
+
|
6
|
+
Rake::TestTask.new do |t|
|
7
|
+
if ENV['NEW_PROJECT']
|
8
|
+
require_relative '../lib/iron_worker_ng.rb'
|
9
|
+
|
10
|
+
client = IronWorkerNG::Client.new
|
11
|
+
name = 'IWtest ' + Time.now.strftime('%b %-d %T')
|
12
|
+
resp = client.api.post('projects', name: name)
|
13
|
+
res = JSON.parse(resp.body)
|
14
|
+
raise "Failed to create new project: #{res}" unless
|
15
|
+
res['msg'].start_with? 'Project Created'
|
16
|
+
|
17
|
+
ENV['IRON_PROJECT_ID'] = res['id']
|
18
|
+
end
|
19
|
+
if ENV['IRON_PROJECT_ID']
|
20
|
+
t.options = "-- --project-id=#{ENV['IRON_PROJECT_ID']}"
|
21
|
+
end
|
22
|
+
|
23
|
+
t.libs << "lib"
|
24
|
+
|
25
|
+
files = FileList['test/**/test_*.rb']
|
26
|
+
t.test_files = files.keep_if do |f|
|
27
|
+
f =~ Regexp.new(ENV['TESTP'] || '') and
|
28
|
+
not ( r = ENV['EXCLP'] and
|
29
|
+
f =~ Regexp.new(r) )
|
30
|
+
end
|
31
|
+
|
32
|
+
t.verbose = true
|
33
|
+
end
|
data/test/quick_run.rb
CHANGED
@@ -27,8 +27,8 @@ class QuickRun < TestBase
|
|
27
27
|
puts "post"
|
28
28
|
res = queue.post(body)
|
29
29
|
# p res
|
30
|
-
|
31
|
-
|
30
|
+
refute_nil res
|
31
|
+
refute_nil res.id
|
32
32
|
post_id = res.id
|
33
33
|
assert !(res.msg.nil? || res.msg.empty?)
|
34
34
|
end
|
@@ -36,7 +36,7 @@ class QuickRun < TestBase
|
|
36
36
|
quicky.time(:get) do
|
37
37
|
puts "get"
|
38
38
|
msg = queue.get
|
39
|
-
|
39
|
+
refute_nil msg.id
|
40
40
|
assert_equal msg.id, post_id
|
41
41
|
assert !(msg.body.nil? || msg.body.empty?)
|
42
42
|
assert_equal body, msg.body
|
@@ -46,7 +46,7 @@ class QuickRun < TestBase
|
|
46
46
|
puts "delete"
|
47
47
|
res = queue.delete(post_id)
|
48
48
|
# p res
|
49
|
-
|
49
|
+
refute_nil res
|
50
50
|
assert !(res.msg.nil? || res.msg.empty?)
|
51
51
|
end
|
52
52
|
|
data/test/quick_run2.rb
CHANGED
data/test/test_alerts.rb
CHANGED
@@ -17,61 +17,69 @@ class TestAlerts < TestBase
|
|
17
17
|
|
18
18
|
# no configuration
|
19
19
|
alert = {}
|
20
|
-
|
20
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
21
21
|
|
22
22
|
# only type is specified
|
23
23
|
alert[:type] = 'fixed'
|
24
|
-
|
24
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
25
25
|
|
26
26
|
# type and trigger value specified
|
27
27
|
alert[:trigger] = 30
|
28
|
-
|
28
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
29
29
|
|
30
30
|
# type, trigger, and direction
|
31
31
|
alert[:direction] = 'asc'
|
32
|
-
|
32
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
33
33
|
|
34
34
|
# type, trigger, direction, and alert queue name - alright
|
35
35
|
aq_name = 'bad-alerts-params-alerts'
|
36
36
|
alert[:queue] = aq_name
|
37
37
|
assert_nothing_raised(Rest::HttpError) { queue.add_alert(alert) }
|
38
38
|
|
39
|
-
# type, trigger, direction, queue name, and snooze -
|
39
|
+
# type, trigger, direction, queue name, and snooze - alert duplication
|
40
40
|
alert[:snooze] = 8
|
41
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
42
|
+
|
43
|
+
# alright, no alert duplication
|
44
|
+
alert[:trigger] = 50
|
41
45
|
assert_nothing_raised(Rest::HttpError) { queue.add_alert(alert) }
|
46
|
+
queue.clear_alerts
|
42
47
|
|
43
48
|
# wrong snooze
|
44
49
|
alert[:snooze] = -13
|
45
|
-
|
50
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
46
51
|
|
47
52
|
alert[:snooze] = '1234'
|
48
|
-
|
53
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
49
54
|
|
50
55
|
# wrong type
|
51
56
|
alert[:snooze] = 0
|
52
57
|
alert[:type] = 'wrong'
|
53
|
-
|
58
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
54
59
|
|
55
60
|
# wrong trigger
|
56
61
|
alert[:type] = 'progressive'
|
57
62
|
alert[:trigger] = 'c'
|
58
|
-
|
63
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
59
64
|
|
60
65
|
# wrong direction
|
61
66
|
alert[:trigger] = 30
|
62
67
|
alert[:direction] = 'both'
|
63
|
-
|
68
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
64
69
|
|
65
|
-
#
|
66
|
-
|
70
|
+
# default direction is "asc"
|
71
|
+
alert.delete(:direction)
|
72
|
+
assert_nothing_raised(Rest::HttpError) { queue.add_alert(alert) }
|
73
|
+
|
74
|
+
queue.clear_alerts
|
67
75
|
|
68
76
|
# Test max alerts number
|
69
77
|
alert[:direction] = 'asc'
|
70
78
|
# insert 6 alerts
|
71
|
-
|
79
|
+
assert_raises(Rest::HttpError) { queue.add_alerts(Array.new(6, alert)) }
|
72
80
|
|
73
81
|
queue.add_alerts(Array.new(5, alert))
|
74
|
-
|
82
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
75
83
|
|
76
84
|
delete_queues queue
|
77
85
|
|
@@ -79,14 +87,33 @@ class TestAlerts < TestBase
|
|
79
87
|
# Progressive alert posts to its queue (queue is the same as alert queue)
|
80
88
|
alert[:queue] = q_name
|
81
89
|
alert[:type] = 'progressive'
|
82
|
-
|
90
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
83
91
|
|
84
92
|
# Q1 progressive alert posts to Q2, Q2 progressive alert posts to Q1
|
85
93
|
a_queue = @client.queue aq_name
|
94
|
+
delete_queues a_queue
|
95
|
+
|
86
96
|
queue.add_alert(alert.merge({:queue => aq_name}))
|
87
|
-
|
97
|
+
assert_raises(Rest::HttpError) do
|
88
98
|
a_queue.add_alert(alert.merge({:queue => q_name}))
|
89
99
|
end
|
100
|
+
|
101
|
+
delete_queues queue, a_queue
|
102
|
+
|
103
|
+
# Push queues have no alerts feature
|
104
|
+
queue = @client.queue 'push_queue'
|
105
|
+
delete_queues queue
|
106
|
+
|
107
|
+
queue.add_subscriber({ :url => 'http://iron.io/receiver' })
|
108
|
+
assert_raises(Rest::HttpError) { queue.add_alert(alert) }
|
109
|
+
|
110
|
+
delete_queues queue
|
111
|
+
|
112
|
+
assert_nothing_raised(Rest::HttpError) { queue.add_alert(alert) }
|
113
|
+
# conversion queue with alerts to push queue must raise exception
|
114
|
+
assert_raises(Rest::HttpError) { queue.update({ :push_type => 'multicast' }) }
|
115
|
+
|
116
|
+
delete_queues queue
|
90
117
|
end
|
91
118
|
|
92
119
|
def test_size_alerts
|
@@ -141,15 +168,19 @@ class TestAlerts < TestBase
|
|
141
168
|
|
142
169
|
# Trigger alert
|
143
170
|
post_messages(queue, trigger + 1)
|
144
|
-
to_time = Time.now + snooze -
|
171
|
+
to_time = Time.now + snooze - 2
|
145
172
|
assert_queue_size 1, alert_queue
|
146
173
|
|
147
|
-
while
|
174
|
+
while true do
|
148
175
|
delete_messages(queue, 2) # queeu size is `trigger - 1`
|
149
176
|
post_messages(queue, 2) # size is `trigger + 1`
|
150
|
-
|
177
|
+
if Time.now < to_time
|
178
|
+
assert_queue_size 1, alert_queue
|
179
|
+
else
|
180
|
+
break
|
181
|
+
end
|
151
182
|
end
|
152
|
-
sleep
|
183
|
+
sleep 2
|
153
184
|
|
154
185
|
delete_messages(queue, 2) # queeu size is `trigger - 1`
|
155
186
|
post_messages(queue, 2) # size is `trigger - 1`
|
@@ -163,15 +194,19 @@ class TestAlerts < TestBase
|
|
163
194
|
# Trigger alert
|
164
195
|
post_messages(queue, trigger + 1)
|
165
196
|
delete_messages(queue, 2)
|
166
|
-
to_time = Time.now + snooze -
|
197
|
+
to_time = Time.now + snooze - 2
|
167
198
|
assert_queue_size 1, alert_queue
|
168
199
|
|
169
|
-
while
|
200
|
+
while true do
|
170
201
|
post_messages(queue, 2) # queeu size is `trigger + 1`
|
171
202
|
delete_messages(queue, 2) # size is `trigger - 1`
|
172
|
-
|
203
|
+
if Time.now < to_time
|
204
|
+
assert_queue_size 1, alert_queue
|
205
|
+
else
|
206
|
+
break
|
207
|
+
end
|
173
208
|
end
|
174
|
-
sleep
|
209
|
+
sleep 2
|
175
210
|
|
176
211
|
post_messages(queue, 2) # size is `trigger + 1`
|
177
212
|
delete_messages(queue, 2) # queeu size is `trigger - 1`
|
@@ -235,11 +270,15 @@ class TestAlerts < TestBase
|
|
235
270
|
# Check queue for alert
|
236
271
|
assert_queue_size 1, alert_queue
|
237
272
|
|
238
|
-
while
|
273
|
+
while true do
|
239
274
|
# will trigger alert if snooze does not work
|
240
275
|
post_messages(queue, trigger + 1)
|
241
276
|
# but must not trigger
|
242
|
-
|
277
|
+
if Time.now < to_time
|
278
|
+
assert_queue_size 1, alert_queue
|
279
|
+
else
|
280
|
+
break
|
281
|
+
end
|
243
282
|
end
|
244
283
|
sleep 4
|
245
284
|
|
@@ -250,18 +289,24 @@ class TestAlerts < TestBase
|
|
250
289
|
delete_queues(queue, alert_queue)
|
251
290
|
|
252
291
|
# test descending alert with snooze
|
253
|
-
queue, alert_queue = clear_queue_add_alert(type,
|
292
|
+
queue, alert_queue = clear_queue_add_alert(type, 1, 'desc', snooze)
|
254
293
|
|
255
294
|
# Does not trigger alert
|
256
295
|
post_messages(queue, 20 * trigger)
|
257
|
-
to_time = Time.now + snooze -
|
296
|
+
to_time = Time.now + snooze - 3
|
258
297
|
|
259
|
-
while
|
298
|
+
while true do
|
260
299
|
delete_messages(queue, trigger + 1)
|
261
|
-
|
300
|
+
amsgs = alert_queue.peek({ :n => 10 })
|
301
|
+
puts amsgs.map { |am| am.body }.join("\n")
|
302
|
+
if Time.now < to_time
|
303
|
+
assert_queue_size 1, alert_queue
|
304
|
+
else
|
305
|
+
break
|
306
|
+
end
|
262
307
|
break if get_queue_size(queue) <= trigger
|
263
308
|
end
|
264
|
-
sleep
|
309
|
+
sleep 3
|
265
310
|
|
266
311
|
post_messages(queue, trigger + 1)
|
267
312
|
delete_messages(queue, trigger)
|
@@ -293,7 +338,7 @@ class TestAlerts < TestBase
|
|
293
338
|
def delete_queues(*queues)
|
294
339
|
queues.each do |q|
|
295
340
|
begin
|
296
|
-
q.
|
341
|
+
q.delete
|
297
342
|
rescue Rest::HttpError => ex
|
298
343
|
if ex.code == 404
|
299
344
|
Rest.logger.info("Delete queue got 404, ignoring.")
|
@@ -323,6 +368,7 @@ class TestAlerts < TestBase
|
|
323
368
|
puts "Try to trigger descending alert... delete #{nmsgs} messages"
|
324
369
|
delete_messages(queue, nmsgs)
|
325
370
|
end
|
371
|
+
sleep 1
|
326
372
|
assert_queue_size aq_size, alert_queue, 'Alert is triggered, but must not be'
|
327
373
|
|
328
374
|
if qsize < trigger
|
@@ -332,6 +378,7 @@ class TestAlerts < TestBase
|
|
332
378
|
puts "Delete #{1 + overhead} more message(s)"
|
333
379
|
delete_messages(queue, 1 + overhead)
|
334
380
|
end
|
381
|
+
sleep 1
|
335
382
|
assert_queue_size aq_size + 1, alert_queue, 'Alert is not triggered, but must be'
|
336
383
|
end
|
337
384
|
|
data/test/test_base.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
2
|
+
gem 'minitest'
|
3
|
+
require 'minitest/autorun'
|
3
4
|
require 'yaml'
|
4
5
|
require 'uber_config'
|
5
6
|
|
@@ -14,7 +15,7 @@ LOG = Logger.new(STDOUT)
|
|
14
15
|
LOG.level = Logger::INFO
|
15
16
|
MAX_TRIES = 10
|
16
17
|
|
17
|
-
class TestBase < Test
|
18
|
+
class TestBase < Minitest::Test
|
18
19
|
|
19
20
|
def setup
|
20
21
|
puts 'setup'
|
@@ -27,8 +28,8 @@ class TestBase < Test::Unit::TestCase
|
|
27
28
|
|
28
29
|
@client = IronMQ::Client.new(@config['iron'])
|
29
30
|
puts "IronMQ::VERSION = #{IronMQ::VERSION}"
|
30
|
-
#Rest.logger.level = Logger::DEBUG # this doesn't work for some reason?
|
31
|
-
#IronCore::Logger.logger.level = Logger::DEBUG
|
31
|
+
# Rest.logger.level = Logger::DEBUG # this doesn't work for some reason?
|
32
|
+
# IronCore::Logger.logger.level = Logger::DEBUG
|
32
33
|
|
33
34
|
@queue_name = 'ironmq-ruby-tests' # default queue for tests
|
34
35
|
end
|
@@ -46,6 +47,7 @@ class TestBase < Test::Unit::TestCase
|
|
46
47
|
rescue Rest::HttpError => ex
|
47
48
|
if ex.code == 404
|
48
49
|
# this is fine
|
50
|
+
puts '404 ON CLEAR!!'
|
49
51
|
else
|
50
52
|
raise ex
|
51
53
|
end
|
data/test/test_bulk.rb
CHANGED
data/test/test_iron_mq.rb
CHANGED
@@ -7,36 +7,6 @@ class IronMQTests < TestBase
|
|
7
7
|
super
|
8
8
|
LOG.info "@host: #{@host}"
|
9
9
|
|
10
|
-
queues = @client.queues.list
|
11
|
-
# p queues
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_performance_post_100_messages
|
15
|
-
queue = @client.queue('test_perf_100')
|
16
|
-
# slower to rackspace since this is running on aws
|
17
|
-
timeout = @host.include?('rackspace') ? 40 : 12
|
18
|
-
|
19
|
-
assert_performance(timeout) do
|
20
|
-
100.times do
|
21
|
-
queue.post("hello world!")
|
22
|
-
end
|
23
|
-
|
24
|
-
# delete queue on test complete
|
25
|
-
resp = queue.delete_queue
|
26
|
-
assert_equal 200, resp.code, "API must response with HTTP 200 status, but returned HTTP #{resp.code}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_get
|
31
|
-
queue_name = "some_queue_abcj9u23"
|
32
|
-
queue = @client.queue(queue_name)
|
33
|
-
msg = queue.get
|
34
|
-
v = "hello big world"
|
35
|
-
queue.post(v)
|
36
|
-
msg = queue.get
|
37
|
-
msg.delete
|
38
|
-
msg = queue.get
|
39
|
-
|
40
10
|
end
|
41
11
|
|
42
12
|
def test_basics
|
@@ -44,8 +14,7 @@ class IronMQTests < TestBase
|
|
44
14
|
clear_queue(queue_name)
|
45
15
|
|
46
16
|
# NOTE: Kept for backward compatibility checking
|
47
|
-
queue = @client.
|
48
|
-
# p queue
|
17
|
+
queue = @client.queue(queue_name)
|
49
18
|
res = queue.post("hello world!")
|
50
19
|
# p res
|
51
20
|
|
@@ -53,17 +22,16 @@ class IronMQTests < TestBase
|
|
53
22
|
assert res.id
|
54
23
|
assert res.msg
|
55
24
|
sleep 0.3
|
56
|
-
assert_equal 1, queue.size
|
25
|
+
assert_equal 1, queue.reload.size
|
57
26
|
|
58
|
-
message = queue.
|
27
|
+
message = queue.reserve
|
59
28
|
# p res
|
60
29
|
assert res["id"]
|
61
30
|
assert res.id
|
62
31
|
|
63
|
-
res = queue.delete(res["id"])
|
32
|
+
res = queue.delete(res["id"], message.reservation_id)
|
64
33
|
# p res
|
65
|
-
|
66
|
-
res = queue.get
|
34
|
+
res = queue.reserve
|
67
35
|
# p res
|
68
36
|
assert_nil res
|
69
37
|
|
@@ -73,15 +41,14 @@ class IronMQTests < TestBase
|
|
73
41
|
res = queue.post("hello world 2!")
|
74
42
|
# p res
|
75
43
|
|
76
|
-
msg = queue.
|
44
|
+
msg = queue.reserve
|
77
45
|
# p msg
|
78
46
|
assert msg
|
79
47
|
|
80
48
|
res = msg.delete
|
81
49
|
#p res
|
82
50
|
|
83
|
-
|
84
|
-
res = queue.get
|
51
|
+
res = queue.reserve
|
85
52
|
# p res
|
86
53
|
assert_nil res
|
87
54
|
|
@@ -92,16 +59,16 @@ class IronMQTests < TestBase
|
|
92
59
|
# p res
|
93
60
|
assert res.msg
|
94
61
|
|
95
|
-
res = queue.
|
96
|
-
|
62
|
+
res = queue.reserve
|
63
|
+
puts "queue.reserve got: #{res.body}"
|
64
|
+
p res
|
97
65
|
assert res["id"]
|
98
66
|
assert res.id
|
99
67
|
assert_equal v, res.body
|
100
68
|
|
101
|
-
res = queue.delete(res.id)
|
102
|
-
|
103
|
-
|
104
|
-
res = queue.get
|
69
|
+
res = queue.delete(res.id, res.reservation_id)
|
70
|
+
|
71
|
+
res = queue.reserve
|
105
72
|
# p res
|
106
73
|
assert_nil res
|
107
74
|
|
@@ -110,14 +77,13 @@ class IronMQTests < TestBase
|
|
110
77
|
# p res
|
111
78
|
assert res.msg
|
112
79
|
|
113
|
-
res = queue.
|
80
|
+
res = queue.reserve
|
114
81
|
# p res
|
115
82
|
assert res.body
|
116
83
|
|
117
84
|
res = res.delete
|
118
85
|
# p res
|
119
|
-
|
120
|
-
res = queue.get
|
86
|
+
res = queue.reserve
|
121
87
|
# p res
|
122
88
|
assert_nil res
|
123
89
|
|
@@ -126,7 +92,10 @@ class IronMQTests < TestBase
|
|
126
92
|
assert_equal 200, resp.code, "API must response with HTTP 200 status, but returned HTTP #{resp.code}"
|
127
93
|
end
|
128
94
|
|
95
|
+
|
96
|
+
|
129
97
|
def test_multi_delete
|
98
|
+
puts 'test_multi_delete'
|
130
99
|
queue_name = 'test_multi_delete_41'
|
131
100
|
clear_queue(queue_name)
|
132
101
|
|
@@ -134,7 +103,7 @@ class IronMQTests < TestBase
|
|
134
103
|
ids = []
|
135
104
|
10.times do |i|
|
136
105
|
msg = queue.post("hello #{i}")
|
137
|
-
ids << msg.id
|
106
|
+
ids << {id: msg.id}
|
138
107
|
end
|
139
108
|
sleep 0.5
|
140
109
|
assert_equal 10, queue.reload.size
|
@@ -142,10 +111,42 @@ class IronMQTests < TestBase
|
|
142
111
|
queue.delete_messages(ids)
|
143
112
|
sleep 1
|
144
113
|
assert_equal 0, queue.reload.size
|
114
|
+
|
115
|
+
# now try it with reserved messages
|
116
|
+
ids = []
|
117
|
+
10.times do |i|
|
118
|
+
msg = queue.post("hello #{i}")
|
119
|
+
end
|
120
|
+
sleep 0.5
|
121
|
+
assert_equal 10, queue.reload.size
|
122
|
+
while (msg = queue.reserve) != nil do
|
123
|
+
ids << {id: msg.id, reservation_id: msg.reservation_id}
|
124
|
+
end
|
125
|
+
queue.delete_messages(ids)
|
126
|
+
sleep 1
|
127
|
+
assert_equal 0, queue.reload.size
|
128
|
+
|
145
129
|
queue.delete_queue
|
146
130
|
|
147
131
|
end
|
148
132
|
|
133
|
+
def test_reservation_ids
|
134
|
+
puts 'test_reservation_ids'
|
135
|
+
# get a message, let it timeout, then try to delete it. That should fail.
|
136
|
+
queue_name = 'test_res_ids'
|
137
|
+
clear_queue(queue_name)
|
138
|
+
|
139
|
+
queue = @client.queue(queue_name)
|
140
|
+
msg = queue.post("hello")
|
141
|
+
msg = queue.reserve(:timeout=>3)
|
142
|
+
sleep 3
|
143
|
+
ex = assert_raises Rest::HttpError do
|
144
|
+
msg.delete
|
145
|
+
end
|
146
|
+
assert_equal 403, ex.code
|
147
|
+
|
148
|
+
end
|
149
|
+
|
149
150
|
def test_queues_list
|
150
151
|
queue_name = 'test_queues_list_1'
|
151
152
|
clear_queue(queue_name)
|
@@ -190,42 +191,43 @@ class IronMQTests < TestBase
|
|
190
191
|
|
191
192
|
sleep 61 # should be 1 minute timeout by default
|
192
193
|
new_msg = queue.get
|
193
|
-
|
194
|
+
refute_nil new_msg
|
194
195
|
assert_equal new_msg.id, msg.id
|
195
196
|
new_msg.delete
|
196
197
|
|
197
198
|
# now try explicit timeout
|
198
|
-
|
199
|
-
|
200
|
-
|
199
|
+
timeout = 5
|
200
|
+
res = queue.post("hello world timeout2!", :timeout => timeout)
|
201
|
+
# p resds
|
202
|
+
msg = queue.get(:timeout=>timeout)
|
201
203
|
# p msg
|
202
204
|
assert msg
|
203
|
-
assert_equal 30, msg.timeout
|
205
|
+
# assert_equal 30, msg.timeout - removed in v3
|
204
206
|
|
205
|
-
msg_nil = queue.get
|
207
|
+
msg_nil = queue.get(:timeout=>timeout)
|
206
208
|
# p msg_nil
|
207
209
|
assert_nil msg_nil
|
208
210
|
|
209
|
-
sleep
|
210
|
-
new_msg = queue.get
|
211
|
-
|
211
|
+
sleep timeout + 1
|
212
|
+
new_msg = queue.get(:timeout=>timeout)
|
213
|
+
refute_nil new_msg
|
212
214
|
assert_equal new_msg.id, msg.id
|
213
215
|
new_msg.delete
|
214
216
|
|
215
217
|
# timeout on get
|
216
218
|
res = queue.post("hello world timeout3!")
|
217
|
-
msg = queue.get(:timeout =>
|
218
|
-
# puts "MESSAGE IS #{msg.inspect}"
|
219
|
+
msg = queue.get(:timeout => timeout)
|
220
|
+
# puts "MESSAGE IS #{msg.inspect}"
|
219
221
|
assert msg
|
220
|
-
assert_equal msg.timeout, 30
|
222
|
+
# assert_equal msg.timeout, 30 - removed in v3
|
221
223
|
|
222
|
-
msg_nil = queue.get
|
224
|
+
msg_nil = queue.get(:timeout=>timeout)
|
223
225
|
# p msg_nil
|
224
226
|
assert_nil msg_nil
|
225
227
|
|
226
|
-
sleep
|
228
|
+
sleep timeout+1
|
227
229
|
new_msg = queue.get
|
228
|
-
|
230
|
+
refute_nil new_msg
|
229
231
|
assert_equal new_msg.id, msg.id
|
230
232
|
new_msg.delete
|
231
233
|
|
@@ -234,39 +236,21 @@ class IronMQTests < TestBase
|
|
234
236
|
assert_equal 200, resp.code, "API must response with HTTP 200 status, but returned HTTP #{resp.code}"
|
235
237
|
end
|
236
238
|
|
239
|
+
# todo: This test should be changed to make queues, it assumes 30+ queues are already created.
|
237
240
|
def test_queues
|
238
|
-
puts
|
241
|
+
puts "test_queues-#{Time.now.to_i}"
|
239
242
|
|
240
243
|
qname = "some_queue_that_does_not_exist_1"
|
241
244
|
queue = @client.queue(qname)
|
242
|
-
# delete it before the test
|
243
|
-
queue.delete_queue
|
244
|
-
|
245
|
-
assert_raise Rest::HttpError do
|
246
|
-
# should raise a 404
|
247
|
-
m = queue.size
|
248
|
-
end
|
249
|
-
|
250
245
|
# create at least one queue
|
251
246
|
queue.post('create queue message')
|
252
247
|
# queue should exist now
|
253
248
|
m = queue.get
|
254
|
-
|
249
|
+
refute_nil m
|
255
250
|
|
256
|
-
res = @client.queues.list
|
251
|
+
res = @client.queues.list(page: 1, per_page: 30)
|
257
252
|
# puts "res.size: #{res.size}"
|
258
|
-
res.
|
259
|
-
# puts "queue_name: " + q.name
|
260
|
-
# puts "queue size: " + q.size.to_s
|
261
|
-
assert q.size >= 0
|
262
|
-
end
|
263
|
-
assert res.size > 0
|
264
|
-
|
265
|
-
res = @client.queues.list(:page => 50)
|
266
|
-
# puts "res.size 2: #{res.size}"
|
267
|
-
# res.each do |q| { p q.name }
|
268
|
-
|
269
|
-
assert_equal 0, res.size
|
253
|
+
assert_equal 30, res.size
|
270
254
|
|
271
255
|
# delete queue on test complete
|
272
256
|
resp = queue.delete_queue
|
@@ -289,7 +273,7 @@ class IronMQTests < TestBase
|
|
289
273
|
|
290
274
|
sleep 6
|
291
275
|
new_msg = queue.get
|
292
|
-
|
276
|
+
refute_nil new_msg
|
293
277
|
assert_equal msg_id, new_msg.id
|
294
278
|
new_msg.delete
|
295
279
|
|
@@ -327,7 +311,7 @@ class IronMQTests < TestBase
|
|
327
311
|
assert msgs.is_a?(Array)
|
328
312
|
msgs.each do |m|
|
329
313
|
puts m.id
|
330
|
-
|
314
|
+
refute_equal msg.id, m.id
|
331
315
|
end
|
332
316
|
assert msgs.size == 9, "size should be 9, but it's #{msgs.size}"
|
333
317
|
assert msgs[0]["id"]
|
@@ -363,11 +347,11 @@ class IronMQTests < TestBase
|
|
363
347
|
queue.post("third message")
|
364
348
|
|
365
349
|
msg = queue.peek
|
366
|
-
|
350
|
+
refute_nil msg
|
367
351
|
assert_equal "first message", msg.body, "message body must be 'first message', but it's '#{msg.body}'"
|
368
352
|
|
369
353
|
msg = queue.peek
|
370
|
-
|
354
|
+
refute_nil msg
|
371
355
|
assert_equal "first message", msg.body, "message body must be 'first message', but it's '#{msg.body}'"
|
372
356
|
|
373
357
|
msgs = queue.peek(:n => 2)
|
@@ -375,7 +359,7 @@ class IronMQTests < TestBase
|
|
375
359
|
assert_equal 2, msgs.size, "must received 2 messages, but received #{msgs.size}"
|
376
360
|
|
377
361
|
msg = queue.peek
|
378
|
-
|
362
|
+
refute_nil msg
|
379
363
|
assert_equal "first message", msg.body, "message body must be 'first message', but it's '#{msg.body}'"
|
380
364
|
|
381
365
|
msgs = queue.peek(:n => 7)
|
@@ -383,14 +367,14 @@ class IronMQTests < TestBase
|
|
383
367
|
assert_equal 3, msgs.size, "must received 3 messages, but received #{msgs.size}"
|
384
368
|
|
385
369
|
msg = queue.get
|
386
|
-
|
370
|
+
refute_nil msg
|
387
371
|
assert_equal "first message", msg.body, "message body must be 'first message', but it's '#{msg.body}'"
|
388
372
|
|
389
373
|
resp = msg.delete
|
390
374
|
assert_equal 200, resp.code, "API must response with HTTP 200 status, but returned HTTP #{resp.code}"
|
391
375
|
|
392
376
|
msg = queue.peek
|
393
|
-
|
377
|
+
refute_nil msg
|
394
378
|
assert_equal "second message", msg.body, "message body must be 'second message', but it's '#{msg.body}'"
|
395
379
|
|
396
380
|
# delete queue on test complete
|
@@ -405,60 +389,65 @@ class IronMQTests < TestBase
|
|
405
389
|
clear_queue(queue_name)
|
406
390
|
|
407
391
|
queue = @client.queue(queue_name)
|
408
|
-
queue.post("first message"
|
409
|
-
queue.post("second message"
|
410
|
-
queue.post("third message"
|
392
|
+
queue.post("first message")
|
393
|
+
queue.post("second message")
|
394
|
+
queue.post("third message")
|
411
395
|
|
412
396
|
|
413
397
|
# get message
|
414
|
-
msg = queue.get
|
415
|
-
|
398
|
+
msg = queue.get(:timeout => 10)
|
399
|
+
refute_nil msg
|
416
400
|
assert_equal "first message", msg.body, "message body must be 'first message', but it's '#{msg.body}'"
|
417
401
|
|
418
|
-
sleep
|
402
|
+
sleep 5 # timeout is not passed
|
419
403
|
|
420
404
|
msgs = queue.peek(:n => 3) # all messages from queue
|
421
405
|
assert_equal Array, msgs.class, "waiting for Array, but got #{msgs.class}"
|
422
406
|
assert_equal 2, msgs.size, "API must return only 2 messages"
|
423
407
|
msgs.each do |m|
|
424
|
-
|
408
|
+
refute_equal msg.id, m.id, "returned a message which must be reserved"
|
425
409
|
end
|
426
410
|
|
427
|
-
sleep
|
411
|
+
sleep 5.5 # ensure timeout is passed
|
428
412
|
|
429
413
|
# message must return to the queue
|
430
414
|
msgs = queue.peek(:n => 3)
|
431
415
|
assert_equal Array, msgs.class, "waiting for Array, but got #{msgs.class}"
|
432
416
|
assert_equal 3, msgs.size, "API must return 3 messages"
|
433
417
|
|
434
|
-
msg = queue.get
|
435
|
-
|
418
|
+
msg = queue.get(:timeout=>10)
|
419
|
+
refute_nil msg
|
436
420
|
assert_equal "second message", msg.body, "message body must be 'second message', but it's '#{msg.body}'"
|
437
421
|
|
438
|
-
sleep
|
422
|
+
sleep 5 # timeout is not passed
|
439
423
|
|
440
424
|
msgs = queue.peek(:n => 3) # must return another message
|
441
425
|
assert_equal Array, msgs.class, "waiting for Array, but got #{msgs.class}"
|
442
426
|
assert_equal 2, msgs.size, "API must return only 2 messages"
|
443
|
-
msgs.each { |m|
|
427
|
+
msgs.each { |m| refute_equal msg.id, m.id, "returned message which must be reserved" }
|
444
428
|
|
445
|
-
resp = msg.touch #
|
429
|
+
resp = msg.touch # (:timeout=>10) # increase timeout again, should be another 10 seconds
|
446
430
|
assert_equal 200, resp.code, "API must response with HTTP 200 status, but returned HTTP #{resp.code}"
|
447
431
|
|
448
|
-
sleep
|
432
|
+
sleep 5 # new timeout is not passed, but previous is (15 + 20 vs 30 + 30 seconds)
|
449
433
|
|
450
434
|
msgs = queue.peek(:n => 3) # must return the same as for msg2
|
451
435
|
assert_equal Array, msgs.class, "waiting for Array, but got #{msgs.class}"
|
452
436
|
assert_equal 2, msgs.size, "API must return only 2 messages"
|
453
|
-
msgs.each { |m|
|
437
|
+
msgs.each { |m| refute_equal msg.id, m.id, "returned message which must be reserved" }
|
454
438
|
|
455
|
-
sleep
|
439
|
+
sleep 5 # ensure timeout passed
|
440
|
+
queue.clear
|
441
|
+
queue.post("first message")
|
442
|
+
queue.post("second message")
|
443
|
+
queue.post("third message")
|
456
444
|
|
457
445
|
# message must be returned to the end of the queue
|
458
446
|
msgs = queue.peek(:n => 3)
|
447
|
+
msg = queue.reserve
|
459
448
|
assert_equal Array, msgs.class, "waiting for Array, but got #{msgs.class}"
|
460
449
|
assert_equal 3, msgs.size, "API must return 3 messages"
|
461
|
-
assert_equal msg.id, msgs[
|
450
|
+
assert_equal msg.id, msgs[0].id, "released message must be at the beginning of the queue"
|
462
451
|
|
463
452
|
# delete queue on test complete
|
464
453
|
resp = queue.delete_queue
|
@@ -468,57 +457,52 @@ class IronMQTests < TestBase
|
|
468
457
|
def test_release
|
469
458
|
puts 'test_release'
|
470
459
|
|
471
|
-
queue_name = "
|
460
|
+
queue_name = "test_release_#{Time.now.to_i}"
|
472
461
|
clear_queue(queue_name)
|
473
462
|
|
474
|
-
msg_txt = "testMessage
|
463
|
+
msg_txt = "testMessage-#{Time.now.to_i}"
|
475
464
|
# puts msgTxt
|
476
465
|
|
477
466
|
queue = @client.queue(queue_name)
|
478
467
|
|
479
468
|
msg_id = queue.post(msg_txt, {:timeout => 60*5}).id
|
480
469
|
# puts "msg_id: #{msg_id}"
|
481
|
-
message = queue.
|
470
|
+
message = queue.reserve
|
482
471
|
# p msg
|
483
472
|
assert_equal msg_id, message.id
|
484
473
|
# Ok, so should have received same message, now let's release it quicker than the original timeout
|
485
474
|
|
486
475
|
# but first, ensure the next get is nil
|
487
|
-
msg = queue.
|
476
|
+
msg = queue.reserve
|
488
477
|
# p msg
|
489
478
|
assert_nil msg
|
490
479
|
|
491
480
|
# now release it instantly
|
492
|
-
message.release
|
493
|
-
msg = queue.
|
494
|
-
# p msg
|
495
|
-
assert msg
|
496
|
-
assert_equal msg_id, msg.id
|
481
|
+
re = message.release
|
482
|
+
msg = queue.reserve
|
497
483
|
|
498
|
-
|
499
|
-
|
500
|
-
# p msgr
|
501
|
-
assert_nil msgr
|
484
|
+
assert msg.raw
|
485
|
+
assert_equal msg_id, msg.id
|
502
486
|
|
503
487
|
# let's release it in 10 seconds
|
504
488
|
msg.release(:delay => 10)
|
505
|
-
msgr = queue.
|
489
|
+
msgr = queue.reserve
|
506
490
|
# p msg
|
507
491
|
assert_nil msgr
|
508
492
|
|
509
493
|
sleep 11
|
510
|
-
msg = queue.
|
511
|
-
|
494
|
+
msg = queue.reserve
|
495
|
+
refute_nil msg
|
512
496
|
assert_equal msg_id, msg.id
|
513
497
|
|
514
498
|
msg.release(:delay => 5)
|
515
|
-
msg = queue.
|
499
|
+
msg = queue.reserve
|
516
500
|
# p msg
|
517
501
|
assert_nil msg
|
518
502
|
|
519
503
|
sleep 6
|
520
|
-
msg = queue.
|
521
|
-
|
504
|
+
msg = queue.reserve
|
505
|
+
refute_nil msg
|
522
506
|
assert_equal msg_id, msg.id
|
523
507
|
|
524
508
|
# delete queue on test complete
|
@@ -526,7 +510,6 @@ class IronMQTests < TestBase
|
|
526
510
|
assert_equal 200, resp.code, "API must response with HTTP 200 status, but returned HTTP #{resp.code}"
|
527
511
|
end
|
528
512
|
|
529
|
-
|
530
513
|
def test_clear
|
531
514
|
puts "test_clear"
|
532
515
|
|
@@ -579,7 +562,6 @@ class IronMQTests < TestBase
|
|
579
562
|
def test_queue_delete
|
580
563
|
queue = @client.queue("test_delete")
|
581
564
|
queue.post("hi")
|
582
|
-
old_id = queue.id
|
583
565
|
queue.delete_queue
|
584
566
|
|
585
567
|
LOG.info "sleeping for a bit to let queue delete..."
|
@@ -587,7 +569,6 @@ class IronMQTests < TestBase
|
|
587
569
|
|
588
570
|
queue.post("hi2")
|
589
571
|
# p queue
|
590
|
-
assert_not_equal old_id, queue.id, "old queue ID (#{old_id}) must not be equal to new ID (#{queue.id})"
|
591
572
|
assert_equal 1, queue.size, "queue size must be 1, but got #{queue.size}"
|
592
573
|
|
593
574
|
msg = queue.get
|
@@ -600,7 +581,7 @@ class IronMQTests < TestBase
|
|
600
581
|
|
601
582
|
def test_webhooks
|
602
583
|
qname ="webhook_queue"
|
603
|
-
url = "#{@client.base_url}/#{qname}/
|
584
|
+
url = "#{@client.base_url}/#{qname}/webhook?oauth=#{@client.token}"
|
604
585
|
# p url
|
605
586
|
|
606
587
|
v = "hello webhook"
|
@@ -666,13 +647,13 @@ class IronMQTests < TestBase
|
|
666
647
|
end
|
667
648
|
|
668
649
|
def test_queue_set_info
|
669
|
-
qname = "
|
650
|
+
qname = "test_queue_set_info_#{Time.now.to_i}"
|
670
651
|
clear_queue(qname)
|
671
652
|
q = @client.queue(qname)
|
672
|
-
q.
|
673
|
-
assert_equal
|
674
|
-
q.
|
675
|
-
assert_equal
|
653
|
+
q.update(message_timeout: 45)
|
654
|
+
assert_equal 45, q.reload.info['message_timeout']
|
655
|
+
q.update(message_expiration: 3000)
|
656
|
+
assert_equal 3000, q.reload.info['message_expiration']
|
676
657
|
end
|
677
658
|
|
678
659
|
def test_dequeue_delete
|
@@ -681,7 +662,7 @@ class IronMQTests < TestBase
|
|
681
662
|
queue = @client.queue(queue_name)
|
682
663
|
v = "hello thou shalt only see me once"
|
683
664
|
queue.post(v)
|
684
|
-
msg = queue.get(delete:
|
665
|
+
msg = queue.get(delete: true, timeout: 30)
|
685
666
|
assert_equal msg.body, "hello thou shalt only see me once"
|
686
667
|
sleep 1
|
687
668
|
# get the queue again
|
@@ -691,5 +672,66 @@ class IronMQTests < TestBase
|
|
691
672
|
msg = queue.get
|
692
673
|
assert_equal nil, msg
|
693
674
|
end
|
675
|
+
|
676
|
+
def test_long_polling
|
677
|
+
queue_name = "test_long_polling#{Time.now.to_i}"
|
678
|
+
queue = @client.queue(queue_name)
|
679
|
+
queue.update
|
680
|
+
msg = queue.get
|
681
|
+
assert_nil msg
|
682
|
+
v = "hello long"
|
683
|
+
# ok, nothing in the queue, let's do a long poll
|
684
|
+
starti = Time.now.to_i
|
685
|
+
thr = Thread.new {
|
686
|
+
sleep 5
|
687
|
+
puts "Posting now"
|
688
|
+
begin
|
689
|
+
queue.post(v)
|
690
|
+
rescue Exception => ex
|
691
|
+
p ex
|
692
|
+
end
|
693
|
+
|
694
|
+
}
|
695
|
+
puts "Now going to wait for it..."
|
696
|
+
msg = queue.get(wait: 20)
|
697
|
+
# p msg
|
698
|
+
endi = Time.now.to_i
|
699
|
+
duration = endi - starti
|
700
|
+
p duration
|
701
|
+
assert duration > 4 && duration <= 7
|
702
|
+
refute_nil msg
|
703
|
+
assert_equal v, msg.body
|
704
|
+
msg.delete
|
705
|
+
end
|
706
|
+
|
707
|
+
def test_delete_reserved_messages
|
708
|
+
queue_name = 'test_delete_reserved_messages'
|
709
|
+
queue = @client.queue(queue_name)
|
710
|
+
clear_queue(queue_name)
|
711
|
+
queue.post("more")
|
712
|
+
queue.post("and more")
|
713
|
+
queue.post("and more")
|
714
|
+
assert_equal 3, queue.size
|
715
|
+
messages = queue.reserve(n: 3)
|
716
|
+
queue.delete_reserved_messages(messages)
|
717
|
+
assert_equal 0, queue.reload.size
|
718
|
+
end
|
719
|
+
|
720
|
+
def test_delete_reserved_message
|
721
|
+
queue_name = 'test_delete_message'
|
722
|
+
queue = @client.queue(queue_name)
|
723
|
+
clear_queue(queue_name)
|
724
|
+
queue.post("test message")
|
725
|
+
assert_equal 1, queue.reload.size
|
726
|
+
message = queue.reserve
|
727
|
+
queue.delete(message.id, message.reservation_id)
|
728
|
+
assert_equal 0, queue.reload.size
|
729
|
+
|
730
|
+
queue.post("another message")
|
731
|
+
assert_equal 1, queue.reload.size
|
732
|
+
message = queue.reserve
|
733
|
+
message.delete
|
734
|
+
assert_equal 0, queue.reload.size
|
735
|
+
end
|
694
736
|
end
|
695
737
|
|