rapns 3.3.2-java → 3.4.0-java
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +7 -0
- data/README.md +19 -21
- data/bin/rapns +14 -13
- data/lib/generators/templates/rapns.rb +8 -4
- data/lib/rapns.rb +7 -0
- data/lib/rapns/TODO +3 -0
- data/lib/rapns/apns/feedback.rb +4 -2
- data/lib/rapns/app.rb +3 -1
- data/lib/rapns/configuration.rb +8 -1
- data/lib/rapns/daemon.rb +3 -1
- data/lib/rapns/daemon/apns/app_runner.rb +3 -2
- data/lib/rapns/daemon/apns/certificate_expired_error.rb +20 -0
- data/lib/rapns/daemon/apns/connection.rb +26 -0
- data/lib/rapns/daemon/apns/delivery.rb +2 -1
- data/lib/rapns/daemon/apns/delivery_handler.rb +2 -2
- data/lib/rapns/daemon/app_runner.rb +50 -28
- data/lib/rapns/daemon/batch.rb +100 -0
- data/lib/rapns/daemon/delivery.rb +6 -10
- data/lib/rapns/daemon/delivery_handler.rb +14 -12
- data/lib/rapns/daemon/delivery_handler_collection.rb +33 -0
- data/lib/rapns/daemon/feeder.rb +3 -5
- data/lib/rapns/daemon/gcm/delivery.rb +5 -4
- data/lib/rapns/daemon/gcm/delivery_handler.rb +2 -2
- data/lib/rapns/daemon/store/active_record.rb +23 -2
- data/lib/rapns/deprecation.rb +7 -6
- data/lib/rapns/logger.rb +1 -1
- data/lib/rapns/notification.rb +5 -3
- data/lib/rapns/reflection.rb +1 -1
- data/lib/rapns/version.rb +1 -1
- data/lib/tasks/cane.rake +1 -1
- data/lib/tasks/test.rake +8 -3
- data/spec/unit/apns/app_spec.rb +4 -4
- data/spec/unit/apns_feedback_spec.rb +1 -1
- data/spec/unit/configuration_spec.rb +12 -6
- data/spec/unit/daemon/apns/app_runner_spec.rb +6 -4
- data/spec/unit/daemon/apns/certificate_expired_error_spec.rb +11 -0
- data/spec/unit/daemon/apns/connection_spec.rb +46 -10
- data/spec/unit/daemon/apns/delivery_handler_spec.rb +24 -18
- data/spec/unit/daemon/apns/delivery_spec.rb +11 -12
- data/spec/unit/daemon/apns/feedback_receiver_spec.rb +16 -16
- data/spec/unit/daemon/app_runner_shared.rb +27 -10
- data/spec/unit/daemon/app_runner_spec.rb +48 -28
- data/spec/unit/daemon/batch_spec.rb +160 -0
- data/spec/unit/daemon/delivery_handler_collection_spec.rb +37 -0
- data/spec/unit/daemon/delivery_handler_shared.rb +20 -11
- data/spec/unit/daemon/feeder_spec.rb +12 -12
- data/spec/unit/daemon/gcm/app_runner_spec.rb +4 -2
- data/spec/unit/daemon/gcm/delivery_handler_spec.rb +18 -10
- data/spec/unit/daemon/gcm/delivery_spec.rb +47 -17
- data/spec/unit/daemon/interruptible_sleep_spec.rb +3 -3
- data/spec/unit/daemon/reflectable_spec.rb +1 -1
- data/spec/unit/daemon/store/active_record/reconnectable_spec.rb +1 -1
- data/spec/unit/daemon/store/active_record_spec.rb +87 -10
- data/spec/unit/daemon_spec.rb +6 -6
- data/spec/unit/deprecation_spec.rb +2 -2
- data/spec/unit/logger_spec.rb +33 -17
- data/spec/unit/notification_shared.rb +7 -3
- data/spec/unit/upgraded_spec.rb +8 -14
- data/spec/unit_spec_helper.rb +9 -1
- metadata +53 -44
- data/lib/rapns/daemon/delivery_queue.rb +0 -42
- data/lib/rapns/daemon/delivery_queue_18.rb +0 -44
- data/lib/rapns/daemon/delivery_queue_19.rb +0 -42
- data/spec/acceptance/gcm_upgrade_spec.rb +0 -34
- data/spec/acceptance_spec_helper.rb +0 -85
- data/spec/unit/daemon/delivery_queue_spec.rb +0 -29
@@ -2,7 +2,7 @@ require 'unit_spec_helper'
|
|
2
2
|
|
3
3
|
describe Rapns, 'apns_feedback' do
|
4
4
|
let!(:app) { Rapns::Apns::App.create!(:name => 'test', :environment => 'production', :certificate => TEST_CERT) }
|
5
|
-
let(:receiver) {
|
5
|
+
let(:receiver) { double(:check_for_feedback => nil) }
|
6
6
|
|
7
7
|
before do
|
8
8
|
Rapns::Daemon::Apns::FeedbackReceiver.stub(:new => receiver)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'unit_spec_helper'
|
2
2
|
|
3
3
|
describe Rapns do
|
4
|
-
let(:config) {
|
4
|
+
let(:config) { double }
|
5
5
|
|
6
6
|
before { Rapns.stub(:config => config) }
|
7
7
|
|
@@ -11,20 +11,26 @@ describe Rapns do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
describe Rapns::Configuration do
|
14
|
-
let(:config)
|
14
|
+
let(:config) do
|
15
|
+
Rapns::Deprecation.muted do
|
16
|
+
Rapns::Configuration.new
|
17
|
+
end
|
18
|
+
end
|
15
19
|
|
16
20
|
it 'configures a feedback callback' do
|
17
21
|
b = Proc.new {}
|
18
|
-
Rapns::Deprecation.
|
22
|
+
Rapns::Deprecation.muted do
|
19
23
|
config.on_apns_feedback(&b)
|
20
24
|
end
|
21
25
|
config.apns_feedback_callback.should == b
|
22
26
|
end
|
23
27
|
|
24
28
|
it 'can be updated' do
|
25
|
-
|
26
|
-
|
27
|
-
|
29
|
+
Rapns::Deprecation.muted do
|
30
|
+
new_config = Rapns::Configuration.new
|
31
|
+
new_config.batch_size = 100
|
32
|
+
expect { config.update(new_config) }.to change(config, :batch_size).to(100)
|
33
|
+
end
|
28
34
|
end
|
29
35
|
|
30
36
|
it 'sets the pid_file relative if not absolute' do
|
@@ -8,14 +8,16 @@ describe Rapns::Daemon::Apns::AppRunner do
|
|
8
8
|
let(:app) { app_class.create!(:name => 'my_app', :environment => 'development',
|
9
9
|
:certificate => TEST_CERT, :password => 'pass') }
|
10
10
|
let(:runner) { Rapns::Daemon::Apns::AppRunner.new(app) }
|
11
|
-
let(:handler) {
|
12
|
-
let(:
|
13
|
-
let(:
|
14
|
-
let(:
|
11
|
+
let(:handler) { double(:start => nil, :queue= => nil, :wakeup => nil, :wait => nil, :stop => nil) }
|
12
|
+
let(:handler_collection) { double(:handler_collection, :push => nil, :size => 1, :stop => nil) }
|
13
|
+
let(:receiver) { double(:start => nil, :stop => nil) }
|
14
|
+
let(:config) { double(:feedback_poll => 60, :push => false) }
|
15
|
+
let(:logger) { double(:info => nil, :warn => nil, :error => nil) }
|
15
16
|
|
16
17
|
before do
|
17
18
|
Rapns.stub(:logger => logger, :config => config)
|
18
19
|
Rapns::Daemon::Apns::DeliveryHandler.stub(:new => handler)
|
20
|
+
Rapns::Daemon::DeliveryHandlerCollection.stub(:new => handler_collection)
|
19
21
|
Rapns::Daemon::Apns::FeedbackReceiver.stub(:new => receiver)
|
20
22
|
end
|
21
23
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'unit_spec_helper'
|
2
|
+
|
3
|
+
describe Rapns::Apns::CertificateExpiredError do
|
4
|
+
let(:app) { double(:name => 'test') }
|
5
|
+
let(:error) { Rapns::Apns::CertificateExpiredError.new(app, Time.now) }
|
6
|
+
|
7
|
+
it 'returns a message' do
|
8
|
+
error.message
|
9
|
+
error.to_s
|
10
|
+
end
|
11
|
+
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
require "unit_spec_helper"
|
2
2
|
|
3
3
|
describe Rapns::Daemon::Apns::Connection do
|
4
|
-
let(:
|
5
|
-
let(:
|
6
|
-
let(:
|
7
|
-
let(:
|
8
|
-
let(:
|
4
|
+
let(:rsa_key) { double }
|
5
|
+
let(:certificate) { double }
|
6
|
+
let(:password) { double }
|
7
|
+
let(:x509_certificate) { OpenSSL::X509::Certificate.new(TEST_CERT) }
|
8
|
+
let(:ssl_context) { double(:key= => nil, :cert= => nil, :cert => x509_certificate) }
|
9
9
|
let(:host) { 'gateway.push.apple.com' }
|
10
10
|
let(:port) { '2195' }
|
11
|
-
let(:tcp_socket) {
|
12
|
-
let(:ssl_socket) {
|
13
|
-
let(:logger) {
|
14
|
-
let(:app) {
|
11
|
+
let(:tcp_socket) { double(:setsockopt => nil, :close => nil) }
|
12
|
+
let(:ssl_socket) { double(:sync= => nil, :connect => nil, :close => nil, :write => nil, :flush => nil) }
|
13
|
+
let(:logger) { double(:info => nil, :error => nil, :warn => nil) }
|
14
|
+
let(:app) { double(:name => 'Connection 0', :certificate => certificate, :password => password)}
|
15
15
|
let(:connection) { Rapns::Daemon::Apns::Connection.new(app, host, port) }
|
16
16
|
|
17
17
|
before do
|
@@ -21,6 +21,7 @@ describe Rapns::Daemon::Apns::Connection do
|
|
21
21
|
TCPSocket.stub(:new => tcp_socket)
|
22
22
|
OpenSSL::SSL::SSLSocket.stub(:new => ssl_socket)
|
23
23
|
Rapns.stub(:logger => logger)
|
24
|
+
connection.stub(:reflect)
|
24
25
|
end
|
25
26
|
|
26
27
|
it "reads the number of bytes from the SSL socket" do
|
@@ -79,6 +80,39 @@ describe Rapns::Daemon::Apns::Connection do
|
|
79
80
|
tcp_socket.should_receive(:setsockopt).with(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
|
80
81
|
connection.connect
|
81
82
|
end
|
83
|
+
|
84
|
+
describe 'certificate expiry' do
|
85
|
+
it 'reflects if the certificate will expire soon' do
|
86
|
+
cert = OpenSSL::X509::Certificate.new(app.certificate)
|
87
|
+
connection.should_receive(:reflect).with(:apns_certificate_will_expire, app, cert.not_after)
|
88
|
+
Timecop.freeze(cert.not_after - 3.days) { connection.connect }
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'logs that the certificate will expire soon' do
|
92
|
+
cert = OpenSSL::X509::Certificate.new(app.certificate)
|
93
|
+
logger.should_receive(:warn).with("[#{app.name}] Certificate will expire at 2022-09-07 03:18:32 UTC.")
|
94
|
+
Timecop.freeze(cert.not_after - 3.days) { connection.connect }
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'does not reflect if the certificate will not expire soon' do
|
98
|
+
cert = OpenSSL::X509::Certificate.new(app.certificate)
|
99
|
+
connection.should_not_receive(:reflect).with(:apns_certificate_will_expire, app, kind_of(Time))
|
100
|
+
Timecop.freeze(cert.not_after - 2.months) { connection.connect }
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'logs that the certificate has expired' do
|
104
|
+
cert = OpenSSL::X509::Certificate.new(app.certificate)
|
105
|
+
logger.should_receive(:error).with("[#{app.name}] Certificate expired at 2022-09-07 03:18:32 UTC.")
|
106
|
+
Timecop.freeze(cert.not_after + 1.day) { connection.connect rescue Rapns::Apns::CertificateExpiredError }
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'raises an error if the certificate has expired' do
|
110
|
+
cert = OpenSSL::X509::Certificate.new(app.certificate)
|
111
|
+
Timecop.freeze(cert.not_after + 1.day) do
|
112
|
+
expect { connection.connect }.to raise_error(Rapns::Apns::CertificateExpiredError)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
82
116
|
end
|
83
117
|
|
84
118
|
describe "when shuting down the connection" do
|
@@ -111,7 +145,7 @@ describe Rapns::Daemon::Apns::Connection do
|
|
111
145
|
it "ignores IOError when the socket is already closed" do
|
112
146
|
tcp_socket.stub(:close).and_raise(IOError)
|
113
147
|
connection.connect
|
114
|
-
|
148
|
+
connection.close
|
115
149
|
end
|
116
150
|
end
|
117
151
|
|
@@ -194,6 +228,8 @@ describe Rapns::Daemon::Apns::Connection do
|
|
194
228
|
end
|
195
229
|
|
196
230
|
describe "when reconnecting" do
|
231
|
+
before { connection.connect }
|
232
|
+
|
197
233
|
it 'closes the socket' do
|
198
234
|
connection.should_receive(:close)
|
199
235
|
connection.send(:reconnect)
|
@@ -6,44 +6,50 @@ describe Rapns::Daemon::Apns::DeliveryHandler do
|
|
6
6
|
|
7
7
|
let(:host) { 'gateway.push.apple.com' }
|
8
8
|
let(:port) { 2195 }
|
9
|
-
let(:certificate) {
|
10
|
-
let(:password) {
|
11
|
-
let(:app) {
|
9
|
+
let(:certificate) { double }
|
10
|
+
let(:password) { double }
|
11
|
+
let(:app) { double(:password => password, :certificate => certificate, :name => 'MyApp', :environment => 'production')}
|
12
12
|
let(:delivery_handler) { Rapns::Daemon::Apns::DeliveryHandler.new(app) }
|
13
|
-
let(:connection) {
|
14
|
-
let(:notification) {
|
15
|
-
let(:
|
16
|
-
let(:
|
13
|
+
let(:connection) { double(:connection, :select => false, :write => nil, :reconnect => nil, :close => nil, :connect => nil) }
|
14
|
+
let(:notification) { double(:notification) }
|
15
|
+
let(:batch) { double(:batch, :notification_processed => nil) }
|
16
|
+
let(:http) { double(:http, :shutdown => nil)}
|
17
|
+
let(:queue) { Queue.new }
|
18
|
+
let(:delivery) { double(:perform => nil) }
|
17
19
|
|
18
20
|
before do
|
19
21
|
Rapns::Daemon::Apns::Connection.stub(:new => connection)
|
20
|
-
Rapns::Daemon::Apns::Delivery.stub(:
|
22
|
+
Rapns::Daemon::Apns::Delivery.stub(:new => delivery)
|
21
23
|
delivery_handler.queue = queue
|
22
|
-
queue.push(notification)
|
24
|
+
queue.push([notification, batch])
|
23
25
|
end
|
24
26
|
|
25
|
-
|
26
|
-
Rapns::Daemon::Apns::Connection.should_receive(:new).with(app, host, port)
|
27
|
+
def run_delivery_handler
|
27
28
|
delivery_handler.start
|
28
29
|
delivery_handler.stop
|
30
|
+
delivery_handler.wakeup
|
31
|
+
delivery_handler.wait
|
32
|
+
end
|
33
|
+
|
34
|
+
it "instantiates a new connection" do
|
35
|
+
Rapns::Daemon::Apns::Connection.should_receive(:new).with(app, host, port)
|
36
|
+
run_delivery_handler
|
29
37
|
end
|
30
38
|
|
31
39
|
it "connects the socket" do
|
32
40
|
connection.should_receive(:connect)
|
33
|
-
|
34
|
-
delivery_handler.stop
|
41
|
+
run_delivery_handler
|
35
42
|
end
|
36
43
|
|
37
44
|
it 'performs delivery of an notification' do
|
38
|
-
Rapns::Daemon::Apns::Delivery.should_receive(:
|
39
|
-
|
40
|
-
|
45
|
+
Rapns::Daemon::Apns::Delivery.should_receive(:new).with(app, connection, notification, batch).and_return(delivery)
|
46
|
+
delivery.should_receive(:perform)
|
47
|
+
run_delivery_handler
|
41
48
|
end
|
42
49
|
|
43
50
|
it 'closes the connection stopped' do
|
44
51
|
connection.should_receive(:close)
|
45
|
-
|
46
|
-
delivery_handler.stop
|
52
|
+
run_delivery_handler
|
47
53
|
end
|
48
54
|
|
49
55
|
it 'does not attempt to close the connection if the connection was not established' do
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'unit_spec_helper'
|
2
2
|
|
3
3
|
describe Rapns::Daemon::Apns::Delivery do
|
4
|
-
let(:app) {
|
5
|
-
let(:notification) {
|
6
|
-
let(:
|
7
|
-
let(:
|
8
|
-
let(:
|
9
|
-
let(:
|
10
|
-
let(:
|
4
|
+
let(:app) { double(:name => 'MyApp') }
|
5
|
+
let(:notification) { double.as_null_object }
|
6
|
+
let(:batch) { double(:mark_failed => nil, :mark_delivered => nil) }
|
7
|
+
let(:logger) { double(:error => nil, :info => nil) }
|
8
|
+
let(:config) { double(:check_for_errors => true) }
|
9
|
+
let(:connection) { double(:select => false, :write => nil, :reconnect => nil, :close => nil, :connect => nil) }
|
10
|
+
let(:delivery) { Rapns::Daemon::Apns::Delivery.new(app, connection, notification, batch) }
|
11
11
|
|
12
12
|
def perform
|
13
13
|
begin
|
@@ -17,7 +17,6 @@ describe Rapns::Daemon::Apns::Delivery do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
before do
|
20
|
-
Rapns::Daemon.stub(:store => store)
|
21
20
|
Rapns.stub(:config => config, :logger => logger)
|
22
21
|
end
|
23
22
|
|
@@ -34,7 +33,7 @@ describe Rapns::Daemon::Apns::Delivery do
|
|
34
33
|
end
|
35
34
|
|
36
35
|
it "marks the notification as delivered" do
|
37
|
-
|
36
|
+
batch.should_receive(:mark_delivered).with(notification)
|
38
37
|
perform
|
39
38
|
end
|
40
39
|
|
@@ -53,7 +52,7 @@ describe Rapns::Daemon::Apns::Delivery do
|
|
53
52
|
before { connection.stub(:select => true, :read => [8, 4, 69].pack("ccN")) }
|
54
53
|
|
55
54
|
it "marks the notification as failed" do
|
56
|
-
|
55
|
+
batch.should_receive(:mark_failed).with(notification, 4, "Missing payload")
|
57
56
|
perform
|
58
57
|
end
|
59
58
|
|
@@ -63,7 +62,7 @@ describe Rapns::Daemon::Apns::Delivery do
|
|
63
62
|
end
|
64
63
|
|
65
64
|
it "logs the delivery error" do
|
66
|
-
# checking for the
|
65
|
+
# checking for the doublebed error doesn't work in jruby, but checking
|
67
66
|
# for the exception by class does.
|
68
67
|
|
69
68
|
#error = Rapns::DeliveryError.new(4, 12, "Missing payload")
|
@@ -104,7 +103,7 @@ describe Rapns::Daemon::Apns::Delivery do
|
|
104
103
|
end
|
105
104
|
|
106
105
|
it 'marks the notification as failed' do
|
107
|
-
|
106
|
+
batch.should_receive(:mark_failed).with(notification, nil, "APNs disconnected without returning an error.")
|
108
107
|
perform
|
109
108
|
end
|
110
109
|
end
|
@@ -4,23 +4,23 @@ describe Rapns::Daemon::Apns::FeedbackReceiver, 'check_for_feedback' do
|
|
4
4
|
let(:host) { 'feedback.push.apple.com' }
|
5
5
|
let(:port) { 2196 }
|
6
6
|
let(:poll) { 60 }
|
7
|
-
let(:certificate) {
|
8
|
-
let(:password) {
|
9
|
-
let(:app) {
|
10
|
-
let(:connection) {
|
11
|
-
let(:logger) {
|
7
|
+
let(:certificate) { double }
|
8
|
+
let(:password) { double }
|
9
|
+
let(:app) { double(:name => 'my_app', :password => password, :certificate => certificate, :environment => 'production') }
|
10
|
+
let(:connection) { double(:connect => nil, :read => nil, :close => nil) }
|
11
|
+
let(:logger) { double(:error => nil, :info => nil) }
|
12
12
|
let(:receiver) { Rapns::Daemon::Apns::FeedbackReceiver.new(app, poll) }
|
13
|
-
let(:feedback) {
|
13
|
+
let(:feedback) { double }
|
14
14
|
|
15
15
|
before do
|
16
16
|
receiver.stub(:interruptible_sleep)
|
17
17
|
Rapns.stub(:logger => logger)
|
18
18
|
Rapns::Daemon::Apns::Connection.stub(:new => connection)
|
19
19
|
receiver.instance_variable_set("@stop", false)
|
20
|
-
Rapns::Daemon.stub(:store =>
|
20
|
+
Rapns::Daemon.stub(:store => double(:create_apns_feedback => feedback))
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def double_connection_read_with_tuple
|
24
24
|
connection.unstub(:read)
|
25
25
|
|
26
26
|
def connection.read(bytes)
|
@@ -52,14 +52,14 @@ describe Rapns::Daemon::Apns::FeedbackReceiver, 'check_for_feedback' do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it 'logs the feedback' do
|
55
|
-
|
55
|
+
double_connection_read_with_tuple
|
56
56
|
Rapns.logger.should_receive(:info).with("[my_app] [FeedbackReceiver] Delivery failed at 2011-12-10 16:08:45 UTC for 834f786655eb9f84614a05ad7d00af31e5cfe93ac3ea078f1da44d2a4eb0ce17.")
|
57
57
|
receiver.check_for_feedback
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'creates the feedback' do
|
61
61
|
Rapns::Daemon.store.should_receive(:create_apns_feedback).with(Time.at(1323533325), '834f786655eb9f84614a05ad7d00af31e5cfe93ac3ea078f1da44d2a4eb0ce17', app)
|
62
|
-
|
62
|
+
double_connection_read_with_tuple
|
63
63
|
receiver.check_for_feedback
|
64
64
|
end
|
65
65
|
|
@@ -92,13 +92,13 @@ describe Rapns::Daemon::Apns::FeedbackReceiver, 'check_for_feedback' do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
it 'reflects feedback was received' do
|
95
|
-
|
95
|
+
double_connection_read_with_tuple
|
96
96
|
receiver.should_receive(:reflect).with(:apns_feedback, feedback)
|
97
97
|
receiver.check_for_feedback
|
98
98
|
end
|
99
99
|
|
100
100
|
it 'calls the apns_feedback_callback when feedback is received and the callback is set' do
|
101
|
-
|
101
|
+
double_connection_read_with_tuple
|
102
102
|
Rapns.config.apns_feedback_callback = Proc.new {}
|
103
103
|
Rapns.config.apns_feedback_callback.should_receive(:call).with(feedback)
|
104
104
|
receiver.check_for_feedback
|
@@ -106,9 +106,9 @@ describe Rapns::Daemon::Apns::FeedbackReceiver, 'check_for_feedback' do
|
|
106
106
|
|
107
107
|
it 'catches exceptions in the apns_feedback_callback' do
|
108
108
|
error = StandardError.new('bork!')
|
109
|
-
|
109
|
+
double_connection_read_with_tuple
|
110
110
|
callback = Proc.new { raise error }
|
111
|
-
Rapns::Deprecation.
|
111
|
+
Rapns::Deprecation.muted do
|
112
112
|
Rapns.config.on_apns_feedback &callback
|
113
113
|
end
|
114
114
|
expect { receiver.check_for_feedback }.not_to raise_error
|
@@ -116,10 +116,10 @@ describe Rapns::Daemon::Apns::FeedbackReceiver, 'check_for_feedback' do
|
|
116
116
|
|
117
117
|
it 'logs an exception from the apns_feedback_callback' do
|
118
118
|
error = StandardError.new('bork!')
|
119
|
-
|
119
|
+
double_connection_read_with_tuple
|
120
120
|
callback = Proc.new { raise error }
|
121
121
|
Rapns.logger.should_receive(:error).with(error)
|
122
|
-
Rapns::Deprecation.
|
122
|
+
Rapns::Deprecation.muted do
|
123
123
|
Rapns.config.on_apns_feedback &callback
|
124
124
|
end
|
125
125
|
receiver.check_for_feedback
|
@@ -1,7 +1,7 @@
|
|
1
1
|
shared_examples_for "an AppRunner subclass" do
|
2
|
-
let(:queue) {
|
2
|
+
let(:queue) { double(:push => nil) }
|
3
3
|
|
4
|
-
before {
|
4
|
+
before { Queue.stub(:new => queue) }
|
5
5
|
after { Rapns::Daemon::AppRunner.runners.clear }
|
6
6
|
|
7
7
|
describe 'start' do
|
@@ -10,6 +10,11 @@ shared_examples_for "an AppRunner subclass" do
|
|
10
10
|
runner.start
|
11
11
|
end
|
12
12
|
|
13
|
+
it 'adds the delivery handler to the collection' do
|
14
|
+
handler_collection.should_receive(:push).with(handler)
|
15
|
+
runner.start
|
16
|
+
end
|
17
|
+
|
13
18
|
it 'assigns the queue to the handler' do
|
14
19
|
handler.should_receive(:queue=).with(queue)
|
15
20
|
runner.start
|
@@ -17,11 +22,17 @@ shared_examples_for "an AppRunner subclass" do
|
|
17
22
|
end
|
18
23
|
|
19
24
|
describe 'enqueue' do
|
20
|
-
let(:notification) {
|
25
|
+
let(:notification) { double }
|
26
|
+
let(:batch) { double(:notifications => [notification]) }
|
27
|
+
|
28
|
+
it 'enqueues the batch' do
|
29
|
+
queue.should_receive(:push).with([notification, batch])
|
30
|
+
runner.enqueue(batch)
|
31
|
+
end
|
21
32
|
|
22
|
-
it '
|
23
|
-
|
24
|
-
runner.enqueue(
|
33
|
+
it 'reflects the notification has been enqueued' do
|
34
|
+
runner.should_receive(:reflect).with(:notification_enqueued, notification)
|
35
|
+
runner.enqueue(batch)
|
25
36
|
end
|
26
37
|
end
|
27
38
|
|
@@ -29,19 +40,24 @@ shared_examples_for "an AppRunner subclass" do
|
|
29
40
|
before { runner.start }
|
30
41
|
|
31
42
|
it 'stops the delivery handlers' do
|
32
|
-
|
43
|
+
handler_collection.should_receive(:stop)
|
33
44
|
runner.stop
|
34
45
|
end
|
35
46
|
end
|
36
47
|
|
37
48
|
describe 'idle?' do
|
38
49
|
it 'is idle if all notifications have been processed' do
|
39
|
-
|
50
|
+
runner.batch = double(:complete? => true)
|
51
|
+
runner.idle?.should be_true
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'is idle if the runner has no associated batch' do
|
55
|
+
runner.batch = nil
|
40
56
|
runner.idle?.should be_true
|
41
57
|
end
|
42
58
|
|
43
59
|
it 'is not idle if not all notifications have been processed' do
|
44
|
-
|
60
|
+
runner.batch = double(:complete? => false)
|
45
61
|
runner.idle?.should be_false
|
46
62
|
end
|
47
63
|
end
|
@@ -50,7 +66,7 @@ shared_examples_for "an AppRunner subclass" do
|
|
50
66
|
before { runner.start }
|
51
67
|
|
52
68
|
it 'reduces the number of handlers if needed' do
|
53
|
-
|
69
|
+
handler_collection.should_receive(:pop)
|
54
70
|
new_app = app_class.new
|
55
71
|
new_app.stub(:connections => app.connections - 1)
|
56
72
|
runner.sync(new_app)
|
@@ -58,6 +74,7 @@ shared_examples_for "an AppRunner subclass" do
|
|
58
74
|
|
59
75
|
it 'increases the number of handlers if needed' do
|
60
76
|
runner.should_receive(:start_handler).and_return(handler)
|
77
|
+
handler_collection.should_receive(:push).with(handler)
|
61
78
|
new_app = app_class.new
|
62
79
|
new_app.stub(:connections => app.connections + 1)
|
63
80
|
runner.sync(new_app)
|