rapns 2.0.5 → 3.0.0.beta.1
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.
- data/lib/generators/rapns_generator.rb +1 -0
- data/lib/generators/templates/add_gcm.rb +86 -0
- data/lib/generators/templates/create_rapns_notifications.rb +1 -1
- data/lib/rapns/apns/app.rb +8 -0
- data/lib/rapns/apns/binary_notification_validator.rb +12 -0
- data/lib/rapns/apns/device_token_format_validator.rb +12 -0
- data/lib/rapns/apns/feedback.rb +14 -0
- data/lib/rapns/apns/notification.rb +84 -0
- data/lib/rapns/app.rb +5 -6
- data/lib/rapns/{config.rb → configuration.rb} +5 -5
- data/lib/rapns/daemon/apns/app_runner.rb +36 -0
- data/lib/rapns/daemon/apns/connection.rb +113 -0
- data/lib/rapns/daemon/apns/delivery.rb +63 -0
- data/lib/rapns/daemon/apns/delivery_handler.rb +21 -0
- data/lib/rapns/daemon/apns/disconnection_error.rb +20 -0
- data/lib/rapns/daemon/apns/feedback_receiver.rb +74 -0
- data/lib/rapns/daemon/app_runner.rb +76 -77
- data/lib/rapns/daemon/database_reconnectable.rb +3 -3
- data/lib/rapns/daemon/delivery.rb +43 -0
- data/lib/rapns/daemon/delivery_error.rb +6 -2
- data/lib/rapns/daemon/delivery_handler.rb +13 -79
- data/lib/rapns/daemon/delivery_queue_18.rb +2 -2
- data/lib/rapns/daemon/delivery_queue_19.rb +3 -3
- data/lib/rapns/daemon/feeder.rb +5 -5
- data/lib/rapns/daemon/gcm/app_runner.rb +13 -0
- data/lib/rapns/daemon/gcm/delivery.rb +206 -0
- data/lib/rapns/daemon/gcm/delivery_handler.rb +20 -0
- data/lib/rapns/daemon.rb +31 -20
- data/lib/rapns/gcm/app.rb +7 -0
- data/lib/rapns/gcm/expiry_collapse_key_mutual_inclusion_validator.rb +11 -0
- data/lib/rapns/gcm/notification.rb +31 -0
- data/lib/rapns/gcm/payload_size_validator.rb +13 -0
- data/lib/rapns/multi_json_helper.rb +16 -0
- data/lib/rapns/notification.rb +28 -95
- data/lib/rapns/version.rb +1 -1
- data/lib/rapns.rb +14 -4
- data/lib/tasks/cane.rake +19 -0
- data/lib/tasks/test.rake +34 -0
- data/spec/acceptance/gcm_upgrade_spec.rb +34 -0
- data/spec/acceptance_spec_helper.rb +85 -0
- data/spec/support/simplecov_helper.rb +13 -0
- data/spec/support/simplecov_quality_formatter.rb +8 -0
- data/spec/unit/apns/app_spec.rb +15 -0
- data/spec/unit/apns/feedback_spec.rb +12 -0
- data/spec/{rapns → unit/apns}/notification_spec.rb +44 -72
- data/spec/unit/app_spec.rb +18 -0
- data/spec/unit/daemon/apns/app_runner_spec.rb +37 -0
- data/spec/{rapns/daemon → unit/daemon/apns}/connection_spec.rb +9 -9
- data/spec/unit/daemon/apns/delivery_handler_spec.rb +48 -0
- data/spec/unit/daemon/apns/delivery_spec.rb +154 -0
- data/spec/{rapns/daemon → unit/daemon/apns}/feedback_receiver_spec.rb +14 -14
- data/spec/unit/daemon/app_runner_shared.rb +66 -0
- data/spec/unit/daemon/app_runner_spec.rb +78 -0
- data/spec/{rapns → unit}/daemon/database_reconnectable_spec.rb +4 -5
- data/spec/{rapns → unit}/daemon/delivery_error_spec.rb +2 -2
- data/spec/unit/daemon/delivery_handler_shared.rb +19 -0
- data/spec/{rapns → unit}/daemon/delivery_queue_spec.rb +1 -1
- data/spec/{rapns → unit}/daemon/feeder_spec.rb +33 -33
- data/spec/unit/daemon/gcm/app_runner_spec.rb +15 -0
- data/spec/unit/daemon/gcm/delivery_handler_spec.rb +36 -0
- data/spec/unit/daemon/gcm/delivery_spec.rb +236 -0
- data/spec/{rapns → unit}/daemon/interruptible_sleep_spec.rb +1 -1
- data/spec/{rapns → unit}/daemon/logger_spec.rb +1 -1
- data/spec/{rapns → unit}/daemon_spec.rb +1 -1
- data/spec/unit/gcm/app_spec.rb +5 -0
- data/spec/unit/gcm/notification_spec.rb +55 -0
- data/spec/unit/notification_shared.rb +38 -0
- data/spec/unit/notification_spec.rb +6 -0
- data/spec/{rapns/app_spec.rb → unit_spec_helper.rb} +76 -16
- metadata +107 -45
- data/lib/rapns/binary_notification_validator.rb +0 -10
- data/lib/rapns/daemon/connection.rb +0 -114
- data/lib/rapns/daemon/delivery_handler_pool.rb +0 -18
- data/lib/rapns/daemon/disconnection_error.rb +0 -14
- data/lib/rapns/daemon/feedback_receiver.rb +0 -82
- data/lib/rapns/device_token_format_validator.rb +0 -10
- data/lib/rapns/feedback.rb +0 -12
- data/spec/rapns/daemon/app_runner_spec.rb +0 -193
- data/spec/rapns/daemon/delivery_handler_pool_spec.rb +0 -17
- data/spec/rapns/daemon/delivery_handler_spec.rb +0 -206
- data/spec/rapns/feedback_spec.rb +0 -12
- data/spec/spec_helper.rb +0 -78
@@ -0,0 +1,236 @@
|
|
1
|
+
require 'unit_spec_helper'
|
2
|
+
|
3
|
+
describe Rapns::Daemon::Gcm::Delivery do
|
4
|
+
let(:app) { Rapns::Gcm::App.new(:name => 'MyApp', :auth_key => 'abc123') }
|
5
|
+
let(:notification) { Rapns::Gcm::Notification.create!(:app => app, :registration_ids => ['xyz']) }
|
6
|
+
let(:logger) { stub(:error => nil, :info => nil, :warn => nil) }
|
7
|
+
let(:response) { stub(:code => 200, :header => {}) }
|
8
|
+
let(:http) { stub(:shutdown => nil, :request => response)}
|
9
|
+
let(:now) { Time.parse('2012-10-14 00:00:00') }
|
10
|
+
|
11
|
+
def perform
|
12
|
+
Rapns::Daemon::Gcm::Delivery.perform(app, http, notification)
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
Time.stub(:now => now)
|
17
|
+
Rapns::Daemon.stub(:logger => logger)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'an 200 response' do
|
21
|
+
before do
|
22
|
+
response.stub(:code => 200)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'marks the notification as delivered if delivered successfully to all devices' do
|
26
|
+
response.stub(:body => JSON.dump({ 'failure' => 0 }))
|
27
|
+
expect do
|
28
|
+
perform
|
29
|
+
end.to change(notification, :delivered).to(true)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'logs that the notification was delivered' do
|
33
|
+
response.stub(:body => JSON.dump({ 'failure' => 0 }))
|
34
|
+
logger.should_receive(:info).with("[MyApp] 1 sent to xyz")
|
35
|
+
perform
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'marks a notification as failed if any deliveries failed that cannot be retried.' do
|
39
|
+
body = {
|
40
|
+
'failure' => 1,
|
41
|
+
'success' => 1,
|
42
|
+
'results' => [
|
43
|
+
{ 'message_id' => '1:000' },
|
44
|
+
{ 'error' => 'NotRegistered' }
|
45
|
+
]}
|
46
|
+
response.stub(:body => JSON.dump(body))
|
47
|
+
perform rescue Rapns::DeliveryError
|
48
|
+
notification.reload
|
49
|
+
notification.failed.should be_true
|
50
|
+
notification.error_code = nil
|
51
|
+
notification.error_description = "Weee"
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'all deliveries returned Unavailable or InternalServerError' do
|
55
|
+
let(:body) {{
|
56
|
+
'failure' => 2,
|
57
|
+
'success' => 0,
|
58
|
+
'results' => [
|
59
|
+
{ 'error' => 'Unavailable' },
|
60
|
+
{ 'error' => 'Unavailable' }
|
61
|
+
]}}
|
62
|
+
|
63
|
+
before { response.stub(:body => JSON.dump(body)) }
|
64
|
+
|
65
|
+
it 'retries the notification respecting the Retry-After header' do
|
66
|
+
response.stub(:header => { 'retry-after' => 10 })
|
67
|
+
perform
|
68
|
+
notification.reload
|
69
|
+
notification.retries.should == 1
|
70
|
+
notification.deliver_after.should == now + 10.seconds
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'retries the notification using exponential back-off if the Retry-After header is not present' do
|
74
|
+
notification.update_attribute(:retries, 8)
|
75
|
+
perform
|
76
|
+
notification.reload
|
77
|
+
notification.retries.should == 9
|
78
|
+
notification.deliver_after.should == now + 2 ** 9
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'does not mark the notification as failed' do
|
82
|
+
expect do
|
83
|
+
perform
|
84
|
+
notification.reload
|
85
|
+
end.to_not change(notification, :failed).to(true)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'logs that the notification will be retried' do
|
89
|
+
Rapns::Daemon.logger.should_receive(:warn).with("All recipients unavailable. Notification #{notification.id} will be retired after 2012-10-14 00:00:02 (retry 1).")
|
90
|
+
perform
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
shared_examples_for 'an notification with some delivery failures' do
|
95
|
+
let(:new_notification) { Rapns::Gcm::Notification.where('id != ?', notification.id).first }
|
96
|
+
|
97
|
+
before { response.stub(:body => JSON.dump(body)) }
|
98
|
+
|
99
|
+
it 'marks the original notification as failed' do
|
100
|
+
perform rescue Rapns::DeliveryError
|
101
|
+
notification.reload
|
102
|
+
notification.failed.should be_true
|
103
|
+
notification.failed_at = now
|
104
|
+
notification.error_code.should be_nil
|
105
|
+
notification.error_description.should == error_description
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'creates a new notification for the unavailable devices' do
|
109
|
+
notification.update_attributes(:registration_ids => ['id_0', 'id_1', 'id_2'], :data => {'one' => 1}, :collapse_key => 'thing', :delay_while_idle => true)
|
110
|
+
perform rescue Rapns::DeliveryError
|
111
|
+
new_notification.registration_ids.should == ['id_0', 'id_2']
|
112
|
+
new_notification.data.should == {'one' => 1}
|
113
|
+
new_notification.collapse_key.should == 'thing'
|
114
|
+
new_notification.delay_while_idle.should be_true
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'sets the delivery time on the new notification to respect the Retry-After header' do
|
118
|
+
response.stub(:header => { 'retry-after' => 10 })
|
119
|
+
perform rescue Rapns::DeliveryError
|
120
|
+
new_notification.deliver_after.should == now + 10.seconds
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'raises a DeliveryError' do
|
124
|
+
expect { perform }.to raise_error(Rapns::DeliveryError)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe 'all deliveries failed with some as Unavailable or InternalServerError' do
|
129
|
+
let(:body) {{
|
130
|
+
'failure' => 3,
|
131
|
+
'success' => 0,
|
132
|
+
'results' => [
|
133
|
+
{ 'error' => 'Unavailable' },
|
134
|
+
{ 'error' => 'NotRegistered' },
|
135
|
+
{ 'error' => 'Unavailable' }
|
136
|
+
]}}
|
137
|
+
let(:error_description) { "Failed to deliver to recipients 0, 1, 2. Errors: Unavailable, NotRegistered, Unavailable. 0, 2 will be retried as notification 2." }
|
138
|
+
it_should_behave_like 'an notification with some delivery failures'
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe 'some deliveries failed with Unavailable or InternalServerError' do
|
143
|
+
let(:body) {{
|
144
|
+
'failure' => 2,
|
145
|
+
'success' => 1,
|
146
|
+
'results' => [
|
147
|
+
{ 'error' => 'Unavailable' },
|
148
|
+
{ 'message_id' => '1:000' },
|
149
|
+
{ 'error' => 'InternalServerError' }
|
150
|
+
]}}
|
151
|
+
let(:error_description) { "Failed to deliver to recipients 0, 2. Errors: Unavailable, InternalServerError. 0, 2 will be retried as notification 2." }
|
152
|
+
it_should_behave_like 'an notification with some delivery failures'
|
153
|
+
end
|
154
|
+
|
155
|
+
describe 'an 503 response' do
|
156
|
+
before { response.stub(:code => 503) }
|
157
|
+
|
158
|
+
it 'logs a warning that the notification will be retried.' do
|
159
|
+
logger.should_receive(:warn).with("GCM responded with an Service Unavailable Error. Notification 1 will be retired after 2012-10-14 00:00:02 (retry 1).")
|
160
|
+
perform
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'respects an integer Retry-After header' do
|
164
|
+
response.stub(:header => { 'retry-after' => 10 })
|
165
|
+
expect do
|
166
|
+
perform
|
167
|
+
end.to change(notification, :deliver_after).to(now + 10)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'respects a HTTP-date Retry-After header' do
|
171
|
+
response.stub(:header => { 'retry-after' => 'Wed, 03 Oct 2012 20:55:11 GMT' })
|
172
|
+
expect do
|
173
|
+
perform
|
174
|
+
end.to change(notification, :deliver_after).to(Time.parse('Wed, 03 Oct 2012 20:55:11 GMT'))
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'defaults to exponential back-off if the Retry-After header is not present' do
|
178
|
+
expect do
|
179
|
+
perform
|
180
|
+
end.to change(notification, :deliver_after).to(now + 2 ** 1)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe 'an 500 response' do
|
185
|
+
before do
|
186
|
+
notification.update_attribute(:retries, 2)
|
187
|
+
response.stub(:code => 500)
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'logs a warning that the notification has been re-queued.' do
|
191
|
+
Rapns::Daemon.logger.should_receive(:warn).with("GCM responded with an Internal Error. Notification #{notification.id} will be retired after #{(now + 2 ** 3).strftime("%Y-%m-%d %H:%M:%S")} (retry 3).")
|
192
|
+
perform
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'sets deliver_after on the notification in accordance with the exponential back-off strategy.' do
|
196
|
+
expect do
|
197
|
+
perform
|
198
|
+
notification.reload
|
199
|
+
end.to change(notification, :deliver_after).to(now + 2 ** 3)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe 'an 401 response' do
|
204
|
+
before { response.stub(:code => 401) }
|
205
|
+
|
206
|
+
it 'raises an error' do
|
207
|
+
expect { perform }.to raise_error(Rapns::DeliveryError)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe 'an 400 response' do
|
212
|
+
before { response.stub(:code => 400) }
|
213
|
+
|
214
|
+
it 'marks the notification as failed' do
|
215
|
+
perform rescue Rapns::DeliveryError
|
216
|
+
notification.reload
|
217
|
+
notification.failed.should be_true
|
218
|
+
notification.failed_at.should == now
|
219
|
+
notification.error_code.should == 400
|
220
|
+
notification.error_description.should == 'GCM failed to parse the JSON request. Possibly an rapns bug, please open an issue.'
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
describe 'an un-handled response' do
|
225
|
+
before { response.stub(:code => 418) }
|
226
|
+
|
227
|
+
it 'marks the notification as failed' do
|
228
|
+
perform rescue Rapns::DeliveryError
|
229
|
+
notification.reload
|
230
|
+
notification.failed.should be_true
|
231
|
+
notification.failed_at.should == now
|
232
|
+
notification.error_code.should == 418
|
233
|
+
notification.error_description.should == "I'm a Teapot"
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'unit_spec_helper'
|
2
|
+
require 'unit/notification_shared.rb'
|
3
|
+
|
4
|
+
describe Rapns::Gcm::Notification do
|
5
|
+
it_should_behave_like 'an Notification subclass'
|
6
|
+
|
7
|
+
let(:app) { Rapns::Gcm::App.create!(:name => 'test', :auth_key => 'abc') }
|
8
|
+
let(:notification_class) { Rapns::Gcm::Notification }
|
9
|
+
let(:notification) { notification_class.new }
|
10
|
+
let(:data_setter) { 'data=' }
|
11
|
+
let(:data_getter) { 'data' }
|
12
|
+
|
13
|
+
it { should validate_presence_of :registration_ids }
|
14
|
+
|
15
|
+
it 'has a payload limit of 4096 bytes' do
|
16
|
+
notification.data = { :key => "a" * 4096 }
|
17
|
+
notification.valid?.should be_false
|
18
|
+
notification.errors[:base].should == ["GCM notification payload cannot be larger than 4096 bytes."]
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'allows assignment of many registration IDs' do
|
22
|
+
notification.app = app
|
23
|
+
notification.registration_ids = ['a', 'b']
|
24
|
+
notification.save!
|
25
|
+
reloaded_notification = notification_class.find(notification.id)
|
26
|
+
reloaded_notification.registration_ids.should == ['a', 'b']
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'allows assignment of a single registration ID' do
|
30
|
+
notification.app = app
|
31
|
+
notification.registration_ids = 'a'
|
32
|
+
notification.save!
|
33
|
+
reloaded_notification = notification_class.find(notification.id)
|
34
|
+
reloaded_notification.registration_ids.should == ['a']
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'validates expiry is present if collapse_key is set' do
|
38
|
+
notification.collapse_key = 'test'
|
39
|
+
notification.expiry = nil
|
40
|
+
notification.valid?.should be_false
|
41
|
+
notification.errors[:expiry].should == ['must be set when using a collapse_key']
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'does not include time_to_live in the payload if collapse_key is not set' do
|
45
|
+
notification.expiry = 100
|
46
|
+
notification.collapse_key = nil
|
47
|
+
notification.as_json.key?('time_to_live').should be_false
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'includes time_to_live in the payload if collapse_key is set' do
|
51
|
+
notification.expiry = 100
|
52
|
+
notification.collapse_key = 'sync'
|
53
|
+
notification.as_json['time_to_live'].should == 100
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
shared_examples_for "an Notification subclass" do
|
2
|
+
describe "when assigning data for the device" do
|
3
|
+
it "calls MultiJson.dump when multi_json responds to :dump" do
|
4
|
+
notification = notification_class.new
|
5
|
+
MultiJson.stub(:respond_to?).with(:dump).and_return(true)
|
6
|
+
MultiJson.should_receive(:dump).with(any_args())
|
7
|
+
notification.send(data_setter, { :pirates => 1 })
|
8
|
+
end
|
9
|
+
|
10
|
+
it "calls MultiJson.encode when multi_json does not respond to :dump" do
|
11
|
+
notification = notification_class.new
|
12
|
+
MultiJson.stub(:respond_to?).with(:dump).and_return(false)
|
13
|
+
MultiJson.should_receive(:encode).with(any_args())
|
14
|
+
notification.send(data_setter, { :ninjas => 1 })
|
15
|
+
end
|
16
|
+
|
17
|
+
it "raises an ArgumentError if something other than a Hash is assigned" do
|
18
|
+
expect do
|
19
|
+
notification.send(data_setter, Array.new)
|
20
|
+
end.to raise_error(ArgumentError, "must be a Hash")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "encodes the given Hash as JSON" do
|
24
|
+
notification.send(data_setter, { :hi => "mom" })
|
25
|
+
notification.read_attribute(:data).should == "{\"hi\":\"mom\"}"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "decodes the JSON when using the reader method" do
|
29
|
+
notification.send(data_setter, { :hi => "mom" })
|
30
|
+
notification.send(data_getter).should == {"hi" => "mom"}
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'warns if attributes_for_device is assigned via mass-assignment' do
|
34
|
+
ActiveSupport::Deprecation.should_receive(:warn)
|
35
|
+
notification_class.new(:attributes_for_device => {:hi => 'mom'})
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -1,5 +1,80 @@
|
|
1
|
-
|
1
|
+
ENV['RAILS_ENV'] = 'test'
|
2
2
|
|
3
|
+
begin
|
4
|
+
require './spec/support/simplecov_helper'
|
5
|
+
include SimpleCovHelper
|
6
|
+
start_simple_cov('unit')
|
7
|
+
rescue LoadError
|
8
|
+
puts "Coverage disabled."
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'active_record'
|
12
|
+
|
13
|
+
jruby = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
14
|
+
|
15
|
+
$adapter = ENV['ADAPTER'] ||
|
16
|
+
if jruby
|
17
|
+
'jdbcpostgresql'
|
18
|
+
else
|
19
|
+
'postgresql'
|
20
|
+
end
|
21
|
+
|
22
|
+
DATABASE_CONFIG = YAML.load_file(File.expand_path("../config/database.yml", File.dirname(__FILE__)))
|
23
|
+
|
24
|
+
if DATABASE_CONFIG[$adapter].nil?
|
25
|
+
puts "No such adapter '#{$adapter}'. Valid adapters are #{DATABASE_CONFIG.keys.join(', ')}."
|
26
|
+
exit 1
|
27
|
+
end
|
28
|
+
|
29
|
+
if ENV['TRAVIS']
|
30
|
+
DATABASE_CONFIG[$adapter]['username'] = 'postgres'
|
31
|
+
else
|
32
|
+
require 'etc'
|
33
|
+
DATABASE_CONFIG[$adapter]['username'] = Etc.getlogin
|
34
|
+
end
|
35
|
+
|
36
|
+
puts "Using #{$adapter} adapter."
|
37
|
+
|
38
|
+
ActiveRecord::Base.establish_connection(DATABASE_CONFIG[$adapter])
|
39
|
+
|
40
|
+
require 'generators/templates/create_rapns_notifications'
|
41
|
+
require 'generators/templates/create_rapns_feedback'
|
42
|
+
require 'generators/templates/add_alert_is_json_to_rapns_notifications'
|
43
|
+
require 'generators/templates/add_app_to_rapns'
|
44
|
+
require 'generators/templates/create_rapns_apps'
|
45
|
+
require 'generators/templates/add_gcm'
|
46
|
+
|
47
|
+
[CreateRapnsNotifications, CreateRapnsFeedback,
|
48
|
+
AddAlertIsJsonToRapnsNotifications, AddAppToRapns, CreateRapnsApps, AddGcm].each do |migration|
|
49
|
+
migration.down rescue ActiveRecord::StatementInvalid
|
50
|
+
migration.up
|
51
|
+
end
|
52
|
+
|
53
|
+
require 'bundler'
|
54
|
+
Bundler.require(:default)
|
55
|
+
|
56
|
+
require 'shoulda'
|
57
|
+
require 'database_cleaner'
|
58
|
+
|
59
|
+
DatabaseCleaner.strategy = :truncation
|
60
|
+
|
61
|
+
require 'rapns'
|
62
|
+
require 'rapns/daemon'
|
63
|
+
|
64
|
+
Rapns::Notification.reset_column_information
|
65
|
+
Rapns::App.reset_column_information
|
66
|
+
Rapns::Apns::Feedback.reset_column_information
|
67
|
+
|
68
|
+
RSpec.configure do |config|
|
69
|
+
# config.before :suite do
|
70
|
+
# PerfTools::CpuProfiler.start('/tmp/rapns_profile')
|
71
|
+
# end
|
72
|
+
# config.after :suite do
|
73
|
+
# PerfTools::CpuProfiler.stop
|
74
|
+
# end
|
75
|
+
|
76
|
+
config.before(:each) { DatabaseCleaner.clean }
|
77
|
+
end
|
3
78
|
|
4
79
|
# a test certificate that contains both an X509 certificate and
|
5
80
|
# a private key, similar to those used for connecting to Apple
|
@@ -72,18 +147,3 @@ jxWqQiPAdJtb3xKryJSCMtFPH9azedoCrSgaMflJ1QgoXgpiKZyoEXWraVUggh/0
|
|
72
147
|
CEavgZcTZ6SvMuayqJdGGB+zb1V8XwXMtCjApR/kTm47DjxO4DmpOPs=
|
73
148
|
-----END RSA PRIVATE KEY-----
|
74
149
|
EOF
|
75
|
-
|
76
|
-
|
77
|
-
describe Rapns::App do
|
78
|
-
|
79
|
-
it "does not validate an app with an invalid certificate" do
|
80
|
-
@app = Rapns::App.new :key => 'test', :environment => 'development', :certificate => 'foo'
|
81
|
-
@app.should_not be_valid
|
82
|
-
@app.errors.should include(:certificate)
|
83
|
-
end
|
84
|
-
|
85
|
-
it "does validate a real certificate" do
|
86
|
-
@app = Rapns::App.new :key => 'test', :environment => 'development', :certificate => TEST_CERT
|
87
|
-
@app.should be_valid
|
88
|
-
end
|
89
|
-
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rapns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 3.0.0.beta.1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ian Leitch
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '1.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: net-http-persistent
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
description: Easy to use, full featured APNs daemon for Rails 3
|
31
47
|
email:
|
32
48
|
- port001@gmail.com
|
@@ -41,52 +57,83 @@ files:
|
|
41
57
|
- lib/generators/rapns_generator.rb
|
42
58
|
- lib/generators/templates/add_alert_is_json_to_rapns_notifications.rb
|
43
59
|
- lib/generators/templates/add_app_to_rapns.rb
|
60
|
+
- lib/generators/templates/add_gcm.rb
|
44
61
|
- lib/generators/templates/create_rapns_apps.rb
|
45
62
|
- lib/generators/templates/create_rapns_feedback.rb
|
46
63
|
- lib/generators/templates/create_rapns_notifications.rb
|
47
64
|
- lib/rapns.rb
|
65
|
+
- lib/rapns/apns/app.rb
|
66
|
+
- lib/rapns/apns/binary_notification_validator.rb
|
67
|
+
- lib/rapns/apns/device_token_format_validator.rb
|
68
|
+
- lib/rapns/apns/feedback.rb
|
69
|
+
- lib/rapns/apns/notification.rb
|
48
70
|
- lib/rapns/app.rb
|
49
|
-
- lib/rapns/
|
50
|
-
- lib/rapns/config.rb
|
71
|
+
- lib/rapns/configuration.rb
|
51
72
|
- lib/rapns/daemon.rb
|
73
|
+
- lib/rapns/daemon/apns/app_runner.rb
|
74
|
+
- lib/rapns/daemon/apns/connection.rb
|
75
|
+
- lib/rapns/daemon/apns/delivery.rb
|
76
|
+
- lib/rapns/daemon/apns/delivery_handler.rb
|
77
|
+
- lib/rapns/daemon/apns/disconnection_error.rb
|
78
|
+
- lib/rapns/daemon/apns/feedback_receiver.rb
|
52
79
|
- lib/rapns/daemon/app_runner.rb
|
53
|
-
- lib/rapns/daemon/connection.rb
|
54
80
|
- lib/rapns/daemon/database_reconnectable.rb
|
81
|
+
- lib/rapns/daemon/delivery.rb
|
55
82
|
- lib/rapns/daemon/delivery_error.rb
|
56
83
|
- lib/rapns/daemon/delivery_handler.rb
|
57
|
-
- lib/rapns/daemon/delivery_handler_pool.rb
|
58
84
|
- lib/rapns/daemon/delivery_queue.rb
|
59
85
|
- lib/rapns/daemon/delivery_queue_18.rb
|
60
86
|
- lib/rapns/daemon/delivery_queue_19.rb
|
61
|
-
- lib/rapns/daemon/disconnection_error.rb
|
62
|
-
- lib/rapns/daemon/feedback_receiver.rb
|
63
87
|
- lib/rapns/daemon/feeder.rb
|
88
|
+
- lib/rapns/daemon/gcm/app_runner.rb
|
89
|
+
- lib/rapns/daemon/gcm/delivery.rb
|
90
|
+
- lib/rapns/daemon/gcm/delivery_handler.rb
|
64
91
|
- lib/rapns/daemon/interruptible_sleep.rb
|
65
92
|
- lib/rapns/daemon/logger.rb
|
66
|
-
- lib/rapns/
|
67
|
-
- lib/rapns/
|
93
|
+
- lib/rapns/gcm/app.rb
|
94
|
+
- lib/rapns/gcm/expiry_collapse_key_mutual_inclusion_validator.rb
|
95
|
+
- lib/rapns/gcm/notification.rb
|
96
|
+
- lib/rapns/gcm/payload_size_validator.rb
|
97
|
+
- lib/rapns/multi_json_helper.rb
|
68
98
|
- lib/rapns/notification.rb
|
69
99
|
- lib/rapns/patches.rb
|
70
100
|
- lib/rapns/patches/rails/3.1.0/postgresql_adapter.rb
|
71
101
|
- lib/rapns/patches/rails/3.1.1/postgresql_adapter.rb
|
72
102
|
- lib/rapns/version.rb
|
103
|
+
- lib/tasks/cane.rake
|
104
|
+
- lib/tasks/test.rake
|
73
105
|
- config/database.yml
|
74
|
-
- spec/
|
75
|
-
- spec/
|
76
|
-
- spec/
|
77
|
-
- spec/
|
78
|
-
- spec/
|
79
|
-
- spec/
|
80
|
-
- spec/
|
81
|
-
- spec/
|
82
|
-
- spec/
|
83
|
-
- spec/
|
84
|
-
- spec/
|
85
|
-
- spec/
|
86
|
-
- spec/
|
87
|
-
- spec/
|
88
|
-
- spec/
|
89
|
-
- spec/
|
106
|
+
- spec/acceptance/gcm_upgrade_spec.rb
|
107
|
+
- spec/acceptance_spec_helper.rb
|
108
|
+
- spec/support/simplecov_helper.rb
|
109
|
+
- spec/support/simplecov_quality_formatter.rb
|
110
|
+
- spec/unit/apns/app_spec.rb
|
111
|
+
- spec/unit/apns/feedback_spec.rb
|
112
|
+
- spec/unit/apns/notification_spec.rb
|
113
|
+
- spec/unit/app_spec.rb
|
114
|
+
- spec/unit/daemon/apns/app_runner_spec.rb
|
115
|
+
- spec/unit/daemon/apns/connection_spec.rb
|
116
|
+
- spec/unit/daemon/apns/delivery_handler_spec.rb
|
117
|
+
- spec/unit/daemon/apns/delivery_spec.rb
|
118
|
+
- spec/unit/daemon/apns/feedback_receiver_spec.rb
|
119
|
+
- spec/unit/daemon/app_runner_shared.rb
|
120
|
+
- spec/unit/daemon/app_runner_spec.rb
|
121
|
+
- spec/unit/daemon/database_reconnectable_spec.rb
|
122
|
+
- spec/unit/daemon/delivery_error_spec.rb
|
123
|
+
- spec/unit/daemon/delivery_handler_shared.rb
|
124
|
+
- spec/unit/daemon/delivery_queue_spec.rb
|
125
|
+
- spec/unit/daemon/feeder_spec.rb
|
126
|
+
- spec/unit/daemon/gcm/app_runner_spec.rb
|
127
|
+
- spec/unit/daemon/gcm/delivery_handler_spec.rb
|
128
|
+
- spec/unit/daemon/gcm/delivery_spec.rb
|
129
|
+
- spec/unit/daemon/interruptible_sleep_spec.rb
|
130
|
+
- spec/unit/daemon/logger_spec.rb
|
131
|
+
- spec/unit/daemon_spec.rb
|
132
|
+
- spec/unit/gcm/app_spec.rb
|
133
|
+
- spec/unit/gcm/notification_spec.rb
|
134
|
+
- spec/unit/notification_shared.rb
|
135
|
+
- spec/unit/notification_spec.rb
|
136
|
+
- spec/unit_spec_helper.rb
|
90
137
|
- bin/rapns
|
91
138
|
homepage: https://github.com/ileitch/rapns
|
92
139
|
licenses: []
|
@@ -103,9 +150,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
151
|
none: false
|
105
152
|
requirements:
|
106
|
-
- - ! '
|
153
|
+
- - ! '>'
|
107
154
|
- !ruby/object:Gem::Version
|
108
|
-
version:
|
155
|
+
version: 1.3.1
|
109
156
|
requirements: []
|
110
157
|
rubyforge_project:
|
111
158
|
rubygems_version: 1.8.23
|
@@ -114,19 +161,34 @@ specification_version: 3
|
|
114
161
|
summary: Easy to use, full featured APNs daemon for Rails 3
|
115
162
|
test_files:
|
116
163
|
- config/database.yml
|
117
|
-
- spec/
|
118
|
-
- spec/
|
119
|
-
- spec/
|
120
|
-
- spec/
|
121
|
-
- spec/
|
122
|
-
- spec/
|
123
|
-
- spec/
|
124
|
-
- spec/
|
125
|
-
- spec/
|
126
|
-
- spec/
|
127
|
-
- spec/
|
128
|
-
- spec/
|
129
|
-
- spec/
|
130
|
-
- spec/
|
131
|
-
- spec/
|
132
|
-
- spec/
|
164
|
+
- spec/acceptance/gcm_upgrade_spec.rb
|
165
|
+
- spec/acceptance_spec_helper.rb
|
166
|
+
- spec/support/simplecov_helper.rb
|
167
|
+
- spec/support/simplecov_quality_formatter.rb
|
168
|
+
- spec/unit/apns/app_spec.rb
|
169
|
+
- spec/unit/apns/feedback_spec.rb
|
170
|
+
- spec/unit/apns/notification_spec.rb
|
171
|
+
- spec/unit/app_spec.rb
|
172
|
+
- spec/unit/daemon/apns/app_runner_spec.rb
|
173
|
+
- spec/unit/daemon/apns/connection_spec.rb
|
174
|
+
- spec/unit/daemon/apns/delivery_handler_spec.rb
|
175
|
+
- spec/unit/daemon/apns/delivery_spec.rb
|
176
|
+
- spec/unit/daemon/apns/feedback_receiver_spec.rb
|
177
|
+
- spec/unit/daemon/app_runner_shared.rb
|
178
|
+
- spec/unit/daemon/app_runner_spec.rb
|
179
|
+
- spec/unit/daemon/database_reconnectable_spec.rb
|
180
|
+
- spec/unit/daemon/delivery_error_spec.rb
|
181
|
+
- spec/unit/daemon/delivery_handler_shared.rb
|
182
|
+
- spec/unit/daemon/delivery_queue_spec.rb
|
183
|
+
- spec/unit/daemon/feeder_spec.rb
|
184
|
+
- spec/unit/daemon/gcm/app_runner_spec.rb
|
185
|
+
- spec/unit/daemon/gcm/delivery_handler_spec.rb
|
186
|
+
- spec/unit/daemon/gcm/delivery_spec.rb
|
187
|
+
- spec/unit/daemon/interruptible_sleep_spec.rb
|
188
|
+
- spec/unit/daemon/logger_spec.rb
|
189
|
+
- spec/unit/daemon_spec.rb
|
190
|
+
- spec/unit/gcm/app_spec.rb
|
191
|
+
- spec/unit/gcm/notification_spec.rb
|
192
|
+
- spec/unit/notification_shared.rb
|
193
|
+
- spec/unit/notification_spec.rb
|
194
|
+
- spec/unit_spec_helper.rb
|