From 7eb22b6a44d2fefd43bde110859c5d3fde314aed Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Tue, 7 Mar 2023 22:38:48 +1300 Subject: [PATCH 1/5] Allow passing through arguments to #close. --- lib/async/websocket/client.rb | 4 ++-- test/async/websocket/client.rb | 34 ++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/async/websocket/client.rb b/lib/async/websocket/client.rb index 4472762..e21339a 100644 --- a/lib/async/websocket/client.rb +++ b/lib/async/websocket/client.rb @@ -41,8 +41,8 @@ def initialize(client, connection) super(connection) end - def close - super + def close(...) + super(...) if @client @client.close diff --git a/test/async/websocket/client.rb b/test/async/websocket/client.rb index 7b70c64..3fc89b9 100644 --- a/test/async/websocket/client.rb +++ b/test/async/websocket/client.rb @@ -20,16 +20,30 @@ end end - it "can connect to a websocket server and close underlying client" do - Async do |task| - connection = Async::WebSocket::Client.connect(client_endpoint) - connection.send_text("Hello World!") - message = connection.read - expect(message.to_str).to be == "Hello World!" - - connection.close - expect(task.children).to be(:empty?) - end.wait + with '#close' do + it "can connect to a websocket server and close underlying client" do + Async do |task| + connection = Async::WebSocket::Client.connect(client_endpoint) + connection.send_text("Hello World!") + message = connection.read + expect(message.to_str).to be == "Hello World!" + + connection.close + expect(task.children).to be(:empty?) + end.wait + end + + it "can connect to a websocket server and close underlying client with an error code" do + Async do |task| + connection = Async::WebSocket::Client.connect(client_endpoint) + connection.send_text("Hello World!") + message = connection.read + expect(message.to_str).to be == "Hello World!" + + connection.close(Protocol::WebSocket::Error::GOING_AWAY, "Bye!") + expect(task.children).to be(:empty?) + end.wait + end end with 'missing support for websockets' do From beb34ca77612b0a8ee4d5da74c80e09105978daf Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Tue, 7 Mar 2023 22:39:00 +1300 Subject: [PATCH 2/5] Relax dependency on sus. --- async-websocket.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/async-websocket.gemspec b/async-websocket.gemspec index 23331ad..ff23c82 100644 --- a/async-websocket.gemspec +++ b/async-websocket.gemspec @@ -24,6 +24,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency "bundler" spec.add_development_dependency "covered" - spec.add_development_dependency "sus", "~> 0.16.0" + spec.add_development_dependency "sus", "~> 0.18" spec.add_development_dependency "sus-fixtures-async-http", "~> 0.2.3" end From 978e839e9d24cce9f9fd62fb162f5efab2bc430e Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 8 Mar 2023 16:11:22 +1300 Subject: [PATCH 3/5] Add more tests for close behaviour. (#51) * Expect the connection to be closed after sending and then receiving a close frame. --- gems.rb | 2 +- test/async/websocket/client.rb | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/gems.rb b/gems.rb index 6eac629..bc04589 100644 --- a/gems.rb +++ b/gems.rb @@ -19,4 +19,4 @@ gem "bake-test-external" end -gem "rack", "~> 3.0.0" +# gem "protocol-websocket", path: "../protocol-websocket" diff --git a/test/async/websocket/client.rb b/test/async/websocket/client.rb index 3fc89b9..b7fc72a 100644 --- a/test/async/websocket/client.rb +++ b/test/async/websocket/client.rb @@ -20,6 +20,27 @@ end end + with '#send_close' do + it "can read incoming messages and then close" do + connection = Async::WebSocket::Client.connect(client_endpoint) + 3.times do + connection.send_text("Hello World!") + end + + # This informs the server we are done echoing messages: + connection.send_close + + # Collect all the echoed messages: + messages = [] + while message = connection.read + messages << message + end + + expect(messages.size).to be == 3 + expect(connection).to be(:closed?) + end + end + with '#close' do it "can connect to a websocket server and close underlying client" do Async do |task| @@ -46,6 +67,26 @@ end end + with "#close(1001)" do + let(:app) do + Protocol::HTTP::Middleware.for do |request| + Async::WebSocket::Adapters::HTTP.open(request) do |connection| + connection.send_text("Hello World!") + connection.close(1001) + end + end + end + + it 'closes with custom error' do + connection = Async::WebSocket::Client.connect(client_endpoint) + message = connection.read + + expect do + connection.read + end.to raise_exception(Protocol::WebSocket::Error).and(have_attributes(code: be == 1001)) + end + end + with 'missing support for websockets' do let(:app) do Protocol::HTTP::Middleware.for do |request| From a8621a1d76adf2c96ae9bd684a2f3df48b1d6f2a Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 8 Mar 2023 16:22:22 +1300 Subject: [PATCH 4/5] Close connection at end of test. --- test/async/websocket/client.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/async/websocket/client.rb b/test/async/websocket/client.rb index b7fc72a..ae71654 100644 --- a/test/async/websocket/client.rb +++ b/test/async/websocket/client.rb @@ -38,6 +38,8 @@ expect(messages.size).to be == 3 expect(connection).to be(:closed?) + ensure + connection&.close end end From f05d33646a4b7866581c43c683ff0abbadf8acc2 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 8 Mar 2023 16:23:58 +1300 Subject: [PATCH 5/5] Bump minor version. --- lib/async/websocket/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/async/websocket/version.rb b/lib/async/websocket/version.rb index 9f41810..dda41ad 100644 --- a/lib/async/websocket/version.rb +++ b/lib/async/websocket/version.rb @@ -5,6 +5,6 @@ module Async module WebSocket - VERSION = "0.24.0" + VERSION = "0.25.0" end end