Skip to content
This repository has been archived by the owner on Dec 1, 2021. It is now read-only.

Commit

Permalink
ugg... rescuing StandardError is bad news bears...
Browse files Browse the repository at this point in the history
  • Loading branch information
bvandenbos committed Nov 17, 2011
1 parent 5a64bce commit c5c4f29
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 35 deletions.
47 changes: 30 additions & 17 deletions lib/delsolr.rb
Original file line number Diff line number Diff line change
Expand Up @@ -175,27 +175,26 @@ def query(request_handler, opts = {})
body.force_encoding("UTF-8")
end

# add to the cache if caching
if enable_caching
begin
@cache.set(cache_key, body, ttl)
rescue
end
end
end

response = DelSolr::Client::Response.new(body, query_builder, :logger => logger, :from_cache => from_cache, :shortcuts => @shortcuts)
if logger
if response && response.success?
response_stat_string = "#{from_cache ? cache_time : response.qtime},#{response.total},"
end
logger.info "#{from_cache ? 'C' : 'S'},#{response_stat_string}http://#{configuration.full_path}/select?#{response.request_url}"

url = "http://#{configuration.full_path}/select?#{query_builder.request_string}"
if response && response.success?
log_query_success(url, response, from_cache, (from_cache ? cache_time : response.qtime))
else
# The response from solr will already be logged, but we should also
# log the full url to make debugging easier
log_query_error(url)
end

# Cache successful responses that don't come from the cache
if response && response.success? && enable_caching && !from_cache
# add to the cache if caching
@cache.set(cache_key, body, ttl)
end

response
# If we error, just return nil and let the client decide what to do
rescue StandardError
logger.info "http://#{configuration.full_path}#{query_builder.request_string}" if logger && configuration && query_builder
return nil
end

# Adds a document to the buffer to be posted to solr (NOTE: does not perform the actual post)
Expand Down Expand Up @@ -268,7 +267,21 @@ def pending_documents
end

private


def log_query_success(url, response, from_cache, query_time)
if logger
l = []
l << "#{query_time}ms"
l << (from_cache ? "CACHE" : "SOLR")
l << url
logger.info l.join(' ')
end
end

def log_query_error(url)
logger.error "ERROR #{url}" if logger
end

# returns the update xml buffer
def prepare_update_xml(options = {})
r = ["<add#{options.to_xml_attribute_string}>\n"]
Expand Down
70 changes: 52 additions & 18 deletions test/test_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,23 @@ class ClientTest < Test::Unit::TestCase
FAILURE = '<result status="1"></result>'
CONTENT_TYPE = {'Content-type' => 'text/xml;charset=utf-8'}

class TestLogger
attr_reader :infos, :errors

def initialize(*prms)
@infos = []
@errors = []
end

def info(msg)
@infos << msg
end

def error(msg)
@errors << msg
end
end

class TestCache
def set(k,v,t)
@cache ||= {}
Expand All @@ -26,8 +43,16 @@ def get(k)
@cache[k]
end
end

INVALID_BUFFER = %{
<html>
<body>
Solr returns errors as html
</body>
</html>
}

@@response_buffer = %{
RESPONSE_BUFFER = %{
{
'responseHeader'=>{
'status'=>0,
Expand Down Expand Up @@ -230,39 +255,48 @@ def test_bang_update_with_options
assert_equal(0, c.pending_documents.length)
end

def test_query_returns_nil_when_exception_thrown
c = setup_client

mock_query_builder = DelSolr::Client::QueryBuilder
mock_query_builder.stubs(:request_string).returns('/select?some_query') # mock the query builder
DelSolr::Client::QueryBuilder.stubs(:new).returns(mock_query_builder)
c.connection.expects(:post).raises(StandardError) # mock the connection
assert_nothing_raised do
r = c.query('standard', :query => '123')
assert_nil(r)
end
end

def test_query_with_path
c = setup_client(:path => '/abcsolr')

mock_query_builder = DelSolr::Client::QueryBuilder
mock_query_builder.stubs(:request_string).returns('/select?some_query') # mock the query builder
DelSolr::Client::QueryBuilder.stubs(:new).returns(mock_query_builder)
c.connection.expects(:post).with("/abcsolr/select", mock_query_builder.request_string).returns(build_http_response(@@response_buffer)) # mock the connection
c.connection.expects(:post).with("/abcsolr/select", mock_query_builder.request_string).returns(build_http_response(RESPONSE_BUFFER)) # mock the connection
r = c.query('standard', :query => '123')
assert(r)
assert_equal([1,3,4,5,7,8,9,10,11,12], r.ids.sort)
assert(!r.from_cache?, 'should not be from cache')
end

def test_logs_url_when_response_is_success
test_logger = TestLogger.new
c = setup_client(:logger => test_logger)
mock_query_builder = Object.new
mock_query_builder.stubs(:request_string).returns('/select?some_query') # mock the query builder
DelSolr::Client::QueryBuilder.stubs(:new).returns(mock_query_builder)
c.connection.stubs(:post).returns(build_http_response(RESPONSE_BUFFER)) # mock the connection
c.query('standard', :query => '123')
assert_equal ["151ms SOLR http://localhost:8983/solr/select?/select?some_query"], test_logger.infos
end

def test_logs_error_when_response_is_error
test_logger = TestLogger.new
c = setup_client(:logger => test_logger)
mock_query_builder = Object.new
mock_query_builder.stubs(:request_string).returns('/select?some_query') # mock the query builder
DelSolr::Client::QueryBuilder.stubs(:new).returns(mock_query_builder)
c.connection.stubs(:post).returns(build_http_response(INVALID_BUFFER)) # mock the connection
c.query('standard', :query => '123')
assert_equal "ERROR http://localhost:8983/solr/select?/select?some_query", test_logger.errors.last
end

def test_query_with_default_path
c = setup_client

mock_query_builder = DelSolr::Client::QueryBuilder
mock_query_builder.stubs(:request_string).returns('/select?some_query') # mock the query builder
DelSolr::Client::QueryBuilder.stubs(:new).returns(mock_query_builder)
c.connection.expects(:post).with("/solr/select", mock_query_builder.request_string).returns(build_http_response(@@response_buffer)) # mock the connection
c.connection.expects(:post).with("/solr/select", mock_query_builder.request_string).returns(build_http_response(RESPONSE_BUFFER)) # mock the connection
r = c.query('standard', :query => '123')
assert(r)
assert_equal([1,3,4,5,7,8,9,10,11,12], r.ids.sort)
Expand All @@ -276,7 +310,7 @@ def test_query_from_cache
mock_query_builder = DelSolr::Client::QueryBuilder
mock_query_builder.stubs(:request_string).returns('/select?some_query') # mock the query builder
DelSolr::Client::QueryBuilder.stubs(:new).returns(mock_query_builder)
c.connection.expects(:post).with("/solr/select", mock_query_builder.request_string).returns(build_http_response(@@response_buffer)) # mock the connection
c.connection.expects(:post).with("/solr/select", mock_query_builder.request_string).returns(build_http_response(RESPONSE_BUFFER)) # mock the connection
r = c.query('standard', :query => '123', :enable_caching => true)
assert(r)
assert_equal([1,3,4,5,7,8,9,10,11,12], r.ids.sort)
Expand All @@ -295,7 +329,7 @@ def test_query_encoding_ruby19_ut8
mock_query_builder = DelSolr::Client::QueryBuilder
mock_query_builder.stubs(:request_string).returns('/select?some_query') # mock the query builder
DelSolr::Client::QueryBuilder.stubs(:new).returns(mock_query_builder)
c.connection.expects(:post).with("/solr/select", mock_query_builder.request_string).returns(build_http_response(@@response_buffer)) # mock the connection
c.connection.expects(:post).with("/solr/select", mock_query_builder.request_string).returns(build_http_response(RESPONSE_BUFFER)) # mock the connection
r = c.query('standard', :query => '123')
assert(r)

Expand Down

0 comments on commit c5c4f29

Please sign in to comment.