rpush 1.0.0-java → 2.0.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +37 -22
- data/bin/rpush +13 -4
- data/lib/generators/rpush_generator.rb +2 -0
- data/lib/generators/templates/add_adm.rb +5 -5
- data/lib/generators/templates/add_alert_is_json_to_rapns_notifications.rb +1 -1
- data/lib/generators/templates/add_app_to_rapns.rb +2 -2
- data/lib/generators/templates/add_fail_after_to_rpush_notifications.rb +1 -1
- data/lib/generators/templates/add_gcm.rb +32 -32
- data/lib/generators/templates/add_rpush.rb +67 -67
- data/lib/generators/templates/add_wpns.rb +2 -2
- data/lib/generators/templates/create_rapns_apps.rb +5 -5
- data/lib/generators/templates/create_rapns_feedback.rb +2 -2
- data/lib/generators/templates/create_rapns_notifications.rb +15 -15
- data/lib/generators/templates/rpush.rb +28 -7
- data/lib/generators/templates/rpush_2_0_0_updates.rb +42 -0
- data/lib/rpush/client/active_model/adm/app.rb +23 -0
- data/lib/rpush/client/active_model/adm/data_validator.rb +14 -0
- data/lib/rpush/client/active_model/adm/notification.rb +28 -0
- data/lib/rpush/client/active_model/apns/app.rb +37 -0
- data/lib/rpush/client/active_model/apns/binary_notification_validator.rb +16 -0
- data/lib/rpush/client/active_model/apns/device_token_format_validator.rb +14 -0
- data/lib/rpush/client/active_model/apns/notification.rb +90 -0
- data/lib/rpush/client/active_model/gcm/app.rb +19 -0
- data/lib/rpush/client/active_model/gcm/expiry_collapse_key_mutual_inclusion_validator.rb +14 -0
- data/lib/rpush/client/active_model/gcm/notification.rb +31 -0
- data/lib/rpush/client/active_model/notification.rb +26 -0
- data/lib/rpush/client/active_model/payload_data_size_validator.rb +13 -0
- data/lib/rpush/client/active_model/registration_ids_count_validator.rb +13 -0
- data/lib/rpush/client/active_model/wpns/app.rb +13 -0
- data/lib/rpush/client/active_model/wpns/notification.rb +17 -0
- data/lib/rpush/client/active_model.rb +21 -0
- data/lib/rpush/client/active_record/adm/app.rb +11 -0
- data/lib/rpush/client/active_record/adm/notification.rb +11 -0
- data/lib/rpush/client/active_record/apns/app.rb +11 -0
- data/lib/rpush/client/active_record/apns/feedback.rb +22 -0
- data/lib/rpush/client/active_record/apns/notification.rb +46 -0
- data/lib/rpush/client/active_record/app.rb +17 -0
- data/lib/rpush/client/active_record/gcm/app.rb +11 -0
- data/lib/rpush/client/active_record/gcm/notification.rb +11 -0
- data/lib/rpush/client/active_record/notification.rb +38 -0
- data/lib/rpush/client/active_record/wpns/app.rb +11 -0
- data/lib/rpush/client/active_record/wpns/notification.rb +11 -0
- data/lib/rpush/client/active_record.rb +19 -0
- data/lib/rpush/client/redis/adm/app.rb +14 -0
- data/lib/rpush/client/redis/adm/notification.rb +11 -0
- data/lib/rpush/client/redis/apns/app.rb +11 -0
- data/lib/rpush/client/redis/apns/feedback.rb +20 -0
- data/lib/rpush/client/redis/apns/notification.rb +11 -0
- data/lib/rpush/client/redis/app.rb +24 -0
- data/lib/rpush/client/redis/gcm/app.rb +11 -0
- data/lib/rpush/client/redis/gcm/notification.rb +11 -0
- data/lib/rpush/client/redis/notification.rb +68 -0
- data/lib/rpush/client/redis/wpns/app.rb +11 -0
- data/lib/rpush/client/redis/wpns/notification.rb +11 -0
- data/lib/rpush/client/redis.rb +35 -0
- data/lib/rpush/configuration.rb +27 -6
- data/lib/rpush/daemon/adm/delivery.rb +56 -55
- data/lib/rpush/daemon/apns/delivery.rb +20 -44
- data/lib/rpush/daemon/apns/feedback_receiver.rb +11 -8
- data/lib/rpush/daemon/apns.rb +6 -5
- data/lib/rpush/daemon/app_runner.rb +103 -99
- data/lib/rpush/daemon/batch.rb +54 -40
- data/lib/rpush/daemon/delivery.rb +13 -3
- data/lib/rpush/daemon/delivery_error.rb +10 -2
- data/lib/rpush/daemon/dispatcher/apns_tcp.rb +114 -0
- data/lib/rpush/daemon/dispatcher/http.rb +3 -3
- data/lib/rpush/daemon/dispatcher/tcp.rb +3 -3
- data/lib/rpush/daemon/dispatcher_loop.rb +37 -23
- data/lib/rpush/daemon/errors.rb +18 -0
- data/lib/rpush/daemon/feeder.rb +28 -39
- data/lib/rpush/daemon/gcm/delivery.rb +19 -20
- data/lib/rpush/daemon/interruptible_sleep.rb +26 -45
- data/lib/rpush/daemon/loggable.rb +2 -4
- data/lib/rpush/daemon/proc_title.rb +16 -0
- data/lib/rpush/daemon/queue_payload.rb +12 -0
- data/lib/rpush/daemon/reflectable.rb +3 -5
- data/lib/rpush/daemon/retry_header_parser.rb +6 -6
- data/lib/rpush/daemon/retryable_error.rb +2 -0
- data/lib/rpush/daemon/ring_buffer.rb +16 -0
- data/lib/rpush/daemon/service_config_methods.rb +23 -7
- data/lib/rpush/daemon/signal_handler.rb +56 -0
- data/lib/rpush/daemon/store/active_record/reconnectable.rb +21 -17
- data/lib/rpush/daemon/store/active_record.rb +71 -38
- data/lib/rpush/daemon/store/interface.rb +19 -0
- data/lib/rpush/daemon/store/redis.rb +149 -0
- data/lib/rpush/daemon/string_helpers.rb +15 -0
- data/lib/rpush/daemon/synchronizer.rb +60 -0
- data/lib/rpush/daemon/tcp_connection.rb +6 -11
- data/lib/rpush/daemon/wpns/delivery.rb +21 -30
- data/lib/rpush/daemon.rb +40 -60
- data/lib/rpush/deprecatable.rb +4 -3
- data/lib/rpush/deprecation.rb +7 -10
- data/lib/rpush/embed.rb +8 -3
- data/lib/rpush/logger.rb +11 -15
- data/lib/rpush/push.rb +1 -2
- data/lib/rpush/reflection.rb +8 -12
- data/lib/rpush/version.rb +1 -1
- data/lib/rpush.rb +5 -29
- data/lib/tasks/quality.rake +35 -0
- data/lib/tasks/test.rake +1 -5
- data/spec/.rubocop.yml +4 -0
- data/spec/functional/adm_spec.rb +3 -6
- data/spec/functional/apns_spec.rb +117 -24
- data/spec/functional/embed_spec.rb +20 -20
- data/spec/functional/gcm_spec.rb +4 -7
- data/spec/functional/new_app_spec.rb +59 -0
- data/spec/functional/retry_spec.rb +46 -0
- data/spec/functional/synchronization_spec.rb +68 -0
- data/spec/functional/wpns_spec.rb +3 -6
- data/spec/functional_spec_helper.rb +26 -0
- data/spec/integration/rpush_spec.rb +13 -0
- data/spec/integration/support/gcm_success_response.json +1 -0
- data/spec/spec_helper.rb +60 -0
- data/spec/support/active_record_setup.rb +48 -0
- data/{config → spec/support/config}/database.yml +0 -0
- data/spec/support/install.sh +43 -7
- data/spec/support/simplecov_helper.rb +9 -5
- data/spec/support/simplecov_quality_formatter.rb +10 -6
- data/spec/unit/apns_feedback_spec.rb +3 -3
- data/spec/unit/{adm → client/active_record/adm}/app_spec.rb +3 -3
- data/spec/unit/{adm → client/active_record/adm}/notification_spec.rb +5 -7
- data/spec/unit/client/active_record/apns/app_spec.rb +29 -0
- data/spec/unit/client/active_record/apns/feedback_spec.rb +9 -0
- data/spec/unit/client/active_record/apns/notification_spec.rb +231 -0
- data/spec/unit/client/active_record/app_spec.rb +30 -0
- data/spec/unit/client/active_record/gcm/app_spec.rb +4 -0
- data/spec/unit/{gcm → client/active_record/gcm}/notification_spec.rb +5 -7
- data/spec/unit/client/active_record/notification_spec.rb +21 -0
- data/spec/unit/client/active_record/wpns/app_spec.rb +4 -0
- data/spec/unit/client/active_record/wpns/notification_spec.rb +21 -0
- data/spec/unit/configuration_spec.rb +12 -5
- data/spec/unit/daemon/adm/delivery_spec.rb +66 -55
- data/spec/unit/daemon/apns/certificate_expired_error_spec.rb +3 -3
- data/spec/unit/daemon/apns/delivery_spec.rb +90 -83
- data/spec/unit/daemon/apns/feedback_receiver_spec.rb +22 -17
- data/spec/unit/daemon/app_runner_spec.rb +78 -186
- data/spec/unit/daemon/batch_spec.rb +52 -115
- data/spec/unit/daemon/delivery_spec.rb +15 -1
- data/spec/unit/daemon/dispatcher/http_spec.rb +3 -2
- data/spec/unit/daemon/dispatcher/tcp_spec.rb +10 -9
- data/spec/unit/daemon/dispatcher_loop_spec.rb +6 -24
- data/spec/unit/daemon/feeder_spec.rb +38 -39
- data/spec/unit/daemon/gcm/delivery_spec.rb +122 -101
- data/spec/unit/daemon/reflectable_spec.rb +2 -2
- data/spec/unit/daemon/retryable_error_spec.rb +1 -1
- data/spec/unit/daemon/service_config_methods_spec.rb +6 -3
- data/spec/unit/daemon/signal_handler_spec.rb +95 -0
- data/spec/unit/daemon/store/active_record/reconnectable_spec.rb +48 -27
- data/spec/unit/daemon/store/active_record_spec.rb +38 -47
- data/spec/unit/daemon/tcp_connection_spec.rb +22 -34
- data/spec/unit/daemon/wpns/delivery_spec.rb +58 -50
- data/spec/unit/daemon_spec.rb +48 -82
- data/spec/unit/embed_spec.rb +6 -4
- data/spec/unit/logger_spec.rb +35 -43
- data/spec/unit/notification_shared.rb +9 -79
- data/spec/unit/push_spec.rb +6 -10
- data/spec/unit/reflection_spec.rb +25 -25
- data/spec/unit/rpush_spec.rb +1 -2
- data/spec/unit_spec_helper.rb +33 -88
- metadata +126 -76
- data/lib/rpush/TODO +0 -3
- data/lib/rpush/adm/app.rb +0 -15
- data/lib/rpush/adm/data_validator.rb +0 -11
- data/lib/rpush/adm/notification.rb +0 -29
- data/lib/rpush/apns/app.rb +0 -29
- data/lib/rpush/apns/binary_notification_validator.rb +0 -12
- data/lib/rpush/apns/device_token_format_validator.rb +0 -12
- data/lib/rpush/apns/feedback.rb +0 -16
- data/lib/rpush/apns/notification.rb +0 -84
- data/lib/rpush/app.rb +0 -18
- data/lib/rpush/daemon/apns/certificate_expired_error.rb +0 -20
- data/lib/rpush/daemon/apns/disconnection_error.rb +0 -20
- data/lib/rpush/daemon/dispatcher_loop_collection.rb +0 -33
- data/lib/rpush/daemon/too_many_requests_error.rb +0 -20
- data/lib/rpush/gcm/app.rb +0 -11
- data/lib/rpush/gcm/expiry_collapse_key_mutual_inclusion_validator.rb +0 -11
- data/lib/rpush/gcm/notification.rb +0 -30
- data/lib/rpush/notification.rb +0 -69
- data/lib/rpush/notifier.rb +0 -52
- data/lib/rpush/payload_data_size_validator.rb +0 -10
- data/lib/rpush/railtie.rb +0 -11
- data/lib/rpush/registration_ids_count_validator.rb +0 -10
- data/lib/rpush/wpns/app.rb +0 -9
- data/lib/rpush/wpns/notification.rb +0 -26
- data/lib/tasks/cane.rake +0 -18
- data/lib/tasks/rpush.rake +0 -16
- data/spec/unit/apns/app_spec.rb +0 -29
- data/spec/unit/apns/feedback_spec.rb +0 -9
- data/spec/unit/apns/notification_spec.rb +0 -208
- data/spec/unit/app_spec.rb +0 -30
- data/spec/unit/daemon/apns/disconnection_error_spec.rb +0 -18
- data/spec/unit/daemon/dispatcher_loop_collection_spec.rb +0 -37
- data/spec/unit/daemon/interruptible_sleep_spec.rb +0 -68
- data/spec/unit/daemon/too_many_requests_error_spec.rb +0 -14
- data/spec/unit/gcm/app_spec.rb +0 -4
- data/spec/unit/notification_spec.rb +0 -15
- data/spec/unit/notifier_spec.rb +0 -49
- data/spec/unit/wpns/app_spec.rb +0 -4
- data/spec/unit/wpns/notification_spec.rb +0 -30
@@ -1,23 +1,15 @@
|
|
1
1
|
require 'unit_spec_helper'
|
2
2
|
|
3
3
|
describe Rpush::Daemon::Batch do
|
4
|
-
let(:notification1) { double(:notification1, :
|
5
|
-
let(:notification2) { double(:notification2, :
|
4
|
+
let(:notification1) { double(:notification1, id: 1) }
|
5
|
+
let(:notification2) { double(:notification2, id: 2) }
|
6
6
|
let(:batch) { Rpush::Daemon::Batch.new([notification1, notification2]) }
|
7
7
|
let(:store) { double.as_null_object }
|
8
8
|
let(:time) { Time.now }
|
9
9
|
|
10
10
|
before do
|
11
|
-
Time.stub(:
|
12
|
-
Rpush::Daemon.stub(:
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'exposes the notifications' do
|
16
|
-
batch.notifications.should eq [notification1, notification2]
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'exposes the number notifications' do
|
20
|
-
batch.num_notifications.should eq 2
|
11
|
+
Time.stub(now: time)
|
12
|
+
Rpush::Daemon.stub(store: store)
|
21
13
|
end
|
22
14
|
|
23
15
|
it 'exposes the number notifications processed' do
|
@@ -25,125 +17,85 @@ describe Rpush::Daemon::Batch do
|
|
25
17
|
end
|
26
18
|
|
27
19
|
it 'increments the processed notifications count' do
|
28
|
-
expect { batch.
|
20
|
+
expect { batch.notification_processed }.to change(batch, :num_processed).to(1)
|
29
21
|
end
|
30
22
|
|
31
23
|
it 'completes the batch when all notifications have been processed' do
|
32
24
|
batch.should_receive(:complete)
|
33
|
-
2.times { batch.
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'can be described' do
|
37
|
-
batch.describe.should eq '1, 2'
|
25
|
+
2.times { batch.notification_processed }
|
38
26
|
end
|
39
27
|
|
40
28
|
describe 'mark_delivered' do
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
it 'marks the notification as delivered immediately' do
|
45
|
-
store.should_receive(:mark_delivered).with(notification1, time)
|
46
|
-
batch.mark_delivered(notification1)
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'reflects the notification was delivered' do
|
50
|
-
batch.should_receive(:reflect).with(:notification_delivered, notification1)
|
51
|
-
batch.mark_delivered(notification1)
|
52
|
-
end
|
29
|
+
it 'marks the notification as delivered immediately without persisting' do
|
30
|
+
store.should_receive(:mark_delivered).with(notification1, time, persist: false)
|
31
|
+
batch.mark_delivered(notification1)
|
53
32
|
end
|
54
33
|
|
55
|
-
|
56
|
-
|
34
|
+
it 'defers persisting' do
|
35
|
+
batch.mark_delivered(notification1)
|
36
|
+
batch.delivered.should eq [notification1]
|
37
|
+
end
|
38
|
+
end
|
57
39
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
40
|
+
describe 'mark_all_delivered' do
|
41
|
+
it 'marks the notifications as delivered immediately without persisting' do
|
42
|
+
store.should_receive(:mark_delivered).with(notification1, time, persist: false)
|
43
|
+
store.should_receive(:mark_delivered).with(notification2, time, persist: false)
|
44
|
+
batch.mark_all_delivered
|
45
|
+
end
|
62
46
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
47
|
+
it 'defers persisting' do
|
48
|
+
batch.mark_all_delivered
|
49
|
+
batch.delivered.should eq [notification1, notification2]
|
67
50
|
end
|
68
51
|
end
|
69
52
|
|
70
53
|
describe 'mark_failed' do
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
it 'marks the notification as failed' do
|
75
|
-
store.should_receive(:mark_failed).with(notification1, 1, 'an error', time)
|
76
|
-
batch.mark_failed(notification1, 1, 'an error')
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'reflects the notification failed' do
|
80
|
-
batch.should_receive(:reflect).with(:notification_delivered, notification1)
|
81
|
-
batch.mark_delivered(notification1)
|
82
|
-
end
|
54
|
+
it 'marks the notification as failed without persisting' do
|
55
|
+
store.should_receive(:mark_failed).with(notification1, 1, 'an error', time, persist: false)
|
56
|
+
batch.mark_failed(notification1, 1, 'an error')
|
83
57
|
end
|
84
58
|
|
85
|
-
|
86
|
-
|
59
|
+
it 'defers persisting' do
|
60
|
+
batch.mark_failed(notification1, 1, 'an error')
|
61
|
+
batch.failed.should eq([1, 'an error'] => [notification1])
|
62
|
+
end
|
63
|
+
end
|
87
64
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
65
|
+
describe 'mark_failed' do
|
66
|
+
it 'marks the notification as failed without persisting' do
|
67
|
+
store.should_receive(:mark_failed).with(notification1, 1, 'an error', time, persist: false)
|
68
|
+
store.should_receive(:mark_failed).with(notification2, 1, 'an error', time, persist: false)
|
69
|
+
batch.mark_all_failed(1, 'an error')
|
70
|
+
end
|
92
71
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
batch.failed.should eq({[1, 'an error'] => [notification1]})
|
97
|
-
end
|
72
|
+
it 'defers persisting' do
|
73
|
+
batch.mark_all_failed(1, 'an error')
|
74
|
+
batch.failed.should eq([1, 'an error'] => [notification1, notification2])
|
98
75
|
end
|
99
76
|
end
|
100
77
|
|
101
78
|
describe 'mark_retryable' do
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
it 'marks the notification as retryable' do
|
106
|
-
store.should_receive(:mark_retryable).with(notification1, time)
|
107
|
-
batch.mark_retryable(notification1, time)
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'reflects the notification will be retried' do
|
111
|
-
batch.should_receive(:reflect).with(:notification_will_retry, notification1)
|
112
|
-
batch.mark_retryable(notification1, time)
|
113
|
-
end
|
79
|
+
it 'marks the notification as retryable without persisting' do
|
80
|
+
store.should_receive(:mark_retryable).with(notification1, time, persist: false)
|
81
|
+
batch.mark_retryable(notification1, time)
|
114
82
|
end
|
115
83
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
it 'marks the notification as retryable without persisting' do
|
120
|
-
store.should_receive(:mark_retryable).with(notification1, time, :persist => false)
|
121
|
-
batch.mark_retryable(notification1, time)
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'defers persisting' do
|
125
|
-
batch.mark_retryable(notification1, time)
|
126
|
-
batch.retryable.should eq({time => [notification1]})
|
127
|
-
end
|
84
|
+
it 'defers persisting' do
|
85
|
+
batch.mark_retryable(notification1, time)
|
86
|
+
batch.retryable.should eq(time => [notification1])
|
128
87
|
end
|
129
88
|
end
|
130
89
|
|
131
90
|
describe 'complete' do
|
132
91
|
before do
|
133
|
-
Rpush.
|
134
|
-
Rpush.stub(:logger => double.as_null_object)
|
92
|
+
Rpush.stub(logger: double.as_null_object)
|
135
93
|
batch.stub(:reflect)
|
136
94
|
end
|
137
95
|
|
138
|
-
it 'clears the notifications' do
|
139
|
-
expect do
|
140
|
-
2.times { batch.notification_dispatched }
|
141
|
-
end.to change(batch, :notifications).to([])
|
142
|
-
end
|
143
|
-
|
144
96
|
it 'identifies as complete' do
|
145
97
|
expect do
|
146
|
-
2.times { batch.
|
98
|
+
2.times { batch.notification_processed }
|
147
99
|
end.to change(batch, :complete?).to(be_true)
|
148
100
|
end
|
149
101
|
|
@@ -151,14 +103,14 @@ describe Rpush::Daemon::Batch do
|
|
151
103
|
e = StandardError.new
|
152
104
|
batch.stub(:complete_delivered).and_raise(e)
|
153
105
|
batch.should_receive(:reflect).with(:error, e)
|
154
|
-
2.times { batch.
|
106
|
+
2.times { batch.notification_processed }
|
155
107
|
end
|
156
108
|
|
157
109
|
describe 'delivered' do
|
158
110
|
def complete
|
159
111
|
[notification1, notification2].each do |n|
|
160
112
|
batch.mark_delivered(n)
|
161
|
-
batch.
|
113
|
+
batch.notification_processed
|
162
114
|
end
|
163
115
|
end
|
164
116
|
|
@@ -172,18 +124,13 @@ describe Rpush::Daemon::Batch do
|
|
172
124
|
batch.should_receive(:reflect).with(:notification_delivered, notification2)
|
173
125
|
complete
|
174
126
|
end
|
175
|
-
|
176
|
-
it 'clears the delivered notifications' do
|
177
|
-
complete
|
178
|
-
batch.delivered.should eq([])
|
179
|
-
end
|
180
127
|
end
|
181
128
|
|
182
129
|
describe 'failed' do
|
183
130
|
def complete
|
184
131
|
[notification1, notification2].each do |n|
|
185
132
|
batch.mark_failed(n, 1, 'an error')
|
186
|
-
batch.
|
133
|
+
batch.notification_processed
|
187
134
|
end
|
188
135
|
end
|
189
136
|
|
@@ -197,18 +144,13 @@ describe Rpush::Daemon::Batch do
|
|
197
144
|
batch.should_receive(:reflect).with(:notification_failed, notification2)
|
198
145
|
complete
|
199
146
|
end
|
200
|
-
|
201
|
-
it 'clears the failed notifications' do
|
202
|
-
complete
|
203
|
-
batch.failed.should eq({})
|
204
|
-
end
|
205
147
|
end
|
206
148
|
|
207
149
|
describe 'retryable' do
|
208
150
|
def complete
|
209
151
|
[notification1, notification2].each do |n|
|
210
152
|
batch.mark_retryable(n, time)
|
211
|
-
batch.
|
153
|
+
batch.notification_processed
|
212
154
|
end
|
213
155
|
end
|
214
156
|
|
@@ -222,11 +164,6 @@ describe Rpush::Daemon::Batch do
|
|
222
164
|
batch.should_receive(:reflect).with(:notification_will_retry, notification2)
|
223
165
|
complete
|
224
166
|
end
|
225
|
-
|
226
|
-
it 'clears the retryable notifications' do
|
227
|
-
complete
|
228
|
-
batch.retryable.should eq({})
|
229
|
-
end
|
230
167
|
end
|
231
168
|
end
|
232
169
|
end
|
@@ -16,7 +16,6 @@ describe Rpush::Daemon::Delivery do
|
|
16
16
|
before { Time.stub(now: now) }
|
17
17
|
|
18
18
|
describe 'mark_retryable' do
|
19
|
-
|
20
19
|
it 'does not retry a notification with an expired fail_after' do
|
21
20
|
batch.should_receive(:mark_failed).with(notification, nil, "Notification failed to be delivered before 2014-10-13 23:00:00.")
|
22
21
|
notification.fail_after = Time.now - 1.hour
|
@@ -35,4 +34,19 @@ describe Rpush::Daemon::Delivery do
|
|
35
34
|
delivery.mark_retryable(notification, Time.now + 1.hour)
|
36
35
|
end
|
37
36
|
end
|
37
|
+
|
38
|
+
describe 'mark_batch_delivered' do
|
39
|
+
it 'marks all notifications as delivered' do
|
40
|
+
batch.should_receive(:mark_all_delivered)
|
41
|
+
delivery.mark_batch_delivered
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'mark_batch_failed' do
|
46
|
+
it 'marks all notifications as delivered' do
|
47
|
+
error = Rpush::DeliveryError.new(1, 42, 'an error')
|
48
|
+
batch.should_receive(:mark_all_failed).with(1, 'Unable to deliver notification 42, received error 1 (an error)')
|
49
|
+
delivery.mark_batch_failed(error)
|
50
|
+
end
|
51
|
+
end
|
38
52
|
end
|
@@ -6,9 +6,10 @@ describe Rpush::Daemon::Dispatcher::Http do
|
|
6
6
|
let(:notification) { double }
|
7
7
|
let(:batch) { double }
|
8
8
|
let(:http) { double }
|
9
|
+
let(:queue_payload) { Rpush::Daemon::QueuePayload.new(batch, notification) }
|
9
10
|
let(:dispatcher) { Rpush::Daemon::Dispatcher::Http.new(app, delivery_class) }
|
10
11
|
|
11
|
-
before { Net::HTTP::Persistent.stub(:
|
12
|
+
before { Net::HTTP::Persistent.stub(new: http) }
|
12
13
|
|
13
14
|
it 'constructs a new persistent connection' do
|
14
15
|
Net::HTTP::Persistent.should_receive(:new)
|
@@ -20,7 +21,7 @@ describe Rpush::Daemon::Dispatcher::Http do
|
|
20
21
|
delivery = double
|
21
22
|
delivery_class.should_receive(:new).with(app, http, notification, batch).and_return(delivery)
|
22
23
|
delivery.should_receive(:perform)
|
23
|
-
dispatcher.dispatch(
|
24
|
+
dispatcher.dispatch(queue_payload)
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -2,35 +2,36 @@ require 'unit_spec_helper'
|
|
2
2
|
|
3
3
|
describe Rpush::Daemon::Dispatcher::Tcp do
|
4
4
|
let(:app) { double }
|
5
|
-
let(:delivery) { double(:
|
6
|
-
let(:delivery_class) { double(:
|
5
|
+
let(:delivery) { double(perform: nil) }
|
6
|
+
let(:delivery_class) { double(new: delivery) }
|
7
7
|
let(:notification) { double }
|
8
8
|
let(:batch) { double }
|
9
|
-
let(:connection) { double(Rpush::Daemon::TcpConnection, :
|
9
|
+
let(:connection) { double(Rpush::Daemon::TcpConnection, connect: nil) }
|
10
10
|
let(:host) { 'localhost' }
|
11
11
|
let(:port) { 1234 }
|
12
|
-
let(:host_proc) {
|
13
|
-
let(:
|
12
|
+
let(:host_proc) { proc { [host, port] } }
|
13
|
+
let(:queue_payload) { Rpush::Daemon::QueuePayload.new(batch, notification) }
|
14
|
+
let(:dispatcher) { Rpush::Daemon::Dispatcher::Tcp.new(app, delivery_class, host: host_proc) }
|
14
15
|
|
15
|
-
before { Rpush::Daemon::TcpConnection.stub(:
|
16
|
+
before { Rpush::Daemon::TcpConnection.stub(new: connection) }
|
16
17
|
|
17
18
|
describe 'dispatch' do
|
18
19
|
it 'lazily connects the socket' do
|
19
20
|
Rpush::Daemon::TcpConnection.should_receive(:new).with(app, host, port).and_return(connection)
|
20
21
|
connection.should_receive(:connect)
|
21
|
-
dispatcher.dispatch(
|
22
|
+
dispatcher.dispatch(queue_payload)
|
22
23
|
end
|
23
24
|
|
24
25
|
it 'delivers the notification' do
|
25
26
|
delivery_class.should_receive(:new).with(app, connection, notification, batch).and_return(delivery)
|
26
27
|
delivery.should_receive(:perform)
|
27
|
-
dispatcher.dispatch(
|
28
|
+
dispatcher.dispatch(queue_payload)
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
32
|
describe 'cleanup' do
|
32
33
|
it 'closes the connection' do
|
33
|
-
dispatcher.dispatch(
|
34
|
+
dispatcher.dispatch(queue_payload) # lazily initialize connection
|
34
35
|
connection.should_receive(:close)
|
35
36
|
dispatcher.cleanup
|
36
37
|
end
|
@@ -4,25 +4,23 @@ describe Rpush::Daemon::DispatcherLoop do
|
|
4
4
|
def run_dispatcher_loop
|
5
5
|
dispatcher_loop.start
|
6
6
|
dispatcher_loop.stop
|
7
|
-
dispatcher_loop.wakeup
|
8
|
-
dispatcher_loop.wait
|
9
7
|
end
|
10
8
|
|
11
9
|
let(:notification) { double }
|
12
|
-
let(:batch) { double(:
|
10
|
+
let(:batch) { double(notification_processed: nil) }
|
13
11
|
let(:queue) { Queue.new }
|
14
|
-
let(:dispatcher) { double(:
|
12
|
+
let(:dispatcher) { double(dispatch: nil, cleanup: nil) }
|
15
13
|
let(:dispatcher_loop) { Rpush::Daemon::DispatcherLoop.new(queue, dispatcher) }
|
16
|
-
let(:store) { double(Rpush::Daemon::Store::ActiveRecord, release_connection: nil)}
|
14
|
+
let(:store) { double(Rpush::Daemon::Store::ActiveRecord, release_connection: nil) }
|
17
15
|
|
18
16
|
before do
|
19
|
-
Rpush::Daemon.stub(:
|
17
|
+
Rpush::Daemon.stub(store: store)
|
20
18
|
queue.push([notification, batch])
|
21
19
|
end
|
22
20
|
|
23
21
|
it 'logs errors' do
|
24
22
|
logger = double
|
25
|
-
Rpush.stub(:
|
23
|
+
Rpush.stub(logger: logger)
|
26
24
|
error = StandardError.new
|
27
25
|
dispatcher.stub(:dispatch).and_raise(error)
|
28
26
|
Rpush.logger.should_receive(:error).with(error)
|
@@ -30,32 +28,16 @@ describe Rpush::Daemon::DispatcherLoop do
|
|
30
28
|
end
|
31
29
|
|
32
30
|
it 'reflects an exception' do
|
33
|
-
Rpush.stub(:
|
31
|
+
Rpush.stub(logger: double(error: nil))
|
34
32
|
error = StandardError.new
|
35
33
|
dispatcher.stub(:dispatch).and_raise(error)
|
36
34
|
dispatcher_loop.should_receive(:reflect).with(:error, error)
|
37
35
|
run_dispatcher_loop
|
38
36
|
end
|
39
37
|
|
40
|
-
it 'instructs the batch that the notification has been processed' do
|
41
|
-
batch.should_receive(:notification_dispatched)
|
42
|
-
run_dispatcher_loop
|
43
|
-
end
|
44
|
-
|
45
|
-
it "instructs the queue to wakeup the thread when told to stop" do
|
46
|
-
queue.should_receive(:push).with(Rpush::Daemon::DispatcherLoop::WAKEUP).and_call_original
|
47
|
-
run_dispatcher_loop
|
48
|
-
end
|
49
|
-
|
50
38
|
describe 'stop' do
|
51
39
|
before do
|
52
40
|
queue.clear
|
53
|
-
queue.push(Rpush::Daemon::DispatcherLoop::WAKEUP)
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'does not attempt to dispatch when a WAKEUP is dequeued' do
|
57
|
-
dispatcher.should_not_receive(:dispatch)
|
58
|
-
run_dispatcher_loop
|
59
41
|
end
|
60
42
|
|
61
43
|
it 'instructs the dispatcher to cleanup' do
|
@@ -1,25 +1,23 @@
|
|
1
1
|
require "unit_spec_helper"
|
2
2
|
|
3
3
|
describe Rpush::Daemon::Feeder do
|
4
|
-
let(:
|
5
|
-
|
6
|
-
:embedded => false,
|
7
|
-
:push => false,
|
8
|
-
:wakeup => nil) }
|
9
|
-
let!(:app) { Rpush::Apns::App.create!(:name => 'my_app', :environment => 'development', :certificate => TEST_CERT) }
|
10
|
-
let(:notification) { Rpush::Apns::Notification.create!(:device_token => "a" * 64, :app => app) }
|
4
|
+
let!(:app) { Rpush::Apns::App.create!(name: 'my_app', environment: 'development', certificate: TEST_CERT) }
|
5
|
+
let(:notification) { Rpush::Apns::Notification.create!(device_token: "a" * 64, app: app) }
|
11
6
|
let(:logger) { double }
|
12
|
-
let(:
|
13
|
-
let(:store) { double(Rpush::Daemon::Store::ActiveRecord,
|
14
|
-
deliverable_notifications: [notification], release_connection: nil) }
|
7
|
+
let(:interruptible_sleeper) { double(sleep: nil, stop: nil, start: nil) }
|
8
|
+
let(:store) { double(Rpush::Daemon::Store::ActiveRecord, deliverable_notifications: [notification], release_connection: nil) }
|
15
9
|
|
16
10
|
before do
|
17
|
-
Rpush.
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
Rpush.configure do |config|
|
12
|
+
config.batch_size = 5000
|
13
|
+
config.push_poll = 0
|
14
|
+
config.push = false
|
15
|
+
end
|
16
|
+
|
17
|
+
Rpush.stub(logger: logger)
|
18
|
+
Rpush::Daemon.stub(store: store)
|
19
|
+
Rpush::Daemon::Feeder.stub(should_stop: true, interruptible_sleeper: interruptible_sleeper)
|
20
|
+
Rpush::Daemon::AppRunner.stub(enqueue: nil, num_queued: 0)
|
23
21
|
end
|
24
22
|
|
25
23
|
def start_and_stop
|
@@ -27,26 +25,26 @@ describe Rpush::Daemon::Feeder do
|
|
27
25
|
Rpush::Daemon::Feeder.stop
|
28
26
|
end
|
29
27
|
|
30
|
-
it '
|
31
|
-
|
32
|
-
Thread.should_receive(:new).and_yield
|
33
|
-
Rpush::Daemon::Feeder.should_receive(:feed_forever)
|
28
|
+
it 'loads deliverable notifications' do
|
29
|
+
Rpush::Daemon.store.should_receive(:deliverable_notifications).with(Rpush.config.batch_size)
|
34
30
|
start_and_stop
|
35
31
|
end
|
36
32
|
|
37
|
-
it '
|
38
|
-
Rpush::Daemon.
|
33
|
+
it 'does not load more notifications if the total queue size is equal to the batch size' do
|
34
|
+
Rpush::Daemon::AppRunner.stub(total_queued: Rpush.config.batch_size)
|
35
|
+
Rpush::Daemon.store.should_not_receive(:deliverable_notifications)
|
39
36
|
start_and_stop
|
40
37
|
end
|
41
38
|
|
42
|
-
it '
|
43
|
-
Rpush
|
44
|
-
Rpush::Daemon.
|
39
|
+
it 'limits the batch size if some runners are still processing notifications' do
|
40
|
+
Rpush.config.stub(batch_size: 10)
|
41
|
+
Rpush::Daemon::AppRunner.stub(total_queued: 6)
|
42
|
+
Rpush::Daemon.store.should_receive(:deliverable_notifications).with(4)
|
45
43
|
start_and_stop
|
46
44
|
end
|
47
45
|
|
48
46
|
it 'enqueues notifications without looping if in push mode' do
|
49
|
-
config.
|
47
|
+
Rpush.config.push = true
|
50
48
|
Rpush::Daemon::Feeder.should_not_receive(:feed_forever)
|
51
49
|
Rpush::Daemon::Feeder.should_receive(:enqueue_notifications)
|
52
50
|
start_and_stop
|
@@ -65,34 +63,35 @@ describe Rpush::Daemon::Feeder do
|
|
65
63
|
end
|
66
64
|
|
67
65
|
describe 'stop' do
|
68
|
-
it 'interrupts sleep
|
69
|
-
|
66
|
+
it 'interrupts sleep' do
|
67
|
+
interruptible_sleeper.should_receive(:stop)
|
70
68
|
start_and_stop
|
71
69
|
end
|
72
70
|
|
73
|
-
it 'releases the store connection
|
71
|
+
it 'releases the store connection' do
|
74
72
|
Rpush::Daemon.store.should_receive(:release_connection)
|
75
73
|
start_and_stop
|
76
74
|
end
|
77
75
|
end
|
78
76
|
|
79
|
-
it
|
77
|
+
it 'enqueues notifications when started' do
|
80
78
|
Rpush::Daemon::Feeder.should_receive(:enqueue_notifications).at_least(:once)
|
81
79
|
Rpush::Daemon::Feeder.stub(:loop).and_yield
|
82
80
|
start_and_stop
|
83
81
|
end
|
84
82
|
|
85
|
-
it
|
86
|
-
|
87
|
-
interruptible_sleep.should_receive(:sleep).with(2)
|
83
|
+
it 'sleeps' do
|
84
|
+
interruptible_sleeper.should_receive(:sleep)
|
88
85
|
start_and_stop
|
89
86
|
end
|
90
87
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
88
|
+
describe 'wakeup' do
|
89
|
+
it 'interrupts sleep' do
|
90
|
+
interruptible_sleeper.should_receive(:wakeup)
|
91
|
+
Rpush::Daemon::Feeder.start
|
92
|
+
Rpush::Daemon::Feeder.wakeup
|
93
|
+
end
|
94
|
+
|
95
|
+
after { Rpush::Daemon::Feeder.stop }
|
97
96
|
end
|
98
97
|
end
|