forked from iron-io/iron_mq_ruby
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_beanstalkd.rb
222 lines (193 loc) · 6.17 KB
/
test_beanstalkd.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
gem 'test-unit'
require 'test/unit'
require 'beanstalk-client'
require 'yaml'
require_relative 'test_base'
class BeanstalkTests < TestBase
def setup
super
config = @config['iron']
@host = "#{config['host'] || "mq-aws-us-east-1.iron.io"}:#{config['beanstalkd_port'] || 11300}"
puts "beanstalkd url: #{@host}"
@skip = @host.include? 'rackspace'
return if @skip # bypass these tests if rackspace
@beanstalk = Beanstalk::Connection.new(@host)
@beanstalk.put("oauth #{config['token']} #{config['project_id']}")
clear_tube('default')
end
def test_basics
omit_if @skip # bypass this test if rackspace
puts 'test_basics3'
queue_name = "beanstalk_test"
clear_queue(queue_name)
@beanstalk.use(queue_name)
@beanstalk.watch(queue_name)
#puts 'reserving...'
#job = beanstalk.reserve(1)
#p job
#exit
msg = "hello #{Time.now}"
puts "msg=" + msg
@beanstalk.put(msg)
job = @beanstalk.reserve
p job
p job.body
assert_equal msg, job.body, "job.body #{job.body} not the same as the one we put on #{msg}."
job.delete
job = assert_raise(Beanstalk::TimedOut) {
@beanstalk.reserve(1)
}
hasher = {:x => 1, :y => "hello", "yo" => "scooby doo"}
@beanstalk.put(hasher.to_json)
job = @beanstalk.reserve(1)
got = JSON.parse(job.body)
assert got.is_a?(Hash)
assert_equal hasher[:x], got['x']
job.delete
msg = "hello there\nthis is a new line"
@beanstalk.put(msg)
job = @beanstalk.reserve(1)
assert_equal msg, job.body, "#{job.body} does not equal #{msg}"
job.delete
end
def clear_tube(tube)
omit_if @skip # bypass this test if rackspace
watched = @beanstalk.list_tubes_watched(true)
puts 'watched: ' + watched.inspect
@beanstalk.watch(tube)
puts "clear #{tube}"
# clean up anything in queue
while x = reserve(0) do
puts 'deleting ' + x.inspect
x.delete
end
puts 'done clearing'
@beanstalk.ignore(tube) if not watched.include?(tube)
end
def test_basics2
omit_if @skip # bypass this test if rackspace
puts 'test_basics'
msg = "hello #{Time.now}"
@beanstalk.put(msg)
job = reserve
puts 'first job: ' + job.inspect
puts "body=" + job.body # prints "hello"
assert_equal msg, job.body, "body not the same as message."
job.delete
puts 'deleted'
job = reserve(1)
puts 'second job = ' + job.inspect
assert job.nil?, "second job was not nil " + job.inspect
hasher = {:x => 1, :y => "hello", "yo" => "scooby doo"}
@beanstalk.put(hasher.to_json)
job = reserve(1)
got = JSON.parse(job.body)
puts 'got=' + got.inspect
assert got.is_a?(Hash)
assert_equal hasher[:x], got['x']
job.delete
msg = "hello there\nthis is a new line"
@beanstalk.put(msg)
job = reserve(1)
assert_equal msg, job.body, "#{job.body} does not equal #{msg}"
job.delete
end
def test_timeout
omit_if @skip # bypass this test if rackspace
puts 'test_timeout'
msg = "timeout message #{Time.now}"
# timeout of 10 seconds
res = @beanstalk.put(msg, 65536, 0, 10)
puts 'result: ' + res.inspect
job = reserve(0)
puts 'first timeout job: ' + job.inspect
assert_equal msg, job.body, "body not the same as message."
niljob = reserve(0)
assert niljob.nil?, "job is not nil! #{niljob.inspect}"
# let it time out
sleep 10
job = reserve(0)
puts 'second delayed job: ' + job.inspect
assert_not_nil job, "job is nil"
assert_equal msg, job.body, "body not the same as message."
job.delete
end
def test_delay
omit_if @skip # bypass this test if rackspace
puts 'test_delay'
msg = "delayed message #{Time.now}"
# delay of 2 seconds
@beanstalk.put(msg, 65536, 2)
# delay should still be in effect, so job is nil
job = reserve(0)
assert job.nil?, "job is not nil"
# wait for delay to expire
sleep 2
job = reserve(0)
assert_not_nil job, "job is nil"
assert_equal msg, job.body, "body not the same as message."
job.delete
end
def tube_message(tube)
omit_if @skip # bypass this test if rackspace
"hello #{tube}! #{Time.now}"
end
def reserve(timeout=nil)
omit_if @skip # bypass this test if rackspace
begin
job = @beanstalk.reserve(timeout)
puts 'got job: ' + job.inspect
return job
rescue Beanstalk::TimedOut => ex
puts "Timed out: #{ex.message}"
return nil
end
end
def test_tubes
omit_if @skip # bypass this test if rackspace
clear_tube('youtube')
tube1 = 'default'
msg1 = tube_message(tube1)
@beanstalk.put(msg1)
tube2 = 'youtube'
@beanstalk.use(tube2) # switch tubes to put messages on
msg2 = tube_message(tube2)
@beanstalk.put(msg2)
# now we have a single message in two different tubes.
# let's first try to ensure we only get the one off the default tube.
job = reserve(1)
assert_equal msg1, job.body, "body #{job.body.to_s} does not equal #{msg1}"
job.delete
# second message should not come off since we're not watching that tube.
job = reserve(1)
assert job.nil?, "second job was not nil " + job.inspect
@beanstalk.watch(tube2)
job = reserve(1)
assert_equal msg2, job.body, "body #{job.body.to_s} does not equal #{msg2}"
job.delete
# Now that we're watching both tubes we should get messages put into either.
@beanstalk.use(tube1)
msg3 = tube_message(tube1)
@beanstalk.put(msg3)
job = reserve(1)
assert_equal msg3, job.body
job.delete
# now put one in default and one in tube2, then we'll ignore default
msg1 = tube_message(tube1)
@beanstalk.put(msg1)
@beanstalk.use(tube2) # switch tubes to put messages on
msg2 = tube_message(tube2)
@beanstalk.put(msg2)
@beanstalk.ignore(tube1)
job = reserve(1)
assert_equal msg2, job.body, "body #{job.body.to_s} does not equal #{msg2}"
job.delete
job = reserve(1)
assert job.nil?
# clean up the last message from default
@beanstalk.watch(tube1)
job = reserve(1)
assert_equal msg1, job.body, "body #{job.body.to_s} does not equal #{msg1}"
job.delete
end
end