notifiable-apns-grocer 0.13.1 → 0.15.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ede6dedfe7e69539c8a801a6f77222a70c66b619
4
- data.tar.gz: 938f7d8314bc277c82fbb5511fbe1696ffbf28f9
3
+ metadata.gz: 9f98e571808f87e99bf9f26f34d31e76aa25aa5b
4
+ data.tar.gz: 5ef965c6a92674148da9b9ef5e17cd338ac1753c
5
5
  SHA512:
6
- metadata.gz: ad80166bb9fb3ab60a2d81b518a9355d710e6bdf5ebfb0d8c00d76974a279ac9e8d53becc01e9975050ba1b90ca6c38f70a610e88ba397c8667a5d020ab3457d
7
- data.tar.gz: 59a60a1b7bd225dcda5fe8aa4854b10671d5014e8d8d3e2d444866b00368c31bf2c8e0204ea6214bc6148fa7434f030bfb4dec931c299154d6937ab3fb1e573c
6
+ metadata.gz: 69e74a7cbafbd3fae7ec9356bceeba1fd547eaaf03e4f86f3c93b1670796ea4fb7d1a4a61e74179dcd5240e2f67a375eb8690e3e7d34469ae95ff6186c9778ea
7
+ data.tar.gz: 13a79028ce58615c5dddc3134c0c0743f127418eb29750986208e9038d11bd96410a0510fe11abd2869c9a95f94b832505b84c29b473c60e7b4c86711fd7240f
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ ruby '2.3.1'
4
+
3
5
  # Specify your gem's dependencies in notifiable-apns-grocer.gemspec
4
- gemspec
6
+ gemspec
7
+
8
+ gem 'notifiable-rails', github: "FutureWorkshops/notifiable-rails"
@@ -1,6 +1,7 @@
1
1
  require 'notifiable'
2
- require "notifiable/apns/grocer/version"
3
- require "notifiable/apns/grocer/stream"
2
+ require 'notifiable/apns/grocer/version'
3
+ require 'notifiable/apns/grocer/stream'
4
+ require 'notifiable/apns/grocer/grocer_ssl_connection'
4
5
 
5
6
  module Notifiable
6
7
  module Apns
@@ -0,0 +1,15 @@
1
+ module Grocer
2
+ class SSLConnection
3
+ def connect
4
+ context = OpenSSL::SSL::SSLContext.new
5
+ context.key = OpenSSL::PKey::RSA.new(certificate, passphrase)
6
+ context.cert = OpenSSL::X509::Certificate.new(certificate)
7
+
8
+ @sock = TCPSocket.new(gateway, port)
9
+ @sock.setsockopt Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true
10
+ @ssl = OpenSSL::SSL::SSLSocket.new(@sock, context)
11
+ @ssl.sync = true
12
+ @ssl.connect
13
+ end
14
+ end
15
+ end
@@ -7,25 +7,9 @@ module Notifiable
7
7
  module Grocer
8
8
  class Stream < Notifiable::NotifierBase
9
9
 
10
- notifier_attribute :certificate, :passphrase, :connection_pool_size, :connection_pool_timeout, :gateway_host, :gateway_port, :feedback_host, :feedback_port
10
+ notifier_attribute :certificate, :passphrase, :sandbox, :connection_pool_size, :connection_pool_timeout
11
11
 
12
12
  attr_reader :certificate, :passphrase
13
-
14
- def gateway_host
15
- @gateway_host || "gateway.push.apple.com"
16
- end
17
-
18
- def gateway_port
19
- @gateway_port || 2195
20
- end
21
-
22
- def feedback_host
23
- @gateway_host || "feedback.push.apple.com"
24
- end
25
-
26
- def feedback_port
27
- @feedback_port || 2196
28
- end
29
13
 
30
14
  def connection_pool_size
31
15
  @connection_pool_size || 10
@@ -34,6 +18,10 @@ module Notifiable
34
18
  def connection_pool_timeout
35
19
  @connection_pool_timeout || 10
36
20
  end
21
+
22
+ def sandbox?
23
+ @sandbox == "1"
24
+ end
37
25
 
38
26
  def close
39
27
  super
@@ -42,31 +30,40 @@ module Notifiable
42
30
  end
43
31
 
44
32
  protected
45
- def enqueue(device_token, localized_notification)
46
-
33
+ def enqueue(device, notification)
47
34
  raise "Certificate missing" if certificate.nil?
48
-
49
- grocer_notification = ::Grocer::Notification.new(
50
- device_token: device_token.token,
51
- alert: localized_notification.message,
52
- custom: localized_notification.send_params,
53
- sound: "default"
54
- )
35
+
36
+ grocer_notification = ::Grocer::Notification.new(grocer_payload(device, notification))
55
37
 
56
38
  pusher_pool.with do |pusher|
57
39
  pusher.push(grocer_notification)
58
40
  end
59
41
 
60
42
  # assume processed. Errors will be receieved through a callback
61
- processed(device_token, 0)
43
+ processed(device, 0)
62
44
  end
63
45
 
64
46
  def flush
65
47
  process_feedback unless self.test_env?
66
48
  end
67
49
 
68
- private
69
- # logic
50
+ private
51
+ def gateway_host
52
+ self.sandbox? ? "gateway.sandbox.push.apple.com" : "gateway.push.apple.com"
53
+ end
54
+
55
+ def gateway_port
56
+ 2195
57
+ end
58
+
59
+ def feedback_host
60
+ self.sandbox? ? "feedback.sandbox.push.apple.com" : "feedback.push.apple.com"
61
+ end
62
+
63
+ def feedback_port
64
+ 2196
65
+ end
66
+
70
67
  def gateway_config
71
68
  {
72
69
  certificate: certificate,
@@ -87,6 +84,18 @@ module Notifiable
87
84
  }
88
85
  end
89
86
 
87
+ def grocer_payload(device, notification)
88
+ payload = {device_token: device.token, custom: notification.send_params}
89
+ payload[:alert] = notification.title ? {title: notification.title, body: notification.message} : notification.message
90
+ payload[:sound] = notification.sound if notification.sound
91
+ payload[:badge] = notification.badge_count if notification.badge_count
92
+ payload[:identifier] = notification.identifier if notification.identifier
93
+ payload[:content_available] = notification.content_available if notification.content_available
94
+ payload[:mutable_content] = notification.mutable_content if notification.mutable_content
95
+ payload[:expiry] = notification.expiry if notification.expiry
96
+ payload
97
+ end
98
+
90
99
  def pusher_pool
91
100
  @pusher_pool ||= ConnectionPool.new(size: connection_pool_size, timeout: connection_pool_timeout) do
92
101
  ::Grocer.pusher(gateway_config)
@@ -102,8 +111,8 @@ module Notifiable
102
111
  token = attempt.device_token
103
112
  device_token = DeviceToken.find_by_token(token)
104
113
  if device_token
105
- device_token.update_attribute("is_valid", false) if device_token.updated_at < attempt.timestamp
106
- Rails.logger.info("Device #{token} (#{device_token.user_id}) failed at #{attempt.timestamp}")
114
+ device_token.destroy if device_token.updated_at < attempt.timestamp
115
+ Rails.logger.info("Device #{token} removed at #{attempt.timestamp}")
107
116
  end
108
117
  end
109
118
  end
@@ -1,7 +1,7 @@
1
1
  module Notifiable
2
2
  module Apns
3
3
  module Grocer
4
- VERSION = "0.13.1"
4
+ VERSION = "0.15.0"
5
5
  end
6
6
  end
7
7
  end
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "notifiable-rails", ">=0.24.1"
22
- spec.add_dependency "grocer", '~> 0.6.1'
22
+ spec.add_dependency "grocer", '~> 0.7.0'
23
23
  spec.add_dependency "connection_pool", '~> 2.0.0'
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.3"
@@ -29,7 +29,6 @@ Gem::Specification.new do |spec|
29
29
  spec.add_development_dependency "simplecov-rcov"
30
30
  spec.add_development_dependency "sqlite3"
31
31
  spec.add_development_dependency "database_cleaner"
32
- spec.add_development_dependency 'ruby-prof'
33
32
  spec.add_development_dependency 'byebug'
34
33
 
35
34
  end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Send notification" do
4
+
5
+ let(:a1) { Notifiable::App.create }
6
+ let(:n1) { Notifiable::Notification.create(:app => a1, message: "Test message") }
7
+ let(:d1) { Notifiable::DeviceToken.create(:token => "ABC123", :provider => :apns, :app => a1) }
8
+
9
+ describe "#add_device_token" do
10
+
11
+ before(:each) do
12
+ a1.save_notification_statuses = true
13
+ a1.apns_certificate = File.read(File.join(File.dirname(__FILE__), "..", "fixtures", "apns-development.pem"))
14
+ allow_any_instance_of(Notifiable::Apns::Grocer::Stream).to receive(:gateway_host).and_return("localhost")
15
+
16
+ n1.batch do |n|
17
+ n.add_device_token(d1)
18
+ end
19
+
20
+ Timeout.timeout(2) {
21
+ @notification = @grocer.notifications.pop
22
+ }
23
+ end
24
+
25
+ it { expect(Notifiable::NotificationStatus.count).to eql 1 }
26
+ it { expect(Notifiable::NotificationStatus.first.status).to eql 0 }
27
+ it { expect(@notification.alert).to eql "Test message" }
28
+ it { expect(@notification.custom[:n_id]).to eql n1.id }
29
+ end
30
+ end
data/spec/spec_helper.rb CHANGED
@@ -16,7 +16,7 @@ require 'grocer'
16
16
  require File.expand_path("../../lib/notifiable/apns/grocer", __FILE__)
17
17
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
18
18
 
19
- db_path = 'spec/support/db/test.sqlite3'
19
+ db_path = 'spec/test.sqlite3'
20
20
  DatabaseCleaner.strategy = :truncation
21
21
 
22
22
  Rails.logger = Logger.new(STDOUT)
@@ -40,7 +40,8 @@ RSpec.configure do |config|
40
40
  )
41
41
 
42
42
  ActiveRecord::Migration.verbose = false
43
- ActiveRecord::Migrator.migrate "spec/support/db/migrate"
43
+ notifiable_rails_path = Gem.loaded_specs['notifiable-rails'].full_gem_path
44
+ ActiveRecord::Migrator.migrate File.join(notifiable_rails_path, 'db', 'migrate')
44
45
 
45
46
  @grocer = Grocer.server(port: 2195)
46
47
  @grocer.accept
data/spec/stream_spec.rb CHANGED
@@ -2,71 +2,108 @@ require 'spec_helper'
2
2
 
3
3
  describe Notifiable::Apns::Grocer::Stream do
4
4
 
5
- let(:a) { Notifiable::App.create }
6
- let(:n1) { Notifiable::Notification.create(:app => a) }
7
- let!(:ln) { Notifiable::LocalizedNotification.create(:message => "Test message", :params => {:flag => true}, :notification => n1, :locale => 'en') }
8
- let(:d) { Notifiable::DeviceToken.create(:token => "ABC123", :provider => :apns, :app => a, :locale => 'en') }
5
+ subject { Notifiable::Apns::Grocer::Stream.new(Rails.env, n1) }
6
+ let(:a1) { Notifiable::App.create! name: "Drum Cussac" }
7
+ let(:n1) { Notifiable::Notification.create! app: a1 }
9
8
 
10
- before(:each) do
11
- a.apns_gateway_host = "localhost"
12
- a.apns_gateway_port = 2195
13
- a.apns_feedback_host = "localhost"
14
- a.apns_feedback_port = 2196
15
- a.apns_certificate = File.join(File.dirname(__FILE__), "fixtures", "apns-development.pem")
16
- a.save_notification_statuses = true
9
+ describe "#sandbox?" do
10
+ before(:each) { subject.instance_variable_set("@sandbox", "1") }
11
+ it { expect(subject.send(:sandbox?)).to eql true }
17
12
  end
18
13
 
19
- it "sends a single notification" do
20
- n1.batch do |n|
21
- n.add_device_token(d)
14
+ describe "#grocer_payload?" do
15
+ let(:d1) { Notifiable::DeviceToken.create! app: a1, token: "abc123", provider: 'apns' }
16
+ before(:each) { @grocer_payload = subject.send("grocer_payload", d1, n1) }
17
+
18
+ context "message" do
19
+ let(:n1) { Notifiable::Notification.create! app: a1, message: "New deals!" }
20
+ it { expect(@grocer_payload).to include(alert: "New deals!") }
21
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
22
+ it { expect(@grocer_payload).to_not include(:sound) }
23
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
22
24
  end
23
25
 
24
- expect(Notifiable::NotificationStatus.count).to eql 1
25
- expect(Notifiable::NotificationStatus.first.status).to eql 0
26
+ context "title and message" do
27
+ let(:n1) { Notifiable::Notification.create! app: a1, title: 'Shopping', message: "New deals!" }
28
+ it { expect(@grocer_payload[:alert]).to include({title: 'Shopping'}) }
29
+ it { expect(@grocer_payload[:alert]).to include({body: 'New deals!'}) }
30
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
31
+ it { expect(@grocer_payload).to_not include(:sound) }
32
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
33
+ end
26
34
 
27
- Timeout.timeout(2) {
28
- notification = @grocer.notifications.pop
29
- expect(notification.alert).to eql "Test message"
30
- expect(notification.custom[:localized_notification_id]).to eql ln.id
31
- }
32
- end
33
-
34
- it "supports custom properties" do
35
- n1.batch do |n|
36
- n.add_device_token(d)
35
+ context "sound" do
36
+ let(:n1) { Notifiable::Notification.create! app: a1, sound: "buzzer" }
37
+ it { expect(@grocer_payload).to include(sound: "buzzer") }
38
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
39
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
37
40
  end
38
-
39
- expect(Notifiable::NotificationStatus.count).to eql 1
40
- expect(Notifiable::NotificationStatus.first.status).to eql 0
41
41
 
42
- Timeout.timeout(2) {
43
- notification = @grocer.notifications.pop
44
- expect(notification.custom[:localized_notification_id]).to eql ln.id
45
- expect(notification.custom[:flag]).to eql true
46
- }
47
- end
48
-
49
- it "sets gateway and feedback properties" do
50
- g = Notifiable::Apns::Grocer::Stream.new(Rails.env, n1)
51
- a.configure(:apns, g)
42
+ context "badge count" do
43
+ let(:n1) { Notifiable::Notification.create! app: a1, badge_count: 1 }
44
+ it { expect(@grocer_payload).to include(badge: 1) }
45
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
46
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
47
+ end
52
48
 
53
- expect(g.send(:gateway_host)).to eql "localhost"
54
- expect(g.send(:gateway_port)).to eql 2195
55
- expect(g.send(:feedback_host)).to eql "localhost"
56
- expect(g.send(:feedback_port)).to eql 2196
49
+ context "parameters" do
50
+ let(:n1) { Notifiable::Notification.create! app: a1, parameters: {screen: "leaderboard"}}
51
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
52
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
53
+ it { expect(@grocer_payload[:custom]).to include(screen: "leaderboard") }
54
+ end
57
55
 
58
- end
59
-
60
- it "has default connection pool size" do
61
- g = Notifiable::Apns::Grocer::Stream.new(Rails.env, n1)
56
+ context "identifier" do
57
+ let(:n1) { Notifiable::Notification.create! app: a1, identifier: "23508241"}
58
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
59
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
60
+ it { expect(@grocer_payload).to include(identifier: "23508241") }
61
+ end
62
62
 
63
- expect(g.send(:connection_pool_size)).to eq 10
63
+ context "content_available" do
64
+ let(:n1) { Notifiable::Notification.create! app: a1, content_available: true}
65
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
66
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
67
+ it { expect(@grocer_payload).to include(content_available: true) }
68
+ end
69
+
70
+ context "mutable_content" do
71
+ let(:n1) { Notifiable::Notification.create! app: a1, mutable_content: true}
72
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
73
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
74
+ it { expect(@grocer_payload).to include(mutable_content: true) }
75
+ end
76
+
77
+ context "expiry" do
78
+ let(:expiry) { Time.now + 60*60 }
79
+ let(:n1) { Notifiable::Notification.create! app: a1, expiry: expiry}
80
+ it { expect(@grocer_payload).to include(device_token: "abc123") }
81
+ it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
82
+ it { expect(@grocer_payload).to include(expiry: expiry) }
83
+ end
64
84
  end
65
85
 
66
- it "has default connection pool timeout" do
67
- g = Notifiable::Apns::Grocer::Stream.new(Rails.env, n1)
86
+ describe "#gateway_host" do
87
+ context "sandbox" do
88
+ before(:each) { allow(subject).to receive(:sandbox?) { true } }
89
+ it { expect(subject.send(:gateway_host)).to eql "gateway.sandbox.push.apple.com" }
90
+ end
68
91
 
69
- expect(g.send(:connection_pool_timeout)).to eq 10
92
+ context "production" do
93
+ before(:each) { allow(subject).to receive(:sandbox?) { false } }
94
+ it { expect(subject.send(:gateway_host)).to eql "gateway.push.apple.com" }
95
+ end
96
+ end
97
+
98
+ describe "#feedback" do
99
+ let!(:d1) { Notifiable::DeviceToken.create! app: a1, token: 'abc123', provider: 'apns' }
100
+ before(:each) do
101
+ feedback_double = double('Grocer::Feedback')
102
+ attempt_double = double('Grocer::FailedDeliveryAttempt', device_token: 'abc123', timestamp: DateTime.now)
103
+ allow(subject).to receive(:grocer_feedback) { [attempt_double].each }
104
+ subject.send(:process_feedback)
105
+ end
106
+ it { expect(Notifiable::DeviceToken.count).to eq 0 }
70
107
  end
71
108
 
72
109
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notifiable-apns-grocer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kamil Kocemba
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-03-13 00:00:00.000000000 Z
12
+ date: 2018-03-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: notifiable-rails
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: 0.6.1
34
+ version: 0.7.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: 0.6.1
41
+ version: 0.7.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: connection_pool
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -151,20 +151,6 @@ dependencies:
151
151
  - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: '0'
154
- - !ruby/object:Gem::Dependency
155
- name: ruby-prof
156
- requirement: !ruby/object:Gem::Requirement
157
- requirements:
158
- - - ">="
159
- - !ruby/object:Gem::Version
160
- version: '0'
161
- type: :development
162
- prerelease: false
163
- version_requirements: !ruby/object:Gem::Requirement
164
- requirements:
165
- - - ">="
166
- - !ruby/object:Gem::Version
167
- version: '0'
168
154
  - !ruby/object:Gem::Dependency
169
155
  name: byebug
170
156
  requirement: !ruby/object:Gem::Requirement
@@ -189,26 +175,20 @@ extra_rdoc_files: []
189
175
  files:
190
176
  - ".gitignore"
191
177
  - ".rspec"
192
- - ".ruby-gemset"
193
- - ".ruby-version"
194
178
  - Gemfile
195
179
  - LICENSE
196
180
  - LICENSE.txt
197
181
  - README.md
198
182
  - Rakefile
199
183
  - lib/notifiable/apns/grocer.rb
184
+ - lib/notifiable/apns/grocer/grocer_ssl_connection.rb
200
185
  - lib/notifiable/apns/grocer/stream.rb
201
186
  - lib/notifiable/apns/grocer/version.rb
202
- - lib/tasks/load_test.rake
203
187
  - notifiable-apns-grocer.gemspec
188
+ - spec/features/send_notification_spec.rb
204
189
  - spec/fixtures/apns-development.pem
205
190
  - spec/spec_helper.rb
206
191
  - spec/stream_spec.rb
207
- - spec/support/db/migrate/20131210115648_create_notifiable_apps.rb
208
- - spec/support/db/migrate/20131210115649_create_notifiable_device_tokens.rb
209
- - spec/support/db/migrate/20131210115650_create_notifiable_notifications.rb
210
- - spec/support/db/migrate/20131210115651_create_notifiable_localized_notifications.rb
211
- - spec/support/db/migrate/20131210115652_create_notifiable_statuses.rb
212
192
  homepage: http://www.futureworkshops.com
213
193
  licenses:
214
194
  - Apache 2.0
@@ -229,16 +209,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
229
209
  version: '0'
230
210
  requirements: []
231
211
  rubyforge_project:
232
- rubygems_version: 2.4.3
212
+ rubygems_version: 2.6.14
233
213
  signing_key:
234
214
  specification_version: 4
235
215
  summary: Notifiable APNS plugin for Grocer
236
216
  test_files:
217
+ - spec/features/send_notification_spec.rb
237
218
  - spec/fixtures/apns-development.pem
238
219
  - spec/spec_helper.rb
239
220
  - spec/stream_spec.rb
240
- - spec/support/db/migrate/20131210115648_create_notifiable_apps.rb
241
- - spec/support/db/migrate/20131210115649_create_notifiable_device_tokens.rb
242
- - spec/support/db/migrate/20131210115650_create_notifiable_notifications.rb
243
- - spec/support/db/migrate/20131210115651_create_notifiable_localized_notifications.rb
244
- - spec/support/db/migrate/20131210115652_create_notifiable_statuses.rb
data/.ruby-gemset DELETED
@@ -1 +0,0 @@
1
- notifiable-apns-grocer
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.1.5
@@ -1,84 +0,0 @@
1
- require 'rubygems'
2
- require 'grocer'
3
- require 'benchmark'
4
- require 'ruby-prof'
5
-
6
- include Benchmark
7
-
8
- namespace :apns do
9
- desc "Load tests the notification deliver against stub APNS server"
10
- task :load_test => :environment do
11
- Rails.env = "test"
12
-
13
- ActiveRecord::Base.establish_connection('load_test_sqlite')
14
-
15
- #ActiveRecord::Base.establish_connection('load_test_pg')
16
- #ActiveRecord::Base.establish_connection('load_test_mysql')
17
-
18
- test_apns
19
- end
20
- end
21
-
22
- private
23
- def test_apns
24
-
25
- RubyProf.start
26
-
27
- Notifiable.configure do |config|
28
- config.apns_certificate = nil
29
- config.apns_gateway = ENV["NOTIFIABLE_APNS_STUB_HOST"] || "localhost"
30
- config.apns_passphrase = nil
31
- end
32
-
33
- notification = Notifiable::Notification.create(:message => 'Test notification')
34
- user = User.create({ :email => 'test@example.com' })
35
- device_token = Notifiable::DeviceToken.create(:token => '852a38d14b5e6df4168d3f7f41b38f6627b2cc0605bd53266f6d6fe8332738', :provider => :apns, :user_id => 'test@example.com')
36
-
37
- iterations = 10
38
- batch_size = 10000
39
-
40
- tt = Benchmark::Tms.new
41
-
42
- Benchmark.benchmark(CAPTION, 9, FORMAT, "> TOTAL: ", "> BATCH:") do |x|
43
- iterations.times do ;
44
-
45
- tt = tt + x.report("#{batch_size}:") {
46
- Notifiable.batch do |batch|
47
- batch_size.times do ;
48
- batch.add(notification, user)
49
- end
50
- end
51
- }
52
-
53
- end
54
- [tt, tt / iterations]
55
- end
56
- device_token.destroy
57
- user.destroy
58
- notification.destroy
59
-
60
- result = RubyProf.stop
61
- printer = RubyProf::GraphHtmlPrinter.new(result)
62
- printer.print(File.new('/tmp/profile.html', 'w'), :min_percent => 2)
63
-
64
- end
65
-
66
- # Hack to disable server cert verfification
67
-
68
- module Grocer
69
- class SSLConnection
70
-
71
- def connect
72
- context = OpenSSL::SSL::SSLContext.new
73
- context.verify_mode = OpenSSL::SSL::VERIFY_NONE
74
- @sock = TCPSocket.new(gateway, port)
75
- @sock.setsockopt Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true
76
- @ssl = OpenSSL::SSL::SSLSocket.new(@sock, context)
77
- @ssl.sync = true
78
- @ssl.connect
79
- end
80
-
81
- end
82
- end
83
-
84
-
@@ -1,10 +0,0 @@
1
- class CreateNotifiableApps < ActiveRecord::Migration
2
- def change
3
- create_table :notifiable_apps do |t|
4
- t.string :name
5
- t.text :configuration
6
-
7
- t.timestamps
8
- end
9
- end
10
- end
@@ -1,19 +0,0 @@
1
- class CreateNotifiableDeviceTokens < ActiveRecord::Migration
2
-
3
- def change
4
- create_table :notifiable_device_tokens do |t|
5
- t.string :token
6
- t.string :provider
7
- t.string :locale
8
- t.boolean :is_valid, :default => true
9
- t.integer :user_id
10
- t.references :app
11
-
12
- t.timestamps
13
- end
14
-
15
- add_index :notifiable_device_tokens, :token, :unique => true
16
- add_index :notifiable_device_tokens, :user_id
17
- end
18
-
19
- end
@@ -1,16 +0,0 @@
1
- class CreateNotifiableNotifications < ActiveRecord::Migration
2
-
3
- def change
4
- create_table :notifiable_notifications do |t|
5
- t.references :app
6
-
7
- #stats
8
- t.integer :sent_count, :default => 0
9
- t.integer :gateway_accepted_count, :default => 0
10
- t.integer :opened_count, :default => 0
11
-
12
- t.timestamps
13
- end
14
- end
15
-
16
- end
@@ -1,22 +0,0 @@
1
- class CreateNotifiableLocalizedNotifications < ActiveRecord::Migration
2
-
3
- def change
4
- create_table :notifiable_localized_notifications do |t|
5
- t.text :message
6
- t.text :params
7
- t.string :locale
8
- t.references :notification
9
-
10
- # APNS - Optional
11
- #t.integer :badge
12
- #t.text :sound
13
- #t.datetime :expiry
14
-
15
- # MPNS - Optional
16
- #t.text :title
17
-
18
- t.timestamps
19
- end
20
- end
21
-
22
- end
@@ -1,12 +0,0 @@
1
- class CreateNotifiableStatuses < ActiveRecord::Migration
2
-
3
- def change
4
- create_table :notifiable_statuses do |t|
5
- t.references :localized_notification
6
- t.references :device_token
7
- t.integer :status
8
- t.datetime :created_at
9
- end
10
- end
11
-
12
- end