rpush 7.0.0 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -1
  3. data/README.md +38 -1
  4. data/lib/generators/rpush_migration_generator.rb +1 -0
  5. data/lib/generators/templates/rpush.rb +17 -0
  6. data/lib/generators/templates/rpush_7_1_0_updates.rb +12 -0
  7. data/lib/rpush/client/active_model/apns/notification.rb +0 -4
  8. data/lib/rpush/client/active_model/fcm/app.rb +20 -0
  9. data/lib/rpush/client/active_model/fcm/expiry_collapse_key_mutual_inclusion_validator.rb +14 -0
  10. data/lib/rpush/client/active_model/fcm/notification.rb +129 -0
  11. data/lib/rpush/client/active_model/fcm/notification_keys_in_allowed_list_validator.rb +20 -0
  12. data/lib/rpush/client/active_model.rb +5 -0
  13. data/lib/rpush/client/active_record/fcm/app.rb +11 -0
  14. data/lib/rpush/client/active_record/fcm/notification.rb +11 -0
  15. data/lib/rpush/client/active_record.rb +3 -0
  16. data/lib/rpush/client/redis/app.rb +2 -0
  17. data/lib/rpush/client/redis/fcm/app.rb +11 -0
  18. data/lib/rpush/client/redis/fcm/notification.rb +11 -0
  19. data/lib/rpush/client/redis.rb +3 -0
  20. data/lib/rpush/configuration.rb +1 -1
  21. data/lib/rpush/daemon/apns2/delivery.rb +0 -1
  22. data/lib/rpush/daemon/apnsp8/delivery.rb +0 -1
  23. data/lib/rpush/daemon/fcm/delivery.rb +162 -0
  24. data/lib/rpush/daemon/fcm.rb +9 -0
  25. data/lib/rpush/daemon/gcm/delivery.rb +1 -1
  26. data/lib/rpush/daemon/google_credential_cache.rb +41 -0
  27. data/lib/rpush/daemon/store/active_record.rb +15 -0
  28. data/lib/rpush/daemon/store/interface.rb +2 -2
  29. data/lib/rpush/daemon/store/redis.rb +19 -6
  30. data/lib/rpush/daemon/webpush/delivery.rb +2 -2
  31. data/lib/rpush/daemon.rb +4 -0
  32. data/lib/rpush/reflection_collection.rb +3 -2
  33. data/lib/rpush/version.rb +1 -1
  34. data/lib/rpush.rb +1 -0
  35. data/spec/functional/apns2_spec.rb +2 -6
  36. data/spec/functional/fcm_priority_spec.rb +46 -0
  37. data/spec/functional/fcm_spec.rb +77 -0
  38. data/spec/functional_spec_helper.rb +1 -1
  39. data/spec/spec_helper.rb +2 -1
  40. data/spec/support/active_record_setup.rb +3 -1
  41. data/spec/unit/client/active_record/fcm/app_spec.rb +6 -0
  42. data/spec/unit/client/active_record/fcm/notification_spec.rb +10 -0
  43. data/spec/unit/client/redis/fcm/app_spec.rb +5 -0
  44. data/spec/unit/client/redis/fcm/notification_spec.rb +5 -0
  45. data/spec/unit/client/shared/apns/notification.rb +0 -15
  46. data/spec/unit/client/shared/fcm/app.rb +4 -0
  47. data/spec/unit/client/shared/fcm/notification.rb +92 -0
  48. data/spec/unit/configuration_spec.rb +1 -1
  49. data/spec/unit/daemon/apnsp8/delivery_spec.rb +1 -1
  50. data/spec/unit/daemon/fcm/delivery_spec.rb +127 -0
  51. data/spec/unit/daemon/service_config_methods_spec.rb +1 -1
  52. data/spec/unit/daemon/tcp_connection_spec.rb +8 -7
  53. data/spec/unit/daemon/wns/delivery_spec.rb +1 -1
  54. data/spec/unit/logger_spec.rb +1 -1
  55. data/spec/unit_spec_helper.rb +1 -1
  56. metadata +81 -17
@@ -0,0 +1,127 @@
1
+ require 'unit_spec_helper'
2
+
3
+ describe Rpush::Daemon::Fcm::Delivery do
4
+ let(:app) { Rpush::Fcm::App.create!(name: 'MyApp', firebase_project_id: 'abc123', json_key:'{}') }
5
+ let(:notification) { Rpush::Fcm::Notification.create!(app: app, device_token: 'xyz', deliver_after: Time.now) }
6
+ let(:logger) { double(error: nil, info: nil, warn: nil) }
7
+ let(:response) { double(code: 200, header: {}) }
8
+ let(:http) { double(shutdown: nil, request: response) }
9
+ let(:now) { Time.parse('2012-10-14 00:00:00') }
10
+ let(:batch) { double(mark_failed: nil, mark_delivered: nil, mark_retryable: nil, notification_processed: nil) }
11
+ let(:delivery) { Rpush::Daemon::Fcm::Delivery.new(app, http, notification, batch) }
12
+ let(:store) { double(create_fcm_notification: double(id: 2)) }
13
+
14
+ def perform
15
+ delivery.perform
16
+ end
17
+
18
+ def perform_with_rescue
19
+ expect { perform }.to raise_error(StandardError)
20
+ end
21
+
22
+ before do
23
+ allow(delivery).to receive_messages(reflect: nil)
24
+ allow(Rpush::Daemon).to receive_messages(store: store)
25
+ allow(Time).to receive_messages(now: now)
26
+ allow(Rpush).to receive_messages(logger: logger)
27
+ allow_any_instance_of(Rpush::Daemon::Fcm::Delivery).to receive_messages(obtain_access_token: "access_token")
28
+ end
29
+
30
+ describe 'a 200 response' do
31
+ before do
32
+ allow(response).to receive_messages(code: 200)
33
+ allow(response).to receive_messages(body: nil)
34
+ allow(notification).to receive_messages(device_token: '1')
35
+ end
36
+
37
+ it 'reflects on ID which successfully received the notification' do
38
+ expect(delivery).to receive(:reflect).with(:fcm_delivered_to_recipient, notification)
39
+ perform
40
+ end
41
+
42
+ it 'marks the notification as delivered' do
43
+ expect(delivery).to receive(:mark_delivered)
44
+ perform
45
+ end
46
+
47
+ it 'logs that the notification was delivered' do
48
+ expect(logger).to receive(:info).with("[MyApp] #{notification.id} sent to 1")
49
+ perform
50
+ end
51
+ end
52
+
53
+ describe 'all deliveries failed with Unavailable or InternalServerError 503' do
54
+ before do
55
+ allow(notification).to receive_messages(device_token: '1')
56
+ allow(response).to receive_messages(code: 503, body: nil)
57
+ end
58
+
59
+ it 'reflects on any IDs which failed to receive the notification' do
60
+ pending("Determine the correct cases where FCM should send fcm_failed_to_recipient")
61
+ expect(delivery).to receive(:reflect).with(:fcm_failed_to_recipient, notification)
62
+ perform
63
+ end
64
+
65
+ it 'retries the notification respecting the Retry-After header' do
66
+ allow(response).to receive_messages(header: { 'retry-after' => 10 })
67
+ expect(delivery).to receive(:mark_retryable).with(notification, now + 10.seconds)
68
+ perform
69
+ end
70
+
71
+ it 'retries the notification using exponential back-off if the Retry-After header is not present' do
72
+ expect(delivery).to receive(:mark_retryable).with(notification, now + 2)
73
+ perform
74
+ end
75
+
76
+ it 'does not mark the notification as failed' do
77
+ expect(delivery).not_to receive(:mark_failed)
78
+ perform
79
+ end
80
+
81
+ it 'logs that the notification will be retried' do
82
+ notification.retries = 1
83
+ notification.deliver_after = now + 2
84
+ expect(Rpush.logger).to receive(:warn).with("[MyApp] FCM responded with an Service Unavailable Error. Notification #{notification.id} will be retried after 2012-10-14 00:00:02 (retry 1).")
85
+ perform
86
+ end
87
+ end
88
+
89
+ describe 'all deliveries failed with Unavailable or InternalServerError 500' do
90
+ before do
91
+ allow(notification).to receive_messages(device_token: '1')
92
+ allow(response).to receive_messages(code: 500, body: nil)
93
+ end
94
+
95
+ it 'logs a warning that the notification has been re-queued.' do
96
+ notification.retries = 3
97
+ notification.deliver_after = now + 2**3
98
+ expect(Rpush.logger).to receive(:warn).with("[MyApp] FCM responded with an Internal Error. Notification #{notification.id} will be retried after #{(now + 2**3).strftime('%Y-%m-%d %H:%M:%S')} (retry 3).")
99
+ perform
100
+ end
101
+
102
+ it 'retries the notification in accordance with the exponential back-off strategy.' do
103
+ notification.update_attribute(:retries, 2)
104
+ expect(delivery).to receive(:mark_retryable).with(notification, now + 2**3)
105
+ perform
106
+ end
107
+ end
108
+
109
+ describe 'all deliveries failed with invalid token' do
110
+ before do
111
+ allow(notification).to receive_messages(device_token: '1')
112
+ allow(response).to receive_messages(code: 404, body: { error: { status: 'NOT_FOUND', message: 'Requested entity was not found.' } }.to_json)
113
+ end
114
+
115
+ it 'reflects on invalid IDs' do
116
+ expect(delivery).to receive(:reflect).with(:fcm_invalid_device_token, app, "NOT_FOUND: Requested entity was not found.", '1')
117
+ perform_with_rescue
118
+ end
119
+
120
+ it 'marks a notification as failed if any ids are invalid' do
121
+ expect(delivery).to receive(:mark_failed)
122
+ expect(delivery).not_to receive(:mark_retryable)
123
+ expect(store).not_to receive(:create_fcm_notification)
124
+ perform_with_rescue
125
+ end
126
+ end
127
+ end
@@ -23,7 +23,7 @@ describe Rpush::Daemon::ServiceConfigMethods do
23
23
  ServiceConfigMethodsSpec.dispatcher :http, an: :option
24
24
  app = double
25
25
  dispatcher = double
26
- expect(Rpush::Daemon::Dispatcher::Http).to receive(:new).with(app, ServiceConfigMethodsSpec::Delivery, an: :option).and_return(dispatcher)
26
+ expect(Rpush::Daemon::Dispatcher::Http).to receive(:new).with(app, ServiceConfigMethodsSpec::Delivery, {an: :option}).and_return(dispatcher)
27
27
  expect(ServiceConfigMethodsSpec.new_dispatcher(app)).to eq dispatcher
28
28
  end
29
29
 
@@ -15,6 +15,7 @@ describe Rpush::Daemon::TcpConnection do
15
15
  let(:connection) { Rpush::Daemon::TcpConnection.new(app, host, port) }
16
16
 
17
17
  before do
18
+ allow(x509_certificate).to receive(:not_after).and_return(Time.now + 1.year)
18
19
  allow(OpenSSL::SSL::SSLContext).to receive_messages(new: ssl_context)
19
20
  allow(OpenSSL::PKey::RSA).to receive_messages(new: rsa_key)
20
21
  allow(OpenSSL::X509::Certificate).to receive_messages(new: x509_certificate)
@@ -83,31 +84,31 @@ describe Rpush::Daemon::TcpConnection do
83
84
 
84
85
  describe 'certificate expiry' do
85
86
  it 'reflects if the certificate will expire soon' do
86
- cert = OpenSSL::X509::Certificate.new(app.certificate)
87
+ cert = x509_certificate
87
88
  expect(connection).to receive(:reflect).with(:ssl_certificate_will_expire, app, cert.not_after)
88
89
  Timecop.freeze(cert.not_after - 3.days) { connection.connect }
89
90
  end
90
91
 
91
92
  it 'logs that the certificate will expire soon' do
92
- cert = OpenSSL::X509::Certificate.new(app.certificate)
93
- expect(logger).to receive(:warn).with("[#{app.name}] Certificate will expire at 2022-09-07 03:18:32 UTC.")
93
+ cert = x509_certificate
94
+ expect(logger).to receive(:warn).with("[#{app.name}] Certificate will expire at #{cert.not_after.utc}.")
94
95
  Timecop.freeze(cert.not_after - 3.days) { connection.connect }
95
96
  end
96
97
 
97
98
  it 'does not reflect if the certificate will not expire soon' do
98
- cert = OpenSSL::X509::Certificate.new(app.certificate)
99
+ cert = x509_certificate
99
100
  expect(connection).not_to receive(:reflect).with(:ssl_certificate_will_expire, app, kind_of(Time))
100
101
  Timecop.freeze(cert.not_after - 2.months) { connection.connect }
101
102
  end
102
103
 
103
104
  it 'logs that the certificate has expired' do
104
- cert = OpenSSL::X509::Certificate.new(app.certificate)
105
- expect(logger).to receive(:error).with("[#{app.name}] Certificate expired at 2022-09-07 03:18:32 UTC.")
105
+ cert = x509_certificate
106
+ expect(logger).to receive(:error).with("[#{app.name}] Certificate expired at #{cert.not_after.utc}.")
106
107
  Timecop.freeze(cert.not_after + 1.day) { connection.connect rescue Rpush::CertificateExpiredError }
107
108
  end
108
109
 
109
110
  it 'raises an error if the certificate has expired' do
110
- cert = OpenSSL::X509::Certificate.new(app.certificate)
111
+ cert = x509_certificate
111
112
  Timecop.freeze(cert.not_after + 1.day) do
112
113
  expect { connection.connect }.to raise_error(Rpush::CertificateExpiredError)
113
114
  end
@@ -50,7 +50,7 @@ describe Rpush::Daemon::Wns::Delivery do
50
50
  end
51
51
 
52
52
  it 'set the access token for the app' do
53
- expect(delivery).to receive(:update_access_token).with("access_token" => "dummy_access_token", "expires_in" => 60)
53
+ expect(delivery).to receive(:update_access_token).with({"access_token" => "dummy_access_token", "expires_in" => 60})
54
54
  expect(store).to receive(:update_app).with app
55
55
  perform
56
56
  end
@@ -92,7 +92,7 @@ describe Rpush::Logger do
92
92
  now = Time.now
93
93
  allow(Time).to receive(:now).and_return(now)
94
94
  logger = Rpush::Logger.new
95
- expect(@logger).to receive(:info).with(/#{Regexp.escape("[#{now.to_s(:db)}]")}/)
95
+ expect(@logger).to receive(:info).with(/#{Regexp.escape("[#{now.to_formatted_s(:db)}]")}/)
96
96
  logger.info("blah")
97
97
  end
98
98
 
@@ -12,7 +12,7 @@ RSpec.configure do |config|
12
12
  config.before(:each) do
13
13
  Modis.with_connection do |redis|
14
14
  redis.keys('rpush:*').each { |key| redis.del(key) }
15
- end if redis?
15
+ end if redis? && unit_example?(self.class.metadata)
16
16
 
17
17
  if active_record? && unit_example?(self.class.metadata)
18
18
  connection = ActiveRecord::Base.connection
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rpush
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Leitch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-21 00:00:00.000000000 Z
11
+ date: 2024-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -79,6 +79,9 @@ dependencies:
79
79
  - - ">="
80
80
  - !ruby/object:Gem::Version
81
81
  version: '5.2'
82
+ - - "<"
83
+ - !ruby/object:Gem::Version
84
+ version: 7.1.0
82
85
  type: :runtime
83
86
  prerelease: false
84
87
  version_requirements: !ruby/object:Gem::Requirement
@@ -86,6 +89,9 @@ dependencies:
86
89
  - - ">="
87
90
  - !ruby/object:Gem::Version
88
91
  version: '5.2'
92
+ - - "<"
93
+ - !ruby/object:Gem::Version
94
+ version: 7.1.0
89
95
  - !ruby/object:Gem::Dependency
90
96
  name: thor
91
97
  requirement: !ruby/object:Gem::Requirement
@@ -135,19 +141,47 @@ dependencies:
135
141
  - !ruby/object:Gem::Version
136
142
  version: '0'
137
143
  - !ruby/object:Gem::Dependency
138
- name: webpush
144
+ name: web-push
139
145
  requirement: !ruby/object:Gem::Requirement
140
146
  requirements:
141
- - - "~>"
147
+ - - ">="
142
148
  - !ruby/object:Gem::Version
143
- version: '1.0'
149
+ version: '0'
144
150
  type: :runtime
145
151
  prerelease: false
146
152
  version_requirements: !ruby/object:Gem::Requirement
147
153
  requirements:
148
- - - "~>"
154
+ - - ">="
149
155
  - !ruby/object:Gem::Version
150
- version: '1.0'
156
+ version: '0'
157
+ - !ruby/object:Gem::Dependency
158
+ name: googleauth
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ type: :runtime
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ - !ruby/object:Gem::Dependency
172
+ name: debug
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
151
185
  - !ruby/object:Gem::Dependency
152
186
  name: rake
153
187
  requirement: !ruby/object:Gem::Requirement
@@ -166,16 +200,16 @@ dependencies:
166
200
  name: rspec
167
201
  requirement: !ruby/object:Gem::Requirement
168
202
  requirements:
169
- - - "~>"
203
+ - - ">="
170
204
  - !ruby/object:Gem::Version
171
- version: 3.4.0
205
+ version: '0'
172
206
  type: :development
173
207
  prerelease: false
174
208
  version_requirements: !ruby/object:Gem::Requirement
175
209
  requirements:
176
- - - "~>"
210
+ - - ">="
177
211
  - !ruby/object:Gem::Version
178
- version: 3.4.0
212
+ version: '0'
179
213
  - !ruby/object:Gem::Dependency
180
214
  name: database_cleaner
181
215
  requirement: !ruby/object:Gem::Requirement
@@ -264,16 +298,16 @@ dependencies:
264
298
  name: codeclimate-test-reporter
265
299
  requirement: !ruby/object:Gem::Requirement
266
300
  requirements:
267
- - - ">="
301
+ - - '='
268
302
  - !ruby/object:Gem::Version
269
- version: '0'
303
+ version: 1.0.7
270
304
  type: :development
271
305
  prerelease: false
272
306
  version_requirements: !ruby/object:Gem::Requirement
273
307
  requirements:
274
- - - ">="
308
+ - - '='
275
309
  - !ruby/object:Gem::Version
276
- version: '0'
310
+ version: 1.0.7
277
311
  - !ruby/object:Gem::Dependency
278
312
  name: simplecov
279
313
  requirement: !ruby/object:Gem::Requirement
@@ -413,6 +447,7 @@ files:
413
447
  - lib/generators/templates/rpush_4_1_0_updates.rb
414
448
  - lib/generators/templates/rpush_4_1_1_updates.rb
415
449
  - lib/generators/templates/rpush_4_2_0_updates.rb
450
+ - lib/generators/templates/rpush_7_1_0_updates.rb
416
451
  - lib/rpush.rb
417
452
  - lib/rpush/apns_feedback.rb
418
453
  - lib/rpush/cli.rb
@@ -429,6 +464,10 @@ files:
429
464
  - lib/rpush/client/active_model/apnsp8/app.rb
430
465
  - lib/rpush/client/active_model/apnsp8/notification.rb
431
466
  - lib/rpush/client/active_model/certificate_private_key_validator.rb
467
+ - lib/rpush/client/active_model/fcm/app.rb
468
+ - lib/rpush/client/active_model/fcm/expiry_collapse_key_mutual_inclusion_validator.rb
469
+ - lib/rpush/client/active_model/fcm/notification.rb
470
+ - lib/rpush/client/active_model/fcm/notification_keys_in_allowed_list_validator.rb
432
471
  - lib/rpush/client/active_model/gcm/app.rb
433
472
  - lib/rpush/client/active_model/gcm/expiry_collapse_key_mutual_inclusion_validator.rb
434
473
  - lib/rpush/client/active_model/gcm/notification.rb
@@ -456,6 +495,8 @@ files:
456
495
  - lib/rpush/client/active_record/apnsp8/app.rb
457
496
  - lib/rpush/client/active_record/apnsp8/notification.rb
458
497
  - lib/rpush/client/active_record/app.rb
498
+ - lib/rpush/client/active_record/fcm/app.rb
499
+ - lib/rpush/client/active_record/fcm/notification.rb
459
500
  - lib/rpush/client/active_record/gcm/app.rb
460
501
  - lib/rpush/client/active_record/gcm/notification.rb
461
502
  - lib/rpush/client/active_record/notification.rb
@@ -480,6 +521,8 @@ files:
480
521
  - lib/rpush/client/redis/apnsp8/app.rb
481
522
  - lib/rpush/client/redis/apnsp8/notification.rb
482
523
  - lib/rpush/client/redis/app.rb
524
+ - lib/rpush/client/redis/fcm/app.rb
525
+ - lib/rpush/client/redis/fcm/notification.rb
483
526
  - lib/rpush/client/redis/gcm/app.rb
484
527
  - lib/rpush/client/redis/gcm/notification.rb
485
528
  - lib/rpush/client/redis/notification.rb
@@ -517,9 +560,12 @@ files:
517
560
  - lib/rpush/daemon/dispatcher/tcp.rb
518
561
  - lib/rpush/daemon/dispatcher_loop.rb
519
562
  - lib/rpush/daemon/errors.rb
563
+ - lib/rpush/daemon/fcm.rb
564
+ - lib/rpush/daemon/fcm/delivery.rb
520
565
  - lib/rpush/daemon/feeder.rb
521
566
  - lib/rpush/daemon/gcm.rb
522
567
  - lib/rpush/daemon/gcm/delivery.rb
568
+ - lib/rpush/daemon/google_credential_cache.rb
523
569
  - lib/rpush/daemon/interruptible_sleep.rb
524
570
  - lib/rpush/daemon/loggable.rb
525
571
  - lib/rpush/daemon/proc_title.rb
@@ -569,6 +615,8 @@ files:
569
615
  - spec/functional/apns_spec.rb
570
616
  - spec/functional/cli_spec.rb
571
617
  - spec/functional/embed_spec.rb
618
+ - spec/functional/fcm_priority_spec.rb
619
+ - spec/functional/fcm_spec.rb
572
620
  - spec/functional/gcm_priority_spec.rb
573
621
  - spec/functional/gcm_spec.rb
574
622
  - spec/functional/new_app_spec.rb
@@ -596,6 +644,8 @@ files:
596
644
  - spec/unit/client/active_record/apns2/notification_spec.rb
597
645
  - spec/unit/client/active_record/apnsp8/notification_spec.rb
598
646
  - spec/unit/client/active_record/app_spec.rb
647
+ - spec/unit/client/active_record/fcm/app_spec.rb
648
+ - spec/unit/client/active_record/fcm/notification_spec.rb
599
649
  - spec/unit/client/active_record/gcm/app_spec.rb
600
650
  - spec/unit/client/active_record/gcm/notification_spec.rb
601
651
  - spec/unit/client/active_record/notification_spec.rb
@@ -618,6 +668,8 @@ files:
618
668
  - spec/unit/client/redis/apns2/notification_spec.rb
619
669
  - spec/unit/client/redis/apnsp8/notification_spec.rb
620
670
  - spec/unit/client/redis/app_spec.rb
671
+ - spec/unit/client/redis/fcm/app_spec.rb
672
+ - spec/unit/client/redis/fcm/notification_spec.rb
621
673
  - spec/unit/client/redis/gcm/app_spec.rb
622
674
  - spec/unit/client/redis/gcm/notification_spec.rb
623
675
  - spec/unit/client/redis/notification_spec.rb
@@ -635,6 +687,8 @@ files:
635
687
  - spec/unit/client/shared/apns/feedback.rb
636
688
  - spec/unit/client/shared/apns/notification.rb
637
689
  - spec/unit/client/shared/app.rb
690
+ - spec/unit/client/shared/fcm/app.rb
691
+ - spec/unit/client/shared/fcm/notification.rb
638
692
  - spec/unit/client/shared/gcm/app.rb
639
693
  - spec/unit/client/shared/gcm/notification.rb
640
694
  - spec/unit/client/shared/notification.rb
@@ -659,6 +713,7 @@ files:
659
713
  - spec/unit/daemon/dispatcher/http_spec.rb
660
714
  - spec/unit/daemon/dispatcher/tcp_spec.rb
661
715
  - spec/unit/daemon/dispatcher_loop_spec.rb
716
+ - spec/unit/daemon/fcm/delivery_spec.rb
662
717
  - spec/unit/daemon/feeder_spec.rb
663
718
  - spec/unit/daemon/gcm/delivery_spec.rb
664
719
  - spec/unit/daemon/proc_title_spec.rb
@@ -706,14 +761,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
706
761
  requirements:
707
762
  - - ">="
708
763
  - !ruby/object:Gem::Version
709
- version: 2.4.0
764
+ version: 2.7.0
710
765
  required_rubygems_version: !ruby/object:Gem::Requirement
711
766
  requirements:
712
767
  - - ">="
713
768
  - !ruby/object:Gem::Version
714
769
  version: '0'
715
770
  requirements: []
716
- rubygems_version: 3.3.5
771
+ rubygems_version: 3.3.3
717
772
  signing_key:
718
773
  specification_version: 4
719
774
  summary: The push notification service for Ruby.
@@ -724,6 +779,8 @@ test_files:
724
779
  - spec/functional/apns_spec.rb
725
780
  - spec/functional/cli_spec.rb
726
781
  - spec/functional/embed_spec.rb
782
+ - spec/functional/fcm_priority_spec.rb
783
+ - spec/functional/fcm_spec.rb
727
784
  - spec/functional/gcm_priority_spec.rb
728
785
  - spec/functional/gcm_spec.rb
729
786
  - spec/functional/new_app_spec.rb
@@ -751,6 +808,8 @@ test_files:
751
808
  - spec/unit/client/active_record/apns2/notification_spec.rb
752
809
  - spec/unit/client/active_record/apnsp8/notification_spec.rb
753
810
  - spec/unit/client/active_record/app_spec.rb
811
+ - spec/unit/client/active_record/fcm/app_spec.rb
812
+ - spec/unit/client/active_record/fcm/notification_spec.rb
754
813
  - spec/unit/client/active_record/gcm/app_spec.rb
755
814
  - spec/unit/client/active_record/gcm/notification_spec.rb
756
815
  - spec/unit/client/active_record/notification_spec.rb
@@ -773,6 +832,8 @@ test_files:
773
832
  - spec/unit/client/redis/apns2/notification_spec.rb
774
833
  - spec/unit/client/redis/apnsp8/notification_spec.rb
775
834
  - spec/unit/client/redis/app_spec.rb
835
+ - spec/unit/client/redis/fcm/app_spec.rb
836
+ - spec/unit/client/redis/fcm/notification_spec.rb
776
837
  - spec/unit/client/redis/gcm/app_spec.rb
777
838
  - spec/unit/client/redis/gcm/notification_spec.rb
778
839
  - spec/unit/client/redis/notification_spec.rb
@@ -790,6 +851,8 @@ test_files:
790
851
  - spec/unit/client/shared/apns/feedback.rb
791
852
  - spec/unit/client/shared/apns/notification.rb
792
853
  - spec/unit/client/shared/app.rb
854
+ - spec/unit/client/shared/fcm/app.rb
855
+ - spec/unit/client/shared/fcm/notification.rb
793
856
  - spec/unit/client/shared/gcm/app.rb
794
857
  - spec/unit/client/shared/gcm/notification.rb
795
858
  - spec/unit/client/shared/notification.rb
@@ -814,6 +877,7 @@ test_files:
814
877
  - spec/unit/daemon/dispatcher/http_spec.rb
815
878
  - spec/unit/daemon/dispatcher/tcp_spec.rb
816
879
  - spec/unit/daemon/dispatcher_loop_spec.rb
880
+ - spec/unit/daemon/fcm/delivery_spec.rb
817
881
  - spec/unit/daemon/feeder_spec.rb
818
882
  - spec/unit/daemon/gcm/delivery_spec.rb
819
883
  - spec/unit/daemon/proc_title_spec.rb