X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/995dd33ec5bc9ebb7cc4ff075a1f5e1a4e7db20c..ddc1f6b0c54b72df395cfef26e0dc4eb8f65463d:/services/api/test/integration/websocket_test.rb diff --git a/services/api/test/integration/websocket_test.rb b/services/api/test/integration/websocket_test.rb index 3bba0ef466..7780ccb87c 100644 --- a/services/api/test/integration/websocket_test.rb +++ b/services/api/test/integration/websocket_test.rb @@ -31,8 +31,8 @@ class WebsocketTest < ActionDispatch::IntegrationTest ws.on :open do |event| opened = true if timeout - EM::Timer.new 3 do - too_long = true + EM::Timer.new 4 do + too_long = true if close_status.nil? EM.stop_event_loop end end @@ -142,7 +142,10 @@ class WebsocketTest < ActionDispatch::IntegrationTest state = 3 when 3 human_ev_uuid = d["object_uuid"] + state = 4 ws.close + when 4 + assert false, "Should not get any more events" end end @@ -176,7 +179,10 @@ class WebsocketTest < ActionDispatch::IntegrationTest state = 2 when 2 human_ev_uuid = d["object_uuid"] + state = 3 ws.close + when 3 + assert false, "Should not get any more events" end end @@ -211,6 +217,7 @@ class WebsocketTest < ActionDispatch::IntegrationTest when 2 assert_equal 200, d["status"] spec = Specimen.create + Trait.create # not part of filters, should not be received human = Human.create state = 3 when 3 @@ -218,7 +225,10 @@ class WebsocketTest < ActionDispatch::IntegrationTest state = 4 when 4 human_ev_uuid = d["object_uuid"] + state = 5 ws.close + when 5 + assert false, "Should not get any more events" end end @@ -230,6 +240,42 @@ class WebsocketTest < ActionDispatch::IntegrationTest assert_equal human.uuid, human_ev_uuid end + + test "connect, subscribe, compound filter" do + state = 1 + t1 = nil + + authorize_with :admin + + ws_helper :admin do |ws| + ws.on :open do |event| + ws.send ({method: 'subscribe', filters: [['object_uuid', 'is_a', 'arvados#trait'], ['event_type', '=', 'update']]}.to_json) + end + + ws.on :message do |event| + d = Oj.load event.data + case state + when 1 + assert_equal 200, d["status"] + t1 = Trait.create("name" => "foo") + t1.name = "bar" + t1.save! + state = 2 + when 2 + assert_equal 'update', d['event_type'] + state = 3 + ws.close + when 3 + assert false, "Should not get any more events" + end + end + + end + + assert_equal 3, state + assert_not_nil t1 + end + test "connect, subscribe, ask events starting at seq num" do state = 1 human = nil @@ -259,7 +305,10 @@ class WebsocketTest < ActionDispatch::IntegrationTest when 3 l2 = d["object_uuid"] assert_not_nil l2, "Unexpected message: #{d}" + state = 4 ws.close + when 4 + assert false, "Should not get any more events" end end @@ -281,6 +330,9 @@ class WebsocketTest < ActionDispatch::IntegrationTest ws.on :open do |event| ws.send ({method: 'subscribe'}.to_json) EM::Timer.new 3 do + # Set a time limit on the test because after unsubscribing the server + # still has to process the next event (and then hopefully correctly + # decides not to send it because we unsubscribed.) ws.close end end @@ -290,15 +342,14 @@ class WebsocketTest < ActionDispatch::IntegrationTest case state when 1 assert_equal 200, d["status"] - filter_id = d["filter_id"] spec = Specimen.create state = 2 when 2 spec_ev_uuid = d["object_uuid"] - ws.send ({method: 'unsubscribe', filter_id: filter_id}.to_json) + ws.send ({method: 'unsubscribe'}.to_json) EM::Timer.new 1 do - Human.create + Specimen.create end state = 3 @@ -316,19 +367,22 @@ class WebsocketTest < ActionDispatch::IntegrationTest assert_equal spec.uuid, spec_ev_uuid end - - test "connect, subscribe, get event, try to unsubscribe with bogus filter_id" do + test "connect, subscribe, get event, unsubscribe with filter" do state = 1 spec = nil spec_ev_uuid = nil - human = nil - human_ev_uuid = nil authorize_with :admin - ws_helper :admin do |ws| + ws_helper :admin, false do |ws| ws.on :open do |event| - ws.send ({method: 'subscribe'}.to_json) + ws.send ({method: 'subscribe', filters: [['object_uuid', 'is_a', 'arvados#human']]}.to_json) + EM::Timer.new 3 do + # Set a time limit on the test because after unsubscribing the server + # still has to process the next event (and then hopefully correctly + # decides not to send it because we unsubscribed.) + ws.close + end end ws.on :message do |event| @@ -336,35 +390,33 @@ class WebsocketTest < ActionDispatch::IntegrationTest case state when 1 assert_equal 200, d["status"] - spec = Specimen.create + spec = Human.create state = 2 when 2 spec_ev_uuid = d["object_uuid"] - ws.send ({method: 'unsubscribe', filter_id: 100000}.to_json) + ws.send ({method: 'unsubscribe', filters: [['object_uuid', 'is_a', 'arvados#human']]}.to_json) EM::Timer.new 1 do - human = Human.create + Human.create end state = 3 when 3 - assert_equal 404, d["status"] + assert_equal 200, d["status"] state = 4 when 4 - human_ev_uuid = d["object_uuid"] - ws.close + assert false, "Should not get any more events" end end end assert_not_nil spec - assert_not_nil human assert_equal spec.uuid, spec_ev_uuid - assert_equal human.uuid, human_ev_uuid end - test "connect, subscribe, get event, try to unsubscribe with missing filter_id" do + + test "connect, subscribe, get event, try to unsubscribe with bogus filter" do state = 1 spec = nil spec_ev_uuid = nil @@ -387,7 +439,7 @@ class WebsocketTest < ActionDispatch::IntegrationTest state = 2 when 2 spec_ev_uuid = d["object_uuid"] - ws.send ({method: 'unsubscribe'}.to_json) + ws.send ({method: 'unsubscribe', filters: [['foo', 'bar', 'baz']]}.to_json) EM::Timer.new 1 do human = Human.create @@ -395,11 +447,14 @@ class WebsocketTest < ActionDispatch::IntegrationTest state = 3 when 3 - assert_equal 400, d["status"] + assert_equal 404, d["status"] state = 4 when 4 human_ev_uuid = d["object_uuid"] + state = 5 ws.close + when 5 + assert false, "Should not get any more events" end end @@ -412,6 +467,7 @@ class WebsocketTest < ActionDispatch::IntegrationTest end + test "connected, not subscribed, no event" do authorize_with :admin @@ -532,10 +588,10 @@ class WebsocketTest < ActionDispatch::IntegrationTest ws.on :message do |event| d = Oj.load event.data case state - when (1..16) + when (1..EventBus::MAX_FILTERS) assert_equal 200, d["status"] state += 1 - when 17 + when (EventBus::MAX_FILTERS+1) assert_equal 403, d["status"] ws.close end @@ -547,4 +603,47 @@ class WebsocketTest < ActionDispatch::IntegrationTest end + test "connect, subscribe, lots of events" do + state = 1 + event_count = 0 + log_start = Log.order(:id).last.id + + authorize_with :admin + + ws_helper :admin, false do |ws| + EM::Timer.new 45 do + # Needs a longer timeout than the default + ws.close + end + + ws.on :open do |event| + ws.send ({method: 'subscribe'}.to_json) + end + + ws.on :message do |event| + d = Oj.load event.data + case state + when 1 + assert_equal 200, d["status"] + ActiveRecord::Base.transaction do + (1..202).each do + spec = Specimen.create + end + end + state = 2 + when 2 + event_count += 1 + assert_equal d['id'], event_count+log_start + if event_count == 202 + ws.close + end + end + end + + end + + assert_equal 202, event_count + end + + end