rpush 1.0.0 → 2.0.0.beta1
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 +13 -0
- data/README.md +12 -14
- data/bin/rpush +11 -2
- 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 +10 -7
- data/lib/generators/templates/rpush_2_0_0_updates.rb +23 -0
- data/lib/rpush.rb +4 -28
- data/lib/rpush/client/active_model.rb +21 -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_record.rb +19 -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 +20 -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/redis.rb +35 -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 +22 -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/configuration.rb +27 -6
- data/lib/rpush/daemon.rb +36 -56
- data/lib/rpush/daemon/adm/delivery.rb +50 -52
- data/lib/rpush/daemon/apns.rb +6 -5
- data/lib/rpush/daemon/apns/delivery.rb +20 -44
- data/lib/rpush/daemon/apns/feedback_receiver.rb +11 -8
- data/lib/rpush/daemon/app_runner.rb +67 -60
- 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 +106 -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 +15 -6
- 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/ring_buffer.rb +16 -0
- data/lib/rpush/daemon/service_config_methods.rb +23 -7
- data/lib/rpush/daemon/signal_handler.rb +51 -0
- data/lib/rpush/daemon/store/active_record.rb +71 -38
- data/lib/rpush/daemon/store/active_record/reconnectable.rb +15 -15
- data/lib/rpush/daemon/store/interface.rb +19 -0
- data/lib/rpush/daemon/store/redis.rb +149 -0
- data/lib/rpush/daemon/tcp_connection.rb +6 -11
- data/lib/rpush/daemon/wpns/delivery.rb +21 -30
- data/lib/rpush/deprecatable.rb +4 -3
- data/lib/rpush/deprecation.rb +7 -10
- data/lib/rpush/embed.rb +7 -2
- data/lib/rpush/logger.rb +11 -15
- data/lib/rpush/push.rb +0 -1
- data/lib/rpush/reflection.rb +6 -12
- data/lib/rpush/version.rb +1 -1
- data/lib/tasks/quality.rake +34 -0
- data/spec/.rubocop.yml +4 -0
- data/spec/functional/adm_spec.rb +3 -6
- data/spec/functional/apns_spec.rb +118 -24
- data/spec/functional/embed_spec.rb +22 -20
- data/spec/functional/gcm_spec.rb +4 -7
- data/spec/functional/new_app_spec.rb +61 -0
- data/spec/functional/retry_spec.rb +46 -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 +15 -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 +57 -54
- 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 +24 -17
- data/spec/unit/daemon/app_runner_spec.rb +66 -123
- 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 +7 -12
- data/spec/unit/daemon/feeder_spec.rb +40 -39
- data/spec/unit/daemon/gcm/delivery_spec.rb +108 -89
- 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 +72 -0
- data/spec/unit/daemon/store/active_record/reconnectable_spec.rb +9 -9
- 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/too_many_requests_error_spec.rb +1 -1
- data/spec/unit/daemon/wpns/delivery_spec.rb +61 -50
- data/spec/unit/daemon_spec.rb +46 -81
- data/spec/unit/embed_spec.rb +4 -2
- data/spec/unit/logger_spec.rb +30 -40
- data/spec/unit/notification_shared.rb +9 -79
- data/spec/unit/push_spec.rb +3 -8
- 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 +119 -67
- 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/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/interruptible_sleep_spec.rb +0 -68
- 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,7 +1,7 @@
|
|
|
1
1
|
require "unit_spec_helper"
|
|
2
2
|
|
|
3
3
|
describe Rpush::TooManyRequestsError do
|
|
4
|
-
let(:response) { double(:
|
|
4
|
+
let(:response) { double(code: 429, header: { 'retry-after' => 3600 }) }
|
|
5
5
|
let(:error) { Rpush::TooManyRequestsError.new(429, 12, "Too Many Requests", response) }
|
|
6
6
|
|
|
7
7
|
it "returns an informative message" do
|
|
@@ -1,37 +1,44 @@
|
|
|
1
1
|
require 'unit_spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Rpush::Daemon::Wpns::Delivery do
|
|
4
|
-
let(:app) { Rpush::Wpns::App.
|
|
5
|
-
let(:notification)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
let(:
|
|
10
|
-
let(:
|
|
4
|
+
let(:app) { Rpush::Wpns::App.create!(name: "MyApp") }
|
|
5
|
+
let(:notification) do Rpush::Wpns::Notification.create!(app: app, alert: "test",
|
|
6
|
+
uri: "http://some.example/",
|
|
7
|
+
deliver_after: Time.now)
|
|
8
|
+
end
|
|
9
|
+
let(:logger) { double(error: nil, info: nil, warn: nil) }
|
|
10
|
+
let(:response) { double(code: 200, header: {}) }
|
|
11
|
+
let(:http) { double(shutdown: nil, request: response) }
|
|
11
12
|
let(:now) { Time.parse('2012-10-14 00:00:00') }
|
|
12
|
-
let(:batch) { double(mark_failed: nil, mark_delivered: nil, mark_retryable: nil) }
|
|
13
|
+
let(:batch) { double(mark_failed: nil, mark_delivered: nil, mark_retryable: nil, notification_processed: nil) }
|
|
13
14
|
let(:delivery) { Rpush::Daemon::Wpns::Delivery.new(app, http, notification, batch) }
|
|
14
|
-
let(:store) { double(:
|
|
15
|
+
let(:store) { double(create_wpns_notification: double(id: 2)) }
|
|
15
16
|
|
|
16
17
|
def perform
|
|
17
18
|
delivery.perform
|
|
18
19
|
end
|
|
19
20
|
|
|
21
|
+
def perform_with_rescue
|
|
22
|
+
expect { perform }.to raise_error
|
|
23
|
+
end
|
|
24
|
+
|
|
20
25
|
before do
|
|
21
|
-
delivery.stub(:
|
|
22
|
-
Rpush::Daemon.stub(:
|
|
23
|
-
Time.stub(:
|
|
24
|
-
Rpush.stub(:
|
|
26
|
+
delivery.stub(reflect: nil)
|
|
27
|
+
Rpush::Daemon.stub(store: store)
|
|
28
|
+
Time.stub(now: now)
|
|
29
|
+
Rpush.stub(logger: logger)
|
|
25
30
|
end
|
|
26
31
|
|
|
27
32
|
shared_examples_for "an notification with some delivery faliures" do
|
|
28
33
|
let(:new_notification) { Rpush::Wpns::Notification.where('id != ?', notification.id).first }
|
|
29
34
|
|
|
30
|
-
before { response.stub(:
|
|
35
|
+
before { response.stub(body: JSON.dump(body)) }
|
|
31
36
|
|
|
32
37
|
it "marks the original notification falied" do
|
|
33
|
-
delivery.should_receive(:mark_failed)
|
|
34
|
-
|
|
38
|
+
delivery.should_receive(:mark_failed) do |error|
|
|
39
|
+
error.message.should =~ error_description
|
|
40
|
+
end
|
|
41
|
+
perform_with_rescue
|
|
35
42
|
end
|
|
36
43
|
|
|
37
44
|
it "raises a DeliveryError" do
|
|
@@ -41,99 +48,102 @@ describe Rpush::Daemon::Wpns::Delivery do
|
|
|
41
48
|
|
|
42
49
|
describe "an 200 response" do
|
|
43
50
|
before do
|
|
44
|
-
response.stub(:
|
|
51
|
+
response.stub(code: 200)
|
|
45
52
|
end
|
|
46
53
|
|
|
47
54
|
it "marks the notification as delivered if delivered successfully to all devices" do
|
|
48
|
-
response.stub(:
|
|
49
|
-
response.stub(:
|
|
55
|
+
response.stub(body: JSON.dump("failure" => 0))
|
|
56
|
+
response.stub(to_hash: { "x-notificationstatus" => ["Received"] })
|
|
50
57
|
batch.should_receive(:mark_delivered).with(notification)
|
|
51
58
|
perform
|
|
52
59
|
end
|
|
53
60
|
|
|
54
61
|
it "retries the notification when the queue is full" do
|
|
55
|
-
response.stub(:
|
|
56
|
-
response.stub(:
|
|
57
|
-
batch.should_receive(:mark_retryable).with(notification, Time.now + (60*10))
|
|
62
|
+
response.stub(body: JSON.dump("failure" => 0))
|
|
63
|
+
response.stub(to_hash: { "x-notificationstatus" => ["QueueFull"] })
|
|
64
|
+
batch.should_receive(:mark_retryable).with(notification, Time.now + (60 * 10))
|
|
58
65
|
perform
|
|
59
66
|
end
|
|
60
67
|
|
|
61
68
|
it "marks the notification as failed if the notification is suppressed" do
|
|
62
|
-
response.stub(:
|
|
63
|
-
response.stub(:
|
|
64
|
-
|
|
65
|
-
|
|
69
|
+
response.stub(body: JSON.dump("faliure" => 0))
|
|
70
|
+
response.stub(to_hash: { "x-notificationstatus" => ["Suppressed"] })
|
|
71
|
+
error = Rpush::DeliveryError.new(200, notification.id, 'Notification was received but suppressed by the service.')
|
|
72
|
+
delivery.should_receive(:mark_failed).with(error)
|
|
73
|
+
perform_with_rescue
|
|
66
74
|
end
|
|
67
75
|
end
|
|
68
76
|
|
|
69
77
|
describe "an 400 response" do
|
|
70
|
-
before { response.stub(:
|
|
78
|
+
before { response.stub(code: 400) }
|
|
71
79
|
it "marks notifications as failed" do
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
error = Rpush::DeliveryError.new(400, notification.id, 'Bad XML or malformed notification URI.')
|
|
81
|
+
delivery.should_receive(:mark_failed).with(error)
|
|
82
|
+
perform_with_rescue
|
|
75
83
|
end
|
|
76
84
|
end
|
|
77
85
|
|
|
78
86
|
describe "an 401 response" do
|
|
79
|
-
before { response.stub(:
|
|
87
|
+
before { response.stub(code: 401) }
|
|
80
88
|
it "marks notifications as failed" do
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
89
|
+
error = Rpush::DeliveryError.new(401, notification.id, 'Unauthorized to send a notification to this app.')
|
|
90
|
+
delivery.should_receive(:mark_failed).with(error)
|
|
91
|
+
perform_with_rescue
|
|
84
92
|
end
|
|
85
93
|
end
|
|
86
94
|
|
|
87
95
|
describe "an 404 response" do
|
|
88
|
-
before { response.stub(:
|
|
96
|
+
before { response.stub(code: 404) }
|
|
89
97
|
it "marks notifications as failed" do
|
|
90
|
-
|
|
91
|
-
|
|
98
|
+
error = Rpush::DeliveryError.new(404, notification.id, 'Not Found')
|
|
99
|
+
delivery.should_receive(:mark_failed).with(error)
|
|
100
|
+
perform_with_rescue
|
|
92
101
|
end
|
|
93
102
|
end
|
|
94
103
|
|
|
95
104
|
describe "an 405 response" do
|
|
96
|
-
before { response.stub(:
|
|
105
|
+
before { response.stub(code: 405) }
|
|
97
106
|
it "marks notifications as failed" do
|
|
98
|
-
|
|
99
|
-
|
|
107
|
+
error = Rpush::DeliveryError.new(405, notification.id, 'Method Not Allowed')
|
|
108
|
+
delivery.should_receive(:mark_failed).with(error)
|
|
109
|
+
perform_with_rescue
|
|
100
110
|
end
|
|
101
111
|
end
|
|
102
112
|
|
|
103
113
|
describe "an 406 response" do
|
|
104
|
-
before { response.stub(:
|
|
114
|
+
before { response.stub(code: 406) }
|
|
105
115
|
|
|
106
116
|
it "retries the notification" do
|
|
107
|
-
batch.should_receive(:mark_retryable).with(notification, Time.now + (60*60))
|
|
117
|
+
batch.should_receive(:mark_retryable).with(notification, Time.now + (60 * 60))
|
|
108
118
|
perform
|
|
109
119
|
end
|
|
110
120
|
|
|
111
121
|
it "logs a warning that the notification will be retried" do
|
|
112
122
|
notification.retries = 1
|
|
113
123
|
notification.deliver_after = now + 2
|
|
114
|
-
logger.should_receive(:warn).with("[MyApp] Per-day throttling limit reached. Notification
|
|
124
|
+
logger.should_receive(:warn).with("[MyApp] Per-day throttling limit reached. Notification #{notification.id} will be retried after 2012-10-14 00:00:02 (retry 1).")
|
|
115
125
|
perform
|
|
116
126
|
end
|
|
117
127
|
end
|
|
118
128
|
|
|
119
129
|
describe "an 412 response" do
|
|
120
|
-
before { response.stub(:
|
|
130
|
+
before { response.stub(code: 412) }
|
|
121
131
|
|
|
122
132
|
it "retries the notification" do
|
|
123
|
-
batch.should_receive(:mark_retryable).with(notification, Time.now + (60*60))
|
|
133
|
+
batch.should_receive(:mark_retryable).with(notification, Time.now + (60 * 60))
|
|
124
134
|
perform
|
|
125
135
|
end
|
|
126
136
|
|
|
127
137
|
it "logs a warning that the notification will be retried" do
|
|
128
138
|
notification.retries = 1
|
|
129
139
|
notification.deliver_after = now + 2
|
|
130
|
-
logger.should_receive(:warn).with("[MyApp] Device unreachable. Notification
|
|
140
|
+
logger.should_receive(:warn).with("[MyApp] Device unreachable. Notification #{notification.id} will be retried after 2012-10-14 00:00:02 (retry 1).")
|
|
131
141
|
perform
|
|
132
142
|
end
|
|
133
143
|
end
|
|
134
144
|
|
|
135
145
|
describe "an 503 response" do
|
|
136
|
-
before { response.stub(:
|
|
146
|
+
before { response.stub(code: 503) }
|
|
137
147
|
|
|
138
148
|
it "retries the notification exponentially" do
|
|
139
149
|
delivery.should_receive(:mark_retryable_exponential).with(notification)
|
|
@@ -149,11 +159,12 @@ describe Rpush::Daemon::Wpns::Delivery do
|
|
|
149
159
|
end
|
|
150
160
|
|
|
151
161
|
describe 'an un-handled response' do
|
|
152
|
-
before { response.stub(:
|
|
162
|
+
before { response.stub(code: 418) }
|
|
153
163
|
|
|
154
164
|
it 'marks the notification as failed' do
|
|
155
|
-
|
|
156
|
-
|
|
165
|
+
error = Rpush::DeliveryError.new(418, notification.id, "I'm a Teapot")
|
|
166
|
+
delivery.should_receive(:mark_failed).with(error)
|
|
167
|
+
perform_with_rescue
|
|
157
168
|
end
|
|
158
169
|
end
|
|
159
170
|
end
|
data/spec/unit/daemon_spec.rb
CHANGED
|
@@ -6,75 +6,66 @@ describe Rpush::Daemon, "when starting" do
|
|
|
6
6
|
|
|
7
7
|
let(:certificate) { double }
|
|
8
8
|
let(:password) { double }
|
|
9
|
-
let(:
|
|
10
|
-
:embedded => false, :push => false, :store => :active_record,
|
|
11
|
-
:logger => nil) }
|
|
12
|
-
let(:logger) { double(:logger, :info => nil, :error => nil, :warn => nil) }
|
|
9
|
+
let(:logger) { double(:logger, info: nil, error: nil, warn: nil) }
|
|
13
10
|
|
|
14
11
|
before do
|
|
15
|
-
Rpush.stub(:
|
|
12
|
+
Rpush.stub(logger: logger)
|
|
16
13
|
Rpush::Daemon::Feeder.stub(:start)
|
|
17
|
-
Rpush::Daemon::AppRunner.stub(:
|
|
18
|
-
Rpush::Daemon.stub(:
|
|
14
|
+
Rpush::Daemon::AppRunner.stub(sync: nil, stop: nil)
|
|
15
|
+
Rpush::Daemon.stub(exit: nil, puts: nil)
|
|
16
|
+
Rpush::Daemon::SignalHandler.stub(start: nil, stop: nil, handle_shutdown_signal: nil)
|
|
17
|
+
Process.stub(:daemon)
|
|
19
18
|
File.stub(:open)
|
|
20
|
-
Rails.stub(:root).and_return("/rails_root")
|
|
21
19
|
end
|
|
22
20
|
|
|
23
21
|
unless Rpush.jruby?
|
|
24
22
|
it "forks into a daemon if the foreground option is false" do
|
|
25
|
-
config.
|
|
23
|
+
Rpush.config.foreground = false
|
|
26
24
|
Rpush::Daemon.initialize_store
|
|
27
|
-
|
|
28
|
-
Rpush::Daemon.should_receive(:daemonize)
|
|
29
|
-
Rpush::Daemon.start
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it 'notifies the store after forking' do
|
|
33
|
-
config.stub(:foreground => false)
|
|
34
|
-
Rpush::Daemon.initialize_store
|
|
35
|
-
Rpush::Daemon.store.should_receive(:after_daemonize)
|
|
25
|
+
Process.should_receive(:daemon)
|
|
36
26
|
Rpush::Daemon.start
|
|
37
27
|
end
|
|
38
28
|
|
|
39
29
|
it "does not fork into a daemon if the foreground option is true" do
|
|
40
|
-
config.
|
|
41
|
-
|
|
30
|
+
Rpush.config.foreground = true
|
|
31
|
+
Process.should_not_receive(:daemon)
|
|
42
32
|
Rpush::Daemon.start
|
|
43
33
|
end
|
|
44
34
|
|
|
45
35
|
it "does not fork into a daemon if the push option is true" do
|
|
46
|
-
config.
|
|
47
|
-
|
|
36
|
+
Rpush.config.push = true
|
|
37
|
+
Process.should_not_receive(:daemon)
|
|
48
38
|
Rpush::Daemon.start
|
|
49
39
|
end
|
|
50
40
|
|
|
51
41
|
it "does not fork into a daemon if the embedded option is true" do
|
|
52
|
-
config.
|
|
53
|
-
|
|
42
|
+
Rpush.config.embedded = true
|
|
43
|
+
Process.should_not_receive(:daemon)
|
|
54
44
|
Rpush::Daemon.start
|
|
55
45
|
end
|
|
56
46
|
end
|
|
57
47
|
|
|
58
|
-
it '
|
|
59
|
-
Rpush::Daemon.
|
|
48
|
+
it 'releases the store connection' do
|
|
49
|
+
Rpush::Daemon.store = double
|
|
50
|
+
Rpush::Daemon.store.should_receive(:release_connection)
|
|
60
51
|
Rpush::Daemon.start
|
|
61
52
|
end
|
|
62
53
|
|
|
63
|
-
it '
|
|
64
|
-
|
|
65
|
-
Rpush::Daemon.should_not_receive(:setup_signal_traps)
|
|
54
|
+
it 'sets up setup signal traps' do
|
|
55
|
+
Rpush::Daemon::SignalHandler.should_receive(:start)
|
|
66
56
|
Rpush::Daemon.start
|
|
67
57
|
end
|
|
68
58
|
|
|
69
59
|
it 'instantiates the store' do
|
|
70
|
-
config.
|
|
60
|
+
Rpush.config.client = :active_record
|
|
71
61
|
Rpush::Daemon.start
|
|
72
62
|
Rpush::Daemon.store.should be_kind_of(Rpush::Daemon::Store::ActiveRecord)
|
|
73
63
|
end
|
|
74
64
|
|
|
75
65
|
it 'logs an error if the store cannot be loaded' do
|
|
76
|
-
config.
|
|
66
|
+
Rpush.config.client = :foo_bar
|
|
77
67
|
Rpush.logger.should_receive(:error).with(kind_of(LoadError))
|
|
68
|
+
Rpush::Daemon.stub(:exit) { Rpush::Daemon.store = double.as_null_object }
|
|
78
69
|
Rpush::Daemon.start
|
|
79
70
|
end
|
|
80
71
|
|
|
@@ -84,7 +75,7 @@ describe Rpush::Daemon, "when starting" do
|
|
|
84
75
|
end
|
|
85
76
|
|
|
86
77
|
it "logs an error if the PID file could not be written" do
|
|
87
|
-
config.
|
|
78
|
+
Rpush.config.pid_file = '/rails_root/rpush.pid'
|
|
88
79
|
File.stub(:open).and_raise(Errno::ENOENT)
|
|
89
80
|
logger.should_receive(:error).with("Failed to write PID to '/rails_root/rpush.pid': #<Errno::ENOENT: No such file or directory>")
|
|
90
81
|
Rpush::Daemon.start
|
|
@@ -99,61 +90,35 @@ describe Rpush::Daemon, "when starting" do
|
|
|
99
90
|
Rpush::Daemon::AppRunner.should_receive(:sync)
|
|
100
91
|
Rpush::Daemon.start
|
|
101
92
|
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
describe Rpush::Daemon, "when being shutdown" do
|
|
105
|
-
let(:config) { double(:pid_file => '/rails_root/rpush.pid') }
|
|
106
|
-
let(:logger) { double(:info => nil, :error => nil, :warn => nil) }
|
|
107
|
-
|
|
108
|
-
before do
|
|
109
|
-
Rpush.stub(:config => config)
|
|
110
|
-
Rpush::Daemon.stub(:puts => nil)
|
|
111
|
-
Rpush::Daemon::Feeder.stub(:stop)
|
|
112
|
-
Rpush::Daemon::AppRunner.stub(:stop)
|
|
113
|
-
end
|
|
114
93
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
Rpush::Daemon.
|
|
119
|
-
Rpush::Daemon.should_receive(:shutdown)
|
|
120
|
-
Process.kill("SIGINT", Process.pid)
|
|
121
|
-
sleep 0.01
|
|
94
|
+
describe "shutdown" do
|
|
95
|
+
it "stops the feeder" do
|
|
96
|
+
Rpush::Daemon::Feeder.should_receive(:stop)
|
|
97
|
+
Rpush::Daemon.shutdown
|
|
122
98
|
end
|
|
123
99
|
|
|
124
|
-
it "
|
|
125
|
-
Rpush::Daemon.
|
|
126
|
-
Rpush::Daemon.
|
|
127
|
-
Process.kill("SIGTERM", Process.pid)
|
|
128
|
-
sleep 0.01
|
|
100
|
+
it "stops the app runners" do
|
|
101
|
+
Rpush::Daemon::AppRunner.should_receive(:stop)
|
|
102
|
+
Rpush::Daemon.shutdown
|
|
129
103
|
end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
it "stops the feeder" do
|
|
133
|
-
Rpush::Daemon::Feeder.should_receive(:stop)
|
|
134
|
-
Rpush::Daemon.shutdown
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
it "stops the app runners" do
|
|
138
|
-
Rpush::Daemon::AppRunner.should_receive(:stop)
|
|
139
|
-
Rpush::Daemon.shutdown
|
|
140
|
-
end
|
|
141
104
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
105
|
+
it "removes the PID file if one was written" do
|
|
106
|
+
Rpush.config.pid_file = "/rails_root/rpush.pid"
|
|
107
|
+
File.stub(:exist?).and_return(true)
|
|
108
|
+
File.should_receive(:delete).with("/rails_root/rpush.pid")
|
|
109
|
+
Rpush::Daemon.shutdown
|
|
110
|
+
end
|
|
147
111
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
112
|
+
it "does not attempt to remove the PID file if it does not exist" do
|
|
113
|
+
File.stub(:exists?).and_return(false)
|
|
114
|
+
File.should_not_receive(:delete)
|
|
115
|
+
Rpush::Daemon.shutdown
|
|
116
|
+
end
|
|
153
117
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
118
|
+
it "does not attempt to remove the PID file if one was not written" do
|
|
119
|
+
Rpush.config.pid_file = nil
|
|
120
|
+
File.should_not_receive(:delete)
|
|
121
|
+
Rpush::Daemon.shutdown
|
|
122
|
+
end
|
|
158
123
|
end
|
|
159
124
|
end
|
data/spec/unit/embed_spec.rb
CHANGED
|
@@ -2,10 +2,12 @@ require 'unit_spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe Rpush, 'embed' do
|
|
4
4
|
before do
|
|
5
|
-
Rpush::Daemon.stub(:
|
|
5
|
+
Rpush::Daemon.stub(start: nil, shutdown: nil)
|
|
6
6
|
Kernel.stub(:at_exit)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
+
after { Rpush.shutdown }
|
|
10
|
+
|
|
9
11
|
it 'sets the embedded config option to true' do
|
|
10
12
|
Rpush.embed
|
|
11
13
|
Rpush.config.embedded.should be_true
|
|
@@ -18,7 +20,7 @@ describe Rpush, 'embed' do
|
|
|
18
20
|
|
|
19
21
|
it 'overrides the default config options with those given as a hash' do
|
|
20
22
|
Rpush.config.push_poll = 4
|
|
21
|
-
expect { Rpush.embed(:
|
|
23
|
+
expect { Rpush.embed(push_poll: 2) }.to change(Rpush.config, :push_poll).to(2)
|
|
22
24
|
end
|
|
23
25
|
end
|
|
24
26
|
|
data/spec/unit/logger_spec.rb
CHANGED
|
@@ -1,74 +1,59 @@
|
|
|
1
1
|
require "unit_spec_helper"
|
|
2
2
|
|
|
3
3
|
module Rails
|
|
4
|
-
|
|
5
|
-
@logger
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def self.logger=(logger)
|
|
9
|
-
@logger = logger
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
module HoptoadNotifier
|
|
14
|
-
def self.notify(e)
|
|
15
|
-
end
|
|
4
|
+
attr_accessor :logger
|
|
16
5
|
end
|
|
17
6
|
|
|
18
7
|
describe Rpush::Logger do
|
|
19
8
|
let(:log) { double(:sync= => true) }
|
|
20
9
|
|
|
21
10
|
before do
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@logger_class = if defined?(ActiveSupport::BufferedLogger)
|
|
25
|
-
ActiveSupport::BufferedLogger
|
|
26
|
-
else
|
|
27
|
-
ActiveSupport::Logger
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
@logger = double(@logger_class.name, :info => nil, :error => nil, :level => 0, :auto_flushing => 1, :auto_flushing= => nil)
|
|
11
|
+
@logger_class = defined?(ActiveSupport::BufferedLogger) ? ActiveSupport::BufferedLogger : ActiveSupport::Logger
|
|
12
|
+
@logger = double(@logger_class.name, info: nil, error: nil, level: 0, auto_flushing: 1, :auto_flushing= => nil)
|
|
31
13
|
@logger_class.stub(:new).and_return(@logger)
|
|
32
14
|
Rails.logger = @logger
|
|
33
|
-
File.stub(:
|
|
34
|
-
FileUtils.stub(:
|
|
15
|
+
File.stub(open: log)
|
|
16
|
+
FileUtils.stub(mkdir_p: nil)
|
|
35
17
|
STDERR.stub(:puts)
|
|
18
|
+
Rpush.config.foreground = true
|
|
19
|
+
Rpush.config.log_dir = Rails.root
|
|
36
20
|
end
|
|
37
21
|
|
|
38
22
|
it "disables logging if the log file cannot be opened" do
|
|
39
23
|
File.stub(:open).and_raise(Errno::ENOENT)
|
|
40
24
|
STDERR.should_receive(:puts).with(/No such file or directory/)
|
|
41
25
|
STDERR.should_receive(:puts).with(/Logging disabled/)
|
|
42
|
-
Rpush::Logger.new
|
|
26
|
+
Rpush::Logger.new
|
|
43
27
|
end
|
|
44
28
|
|
|
45
29
|
it 'creates the log directory' do
|
|
46
|
-
FileUtils.should_receive(:mkdir_p).with('/rails_root/log')
|
|
47
|
-
Rpush::Logger.new
|
|
30
|
+
FileUtils.should_receive(:mkdir_p).with('/tmp/rails_root/log')
|
|
31
|
+
Rpush::Logger.new
|
|
48
32
|
end
|
|
49
33
|
|
|
50
34
|
it "should open the a log file in the Rails log directory" do
|
|
51
|
-
File.should_receive(:open).with('/rails_root/log/rpush.log', 'a')
|
|
52
|
-
Rpush::Logger.new
|
|
35
|
+
File.should_receive(:open).with('/tmp/rails_root/log/rpush.log', 'a')
|
|
36
|
+
Rpush::Logger.new
|
|
53
37
|
end
|
|
54
38
|
|
|
55
39
|
it 'sets sync mode on the log descriptor' do
|
|
56
40
|
log.should_receive(:sync=).with(true)
|
|
57
|
-
Rpush::Logger.new
|
|
41
|
+
Rpush::Logger.new
|
|
58
42
|
end
|
|
59
43
|
|
|
60
44
|
it 'uses the user-defined logger' do
|
|
61
45
|
my_logger = double
|
|
62
46
|
Rpush.config.logger = my_logger
|
|
63
|
-
logger = Rpush::Logger.new
|
|
47
|
+
logger = Rpush::Logger.new
|
|
64
48
|
my_logger.should_receive(:info)
|
|
49
|
+
Rpush.config.foreground = false
|
|
65
50
|
logger.info('test')
|
|
66
51
|
end
|
|
67
52
|
|
|
68
53
|
it 'uses ActiveSupport::BufferedLogger if a user-defined logger is not set' do
|
|
69
54
|
if ActiveSupport.const_defined?('BufferedLogger')
|
|
70
55
|
ActiveSupport::BufferedLogger.should_receive(:new).with(log, Rails.logger.level)
|
|
71
|
-
Rpush::Logger.new
|
|
56
|
+
Rpush::Logger.new
|
|
72
57
|
end
|
|
73
58
|
end
|
|
74
59
|
|
|
@@ -76,51 +61,56 @@ describe Rpush::Logger do
|
|
|
76
61
|
stub_const('ActiveSupport::Logger', double)
|
|
77
62
|
ActiveSupport.stub(:const_defined? => false)
|
|
78
63
|
ActiveSupport::Logger.should_receive(:new).with(log, Rails.logger.level)
|
|
79
|
-
Rpush::Logger.new
|
|
64
|
+
Rpush::Logger.new
|
|
80
65
|
end
|
|
81
66
|
|
|
82
67
|
it "should print out the msg if running in the foreground" do
|
|
83
|
-
logger = Rpush::Logger.new
|
|
68
|
+
logger = Rpush::Logger.new
|
|
84
69
|
STDOUT.should_receive(:puts).with(/hi mom/)
|
|
85
70
|
logger.info("hi mom")
|
|
86
71
|
end
|
|
87
72
|
|
|
88
73
|
it "should not print out the msg if not running in the foreground" do
|
|
89
|
-
|
|
74
|
+
Rpush.config.foreground = false
|
|
75
|
+
logger = Rpush::Logger.new
|
|
90
76
|
STDOUT.should_not_receive(:puts).with(/hi mom/)
|
|
91
77
|
logger.info("hi mom")
|
|
92
78
|
end
|
|
93
79
|
|
|
94
80
|
it "should prefix log lines with the current time" do
|
|
81
|
+
Rpush.config.foreground = false
|
|
95
82
|
now = Time.now
|
|
96
83
|
Time.stub(:now).and_return(now)
|
|
97
|
-
logger = Rpush::Logger.new
|
|
84
|
+
logger = Rpush::Logger.new
|
|
98
85
|
@logger.should_receive(:info).with(/#{Regexp.escape("[#{now.to_s(:db)}]")}/)
|
|
99
86
|
logger.info("blah")
|
|
100
87
|
end
|
|
101
88
|
|
|
102
89
|
it "should prefix error logs with the ERROR label" do
|
|
103
|
-
|
|
90
|
+
Rpush.config.foreground = false
|
|
91
|
+
logger = Rpush::Logger.new
|
|
104
92
|
@logger.should_receive(:error).with(/#{Regexp.escape("[ERROR]")}/)
|
|
105
93
|
logger.error("eeek")
|
|
106
94
|
end
|
|
107
95
|
|
|
108
96
|
it "should prefix warn logs with the WARNING label" do
|
|
109
|
-
|
|
97
|
+
Rpush.config.foreground = false
|
|
98
|
+
logger = Rpush::Logger.new
|
|
110
99
|
@logger.should_receive(:warn).with(/#{Regexp.escape("[WARNING]")}/)
|
|
111
100
|
logger.warn("eeek")
|
|
112
101
|
end
|
|
113
102
|
|
|
114
103
|
it "should handle an Exception instance" do
|
|
104
|
+
Rpush.config.foreground = false
|
|
115
105
|
e = RuntimeError.new("hi mom")
|
|
116
|
-
e.stub(:
|
|
117
|
-
logger = Rpush::Logger.new
|
|
106
|
+
e.stub(backtrace: [])
|
|
107
|
+
logger = Rpush::Logger.new
|
|
118
108
|
@logger.should_receive(:error).with(/RuntimeError, hi mom/)
|
|
119
109
|
logger.error(e)
|
|
120
110
|
end
|
|
121
111
|
|
|
122
112
|
it 'defaults auto_flushing to true if the Rails logger does not respond to auto_flushing' do
|
|
123
|
-
rails_logger = double(:
|
|
113
|
+
rails_logger = double(info: nil, error: nil, level: 0)
|
|
124
114
|
Rails.logger = rails_logger
|
|
125
115
|
@logger.auto_flushing.should be_true
|
|
126
116
|
end
|