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,208 +0,0 @@
|
|
1
|
-
# encoding: US-ASCII
|
2
|
-
|
3
|
-
require "unit_spec_helper"
|
4
|
-
require 'unit/notification_shared.rb'
|
5
|
-
|
6
|
-
describe Rpush::Apns::Notification do
|
7
|
-
it_should_behave_like 'an Notification subclass'
|
8
|
-
|
9
|
-
let(:app) { Rpush::Apns::App.create!(:name => 'my_app', :environment => 'development', :certificate => TEST_CERT) }
|
10
|
-
let(:notification_class) { Rpush::Apns::Notification }
|
11
|
-
let(:notification) { notification_class.new }
|
12
|
-
let(:data_setter) { 'attributes_for_device=' }
|
13
|
-
let(:data_getter) { 'attributes_for_device' }
|
14
|
-
|
15
|
-
it "should validate the format of the device_token" do
|
16
|
-
notification = Rpush::Apns::Notification.new(:device_token => "{$%^&*()}")
|
17
|
-
notification.valid?.should be_false
|
18
|
-
notification.errors[:device_token].include?("is invalid").should be_true
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should validate the length of the binary conversion of the notification" do
|
22
|
-
notification.device_token = "a" * 64
|
23
|
-
notification.alert = "way too long!" * 100
|
24
|
-
notification.valid?.should be_false
|
25
|
-
notification.errors[:base].include?("APN notification cannot be larger than 256 bytes. Try condensing your alert and device attributes.").should be_true
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should default the sound to 'default'" do
|
29
|
-
notification.sound.should eq('default')
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should default the expiry to 1 day" do
|
33
|
-
notification.expiry.should eq 1.day.to_i
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe Rpush::Apns::Notification, "when assigning the device token" do
|
38
|
-
it "should strip spaces from the given string" do
|
39
|
-
notification = Rpush::Apns::Notification.new(:device_token => "o m g")
|
40
|
-
notification.device_token.should eq "omg"
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should strip chevrons from the given string" do
|
44
|
-
notification = Rpush::Apns::Notification.new(:device_token => "<omg>")
|
45
|
-
notification.device_token.should eq "omg"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe Rpush::Apns::Notification, "as_json" do
|
50
|
-
it "should include the alert if present" do
|
51
|
-
notification = Rpush::Apns::Notification.new(:alert => "hi mom")
|
52
|
-
notification.as_json["aps"]["alert"].should eq "hi mom"
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should not include the alert key if the alert is not present" do
|
56
|
-
notification = Rpush::Apns::Notification.new(:alert => nil)
|
57
|
-
notification.as_json["aps"].key?("alert").should be_false
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should encode the alert as JSON if it is a Hash" do
|
61
|
-
notification = Rpush::Apns::Notification.new(:alert => { 'body' => "hi mom", 'alert-loc-key' => "View" })
|
62
|
-
notification.as_json["aps"]["alert"].should eq ({ 'body' => "hi mom", 'alert-loc-key' => "View" })
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should include the badge if present" do
|
66
|
-
notification = Rpush::Apns::Notification.new(:badge => 6)
|
67
|
-
notification.as_json["aps"]["badge"].should eq 6
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should not include the badge key if the badge is not present" do
|
71
|
-
notification = Rpush::Apns::Notification.new(:badge => nil)
|
72
|
-
notification.as_json["aps"].key?("badge").should be_false
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should include the sound if present" do
|
76
|
-
notification = Rpush::Apns::Notification.new(:alert => "my_sound.aiff")
|
77
|
-
notification.as_json["aps"]["alert"].should eq "my_sound.aiff"
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should not include the sound key if the sound is not present" do
|
81
|
-
notification = Rpush::Apns::Notification.new(:sound => false)
|
82
|
-
notification.as_json["aps"].key?("sound").should be_false
|
83
|
-
end
|
84
|
-
|
85
|
-
it "should include attributes for the device" do
|
86
|
-
notification = Rpush::Apns::Notification.new
|
87
|
-
notification.attributes_for_device = {:omg => :lol, :wtf => :dunno}
|
88
|
-
notification.as_json["omg"].should eq "lol"
|
89
|
-
notification.as_json["wtf"].should eq "dunno"
|
90
|
-
end
|
91
|
-
|
92
|
-
it "should allow attributes to include a hash" do
|
93
|
-
notification = Rpush::Apns::Notification.new
|
94
|
-
notification.attributes_for_device = {:omg => {:ilike => :hashes}}
|
95
|
-
notification.as_json["omg"]["ilike"].should eq "hashes"
|
96
|
-
end
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
describe Rpush::Apns::Notification, 'MDM' do
|
101
|
-
let(:magic) { 'abc123' }
|
102
|
-
let(:notification) { Rpush::Apns::Notification.new }
|
103
|
-
|
104
|
-
it 'includes the mdm magic in the payload' do
|
105
|
-
notification.mdm = magic
|
106
|
-
notification.as_json.should eq ({'mdm' => magic})
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'does not include aps attribute' do
|
110
|
-
notification.alert = "i'm doomed"
|
111
|
-
notification.mdm = magic
|
112
|
-
notification.as_json.key?('aps').should be_false
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
describe Rpush::Apns::Notification, 'content-available' do
|
117
|
-
let(:notification) { Rpush::Apns::Notification.new }
|
118
|
-
|
119
|
-
it 'includes content-available in the payload' do
|
120
|
-
notification.content_available = true
|
121
|
-
notification.as_json['aps']['content-available'].should eq 1
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'does not include content-available in the payload if not set' do
|
125
|
-
notification.as_json['aps'].key?('content-available').should be_false
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'does not include content-available as a non-aps attribute' do
|
129
|
-
notification.content_available = true
|
130
|
-
notification.as_json.key?('content-available').should be_false
|
131
|
-
end
|
132
|
-
|
133
|
-
it 'does not overwrite existing attributes for the device' do
|
134
|
-
notification.data = {:hi => :mom}
|
135
|
-
notification.content_available = true
|
136
|
-
notification.as_json['aps']['content-available'].should eq 1
|
137
|
-
notification.as_json['hi'].should eq 'mom'
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'does not overwrite the content-available flag when setting attributes for the device' do
|
141
|
-
notification.content_available = true
|
142
|
-
notification.data = {:hi => :mom}
|
143
|
-
notification.as_json['aps']['content-available'].should eq 1
|
144
|
-
notification.as_json['hi'].should eq 'mom'
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
describe Rpush::Apns::Notification, "to_binary" do
|
149
|
-
it "should correctly convert the notification to binary" do
|
150
|
-
notification = Rpush::Apns::Notification.new
|
151
|
-
notification.device_token = "a" * 64
|
152
|
-
notification.sound = "1.aiff"
|
153
|
-
notification.badge = 3
|
154
|
-
notification.alert = "Don't panic Mr Mainwaring, don't panic!"
|
155
|
-
notification.attributes_for_device = {:hi => :mom}
|
156
|
-
notification.expiry = 86400 # 1 day, \x00\x01Q\x80
|
157
|
-
notification.app = Rpush::Apns::App.new(:name => 'my_app', :environment => 'development', :certificate => TEST_CERT)
|
158
|
-
notification.stub(:id).and_return(1234)
|
159
|
-
notification.to_binary.should eq "\x01\x00\x00\x04\xD2\x00\x01Q\x80\x00 \xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\x00a{\"aps\":{\"alert\":\"Don't panic Mr Mainwaring, don't panic!\",\"badge\":3,\"sound\":\"1.aiff\"},\"hi\":\"mom\"}"
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
describe Rpush::Apns::Notification, "bug #31" do
|
164
|
-
it 'does not confuse a JSON looking string as JSON' do
|
165
|
-
notification = Rpush::Apns::Notification.new
|
166
|
-
notification.alert = "{\"one\":2}"
|
167
|
-
notification.alert.should eq "{\"one\":2}"
|
168
|
-
end
|
169
|
-
|
170
|
-
it 'does confuse a JSON looking string as JSON if the alert_is_json attribute is not present' do
|
171
|
-
notification = Rpush::Apns::Notification.new
|
172
|
-
notification.stub(:has_attribute? => false)
|
173
|
-
notification.alert = "{\"one\":2}"
|
174
|
-
notification.alert.should eq ({"one" => 2})
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
describe Rpush::Apns::Notification, "bug #35" do
|
179
|
-
it "should limit payload size to 256 bytes but not the entire packet" do
|
180
|
-
notification = Rpush::Apns::Notification.new do |n|
|
181
|
-
n.device_token = "a" * 64
|
182
|
-
n.alert = "a" * 210
|
183
|
-
n.app = Rpush::Apns::App.create!(:name => 'my_app', :environment => 'development', :certificate => TEST_CERT)
|
184
|
-
end
|
185
|
-
|
186
|
-
notification.to_binary(:for_validation => true).bytesize.should > 256
|
187
|
-
notification.payload_size.should < 256
|
188
|
-
notification.should be_valid
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
describe Rpush::Apns::Notification, "multi_json usage" do
|
193
|
-
describe Rpush::Apns::Notification, "alert" do
|
194
|
-
it "should call MultiJson.load when multi_json version is 1.3.0" do
|
195
|
-
notification = Rpush::Apns::Notification.new(:alert => { :a => 1 }, :alert_is_json => true)
|
196
|
-
Gem.stub(:loaded_specs).and_return( { 'multi_json' => Gem::Specification.new('multi_json', '1.3.0') } )
|
197
|
-
MultiJson.should_receive(:load).with(any_args())
|
198
|
-
notification.alert
|
199
|
-
end
|
200
|
-
|
201
|
-
it "should call MultiJson.decode when multi_json version is 1.2.9" do
|
202
|
-
notification = Rpush::Apns::Notification.new(:alert => { :a => 1 }, :alert_is_json => true)
|
203
|
-
Gem.stub(:loaded_specs).and_return( { 'multi_json' => Gem::Specification.new('multi_json', '1.2.9') } )
|
204
|
-
MultiJson.should_receive(:decode).with(any_args())
|
205
|
-
notification.alert
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
data/spec/unit/app_spec.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
|
3
|
-
describe Rpush::App do
|
4
|
-
it 'validates the uniqueness of name within type and environment' do
|
5
|
-
Rpush::Apns::App.create!(:name => 'test', :environment => 'production', :certificate => TEST_CERT)
|
6
|
-
app = Rpush::Apns::App.new(:name => 'test', :environment => 'production', :certificate => TEST_CERT)
|
7
|
-
app.valid?.should be_false
|
8
|
-
app.errors[:name].should eq ['has already been taken']
|
9
|
-
|
10
|
-
app = Rpush::Apns::App.new(:name => 'test', :environment => 'development', :certificate => TEST_CERT)
|
11
|
-
app.valid?.should be_true
|
12
|
-
|
13
|
-
app = Rpush::Gcm::App.new(:name => 'test', :environment => 'production', :auth_key => TEST_CERT)
|
14
|
-
app.valid?.should be_true
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'validating certificates' do
|
18
|
-
it 'rescues from certificate error' do
|
19
|
-
app = Rpush::Apns::App.new(:name => 'test', :environment => 'development', :certificate => 'bad')
|
20
|
-
expect{app.valid?}.not_to raise_error
|
21
|
-
expect(app.valid?).to be_false
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'raises other errors' do
|
25
|
-
app = Rpush::Apns::App.new(:name => 'test', :environment => 'development', :certificate => 'bad')
|
26
|
-
OpenSSL::X509::Certificate.stub(:new).and_raise(NameError, 'simulating no openssl')
|
27
|
-
expect{app.valid?}.to raise_error(NameError)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
|
3
|
-
describe Rpush::Apns::DisconnectionError do
|
4
|
-
let(:error) { Rpush::Apns::DisconnectionError.new }
|
5
|
-
|
6
|
-
it 'returns a nil error code' do
|
7
|
-
error.code.should be_nil
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'contains an error description' do
|
11
|
-
error.description
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns a message' do
|
15
|
-
error.message
|
16
|
-
error.to_s
|
17
|
-
end
|
18
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
|
3
|
-
describe Rpush::Daemon::DispatcherLoopCollection do
|
4
|
-
let(:dispatcher_loop) { double.as_null_object }
|
5
|
-
let(:collection) { Rpush::Daemon::DispatcherLoopCollection.new }
|
6
|
-
|
7
|
-
it 'returns the size of the collection' do
|
8
|
-
collection.push(dispatcher_loop)
|
9
|
-
collection.size.should eq 1
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'pops a dispatcher loop from the collection' do
|
13
|
-
collection.push(dispatcher_loop)
|
14
|
-
dispatcher_loop.should_receive(:stop)
|
15
|
-
dispatcher_loop.should_receive(:wakeup)
|
16
|
-
dispatcher_loop.should_receive(:wait)
|
17
|
-
collection.pop
|
18
|
-
collection.size.should eq 0
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'wakes up all dispatcher loops when popping a single dispatcher_loop' do
|
22
|
-
collection.push(dispatcher_loop)
|
23
|
-
dispatcher_loop2 = double.as_null_object
|
24
|
-
collection.push(dispatcher_loop2)
|
25
|
-
dispatcher_loop.should_receive(:wakeup)
|
26
|
-
dispatcher_loop2.should_receive(:wakeup)
|
27
|
-
collection.pop
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'stops all dispatcher detetcloops' do
|
31
|
-
collection.push(dispatcher_loop)
|
32
|
-
dispatcher_loop.should_receive(:stop)
|
33
|
-
dispatcher_loop.should_receive(:wakeup)
|
34
|
-
dispatcher_loop.should_receive(:wait)
|
35
|
-
collection.stop
|
36
|
-
end
|
37
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
require "unit_spec_helper"
|
2
|
-
|
3
|
-
describe Rpush::Daemon::InterruptibleSleep do
|
4
|
-
|
5
|
-
let(:rd) { double(:close => nil) }
|
6
|
-
let(:wr) { double(:close => nil) }
|
7
|
-
|
8
|
-
subject { Rpush::Daemon::InterruptibleSleep.new }
|
9
|
-
|
10
|
-
it 'creates a new pipe' do
|
11
|
-
IO.should_receive(:pipe)
|
12
|
-
subject
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'selects on the reader' do
|
16
|
-
IO.stub(:pipe => [rd, wr])
|
17
|
-
IO.should_receive(:select).with([rd], nil, nil, 1)
|
18
|
-
subject.sleep(1)
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'closes the writer' do
|
22
|
-
IO.stub(:pipe => [rd, wr])
|
23
|
-
rd.should_receive(:close)
|
24
|
-
wr.should_receive(:close)
|
25
|
-
subject.close
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'returns false when timeout occurs' do
|
29
|
-
expect(subject.sleep(0.01)).to be_false
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'returns true when sleep does not timeout' do
|
33
|
-
subject.interrupt_sleep
|
34
|
-
expect(subject.sleep(0.01)).to be_true
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'with UDP socket connected' do
|
38
|
-
before :each do
|
39
|
-
@host, @port = subject.enable_wake_on_udp('127.0.0.1', 0)
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'times out with no udp activity' do
|
43
|
-
expect(subject.sleep(0.01)).to be_false
|
44
|
-
end
|
45
|
-
|
46
|
-
unless defined? JRUBY_VERSION
|
47
|
-
it 'wakes on UDPSocket' do
|
48
|
-
waker = UDPSocket.new
|
49
|
-
waker.connect(@host, @port)
|
50
|
-
waker.write('x')
|
51
|
-
expect(subject.sleep(0.01)).to be_true
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'consumes all data on udp socket' do
|
55
|
-
waker = UDPSocket.new
|
56
|
-
waker.connect(@host, @port)
|
57
|
-
waker.send('x', 0)
|
58
|
-
waker.send('x', 0)
|
59
|
-
waker.send('x', 0)
|
60
|
-
# true since there is data to be read => no timeout
|
61
|
-
expect(subject.sleep(0.01)).to be_true
|
62
|
-
# false since data is consumed => wait for full timeout
|
63
|
-
expect(subject.sleep(0.01)).to be_false
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require "unit_spec_helper"
|
2
|
-
|
3
|
-
describe Rpush::TooManyRequestsError do
|
4
|
-
let(:response) { double(:code => 429, :header => { 'retry-after' => 3600 }) }
|
5
|
-
let(:error) { Rpush::TooManyRequestsError.new(429, 12, "Too Many Requests", response) }
|
6
|
-
|
7
|
-
it "returns an informative message" do
|
8
|
-
error.to_s.should eq "Too many requests for 12, received error 429 (Too Many Requests) - retry after 3600"
|
9
|
-
end
|
10
|
-
|
11
|
-
it "returns the error code" do
|
12
|
-
error.code.should eq 429
|
13
|
-
end
|
14
|
-
end
|
data/spec/unit/gcm/app_spec.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require "unit_spec_helper"
|
2
|
-
|
3
|
-
describe Rpush::Notification do
|
4
|
-
let(:notification) { Rpush::Notification.new }
|
5
|
-
|
6
|
-
it 'allows assignment of many registration IDs' do
|
7
|
-
notification.registration_ids = ['a', 'b']
|
8
|
-
notification.registration_ids.should eq ['a', 'b']
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'allows assignment of a single registration ID' do
|
12
|
-
notification.registration_ids = 'a'
|
13
|
-
notification.registration_ids.should eq ['a']
|
14
|
-
end
|
15
|
-
end
|
data/spec/unit/notifier_spec.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
require 'rpush/notifier'
|
3
|
-
|
4
|
-
describe Rpush::Notifier do
|
5
|
-
|
6
|
-
before(:each) { @port = 5000 }
|
7
|
-
subject { Rpush::Notifier.new('127.0.0.1', @port) }
|
8
|
-
its(:socket) { should_not be_nil }
|
9
|
-
|
10
|
-
context "when connected" do
|
11
|
-
before :each do
|
12
|
-
@reader = UDPSocket.new
|
13
|
-
@reader.bind('127.0.0.1', 0)
|
14
|
-
@port = @reader.addr[1]
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "notify" do
|
18
|
-
it "calls write on the socket" do
|
19
|
-
UDPSocket.any_instance.should_receive(:write)
|
20
|
-
subject.notify
|
21
|
-
end
|
22
|
-
|
23
|
-
it "writes data that can be read from socket" do
|
24
|
-
subject.notify
|
25
|
-
expect(@reader.recv(1)).to eq 'x'
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "default notifier" do
|
31
|
-
it "creates using :connect first" do
|
32
|
-
Rpush.config.stub :wakeup => { :connect => '127.0.0.1', :port => 1234 }
|
33
|
-
Rpush::Notifier.should_receive(:new).with('127.0.0.1', 1234)
|
34
|
-
Rpush.notifier
|
35
|
-
end
|
36
|
-
|
37
|
-
it "creates using :host next" do
|
38
|
-
Rpush.config.stub :wakeup => { :host => '127.0.0.1', :port => 1234 }
|
39
|
-
Rpush::Notifier.should_receive(:new).with('127.0.0.1', 1234)
|
40
|
-
Rpush.notifier
|
41
|
-
end
|
42
|
-
|
43
|
-
it "returns nil when wakeup is not specified" do
|
44
|
-
Rpush.config.stub :wakeup => nil
|
45
|
-
Rpush::Notifier.should_not_receive(:new)
|
46
|
-
expect(Rpush.notifier).to be_nil
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/spec/unit/wpns/app_spec.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
require 'unit/notification_shared.rb'
|
3
|
-
|
4
|
-
describe Rpush::Wpns::Notification do
|
5
|
-
it_should_behave_like 'an Notification subclass'
|
6
|
-
let(:app) { Rpush::Wpns::App.create!(:name => 'test', :auth_key => 'abc') }
|
7
|
-
let(:notification_class) { Rpush::Wpns::Notification }
|
8
|
-
let(:notification) { notification_class.new }
|
9
|
-
let(:data_setter) { 'data=' }
|
10
|
-
let(:data_getter) { 'data' }
|
11
|
-
|
12
|
-
it "should have an url in the uri parameter" do
|
13
|
-
notification = Rpush::Wpns::Notification.new(:uri => "somthing")
|
14
|
-
notification.valid?
|
15
|
-
notification.errors[:uri].include?("is invalid").should be_true
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should be invalid if there's no message" do
|
19
|
-
notification = Rpush::Wpns::Notification.new(:alert => "")
|
20
|
-
notification.valid?
|
21
|
-
notification.errors[:alert].include?("can't be blank").should be_true
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe Rpush::Wpns::Notification, "when assigning the url" do
|
26
|
-
it "should be a valid url" do
|
27
|
-
notification = Rpush::Wpns::Notification.new(:alert => "abc", :uri => "some")
|
28
|
-
notification.uri_is_valid?.should be_false
|
29
|
-
end
|
30
|
-
end
|