diff options
| author | Teddy Wing | 2018-04-30 18:33:49 +0200 |
|---|---|---|
| committer | Teddy Wing | 2018-05-02 17:20:11 +0200 |
| commit | b6c0477552576e7f8575bf2dca6e7899b640c012 (patch) | |
| tree | 4328a671e4214433cce857bbb2b4ce15f3ed529c /spec/lib | |
| parent | 6779a070b8d5d6d738539f84e4405a86337f7dfb (diff) | |
| download | chouette-core-b6c0477552576e7f8575bf2dca6e7899b640c012.tar.bz2 | |
TomTom::Matrix: Handle error responses from TomTom
Occasionally, the following error would appear in our logs:
NoMethodError
RouteWayCostWorker/perform
Error message
NoMethodError: undefined method `each_with_index' for nil:NilClass
Stack trace (show Rails)
/app/lib/tom_tom/matrix.rb: 83:in `extract_costs_to_way_costs!'
/app/lib/tom_tom/matrix.rb: 23:in `matrix'
/app/lib/tom_tom.rb: 24:in `matrix'
/app/app/services/route_way_cost_calculator.rb: 8:in `calculate!'
/app/app/workers/route_way_cost_worker.rb: 12:in `perform'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 167:in `execute_job'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 139:in `block (5 levels) in process'
/var/lib/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq.rb: 36:in `block in <module:Sidekiq>'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 135:in `block (4 levels) in process'
….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 128:in `block in invoke'
….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 130:in `block in invoke'
…-4.2.10/lib/sidekiq/middleware/server/active_record.rb: 6:in `call'
….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 130:in `block in invoke'
…idekiq-4.2.10/lib/sidekiq/middleware/server/logging.rb: 10:in `call'
….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 130:in `block in invoke'
…kiq-4.2.10/lib/sidekiq/middleware/server/retry_jobs.rb: 74:in `call'
….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 130:in `block in invoke'
….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 133:in `invoke'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 134:in `block (3 levels) in process'
…/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/logging.rb: 32:in `with_context'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 132:in `block (2 levels) in process'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 183:in `stats'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 131:in `block in process'
/var/lib/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq.rb: 35:in `block in <module:Sidekiq>'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 126:in `process'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 82:in `process_one'
…ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 70:in `run'
…lib/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/util.rb: 17:in `watchdog'
…lib/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/util.rb: 26:in `block in safe_thread'
My best guess is that this was caused by TomTom responding with an
error, which we weren't handling previously. In that case, the response
would be a JSON string, but include an `'error'` field instead of
`'matrix'` and `'summary'`. Thus, when we'd try to
`matrix_json['matrix']`, it would fail.
Add a new method that checks for errors before we try to parse
`WayCost`s. If a server error is detected, we log the message to the
Rails log and return an empty array.
Refs #6884
Diffstat (limited to 'spec/lib')
| -rw-r--r-- | spec/lib/tom_tom/matrix_spec.rb | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/spec/lib/tom_tom/matrix_spec.rb b/spec/lib/tom_tom/matrix_spec.rb index 605f1d254..be63447d4 100644 --- a/spec/lib/tom_tom/matrix_spec.rb +++ b/spec/lib/tom_tom/matrix_spec.rb @@ -149,6 +149,35 @@ RSpec.describe TomTom::Matrix do end end + describe "#check_for_error_response" do + it "raises an RemoteError when an 'error' key is present in the response" do + response_body = { + 'formatVersion' => '0.0.1', + 'error' => { + 'description' => 'Output format: csv is unsupported.' + } + } + + expect { + matrix.check_for_error_response(response_body) + }.to raise_error( + TomTom::Matrix::RemoteError, + 'Output format: csv is unsupported.' + ) + end + + it "doesn't raise errors with a normal response" do + response_body = { + 'formatVersion' => '0.0.1', + 'matrix' => [] + } + + expect { + matrix.check_for_error_response(response_body) + }.to_not raise_error + end + end + describe "#extract_costs_to_way_costs!" do it "puts distance & time costs in way_costs" do way_costs = [ |
