ably 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -1
- data/ably.gemspec +4 -3
- data/lib/ably/auth.rb +4 -4
- data/lib/ably/logger.rb +1 -1
- data/lib/ably/models/idiomatic_ruby_wrapper.rb +8 -8
- data/lib/ably/models/message.rb +6 -4
- data/lib/ably/models/presence_message.rb +6 -4
- data/lib/ably/modules/async_wrapper.rb +2 -2
- data/lib/ably/modules/conversions.rb +1 -1
- data/lib/ably/modules/encodeable.rb +1 -1
- data/lib/ably/modules/event_emitter.rb +2 -2
- data/lib/ably/modules/safe_deferrable.rb +1 -1
- data/lib/ably/modules/safe_yield.rb +1 -1
- data/lib/ably/modules/state_emitter.rb +5 -5
- data/lib/ably/realtime/auth.rb +1 -1
- data/lib/ably/realtime/channel.rb +3 -3
- data/lib/ably/realtime/channel/channel_manager.rb +2 -2
- data/lib/ably/realtime/client/incoming_message_dispatcher.rb +3 -2
- data/lib/ably/realtime/connection.rb +11 -6
- data/lib/ably/realtime/connection/websocket_transport.rb +1 -1
- data/lib/ably/realtime/presence.rb +3 -3
- data/lib/ably/realtime/presence/members_map.rb +6 -6
- data/lib/ably/rest/channel.rb +2 -2
- data/lib/ably/rest/client.rb +20 -12
- data/lib/ably/version.rb +1 -1
- data/spec/acceptance/realtime/auth_spec.rb +13 -37
- data/spec/acceptance/realtime/channel_history_spec.rb +7 -1
- data/spec/acceptance/realtime/channel_spec.rb +3 -3
- data/spec/acceptance/realtime/client_spec.rb +2 -2
- data/spec/acceptance/realtime/connection_failures_spec.rb +221 -7
- data/spec/acceptance/realtime/connection_spec.rb +13 -21
- data/spec/acceptance/realtime/message_spec.rb +2 -2
- data/spec/acceptance/realtime/presence_history_spec.rb +12 -3
- data/spec/acceptance/realtime/presence_spec.rb +10 -10
- data/spec/acceptance/rest/auth_spec.rb +21 -48
- data/spec/acceptance/rest/client_spec.rb +193 -68
- data/spec/shared/client_initializer_behaviour.rb +1 -9
- data/spec/spec_helper.rb +2 -0
- data/spec/support/event_emitter_helper.rb +31 -0
- data/spec/support/event_machine_helper.rb +1 -1
- data/spec/support/test_logger_helper.rb +42 -0
- data/spec/unit/logger_spec.rb +1 -9
- data/spec/unit/modules/async_wrapper_spec.rb +2 -2
- data/spec/unit/modules/event_emitter_spec.rb +3 -3
- data/spec/unit/modules/state_emitter_spec.rb +10 -10
- data/spec/unit/realtime/channel_spec.rb +1 -1
- data/spec/unit/realtime/connection_spec.rb +1 -1
- data/spec/unit/realtime/presence_spec.rb +1 -1
- data/spec/unit/rest/channel_spec.rb +22 -0
- data/spec/unit/util/pub_sub_spec.rb +3 -3
- metadata +26 -8
@@ -65,10 +65,10 @@ describe Ably::Rest::Client do
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
context 'with an :auth_callback
|
69
|
-
let(:client) { Ably::Rest::Client.new(client_options.merge(auth_callback:
|
68
|
+
context 'with an :auth_callback lambda' do
|
69
|
+
let(:client) { Ably::Rest::Client.new(client_options.merge(auth_callback: lambda { |token_params| token_request })) }
|
70
70
|
|
71
|
-
it 'calls the auth
|
71
|
+
it 'calls the auth lambda to get a new token' do
|
72
72
|
expect { client.channel('channel_name').publish('event', 'message') }.to change { client.auth.current_token_details }
|
73
73
|
expect(client.auth.current_token_details.client_id).to eql(client_id)
|
74
74
|
end
|
@@ -93,8 +93,8 @@ describe Ably::Rest::Client do
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
context 'with an :auth_callback
|
97
|
-
let(:client) { Ably::Rest::Client.new(client_options.merge(client_id: client_id, auth_callback:
|
96
|
+
context 'with an :auth_callback lambda (clientId provided in library options instead of as a token_request param)' do
|
97
|
+
let(:client) { Ably::Rest::Client.new(client_options.merge(client_id: client_id, auth_callback: lambda { |token_params| token_request })) }
|
98
98
|
let(:token_request) { client.auth.create_token_request({}, key_name: key_name, key_secret: key_secret) }
|
99
99
|
|
100
100
|
it 'correctly sets the clientId on the token' do
|
@@ -178,7 +178,7 @@ describe Ably::Rest::Client do
|
|
178
178
|
|
179
179
|
context 'using tokens' do
|
180
180
|
let(:client) do
|
181
|
-
Ably::Rest::Client.new(client_options.merge(auth_callback:
|
181
|
+
Ably::Rest::Client.new(client_options.merge(auth_callback: lambda do |token_params|
|
182
182
|
@request_index ||= 0
|
183
183
|
@request_index += 1
|
184
184
|
send("token_request_#{@request_index > 2 ? 'next' : @request_index}")
|
@@ -290,7 +290,7 @@ describe Ably::Rest::Client do
|
|
290
290
|
|
291
291
|
context 'fallback hosts', :webmock do
|
292
292
|
let(:path) { '/channels/test/publish' }
|
293
|
-
let(:publish_block) {
|
293
|
+
let(:publish_block) { lambda { client.channel('test').publish('event', 'data') } }
|
294
294
|
|
295
295
|
context 'configured' do
|
296
296
|
let(:client_options) { default_options.merge(key: api_key, environment: 'production') }
|
@@ -321,7 +321,7 @@ describe Ably::Rest::Client do
|
|
321
321
|
let(:custom_hosts) { %w(A.ably-realtime.com B.ably-realtime.com) }
|
322
322
|
let(:max_retry_count) { 2 }
|
323
323
|
let(:max_retry_duration) { 0.5 }
|
324
|
-
let(:fallback_block) {
|
324
|
+
let(:fallback_block) { proc { raise Faraday::SSLError.new('ssl error message') } }
|
325
325
|
let(:client_options) do
|
326
326
|
default_options.merge(
|
327
327
|
environment: nil,
|
@@ -454,7 +454,7 @@ describe Ably::Rest::Client do
|
|
454
454
|
context 'and server returns a 50x error' do
|
455
455
|
let(:status) { 502 }
|
456
456
|
let(:fallback_block) do
|
457
|
-
|
457
|
+
proc do
|
458
458
|
{
|
459
459
|
headers: { 'Content-Type' => 'text/html' },
|
460
460
|
status: status
|
@@ -478,7 +478,7 @@ describe Ably::Rest::Client do
|
|
478
478
|
let(:custom_hosts) { %w(A.foo.com B.foo.com) }
|
479
479
|
let(:max_retry_count) { 2 }
|
480
480
|
let(:max_retry_duration) { 0.5 }
|
481
|
-
let(:fallback_block) {
|
481
|
+
let(:fallback_block) { proc { raise Faraday::SSLError.new('ssl error message') } }
|
482
482
|
let(:production_options) do
|
483
483
|
default_options.merge(
|
484
484
|
environment: nil,
|
@@ -490,7 +490,7 @@ describe Ably::Rest::Client do
|
|
490
490
|
|
491
491
|
let(:status) { 502 }
|
492
492
|
let(:fallback_block) do
|
493
|
-
|
493
|
+
proc do
|
494
494
|
{
|
495
495
|
headers: { 'Content-Type' => 'text/html' },
|
496
496
|
status: status
|
@@ -547,28 +547,36 @@ describe Ably::Rest::Client do
|
|
547
547
|
context 'and timing out the primary host' do
|
548
548
|
before do
|
549
549
|
@web_server = WEBrick::HTTPServer.new(:Port => port, :SSLEnable => false, :AccessLog => [], Logger: WEBrick::Log.new("/dev/null"))
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
@fallback_request_count += 1
|
557
|
-
if @fallback_request_count <= fail_fallback_request_count
|
550
|
+
request_handler = lambda do |result_body|
|
551
|
+
lambda do |req, res|
|
552
|
+
host = req.header["host"].first
|
553
|
+
if host.include?(primary_host)
|
554
|
+
@primary_host_request_count ||= 0
|
555
|
+
@primary_host_request_count += 1
|
558
556
|
sleep request_timeout + 0.5
|
559
557
|
else
|
560
|
-
|
561
|
-
|
562
|
-
|
558
|
+
@fallback_request_count ||= 0
|
559
|
+
@fallback_request_count += 1
|
560
|
+
@fallback_hosts_tried ||= []
|
561
|
+
@fallback_hosts_tried.push(host)
|
562
|
+
if @fallback_request_count <= fail_fallback_request_count
|
563
|
+
sleep request_timeout + 0.5
|
564
|
+
else
|
565
|
+
res.status = 200
|
566
|
+
res['Content-Type'] = 'application/json'
|
567
|
+
res.body = result_body
|
568
|
+
end
|
563
569
|
end
|
564
570
|
end
|
565
571
|
end
|
572
|
+
@web_server.mount_proc "/time", &request_handler.call('[1000000000000]')
|
573
|
+
@web_server.mount_proc "/channels/#{channel_name}/publish", &request_handler.call('{}')
|
566
574
|
Thread.new do
|
567
575
|
@web_server.start
|
568
576
|
end
|
569
577
|
end
|
570
578
|
|
571
|
-
context 'with request timeout less than max_retry_duration' do
|
579
|
+
context 'POST with request timeout less than max_retry_duration' do
|
572
580
|
let(:client_options) do
|
573
581
|
default_options.merge(
|
574
582
|
rest_host: primary_host,
|
@@ -577,20 +585,44 @@ describe Ably::Rest::Client do
|
|
577
585
|
port: port,
|
578
586
|
tls: false,
|
579
587
|
http_request_timeout: request_timeout,
|
580
|
-
|
588
|
+
http_max_retry_duration: request_timeout * 2.5,
|
581
589
|
log_level: :error
|
582
590
|
)
|
583
591
|
end
|
584
592
|
let(:fail_fallback_request_count) { 1 }
|
585
593
|
|
586
|
-
it 'tries
|
594
|
+
it 'tries the primary host, then both fallback hosts (#RSC15d)' do
|
587
595
|
client.channel(channel_name).publish('event', 'data')
|
588
|
-
expect(@
|
596
|
+
expect(@primary_host_request_count).to eql(1)
|
597
|
+
expect(@fallback_request_count).to eql(2)
|
598
|
+
expect(@fallback_hosts_tried.uniq.length).to eql(2)
|
599
|
+
end
|
600
|
+
end
|
601
|
+
|
602
|
+
context 'GET with request timeout less than max_retry_duration' do
|
603
|
+
let(:client_options) do
|
604
|
+
default_options.merge(
|
605
|
+
rest_host: primary_host,
|
606
|
+
fallback_hosts: fallbacks,
|
607
|
+
token: 'fake.token',
|
608
|
+
port: port,
|
609
|
+
tls: false,
|
610
|
+
http_request_timeout: request_timeout,
|
611
|
+
http_max_retry_duration: request_timeout * 2.5,
|
612
|
+
log_level: :error
|
613
|
+
)
|
614
|
+
end
|
615
|
+
let(:fail_fallback_request_count) { 1 }
|
616
|
+
|
617
|
+
it 'tries the primary host, then both fallback hosts (#RSC15d)' do
|
618
|
+
client.time
|
619
|
+
expect(@primary_host_request_count).to eql(1)
|
589
620
|
expect(@fallback_request_count).to eql(2)
|
621
|
+
expect(@fallback_hosts_tried.uniq.length).to eql(2)
|
590
622
|
end
|
591
623
|
end
|
592
624
|
|
593
|
-
context 'with request timeout
|
625
|
+
context 'POST with request timeout more than max_retry_duration' do
|
594
626
|
let(:client_options) do
|
595
627
|
default_options.merge(
|
596
628
|
rest_host: primary_host,
|
@@ -599,18 +631,41 @@ describe Ably::Rest::Client do
|
|
599
631
|
port: port,
|
600
632
|
tls: false,
|
601
633
|
http_request_timeout: request_timeout,
|
602
|
-
|
634
|
+
http_max_retry_duration: request_timeout / 2,
|
603
635
|
log_level: :error
|
604
636
|
)
|
605
637
|
end
|
606
638
|
let(:fail_fallback_request_count) { 0 }
|
607
639
|
|
608
|
-
it '
|
609
|
-
client.channel(channel_name).publish('event', 'data')
|
610
|
-
expect(@
|
611
|
-
expect(@fallback_request_count).to
|
640
|
+
it 'does not try any fallback hosts (#RSC15d)' do
|
641
|
+
expect { client.channel(channel_name).publish('event', 'data') }.to raise_error Ably::Exceptions::ConnectionTimeout
|
642
|
+
expect(@primary_host_request_count).to eql(1)
|
643
|
+
expect(@fallback_request_count).to be_nil
|
644
|
+
end
|
645
|
+
end
|
646
|
+
|
647
|
+
context 'GET with request timeout more than max_retry_duration' do
|
648
|
+
let(:client_options) do
|
649
|
+
default_options.merge(
|
650
|
+
rest_host: primary_host,
|
651
|
+
fallback_hosts: fallbacks,
|
652
|
+
token: 'fake.token',
|
653
|
+
port: port,
|
654
|
+
tls: false,
|
655
|
+
http_request_timeout: request_timeout,
|
656
|
+
http_max_retry_duration: request_timeout / 2,
|
657
|
+
log_level: :error
|
658
|
+
)
|
659
|
+
end
|
660
|
+
let(:fail_fallback_request_count) { 0 }
|
661
|
+
|
662
|
+
it 'does not try any fallback hosts (#RSC15d)' do
|
663
|
+
expect { client.time }.to raise_error Ably::Exceptions::ConnectionTimeout
|
664
|
+
expect(@primary_host_request_count).to eql(1)
|
665
|
+
expect(@fallback_request_count).to be_nil
|
612
666
|
end
|
613
667
|
end
|
668
|
+
|
614
669
|
end
|
615
670
|
|
616
671
|
context 'and failing the primary host' do
|
@@ -662,7 +717,7 @@ describe Ably::Rest::Client do
|
|
662
717
|
let(:custom_hosts) { %w(A.foo.com B.foo.com) }
|
663
718
|
let(:max_retry_count) { 2 }
|
664
719
|
let(:max_retry_duration) { 0.5 }
|
665
|
-
let(:fallback_block) {
|
720
|
+
let(:fallback_block) { proc { raise Faraday::SSLError.new('ssl error message') } }
|
666
721
|
let(:env) { 'custom-env' }
|
667
722
|
let(:production_options) do
|
668
723
|
default_options.merge(
|
@@ -675,7 +730,7 @@ describe Ably::Rest::Client do
|
|
675
730
|
|
676
731
|
let(:status) { 502 }
|
677
732
|
let(:fallback_block) do
|
678
|
-
|
733
|
+
proc do
|
679
734
|
{
|
680
735
|
headers: { 'Content-Type' => 'text/html' },
|
681
736
|
status: status
|
@@ -962,36 +1017,10 @@ describe Ably::Rest::Client do
|
|
962
1017
|
|
963
1018
|
context 'request_id generation' do
|
964
1019
|
context 'Timeout error' do
|
965
|
-
context 'with
|
966
|
-
let(:
|
967
|
-
Class.new do
|
968
|
-
def initialize
|
969
|
-
@messages = []
|
970
|
-
end
|
971
|
-
|
972
|
-
[:fatal, :error, :warn, :info, :debug].each do |severity|
|
973
|
-
define_method severity do |message, &block|
|
974
|
-
message_val = [message]
|
975
|
-
message_val << block.call if block
|
976
|
-
|
977
|
-
@messages << [severity, message_val.compact.join(' ')]
|
978
|
-
end
|
979
|
-
end
|
980
|
-
|
981
|
-
def logs
|
982
|
-
@messages
|
983
|
-
end
|
984
|
-
|
985
|
-
def level
|
986
|
-
1
|
987
|
-
end
|
988
|
-
|
989
|
-
def level=(new_level)
|
990
|
-
end
|
991
|
-
end
|
992
|
-
end
|
993
|
-
let(:custom_logger_object) { custom_logger.new }
|
1020
|
+
context 'with option add_request_ids: true', :webmock, :prevent_log_stubbing do
|
1021
|
+
let(:custom_logger_object) { TestLogger.new }
|
994
1022
|
let(:client_options) { default_options.merge(key: api_key, logger: custom_logger_object, add_request_ids: true) }
|
1023
|
+
|
995
1024
|
before do
|
996
1025
|
@request_id = nil
|
997
1026
|
stub_request(:get, Addressable::Template.new("#{client.endpoint}/time{?request_id}")).with do |request|
|
@@ -1000,15 +1029,64 @@ describe Ably::Rest::Client do
|
|
1000
1029
|
raise Faraday::TimeoutError.new('timeout error message')
|
1001
1030
|
end
|
1002
1031
|
end
|
1032
|
+
|
1003
1033
|
it 'has an error with the same request_id of the request' do
|
1004
|
-
expect{ client.time }.to raise_error(Ably::Exceptions::ConnectionTimeout, /#{@request_id}/)
|
1034
|
+
expect { client.time }.to raise_error(Ably::Exceptions::ConnectionTimeout, /#{@request_id}/)
|
1035
|
+
expect(@request_id).to be_a(String)
|
1036
|
+
expect(@request_id).to_not be_empty
|
1005
1037
|
expect(custom_logger_object.logs.find { |severity, message| message.match(/#{@request_id}/i)} ).to_not be_nil
|
1006
1038
|
end
|
1007
1039
|
end
|
1008
1040
|
|
1009
|
-
context '
|
1010
|
-
let(:client_options) { { key: api_key,
|
1041
|
+
context 'with option add_request_ids: true and REST operations with a message body' do
|
1042
|
+
let(:client_options) { default_options.merge({ key: api_key, add_request_ids: true }) }
|
1043
|
+
let(:channel_name) { random_str }
|
1044
|
+
let(:channel) { client.channels.get(channel_name) }
|
1045
|
+
|
1046
|
+
context 'with mocks to inspect the params', :webmock do
|
1047
|
+
before do
|
1048
|
+
stub_request(:post, Addressable::Template.new("#{client.endpoint}/channels/#{channel_name}/publish{?request_id}")).
|
1049
|
+
with do |request|
|
1050
|
+
@request_id = request.uri.query_values['request_id']
|
1051
|
+
end.to_return(:status => 200, :body => [], :headers => { 'Content-Type' => 'application/json' })
|
1052
|
+
end
|
1053
|
+
|
1054
|
+
context 'with a single publish' do
|
1055
|
+
it 'succeeds and sends the request_id as a param' do
|
1056
|
+
channel.publish('name', { body: random_str })
|
1057
|
+
expect(@request_id.to_s).to_not be_empty
|
1058
|
+
end
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
context 'with an array publish' do
|
1062
|
+
it 'succeeds and sends the request_id as a param' do
|
1063
|
+
channel.publish([{ body: random_str }, { body: random_str }])
|
1064
|
+
expect(@request_id.to_s).to_not be_empty
|
1065
|
+
end
|
1066
|
+
end
|
1067
|
+
end
|
1068
|
+
|
1069
|
+
context 'without mocks to ensure the requests are accepted' do
|
1070
|
+
context 'with a single publish' do
|
1071
|
+
it 'succeeds and sends the request_id as a param' do
|
1072
|
+
channel.publish('name', { body: random_str })
|
1073
|
+
expect(channel.history.items.length).to eql(1)
|
1074
|
+
end
|
1075
|
+
end
|
1076
|
+
|
1077
|
+
context 'with an array publish' do
|
1078
|
+
it 'succeeds and sends the request_id as a param' do
|
1079
|
+
channel.publish([{ body: random_str }, { body: random_str }])
|
1080
|
+
expect(channel.history.items.length).to eql(2)
|
1081
|
+
end
|
1082
|
+
end
|
1083
|
+
end
|
1084
|
+
end
|
1085
|
+
|
1086
|
+
context 'option add_request_ids: true and specified fallback hosts', :webmock do
|
1087
|
+
let(:client_options) { { key: api_key, fallback_hosts_use_default: true, add_request_ids: true, log_level: :error } }
|
1011
1088
|
let(:requests) { [] }
|
1089
|
+
|
1012
1090
|
before do
|
1013
1091
|
@request_id = nil
|
1014
1092
|
hosts = Ably::FALLBACK_HOSTS + ['rest.ably.io']
|
@@ -1021,8 +1099,11 @@ describe Ably::Rest::Client do
|
|
1021
1099
|
end
|
1022
1100
|
end
|
1023
1101
|
end
|
1024
|
-
|
1102
|
+
|
1103
|
+
specify 'request_id is the same across retries' do
|
1025
1104
|
expect{ client.time }.to raise_error(Ably::Exceptions::ConnectionTimeout, /#{@request_id}/)
|
1105
|
+
expect(@request_id).to be_a(String)
|
1106
|
+
expect(@request_id).to_not be_empty
|
1026
1107
|
expect(requests.uniq.count).to eql(1)
|
1027
1108
|
expect(requests.uniq.first).to eql(@request_id)
|
1028
1109
|
end
|
@@ -1030,6 +1111,7 @@ describe Ably::Rest::Client do
|
|
1030
1111
|
|
1031
1112
|
context 'without request_id' do
|
1032
1113
|
let(:client_options) { default_options.merge(key: api_key, http_request_timeout: 0) }
|
1114
|
+
|
1033
1115
|
it 'does not include request_id in ConnectionTimeout error' do
|
1034
1116
|
begin
|
1035
1117
|
client.stats
|
@@ -1038,10 +1120,11 @@ describe Ably::Rest::Client do
|
|
1038
1120
|
end
|
1039
1121
|
end
|
1040
1122
|
end
|
1041
|
-
end
|
1123
|
+
end
|
1042
1124
|
|
1043
1125
|
context 'UnauthorizedRequest nonce error' do
|
1044
1126
|
let(:token_params) { { nonce: "samenonce_#{protocol}", timestamp: Time.now.to_i } }
|
1127
|
+
|
1045
1128
|
it 'includes request_id in UnauthorizedRequest error due to replayed nonce' do
|
1046
1129
|
client1 = Ably::Rest::Client.new(default_options.merge(key: api_key))
|
1047
1130
|
client2 = Ably::Rest::Client.new(default_options.merge(key: api_key, add_request_ids: true))
|
@@ -1054,5 +1137,47 @@ describe Ably::Rest::Client do
|
|
1054
1137
|
end
|
1055
1138
|
end
|
1056
1139
|
end
|
1140
|
+
|
1141
|
+
context 'failed request logging', :prevent_log_stubbing do
|
1142
|
+
let(:custom_logger) { TestLogger.new }
|
1143
|
+
let(:client_options) { default_options.merge(key: api_key, logger: custom_logger) }
|
1144
|
+
|
1145
|
+
it 'is absent when requests do not fail' do
|
1146
|
+
client.time
|
1147
|
+
expect(custom_logger.logs(min_severity: :warn)).to be_empty
|
1148
|
+
end
|
1149
|
+
|
1150
|
+
context 'with the first request failing' do
|
1151
|
+
let(:client_options) do
|
1152
|
+
default_options.merge(
|
1153
|
+
rest_host: 'non.existent.domain.local',
|
1154
|
+
fallback_hosts: [[environment, Ably::Rest::Client::DOMAIN].join('-')],
|
1155
|
+
key: api_key,
|
1156
|
+
logger: custom_logger)
|
1157
|
+
end
|
1158
|
+
|
1159
|
+
it 'is present with success message when requests do not actually fail' do
|
1160
|
+
client.time
|
1161
|
+
expect(custom_logger.logs(min_severity: :warn).select { |severity, msg| msg.match(/Retry/) }.length).to eql(1)
|
1162
|
+
expect(custom_logger.logs(min_severity: :warn).select { |severity, msg| msg.match(/SUCCEEDED/) }.length).to eql(1)
|
1163
|
+
end
|
1164
|
+
end
|
1165
|
+
|
1166
|
+
context 'with all requests failing' do
|
1167
|
+
let(:client_options) do
|
1168
|
+
default_options.merge(
|
1169
|
+
rest_host: 'non.existent.domain.local',
|
1170
|
+
fallback_hosts: ['non2.existent.domain.local'],
|
1171
|
+
key: api_key,
|
1172
|
+
logger: custom_logger)
|
1173
|
+
end
|
1174
|
+
|
1175
|
+
it 'is present when all requests fail' do
|
1176
|
+
expect { client.time }.to raise_error(Ably::Exceptions::ConnectionError)
|
1177
|
+
expect(custom_logger.logs(min_severity: :warn).select { |severity, msg| msg.match(/Retry/) }.length).to be >= 2
|
1178
|
+
expect(custom_logger.logs(min_severity: :error).select { |severity, msg| msg.match(/FAILED/) }.length).to eql(1)
|
1179
|
+
end
|
1180
|
+
end
|
1181
|
+
end
|
1057
1182
|
end
|
1058
1183
|
end
|
@@ -261,15 +261,7 @@ shared_examples 'a client initializer' do
|
|
261
261
|
end
|
262
262
|
|
263
263
|
context 'with custom logger and log_level' do
|
264
|
-
let(:custom_logger)
|
265
|
-
Class.new do
|
266
|
-
extend Forwardable
|
267
|
-
def initialize
|
268
|
-
@logger = Logger.new(STDOUT)
|
269
|
-
end
|
270
|
-
def_delegators :@logger, :fatal, :error, :warn, :info, :debug, :level, :level=
|
271
|
-
end
|
272
|
-
end
|
264
|
+
let(:custom_logger) { TestLogger }
|
273
265
|
let(:client_options) { default_options.merge(logger: custom_logger.new, log_level: Logger::DEBUG, auto_connect: false) }
|
274
266
|
|
275
267
|
it 'uses the custom logger' do
|
data/spec/spec_helper.rb
CHANGED
@@ -15,9 +15,11 @@ require 'ably'
|
|
15
15
|
|
16
16
|
require 'support/api_helper'
|
17
17
|
require 'support/debug_failure_helper'
|
18
|
+
require 'support/event_emitter_helper'
|
18
19
|
require 'support/private_api_formatter'
|
19
20
|
require 'support/protocol_helper'
|
20
21
|
require 'support/random_helper'
|
22
|
+
require 'support/test_logger_helper'
|
21
23
|
|
22
24
|
require 'rspec_config'
|
23
25
|
|