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
|
# encoding: utf-8
require "spec_helper"
describe "Topic-based subscription" do
#
# Environment
#
include EventedSpec::AMQPSpec
include EventedSpec::SpecHelper
em_before { AMQP.cleanup_state }
em_after { AMQP.cleanup_state }
default_options AMQP_OPTS
default_timeout 10
amqp_before do
@channel = AMQP::Channel.new
@channel.should be_open
@exchange = @channel.topic
end
after(:all) do
AMQP.cleanup_state
done
end
#
# Examples
#
context "when keys match exactly" do
it "routes messages to bound queues" do
@aapl_queue = @channel.queue("AAPL queue", :auto_delete => true)
@amzn_queue = @channel.queue("AMZN queue", :auto_delete => true)
received_messages = {
@aapl_queue.name => 0,
@amzn_queue.name => 0
}
expected_messages = {
@aapl_queue.name => 4,
@amzn_queue.name => 2
}
@aapl_queue.bind(@exchange, :key => "nasdaq.aapl").subscribe do |payload|
received_messages[@aapl_queue.name] += 1
end
@amzn_queue.bind(@exchange, :key => "nasdaq.amzn").subscribe do |payload|
received_messages[@amzn_queue.name] += 1
end
4.times do
@exchange.publish(332 + rand(1000)/400.0, :key => "nasdaq.aapl")
end
2.times do
@exchange.publish(181 + rand(1000)/400.0, :key => "nasdaq.amzn")
end
# publish some messages none of our queues should be receiving
3.times do
@exchange.publish(626 + rand(1000)/400.0, :key => "nasdaq.goog")
end
done(0.5) {
received_messages.should == expected_messages
@aapl_queue.unsubscribe
@amzn_queue.unsubscribe
}
end # it
end # context
context "when key matches on * (single word globbing)" do
it "routes messages to bound queues" do
@nba_queue = @channel.queue("NBA queue", :auto_delete => true)
@knicks_queue = @channel.queue("New York Knicks queue", :auto_delete => true)
@celtics_queue = @channel.queue("Boston Celtics queue", :auto_delete => true)
received_messages = {
@nba_queue.name => 0,
@knicks_queue.name => 0,
@celtics_queue.name => 0
}
expected_messages = {
@nba_queue.name => 7,
@knicks_queue.name => 2,
@celtics_queue.name => 3
}
@nba_queue.bind(@exchange, :key => "sports.nba.*").subscribe do |payload|
received_messages[@nba_queue.name] += 1
end
@knicks_queue.bind(@exchange, :key => "sports.nba.knicks").subscribe do |payload|
received_messages[@knicks_queue.name] += 1
end
@celtics_queue.bind(@exchange, :key => "sports.nba.celtics").subscribe do |payload|
received_messages[@celtics_queue.name] += 1
end
@exchange.publish("Houston Rockets 104 : New York Knicks 89", :key => "sports.nba.knicks")
@exchange.publish("Phoenix Suns 129 : New York Knicks 121", :key => "sports.nba.knicks")
@exchange.publish("Ray Allen hit a 21-foot jumper with 24.5 seconds remaining on the clock to give Boston a win over Detroit last night in the TD Garden", :key => "sports.nba.celtics")
@exchange.publish("Garnett's Return Sparks Celtics Over Magic at Garden", :key => "sports.nba.celtics")
@exchange.publish("Tricks of the Trade: Allen Reveals Magic of Big Shots", :key => "sports.nba.celtics")
@exchange.publish("Blatche, Wall lead Wizards over Jazz 108-101", :key => "sports.nba.jazz")
@exchange.publish("Deron Williams Receives NBA Cares Community Assist Award", :key => "sports.nba.jazz")
done(0.6) {
received_messages.should == expected_messages
@nba_queue.unsubscribe
@knicks_queue.unsubscribe
@celtics_queue.unsubscribe
}
end # it
end # context
context "when key matches on # (multiple words globbing)" do
it "routes messages to bound queues" do
@sports_queue = @channel.queue("Sports queue", :auto_delete => true)
@nba_queue = @channel.queue("NBA queue", :auto_delete => true)
@knicks_queue = @channel.queue("New York Knicks queue", :auto_delete => true)
@celtics_queue = @channel.queue("Boston Celtics queue", :auto_delete => true)
received_messages = {
@sports_queue.name => 0,
@nba_queue.name => 0,
@knicks_queue.name => 0,
@celtics_queue.name => 0
}
expected_messages = {
@sports_queue.name => 9,
@nba_queue.name => 7,
@knicks_queue.name => 2,
@celtics_queue.name => 3
}
@sports_queue.bind(@exchange, :key => "sports.#").subscribe do |payload|
received_messages[@sports_queue.name] += 1
end
@nba_queue.bind(@exchange, :key => "*.nba.*").subscribe do |payload|
received_messages[@nba_queue.name] += 1
end
@knicks_queue.bind(@exchange, :key => "sports.nba.knicks").subscribe do |payload|
received_messages[@knicks_queue.name] += 1
end
@celtics_queue.bind(@exchange, :key => "#.celtics").subscribe do |payload|
received_messages[@celtics_queue.name] += 1
end
@exchange.publish("Houston Rockets 104 : New York Knicks 89", :key => "sports.nba.knicks")
@exchange.publish("Phoenix Suns 129 : New York Knicks 121", :key => "sports.nba.knicks")
@exchange.publish("Ray Allen hit a 21-foot jumper with 24.5 seconds remaining on the clock to give Boston a win over Detroit last night in the TD Garden", :key => "sports.nba.celtics")
@exchange.publish("Garnett's Return Sparks Celtics Over Magic at Garden", :key => "sports.nba.celtics")
@exchange.publish("Tricks of the Trade: Allen Reveals Magic of Big Shots", :key => "sports.nba.celtics")
@exchange.publish("Blatche, Wall lead Wizards over Jazz 108-101", :key => "sports.nba.jazz")
@exchange.publish("Deron Williams Receives NBA Cares Community Assist Award", :key => "sports.nba.jazz")
@exchange.publish("Philadelphia's Daniel Briere has been named as an All-Star replacement for Jarome Iginla.", :key => "sports.nhl.allstargame")
@exchange.publish("Devils blank Sid- and Malkin-less Penguins 2-0", :key => "sports.nhl.penguins")
done(0.5) {
received_messages.should == expected_messages
@sports_queue.unsubscribe
@nba_queue.unsubscribe
@knicks_queue.unsubscribe
@celtics_queue.unsubscribe
}
end # it
end # context
end # describe
|