Skip to content

Commit

Permalink
Fixed races in push queues tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Kolesen committed Jan 2, 2013
1 parent 2e8fd27 commit ec0d5eb
Showing 1 changed file with 181 additions and 100 deletions.
281 changes: 181 additions & 100 deletions test/test_push_queues.rb
@@ -1,5 +1,10 @@
# Put config.yml file in ~/Dropbox/configs/ironmq_gem/test/config.yml
require_relative 'test_base'
require 'logger'

LOG = Logger.new(STDOUT)
LOG.level == Logger::INFO
MAX_TRIES = 100

class TestPushQueues < TestBase

Expand All @@ -17,7 +22,7 @@ def test_queue_subscriptions
types = ["multicast", "unicast"]
types.each do |t|

puts "Trying type #{t}"
LOG.info "Trying type #{t}"

qname = "subscription-queue-#{t}"

Expand All @@ -34,61 +39,103 @@ def test_queue_subscriptions
res = queue.update_queue(:subscribers => subscribers,
:push_type => t)
queue = @client.queue(qname)
p queue
p queue.subscribers
assert_equal 10, queue.subscribers.size
LOG.debug queue
LOG.debug queue.subscribers
assert_equal num_subscribers, queue.subscribers.size

# add the last one
queue.reload # temporary, can remove
queue.add_subscriber({url: "http://nowhere.com"})
queue.reload
assert_equal 11, queue.subscribers.size
assert_equal num_subscribers + 1, queue.subscribers.size
queue.remove_subscriber({url: "http://nowhere.com"})
queue.reload
assert_equal 10, queue.subscribers.size
assert_equal num_subscribers, queue.subscribers.size

# todo: assert subscriptions match

msg = "hello #{x}"
m = queue.post(msg)

puts "sleeping..."
sleep 10
puts "Checking results..."
LOG.info "Checking results..."
@rest = Rest::Client.new
found = 0
num_subscribers.times do |i|
key = make_key(i, t, x)
begin
response = @rest.get("http://rest-test.iron.io/stored/#{key}")
parsed = JSON.parse(response.body)
p parsed['body']
assert_equal msg, parsed['body']
found += 1
rescue Rest::HttpError => ex
p ex.code
assert_equal 404, ex.code
if t == "multicast"
num_subscribers.times do |i|
key = make_key(i, t, x)
tries = MAX_TRIES
while tries > 0
tries -= 1
begin
url = "http://rest-test.iron.io/stored/#{key}"
LOG.info "checking url #{url}"
response = @rest.get(url)
parsed = JSON.parse(response.body)
LOG.debug parsed['body']
assert_equal msg, parsed['body']
found += 1
break
rescue Rest::HttpError => ex
LOG.debug ex.code
assert_equal 404, ex.code
end
end

assert_not_equal tries, 0
end
end
subscribers = queue.messages.get(m.id).subscribers
p subscribers
if t == "unicast"
assert_equal 1, found
assert_equal 1, subscribers.size
else # pubsub
assert_equal num_subscribers, found
assert_equal num_subscribers, subscribers.size
elsif t == "unicast"
tries = MAX_TRIES
while tries > 0
tries -= 1
num_subscribers.times do |i|
key = make_key(i, t, x)
begin
url = "http://rest-test.iron.io/stored/#{key}"
LOG.info "checking url #{url}"
response = @rest.get(url)
parsed = JSON.parse(response.body)
LOG.debug parsed['body']
assert_equal msg, parsed['body']
found += 1
break
rescue Rest::HttpError => ex
LOG.debug ex.code
assert_equal 404, ex.code
end
end
break if found == 1
end
assert_not_equal tries, 0
end

subscribers.each do |s|
p s
assert_equal 200, s["status_code"]
assert_equal "deleted", s["status"]

tries = MAX_TRIES
while tries > 0
tries -= 1
subscribers = queue.messages.get(m.id).subscribers
LOG.debug subscribers
if t == "unicast"
assert_equal 1, found
assert_equal 1, subscribers.size
else # pubsub
assert_equal num_subscribers, found
assert_equal num_subscribers, subscribers.size
end

subscribers.each do |s|
LOG.debug s
LOG.info "status_code=#{s['status_code']}"
LOG.info "status=#{s['status']}"
next unless 200 == s["status_code"]
next unless "deleted" == s["status"]
end
break
end
assert_not_equal tries, 0
end

end


def test_failure
@rest = Rest::Client.new
qname = "failure-queue"
Expand All @@ -99,58 +146,71 @@ def test_failure
subscribers << {url: "http://rest-test.iron.io/code/503?switch_after=2&switch_to=200&namespace=push-test-failures-#{x}"}
subscribers << {url: "http://rest-test.iron.io/code/503"}

num_subscribers = 2

queue = @client.queue(qname)
res = queue.update_queue(:subscribers => subscribers,
:push_type => "multicast",
:retries => 3,
:retries_delay => 3
)
queue = @client.queue(qname)
p queue
p queue.subscribers
assert_equal 2, queue.subscribers.size
LOG.debug queue
LOG.debug queue.subscribers
assert_equal num_subscribers, queue.subscribers.size

msg = "hello #{x}"
m = queue.post(msg)
p m

puts 'sleeping 5'
sleep 5

puts 'getting status'
subscribers = queue.messages.get(m.id).subscribers
p subscribers
assert_equal 2, subscribers.size
subscribers.each do |s|
p s
assert_equal 503, s["status_code"]
assert ["reserved", "retrying"].include? s["status"]
end
puts 'sleeping 20'
sleep 20
subscribers = queue.messages.get(m.id).subscribers
p subscribers
assert_equal 2, subscribers.size
subscribers.each do |s|
p s

if s["url"] == "http://rest-test.iron.io/code/503"
assert_equal 503, s["status_code"]
assert_equal "error", s["status"]
else
assert_equal 200, s["status_code"]
assert_equal "deleted", s["status"]
LOG.debug m

tries = MAX_TRIES
while tries > 0
tries -= 1
LOG.info 'getting status'
subscribers = queue.messages.get(m.id).subscribers
LOG.debug subscribers
LOG.info "num_subscribers=#{num_subscribers} subscribers.size=#{subscribers.size}"

assert_equal num_subscribers, subscribers.size
subscribers.each do |s|
LOG.debug s
LOG.info "status_code=#{s['status_code']}"
LOG.info "status=#{s['status']}"
next unless 503 == s["status_code"]
next unless ["reserved", "retrying"].include? s["status"]
end
break
end
assert_not_equal tries, 0


tries = MAX_TRIES
while tries > 0
tries -= 1
subscribers = queue.messages.get(m.id).subscribers
LOG.debug subscribers
assert_equal num_subscribers, subscribers.size
subscribers.each do |s|
LOG.debug s

if s["url"] == "http://rest-test.iron.io/code/503"
next unless 503 == s["status_code"]
next unless "error" == s["status"]
else
next unless 200 == s["status_code"]
next unless "deleted" == s["status"]
end
end
break
end
end


def test_202
types = ["multicast"]
types.each do |t|

puts "Trying type #{t}"
LOG.info "Trying type #{t}"

qname = "subscription-queue-#{t}-202"

Expand All @@ -167,52 +227,73 @@ def test_202
res = queue.update_queue(:subscribers => subscribers,
:push_type => t)
queue = @client.queue(qname)
p queue
p queue.subscribers
assert_equal 2, queue.subscribers.size
LOG.debug queue
LOG.debug queue.subscribers
assert_equal num_subscribers, queue.subscribers.size
# todo: assert subscriptions match

msg = "hello #{x}"
m = queue.post(msg)
m = queue.post(msg,
{:timeout => 2})

tries = MAX_TRIES
while tries > 0
tries -= 1
subscribers = queue.messages.get(m.id).subscribers
LOG.debug subscribers
assert_equal num_subscribers, subscribers.size
subscribers.each do |s|
LOG.debug s
next unless 202 == s["status_code"]
next unless "reserved" == s["status"]
end
break
end
assert_not_equal tries, 0

puts "sleeping..."
sleep 10
LOG.info 'sleeping 2'
sleep 2

subscribers = queue.messages.get(m.id).subscribers
p subscribers
assert_equal 2, subscribers.size
subscribers.each do |s|
p s
assert_equal 202, s["status_code"]
assert_equal "reserved", s["status"]
end
tries = MAX_TRIES
while tries > 0
subscribers = queue.messages.get(m.id).subscribers
LOG.debug subscribers
assert_equal num_subscribers, subscribers.size

puts 'sleeping 60'
sleep 60
subscribers.each do |s|
LOG.debug s
LOG.info "status_code=#{s['status_code']}"
LOG.info "status=#{s['status']}"

subscribers = queue.messages.get(m.id).subscribers
p subscribers
assert_equal 2, subscribers.size
subscribers.each do |s|
p s
assert_equal 202, s["status_code"]
assert_equal "reserved", s["status"]
# now let's delete it to say we're done with it
puts "Acking subscriber"
p s.delete
next unless 202 == s["status_code"]
next unless "reserved" == s["status"]

# now let's delete it to say we're done with it
LOG.info "Acking subscriber"
res = s.delete
LOG.debug res
end
break
end

subscribers = queue.messages.get(m.id).subscribers
p subscribers
assert_equal 2, subscribers.size
subscribers.each do |s|
p s
p s["status_code"]
assert_equal "deleted", s["status"]
assert_not_equal 0, tries

tries = MAX_TRIES
while tries > 0
tries -= 1
subscribers = queue.messages.get(m.id).subscribers
LOG.debug subscribers
assert_equal num_subscribers, subscribers.size
subscribers.each do |s|
LOG.debug s
LOG.info "status=#{s['status']}"
next unless "deleted" == s["status"]
end
break
end
assert_not_equal 0, tries

end

end

def test_202_failure
Expand Down

0 comments on commit ec0d5eb

Please sign in to comment.