Skip to content
This repository has been archived by the owner on Aug 29, 2024. It is now read-only.

Commit

Permalink
Merge pull request #13 from ThibG/httprb
Browse files Browse the repository at this point in the history
Add (failing) http.rb wrap test for TCPSocket and SSLSocket
  • Loading branch information
ioquatix authored Oct 9, 2018
2 parents db34940 + f37e7ca commit a59f4e9
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ group :test do
gem 'coveralls', require: false

gem 'async-container'

gem 'http'
end
85 changes: 85 additions & 0 deletions spec/async/io/wrap/http_rb_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Copyright, 2018, by Thibaut Girka
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

require 'http'
require 'openssl'

require 'async/io/tcp_socket'
require 'async/io/ssl_socket'

# There are different ways to achieve this. This is really just a proof of concept.
module Wrap
module TCPSocket
def self.new(*args)
if Async::Task.current?
Async::IO::TCPSocket.new(*args)
else
::TCPSocket.new(*args)
end
end

def self.open(*args)
self.new(*args)
end
end

module SSLSocket
def self.new(*args)
if Async::Task.current?
# wrap instead of new
Async::IO::SSLSocket.wrap(*args)
else
OpenSSL::SSL::SSLSocket.new(*args)
end
end
end
end

RSpec.describe Async::IO::TCPSocket do
describe "inside reactor" do
include_context Async::RSpec::Reactor

it "should fetch page" do
expect(Async::IO::TCPSocket).to receive(:new).and_call_original

expect do
response = HTTP.get('https://www.google.com', { socket_class: Wrap::TCPSocket, ssl_socket_class: Wrap::SSLSocket })
response.connection.close
end.to_not raise_error
end

it "should fetch page when used as a drop-in replacement" do
expect(Async::IO::TCPSocket).to receive(:new).and_call_original
response = HTTP.get('https://www.google.com', { socket_class: Async::IO::TCPSocket, ssl_socket_class: Async::IO::SSLSocket })
response.connection.close
expect do
end.to_not raise_error
end
end

describe "outside reactor" do
it "should fetch page" do
expect do
response = HTTP.get('https://www.google.com', { socket_class: Wrap::TCPSocket, ssl_socket_class: Wrap::SSLSocket })
response.connection.close
end.to_not raise_error
end
end
end

0 comments on commit a59f4e9

Please sign in to comment.