diff options
| -rw-r--r-- | lib/nickserver/adapters/http.rb | 15 | ||||
| -rw-r--r-- | lib/nickserver/nicknym/source.rb | 3 | ||||
| -rw-r--r-- | test/functional/sample_test.rb | 5 | ||||
| -rw-r--r-- | test/remote/Readme.md | 15 | ||||
| -rw-r--r-- | test/remote/nicknym_source_test.rb | 15 | ||||
| -rw-r--r-- | test/support/http_stub_helper.rb | 27 | ||||
| -rw-r--r-- | test/unit/nicknym/source_test.rb | 13 | 
7 files changed, 65 insertions, 28 deletions
diff --git a/lib/nickserver/adapters/http.rb b/lib/nickserver/adapters/http.rb index 636aceb..eb77cc6 100644 --- a/lib/nickserver/adapters/http.rb +++ b/lib/nickserver/adapters/http.rb @@ -2,6 +2,19 @@ require 'nickserver/adapters'  require 'nickserver/config'  require 'http' +# Nickserver::Adapters::Http +# +# Basic http adapter with ssl and minimal error handling. +# Only implemented get requests so far. +# +# Error Handling: +# +# Pass a string as the 'rescue' option. If a ConnectionError occures +# which includes the string passed it will be rescued and the request +# will return nil. This allows handling the error inside the adapter so +# that for the derived CelluloidHttp Adapter the actor does not get +# killed. +  module Nickserver::Adapters    class Http @@ -9,6 +22,8 @@ module Nickserver::Adapters        url = HTTP::URI.parse url.to_s        response = get_with_auth url, params: options[:query]        return response.code, response.to_s +    rescue HTTP::ConnectionError => e +      raise unless options[:rescue] && e.to_s.include?(options[:rescue])      end      protected diff --git a/lib/nickserver/nicknym/source.rb b/lib/nickserver/nicknym/source.rb index 96945cb..f49547e 100644 --- a/lib/nickserver/nicknym/source.rb +++ b/lib/nickserver/nicknym/source.rb @@ -8,7 +8,8 @@ module Nickserver        PORT = 6425        def available_for?(domain) -        status, body = adapter.get "https://#{domain}/provider.json" +        status, body = adapter.get "https://#{domain}/provider.json", +          rescue: 'failed to connect: getaddrinfo'          status == 200 && provider_with_mx?(body)        end diff --git a/test/functional/sample_test.rb b/test/functional/sample_test.rb index 68127e1..4be5c26 100644 --- a/test/functional/sample_test.rb +++ b/test/functional/sample_test.rb @@ -24,6 +24,11 @@ class SampleTest < FunctionalTest    # Regression Tests +  # #3 handle missing A records +  def test_nicknym +    assert_lookup_status 404, 'postmaster@cs.ucl.ac.uk' +  end +    def test_no_file_descriptors_leak      lookup 'test@mail.bitmask.net'      before = open_files_count diff --git a/test/remote/Readme.md b/test/remote/Readme.md index 957ea12..53f5e65 100644 --- a/test/remote/Readme.md +++ b/test/remote/Readme.md @@ -1,15 +1,14 @@  Integration tests for clients of remote services  ================================================ -The tests in this directory are integration test with remote services.  However -we aims at testing the client side of the equation as that is what we control -here. +The tests in this directory are integration test with remote services. +However we aims at testing the client side of the equation as that is +what we control here. -So unexpected server behavious should *crash* the test if we are not dealing -with it properly yet and have no unit test for it. +So unexpected server behavious should *crash* the test if we are not +dealing with it properly yet and have no unit test for it. -Server responses that we do not expect but handle in the code and test in unit -tests make the test *skip*. +Server responses that we do not expect but handle in the code and test +in unit tests make the test *skip*.  The Behaviour we would normally expect should make the test *pass* - diff --git a/test/remote/nicknym_source_test.rb b/test/remote/nicknym_source_test.rb index 4ca3033..b97f2b2 100644 --- a/test/remote/nicknym_source_test.rb +++ b/test/remote/nicknym_source_test.rb @@ -10,13 +10,24 @@ require 'nickserver/email_address'  class RemoteNicknymSourceTest < CelluloidTest    include HttpAdapterHelper -  def test_availablility_check +  def test_available_for_mail      source.available_for? 'mail.bitmask.net' -    refute source.available_for? 'dl.bitmask.net'   # not a provider    rescue HTTP::ConnectionError => e      skip e.to_s    end +  # not a provider +  def test_not_available +    refute source.available_for? 'dl.bitmask.net' +  rescue HTTP::ConnectionError => e +    skip e.to_s +  end + +  # cs.ucl.ac.uk only has an MX not an A-record +  def test_not_available_without_a_record +    refute source.available_for? 'cs.ucl.ac.uk' +  end +    def test_successful_query      response = source.query(email_with_key)      skip if response.status == 404 diff --git a/test/support/http_stub_helper.rb b/test/support/http_stub_helper.rb index c9f2bfa..4e3d89b 100644 --- a/test/support/http_stub_helper.rb +++ b/test/support/http_stub_helper.rb @@ -10,32 +10,31 @@ module HttpStubHelper    end    def stub_nicknym_available_response(domain, response = {}) -    stub_http_request :get, "https://#{domain}/provider.json", -      response: response +    stub_http_get "https://#{domain}/provider.json", +      response, +      Hash    end    def stub_sks_vindex_reponse(uid, response = {}) -    stub_http_request :get, config.hkp_url, -      query: {op: 'vindex', search: uid, exact: 'on', options: 'mr', fingerprint: 'on'}, -      response: response +    stub_http_get config.hkp_url, response, +      query: {op: 'vindex', search: uid, exact: 'on', options: 'mr', fingerprint: 'on'}    end    def stub_sks_get_reponse(key_id, response = {}) -    stub_http_request :get, config.hkp_url, -      query: {op: 'get', search: "0x"+key_id, exact: 'on', options: 'mr'}, -      response: response +    stub_http_get config.hkp_url, response, +      query: {op: 'get', search: "0x"+key_id, exact: 'on', options: 'mr'}    end    def stub_couch_response(uid, response = {})      query = "\?key=#{"%22#{uid}%22"}&reduce=false" -    stub_http_request :get, -      /#{Regexp.escape(config.couch_url)}.*#{query}/, -      response: response +    stub_http_get /#{Regexp.escape(config.couch_url)}.*#{query}/, +      response    end -  def stub_http_request(verb, url, options = {}) -    response = {status: 200, body: ""}.merge(options.delete(:response) || {}) -    options = nil if options == {} +  private + +  def stub_http_get(url, response, options = nil) +    response = {status: 200, body: ""}.merge(response || {})      adapter.expect :get, [response[:status], response[:body]],        [url, options].compact    end diff --git a/test/unit/nicknym/source_test.rb b/test/unit/nicknym/source_test.rb index f8c9b60..b17f22b 100644 --- a/test/unit/nicknym/source_test.rb +++ b/test/unit/nicknym/source_test.rb @@ -1,4 +1,6 @@  require 'test_helper' +require 'http' +require 'json'  require 'nickserver/nicknym/source'  require 'nickserver/email_address' @@ -20,6 +22,11 @@ class NicknymSourceTest < Minitest::Test      refute available_on?(200, 'blablabla')    end +  # adapter rescues name resolution errors and returns nothing +  def test_not_available_without_response +    refute available_on? +  end +    def test_proxy_successful_query      assert proxies_query_response?(200, 'dummy body')    end @@ -39,9 +46,9 @@ class NicknymSourceTest < Minitest::Test      adapter.verify    end -  def available_on?(status = 0, body = nil) -    adapter.expect :get, [status, body], -      ['https://remote.tld/provider.json'] +  def available_on?(*args) +    adapter.expect :get, args, +      ['https://remote.tld/provider.json', Hash]      available = source.available_for?('remote.tld')      adapter.verify      return available  | 
