aboutsummaryrefslogtreecommitdiffstats
path: root/actioncable
diff options
context:
space:
mode:
authormmmpa <mmmpa.mmmpa@gmail.com>2016-05-16 13:07:35 +0900
committermmmpa <mmmpa.mmmpa@gmail.com>2016-05-26 05:22:56 +0900
commit711d232f9344173d6a3f63d5239fe9a41f10e9bc (patch)
treebb4a4c3b0186bdc379ad7dce81e05fbfc96839e9 /actioncable
parente0dbf155ed8f1047f5bca22a4b3718f063d968a0 (diff)
downloadrails-711d232f9344173d6a3f63d5239fe9a41f10e9bc.tar.gz
rails-711d232f9344173d6a3f63d5239fe9a41f10e9bc.tar.bz2
rails-711d232f9344173d6a3f63d5239fe9a41f10e9bc.zip
Add guard to broadcast.
Diffstat (limited to 'actioncable')
-rw-r--r--actioncable/lib/action_cable/subscription_adapter/subscriber_map.rb6
-rw-r--r--actioncable/test/subscription_adapter/subscriber_map_test.rb17
2 files changed, 22 insertions, 1 deletions
diff --git a/actioncable/lib/action_cable/subscription_adapter/subscriber_map.rb b/actioncable/lib/action_cable/subscription_adapter/subscriber_map.rb
index 37eed09793..4ec513e3ba 100644
--- a/actioncable/lib/action_cable/subscription_adapter/subscriber_map.rb
+++ b/actioncable/lib/action_cable/subscription_adapter/subscriber_map.rb
@@ -32,7 +32,11 @@ module ActionCable
end
def broadcast(channel, message)
- list = @sync.synchronize { @subscribers[channel].dup }
+ list = @sync.synchronize do
+ return if !@subscribers.key?(channel)
+ @subscribers[channel].dup
+ end
+
list.each do |subscriber|
invoke_callback(subscriber, message)
end
diff --git a/actioncable/test/subscription_adapter/subscriber_map_test.rb b/actioncable/test/subscription_adapter/subscriber_map_test.rb
new file mode 100644
index 0000000000..5965ac2b90
--- /dev/null
+++ b/actioncable/test/subscription_adapter/subscriber_map_test.rb
@@ -0,0 +1,17 @@
+require 'test_helper'
+
+class SubscriberMapTest < ActionCable::TestCase
+ test "broadcast should not change subscribers" do
+ setup_subscription_map
+ origin = @subscription_map.instance_variable_get(:@subscribers).dup
+
+ @subscription_map.broadcast('not_exist_channel', '')
+
+ assert_equal origin, @subscription_map.instance_variable_get(:@subscribers)
+ end
+
+ private
+ def setup_subscription_map
+ @subscription_map = ActionCable::SubscriptionAdapter::SubscriberMap.new
+ end
+end