Skip to content

Commit

Permalink
Add tests for different timeout options to all adapters
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexey Chernenkov committed Aug 27, 2018
1 parent 885e373 commit 5d83dc9
Show file tree
Hide file tree
Showing 9 changed files with 194 additions and 4 deletions.
4 changes: 2 additions & 2 deletions lib/httpi/adapter/net_http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,10 @@ def setup_client
@client.open_timeout = @request.open_timeout if @request.open_timeout
@client.read_timeout = @request.read_timeout if @request.read_timeout
if @request.write_timeout
if @client.respond_to?(:write_timeout=) # Since Ruby 2.6
if @client.respond_to?(:write_timeout=) # Expected to appear in Ruby 2.6
@client.write_timeout = @request.write_timeout
else
raise NotSupportedError, "Net::HTTP supports write_timeout since Ruby 2.6"
raise NotSupportedError, "Net::HTTP supports write_timeout starting from Ruby 2.6"
end
end
end
Expand Down
9 changes: 8 additions & 1 deletion spec/httpi/adapter/curb_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -152,12 +152,19 @@
adapter.request(:get)
end

it "is set if specified" do
it "is set if specified read_timeout" do
request.read_timeout = 30
curb.expects(:timeout_ms=).with(30_000)

adapter.request(:get)
end

it "is set if specified write_timeout" do
request.write_timeout = 30
curb.expects(:timeout_ms=).with(30_000)

adapter.request(:get)
end
end

describe "connect_timeout_ms" do
Expand Down
13 changes: 12 additions & 1 deletion spec/httpi/adapter/em_http_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@
end

describe "receive_timeout" do
it "is passed as a connection option" do
it "is passed as a connection option (when read_timeout specified)" do
request.read_timeout = 60

url = "http://example.com:80"
Expand All @@ -128,6 +128,17 @@

adapter
end

it "is passed as a connection option (when write_timeout specified)" do
request.write_timeout = 60

url = "http://example.com:80"
connection_options = { inactivity_timeout: 60 }

EventMachine::HttpRequest.expects(:new).with(url, connection_options)

adapter
end
end

describe "set_auth" do
Expand Down
28 changes: 28 additions & 0 deletions spec/httpi/adapter/excon_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
require "spec_helper"
require "httpi/adapter/excon"
require "httpi/request"

begin
HTTPI::Adapter.load_adapter(:excon)

describe HTTPI::Adapter::Excon do
let(:adapter) { HTTPI::Adapter::Excon.new(request) }
let(:request) { HTTPI::Request.new("http://example.com") }

describe "settings" do
describe "connect_timeout, read_timeout, write_timeout" do
it "are passed as connection options" do
request.open_timeout = 30
request.read_timeout = 40
request.write_timeout = 50

expect(adapter.client.data).to include(
connect_timeout: 30,
read_timeout: 40,
write_timeout: 50
)
end
end
end
end
end
28 changes: 28 additions & 0 deletions spec/httpi/adapter/http_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
require "spec_helper"
require "httpi/adapter/http"
require "httpi/request"

begin
HTTPI::Adapter.load_adapter(:http)

describe HTTPI::Adapter::HTTP do
let(:adapter) { HTTPI::Adapter::HTTP.new(request) }
let(:request) { HTTPI::Request.new("http://example.com") }

describe "settings" do
describe "connect_timeout, read_timeout, write_timeout" do
it "are being set on the client" do
request.open_timeout = 30
request.read_timeout = 40
request.write_timeout = 50

expect(adapter.client.default_options.timeout_options).to eq(
connect_timeout: 30,
read_timeout: 40,
write_timeout: 50
)
end
end
end
end
end
14 changes: 14 additions & 0 deletions spec/httpi/adapter/httpclient_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,20 @@
end
end

describe "send_timeout" do
it "is not set unless specified" do
httpclient.expects(:send_timeout=).never
adapter.request(:get)
end

it "is set if specified" do
request.write_timeout = 30

httpclient.expects(:send_timeout=).with(30)
adapter.request(:get)
end
end

describe "set_auth" do
it "is set for HTTP basic auth" do
request.auth.basic "username", "password"
Expand Down
46 changes: 46 additions & 0 deletions spec/httpi/adapter/net_http_persistent_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
require "spec_helper"
require "httpi/adapter/net_http_persistent"
require "httpi/request"

begin
HTTPI::Adapter.load_adapter(:net_http_persistent)

describe HTTPI::Adapter::NetHTTPPersistent do
let(:adapter) { HTTPI::Adapter::NetHTTPPersistent.new(request) }
let(:request) { HTTPI::Request.new("http://example.com") }

let(:response) {
Object.new.tap do |r|
r.stubs(:code).returns(200)
r.stubs(:body).returns("abc")
r.stubs(:to_hash).returns({"Content-Length" => "3"})
end
}

before do
Net::HTTP::Persistent.any_instance.stubs(:start).returns(response)
end

describe "settings" do
describe "open_timeout, read_timeout" do
it "are being set on the client" do
request.open_timeout = 30
request.read_timeout = 40

adapter.client.expects(:open_timeout=).with(30)
adapter.client.expects(:read_timeout=).with(40)

adapter.request(:get)
end
end

describe "write_timeout" do
it "is not supported" do
request.write_timeout = 50
expect { adapter.request(:get) }
.to raise_error(HTTPI::NotSupportedError, /write_timeout/)
end
end
end
end
end
54 changes: 54 additions & 0 deletions spec/httpi/adapter/net_http_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
require "spec_helper"
require "httpi/adapter/net_http"
require "httpi/request"

begin
HTTPI::Adapter.load_adapter(:net_http)

describe HTTPI::Adapter::NetHTTP do
let(:adapter) { HTTPI::Adapter::NetHTTP.new(request) }
let(:request) { HTTPI::Request.new("http://example.com") }

let(:response) {
Object.new.tap do |r|
r.stubs(:code).returns(200)
r.stubs(:body).returns("abc")
r.stubs(:to_hash).returns({"Content-Length" => "3"})
end
}

before do
Net::HTTP.any_instance.stubs(:start).returns(response)
end

describe "settings" do
describe "open_timeout, read_timeout" do
it "are being set on the client" do
request.open_timeout = 30
request.read_timeout = 40

adapter.client.expects(:open_timeout=).with(30)
adapter.client.expects(:read_timeout=).with(40)

adapter.request(:get)
end
end

describe "write_timeout" do
if Net::HTTP.method_defined?(:write_timeout=)
it "is being set on the client" do
request.write_timeout = 50
adapter.client.expects(:write_timeout=).with(50)
adapter.request(:get)
end
else
it "can not be set on the client" do
request.write_timeout = 50
expect { adapter.request(:get) }
.to raise_error(HTTPI::NotSupportedError, /write_timeout/)
end
end
end
end
end
end
2 changes: 2 additions & 0 deletions spec/integration/net_http_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@
end

it "it supports read timeout" do
require "net/http"

request = HTTPI::Request.new(@server.url + "timeout")
request.read_timeout = 0.5 # seconds

Expand Down

0 comments on commit 5d83dc9

Please sign in to comment.