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.
Files changed (201) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/README.md +37 -22
  4. data/bin/rpush +13 -4
  5. data/lib/generators/rpush_generator.rb +2 -0
  6. data/lib/generators/templates/add_adm.rb +5 -5
  7. data/lib/generators/templates/add_alert_is_json_to_rapns_notifications.rb +1 -1
  8. data/lib/generators/templates/add_app_to_rapns.rb +2 -2
  9. data/lib/generators/templates/add_fail_after_to_rpush_notifications.rb +1 -1
  10. data/lib/generators/templates/add_gcm.rb +32 -32
  11. data/lib/generators/templates/add_rpush.rb +67 -67
  12. data/lib/generators/templates/add_wpns.rb +2 -2
  13. data/lib/generators/templates/create_rapns_apps.rb +5 -5
  14. data/lib/generators/templates/create_rapns_feedback.rb +2 -2
  15. data/lib/generators/templates/create_rapns_notifications.rb +15 -15
  16. data/lib/generators/templates/rpush.rb +28 -7
  17. data/lib/generators/templates/rpush_2_0_0_updates.rb +42 -0
  18. data/lib/rpush/client/active_model/adm/app.rb +23 -0
  19. data/lib/rpush/client/active_model/adm/data_validator.rb +14 -0
  20. data/lib/rpush/client/active_model/adm/notification.rb +28 -0
  21. data/lib/rpush/client/active_model/apns/app.rb +37 -0
  22. data/lib/rpush/client/active_model/apns/binary_notification_validator.rb +16 -0
  23. data/lib/rpush/client/active_model/apns/device_token_format_validator.rb +14 -0
  24. data/lib/rpush/client/active_model/apns/notification.rb +90 -0
  25. data/lib/rpush/client/active_model/gcm/app.rb +19 -0
  26. data/lib/rpush/client/active_model/gcm/expiry_collapse_key_mutual_inclusion_validator.rb +14 -0
  27. data/lib/rpush/client/active_model/gcm/notification.rb +31 -0
  28. data/lib/rpush/client/active_model/notification.rb +26 -0
  29. data/lib/rpush/client/active_model/payload_data_size_validator.rb +13 -0
  30. data/lib/rpush/client/active_model/registration_ids_count_validator.rb +13 -0
  31. data/lib/rpush/client/active_model/wpns/app.rb +13 -0
  32. data/lib/rpush/client/active_model/wpns/notification.rb +17 -0
  33. data/lib/rpush/client/active_model.rb +21 -0
  34. data/lib/rpush/client/active_record/adm/app.rb +11 -0
  35. data/lib/rpush/client/active_record/adm/notification.rb +11 -0
  36. data/lib/rpush/client/active_record/apns/app.rb +11 -0
  37. data/lib/rpush/client/active_record/apns/feedback.rb +22 -0
  38. data/lib/rpush/client/active_record/apns/notification.rb +46 -0
  39. data/lib/rpush/client/active_record/app.rb +17 -0
  40. data/lib/rpush/client/active_record/gcm/app.rb +11 -0
  41. data/lib/rpush/client/active_record/gcm/notification.rb +11 -0
  42. data/lib/rpush/client/active_record/notification.rb +38 -0
  43. data/lib/rpush/client/active_record/wpns/app.rb +11 -0
  44. data/lib/rpush/client/active_record/wpns/notification.rb +11 -0
  45. data/lib/rpush/client/active_record.rb +19 -0
  46. data/lib/rpush/client/redis/adm/app.rb +14 -0
  47. data/lib/rpush/client/redis/adm/notification.rb +11 -0
  48. data/lib/rpush/client/redis/apns/app.rb +11 -0
  49. data/lib/rpush/client/redis/apns/feedback.rb +20 -0
  50. data/lib/rpush/client/redis/apns/notification.rb +11 -0
  51. data/lib/rpush/client/redis/app.rb +24 -0
  52. data/lib/rpush/client/redis/gcm/app.rb +11 -0
  53. data/lib/rpush/client/redis/gcm/notification.rb +11 -0
  54. data/lib/rpush/client/redis/notification.rb +68 -0
  55. data/lib/rpush/client/redis/wpns/app.rb +11 -0
  56. data/lib/rpush/client/redis/wpns/notification.rb +11 -0
  57. data/lib/rpush/client/redis.rb +35 -0
  58. data/lib/rpush/configuration.rb +27 -6
  59. data/lib/rpush/daemon/adm/delivery.rb +56 -55
  60. data/lib/rpush/daemon/apns/delivery.rb +20 -44
  61. data/lib/rpush/daemon/apns/feedback_receiver.rb +11 -8
  62. data/lib/rpush/daemon/apns.rb +6 -5
  63. data/lib/rpush/daemon/app_runner.rb +103 -99
  64. data/lib/rpush/daemon/batch.rb +54 -40
  65. data/lib/rpush/daemon/delivery.rb +13 -3
  66. data/lib/rpush/daemon/delivery_error.rb +10 -2
  67. data/lib/rpush/daemon/dispatcher/apns_tcp.rb +114 -0
  68. data/lib/rpush/daemon/dispatcher/http.rb +3 -3
  69. data/lib/rpush/daemon/dispatcher/tcp.rb +3 -3
  70. data/lib/rpush/daemon/dispatcher_loop.rb +37 -23
  71. data/lib/rpush/daemon/errors.rb +18 -0
  72. data/lib/rpush/daemon/feeder.rb +28 -39
  73. data/lib/rpush/daemon/gcm/delivery.rb +19 -20
  74. data/lib/rpush/daemon/interruptible_sleep.rb +26 -45
  75. data/lib/rpush/daemon/loggable.rb +2 -4
  76. data/lib/rpush/daemon/proc_title.rb +16 -0
  77. data/lib/rpush/daemon/queue_payload.rb +12 -0
  78. data/lib/rpush/daemon/reflectable.rb +3 -5
  79. data/lib/rpush/daemon/retry_header_parser.rb +6 -6
  80. data/lib/rpush/daemon/retryable_error.rb +2 -0
  81. data/lib/rpush/daemon/ring_buffer.rb +16 -0
  82. data/lib/rpush/daemon/service_config_methods.rb +23 -7
  83. data/lib/rpush/daemon/signal_handler.rb +56 -0
  84. data/lib/rpush/daemon/store/active_record/reconnectable.rb +21 -17
  85. data/lib/rpush/daemon/store/active_record.rb +71 -38
  86. data/lib/rpush/daemon/store/interface.rb +19 -0
  87. data/lib/rpush/daemon/store/redis.rb +149 -0
  88. data/lib/rpush/daemon/string_helpers.rb +15 -0
  89. data/lib/rpush/daemon/synchronizer.rb +60 -0
  90. data/lib/rpush/daemon/tcp_connection.rb +6 -11
  91. data/lib/rpush/daemon/wpns/delivery.rb +21 -30
  92. data/lib/rpush/daemon.rb +40 -60
  93. data/lib/rpush/deprecatable.rb +4 -3
  94. data/lib/rpush/deprecation.rb +7 -10
  95. data/lib/rpush/embed.rb +8 -3
  96. data/lib/rpush/logger.rb +11 -15
  97. data/lib/rpush/push.rb +1 -2
  98. data/lib/rpush/reflection.rb +8 -12
  99. data/lib/rpush/version.rb +1 -1
  100. data/lib/rpush.rb +5 -29
  101. data/lib/tasks/quality.rake +35 -0
  102. data/lib/tasks/test.rake +1 -5
  103. data/spec/.rubocop.yml +4 -0
  104. data/spec/functional/adm_spec.rb +3 -6
  105. data/spec/functional/apns_spec.rb +117 -24
  106. data/spec/functional/embed_spec.rb +20 -20
  107. data/spec/functional/gcm_spec.rb +4 -7
  108. data/spec/functional/new_app_spec.rb +59 -0
  109. data/spec/functional/retry_spec.rb +46 -0
  110. data/spec/functional/synchronization_spec.rb +68 -0
  111. data/spec/functional/wpns_spec.rb +3 -6
  112. data/spec/functional_spec_helper.rb +26 -0
  113. data/spec/integration/rpush_spec.rb +13 -0
  114. data/spec/integration/support/gcm_success_response.json +1 -0
  115. data/spec/spec_helper.rb +60 -0
  116. data/spec/support/active_record_setup.rb +48 -0
  117. data/{config → spec/support/config}/database.yml +0 -0
  118. data/spec/support/install.sh +43 -7
  119. data/spec/support/simplecov_helper.rb +9 -5
  120. data/spec/support/simplecov_quality_formatter.rb +10 -6
  121. data/spec/unit/apns_feedback_spec.rb +3 -3
  122. data/spec/unit/{adm → client/active_record/adm}/app_spec.rb +3 -3
  123. data/spec/unit/{adm → client/active_record/adm}/notification_spec.rb +5 -7
  124. data/spec/unit/client/active_record/apns/app_spec.rb +29 -0
  125. data/spec/unit/client/active_record/apns/feedback_spec.rb +9 -0
  126. data/spec/unit/client/active_record/apns/notification_spec.rb +231 -0
  127. data/spec/unit/client/active_record/app_spec.rb +30 -0
  128. data/spec/unit/client/active_record/gcm/app_spec.rb +4 -0
  129. data/spec/unit/{gcm → client/active_record/gcm}/notification_spec.rb +5 -7
  130. data/spec/unit/client/active_record/notification_spec.rb +21 -0
  131. data/spec/unit/client/active_record/wpns/app_spec.rb +4 -0
  132. data/spec/unit/client/active_record/wpns/notification_spec.rb +21 -0
  133. data/spec/unit/configuration_spec.rb +12 -5
  134. data/spec/unit/daemon/adm/delivery_spec.rb +66 -55
  135. data/spec/unit/daemon/apns/certificate_expired_error_spec.rb +3 -3
  136. data/spec/unit/daemon/apns/delivery_spec.rb +90 -83
  137. data/spec/unit/daemon/apns/feedback_receiver_spec.rb +22 -17
  138. data/spec/unit/daemon/app_runner_spec.rb +78 -186
  139. data/spec/unit/daemon/batch_spec.rb +52 -115
  140. data/spec/unit/daemon/delivery_spec.rb +15 -1
  141. data/spec/unit/daemon/dispatcher/http_spec.rb +3 -2
  142. data/spec/unit/daemon/dispatcher/tcp_spec.rb +10 -9
  143. data/spec/unit/daemon/dispatcher_loop_spec.rb +6 -24
  144. data/spec/unit/daemon/feeder_spec.rb +38 -39
  145. data/spec/unit/daemon/gcm/delivery_spec.rb +122 -101
  146. data/spec/unit/daemon/reflectable_spec.rb +2 -2
  147. data/spec/unit/daemon/retryable_error_spec.rb +1 -1
  148. data/spec/unit/daemon/service_config_methods_spec.rb +6 -3
  149. data/spec/unit/daemon/signal_handler_spec.rb +95 -0
  150. data/spec/unit/daemon/store/active_record/reconnectable_spec.rb +48 -27
  151. data/spec/unit/daemon/store/active_record_spec.rb +38 -47
  152. data/spec/unit/daemon/tcp_connection_spec.rb +22 -34
  153. data/spec/unit/daemon/wpns/delivery_spec.rb +58 -50
  154. data/spec/unit/daemon_spec.rb +48 -82
  155. data/spec/unit/embed_spec.rb +6 -4
  156. data/spec/unit/logger_spec.rb +35 -43
  157. data/spec/unit/notification_shared.rb +9 -79
  158. data/spec/unit/push_spec.rb +6 -10
  159. data/spec/unit/reflection_spec.rb +25 -25
  160. data/spec/unit/rpush_spec.rb +1 -2
  161. data/spec/unit_spec_helper.rb +33 -88
  162. metadata +126 -76
  163. data/lib/rpush/TODO +0 -3
  164. data/lib/rpush/adm/app.rb +0 -15
  165. data/lib/rpush/adm/data_validator.rb +0 -11
  166. data/lib/rpush/adm/notification.rb +0 -29
  167. data/lib/rpush/apns/app.rb +0 -29
  168. data/lib/rpush/apns/binary_notification_validator.rb +0 -12
  169. data/lib/rpush/apns/device_token_format_validator.rb +0 -12
  170. data/lib/rpush/apns/feedback.rb +0 -16
  171. data/lib/rpush/apns/notification.rb +0 -84
  172. data/lib/rpush/app.rb +0 -18
  173. data/lib/rpush/daemon/apns/certificate_expired_error.rb +0 -20
  174. data/lib/rpush/daemon/apns/disconnection_error.rb +0 -20
  175. data/lib/rpush/daemon/dispatcher_loop_collection.rb +0 -33
  176. data/lib/rpush/daemon/too_many_requests_error.rb +0 -20
  177. data/lib/rpush/gcm/app.rb +0 -11
  178. data/lib/rpush/gcm/expiry_collapse_key_mutual_inclusion_validator.rb +0 -11
  179. data/lib/rpush/gcm/notification.rb +0 -30
  180. data/lib/rpush/notification.rb +0 -69
  181. data/lib/rpush/notifier.rb +0 -52
  182. data/lib/rpush/payload_data_size_validator.rb +0 -10
  183. data/lib/rpush/railtie.rb +0 -11
  184. data/lib/rpush/registration_ids_count_validator.rb +0 -10
  185. data/lib/rpush/wpns/app.rb +0 -9
  186. data/lib/rpush/wpns/notification.rb +0 -26
  187. data/lib/tasks/cane.rake +0 -18
  188. data/lib/tasks/rpush.rake +0 -16
  189. data/spec/unit/apns/app_spec.rb +0 -29
  190. data/spec/unit/apns/feedback_spec.rb +0 -9
  191. data/spec/unit/apns/notification_spec.rb +0 -208
  192. data/spec/unit/app_spec.rb +0 -30
  193. data/spec/unit/daemon/apns/disconnection_error_spec.rb +0 -18
  194. data/spec/unit/daemon/dispatcher_loop_collection_spec.rb +0 -37
  195. data/spec/unit/daemon/interruptible_sleep_spec.rb +0 -68
  196. data/spec/unit/daemon/too_many_requests_error_spec.rb +0 -14
  197. data/spec/unit/gcm/app_spec.rb +0 -4
  198. data/spec/unit/notification_spec.rb +0 -15
  199. data/spec/unit/notifier_spec.rb +0 -49
  200. data/spec/unit/wpns/app_spec.rb +0 -4
  201. data/spec/unit/wpns/notification_spec.rb +0 -30
@@ -1,6 +1,6 @@
1
- require 'unit_spec_helper'
1
+ require 'functional_spec_helper'
2
2
 
3
- describe 'GCM' do
3
+ describe 'WPNs' do
4
4
  let(:app) { Rpush::Wpns::App.new }
5
5
  let(:notification) { Rpush::Wpns::Notification.new }
6
6
  let(:response) { double(Net::HTTPResponse, code: 200) }
@@ -15,14 +15,11 @@ describe 'GCM' do
15
15
  notification.alert = 'test'
16
16
  notification.save!
17
17
 
18
- Rails.stub(root: File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp')))
19
- Rpush.config.logger = ::Logger.new(STDOUT)
20
-
21
18
  Net::HTTP::Persistent.stub(new: http)
22
19
  end
23
20
 
24
21
  it 'delivers a notification successfully' do
25
- response.stub(to_hash: {'x-notificationstatus' => ['Received']})
22
+ response.stub(to_hash: { 'x-notificationstatus' => ['Received'] })
26
23
 
27
24
  expect do
28
25
  Rpush.push
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ require 'database_cleaner'
4
+ DatabaseCleaner.strategy = :truncation
5
+
6
+ def functional_example?(example)
7
+ path = example.metadata[:example_group][:file_path]
8
+ path =~ /spec\/functional/
9
+ end
10
+
11
+ RSpec.configure do |config|
12
+ config.before(:each) do
13
+ Modis.with_connection do |redis|
14
+ redis.keys('rpush:*').each { |key| redis.del(key) }
15
+ end
16
+
17
+ if functional_example?(example)
18
+ Rails.stub(root: File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp')))
19
+ Rpush.config.logger = ::Logger.new(STDOUT)
20
+ end
21
+ end
22
+
23
+ config.after(:each) do
24
+ DatabaseCleaner.clean if functional_example?(example)
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ # describe "Rpush" do
2
+
3
+ # before :all do
4
+ # `vagrant up`
5
+ # # TODO: Upload current directory.
6
+ # # TODO: Use Net::SSH
7
+ # `vagrant ssh 'cd rpush; git fetch origin; git reset --hard origin/master; sh tools/run_docker.sh'`
8
+ # end
9
+
10
+ # it 'can be installed and successfully delivers a notification' do
11
+ # # Can now SSH to the Docker instance with; ssh -i docker_key root@localhost -p 2100
12
+ # end
13
+ # end
@@ -0,0 +1 @@
1
+ {"results":[{"message_id": "123"}]}
@@ -0,0 +1,60 @@
1
+ ENV['RAILS_ENV'] = 'test'
2
+ client = (ENV['CLIENT'] || :active_record).to_sym
3
+
4
+ require 'bundler/setup'
5
+ Bundler.require(:default)
6
+
7
+ unless ENV['TRAVIS'] && ENV['QUALITY'] == 'false'
8
+ begin
9
+ require './spec/support/simplecov_helper'
10
+ include SimpleCovHelper
11
+ start_simple_cov("rpush-#{client}-#{RUBY_VERSION}")
12
+ rescue LoadError
13
+ puts "Coverage disabled."
14
+ end
15
+ end
16
+
17
+ require 'rpush'
18
+ require 'rpush/daemon'
19
+ require 'rpush/client/redis'
20
+ require 'rpush/client/active_record'
21
+ require 'rpush/daemon/store/active_record'
22
+ require 'rpush/daemon/store/redis'
23
+
24
+ require 'support/active_record_setup'
25
+
26
+ RAILS_ROOT = '/tmp/rails_root'
27
+
28
+ Rpush.configure do |config|
29
+ config.client = client
30
+ config.log_dir = RAILS_ROOT
31
+ end
32
+
33
+ RPUSH_CLIENT = Rpush.config.client
34
+
35
+ def active_record?
36
+ Rpush.config.client == :active_record
37
+ end
38
+
39
+ path = File.join(File.dirname(__FILE__), 'support')
40
+ TEST_CERT = File.read(File.join(path, 'cert_without_password.pem'))
41
+ TEST_CERT_WITH_PASSWORD = File.read(File.join(path, 'cert_with_password.pem'))
42
+
43
+ def after_example_cleanup
44
+ Rpush.logger = nil
45
+ Rpush::Daemon.store = nil
46
+ Rpush::Deprecation.muted do
47
+ Rpush.config.set_defaults if Rpush.config.is_a?(Rpush::Configuration)
48
+ Rpush.config.client = RPUSH_CLIENT
49
+ end
50
+ end
51
+
52
+ RSpec.configure do |config|
53
+ config.before(:each) do
54
+ Rails.stub(root: RAILS_ROOT)
55
+ end
56
+
57
+ config.after(:each) do
58
+ after_example_cleanup
59
+ end
60
+ end
@@ -0,0 +1,48 @@
1
+ require 'active_record'
2
+
3
+ jruby = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
4
+
5
+ SPEC_ADAPTER = ENV['ADAPTER'] || 'postgresql'
6
+ SPEC_ADAPTER = 'jdbc' + SPEC_ADAPTER if jruby
7
+
8
+ require 'yaml'
9
+ db_config = YAML.load_file(File.expand_path("config/database.yml", File.dirname(__FILE__)))
10
+
11
+ if db_config[SPEC_ADAPTER].nil?
12
+ puts "No such adapter '#{SPEC_ADAPTER}'. Valid adapters are #{db_config.keys.join(', ')}."
13
+ exit 1
14
+ end
15
+
16
+ if ENV['TRAVIS']
17
+ db_config[SPEC_ADAPTER]['username'] = 'postgres'
18
+ else
19
+ require 'etc'
20
+ username = SPEC_ADAPTER =~ /mysql/ ? 'root' : Etc.getlogin
21
+ db_config[SPEC_ADAPTER]['username'] = username
22
+ end
23
+
24
+ puts "Using #{SPEC_ADAPTER} adapter."
25
+
26
+ ActiveRecord::Base.configurations = { "test" => db_config[SPEC_ADAPTER] }
27
+ ActiveRecord::Base.establish_connection(db_config[SPEC_ADAPTER])
28
+
29
+ require 'generators/templates/add_rpush'
30
+ require 'generators/templates/rpush_2_0_0_updates'
31
+
32
+ migrations = [AddRpush, Rpush200Updates]
33
+
34
+ unless ENV['TRAVIS']
35
+ migrations.reverse.each do |m|
36
+ begin
37
+ m.down
38
+ rescue ActiveRecord::StatementInvalid => e
39
+ p e
40
+ end
41
+ end
42
+ end
43
+
44
+ migrations.each(&:up)
45
+
46
+ Rpush::Client::ActiveRecord::Notification.reset_column_information
47
+ Rpush::Client::ActiveRecord::App.reset_column_information
48
+ Rpush::Client::ActiveRecord::Apns::Feedback.reset_column_information
File without changes
@@ -1,20 +1,33 @@
1
+ set -ev
1
2
  cp -R /mnt/rpush /rpush
2
- gem install --no-ri --no-rdoc rails
3
3
  cd /tmp
4
4
  export HOME=/
5
5
  export RAILS_NAME=rpush_`date +"%Y%m%d%H%M%S"`
6
+ mysqladmin create `echo $RAILS_NAME`_development
7
+ gem install --no-ri --no-rdoc rails bundler
6
8
  rails new $RAILS_NAME -BJTS -d mysql
7
9
  cd $RAILS_NAME
8
10
  for gem in sdoc coffee-rails uglifier sass-rails jquery-rails jbuilder turbolinks
9
11
  do
10
- sed -i.bak -e "s/^gem '$gem'/\# gem '$gem'/g" Gemfile
12
+ sed -i.bak -e "s/^[ \t]*gem '$gem'/\# gem '$gem'/g" Gemfile
11
13
  done
14
+
12
15
  echo 'gem "rpush", path: "/rpush"' >> Gemfile
13
16
  bundle
14
- /etc/init.d/mysql start
15
- mysqladmin create `echo $RAILS_NAME`_development
16
17
  rails g rpush
17
18
  rake db:migrate
19
+
20
+ cat > gcm_server.rb <<EOF
21
+ require 'webrick'
22
+ server = WEBrick::HTTPServer.new(:Port => 80)
23
+ server.mount_proc '/' do |req, res|
24
+ res["Content-Type"] = 'application/json'
25
+ res.body = File.read('/rpush/spec/integration/support/gcm_success_response.json')
26
+ end
27
+ server.start
28
+ EOF
29
+ rails runner gcm_server.rb &
30
+
18
31
  cat > create_app.rb <<EOF
19
32
  app = Rpush::Gcm::App.new
20
33
  app.name = "android_app"
@@ -26,7 +39,30 @@ n.app = app
26
39
  n.registration_ids = ["abc"]
27
40
  n.data = {:message => "hi mom!"}
28
41
  n.save!
42
+ puts n.id
43
+ EOF
44
+
45
+ export NOTIFICATION_ID=`rails runner create_app.rb`
46
+ export RPUSH_GCM_HOST='http://localhost'
47
+ rpush development
48
+
49
+ cat > check_notification_status.rb <<EOF
50
+ n = Rpush::Gcm::Notification.find(ENV["NOTIFICATION_ID"])
51
+
52
+ while true do
53
+ if n.failed
54
+ puts "FAILED"
55
+ break
56
+ elsif n.delivered
57
+ puts "DELIVERED"
58
+ break
59
+ else
60
+ STDOUT.write(".")
61
+ STDOUT.flush
62
+ end
63
+
64
+ sleep 0.2
65
+ n.reload
66
+ end
29
67
  EOF
30
- rails runner create_app.rb
31
- export RPUSH_GCM_HOST=http://`/sbin/ip route | awk '/default/ { print $3 }'`
32
- rpush development -f
68
+ rails runner check_notification_status.rb
@@ -8,13 +8,17 @@ module SimpleCovHelper
8
8
  add_filter '/lib/generators'
9
9
  command_name name
10
10
 
11
+ formatters = [SimpleCov::Formatter::QualityFormatter]
12
+
11
13
  if ENV['TRAVIS']
12
- require 'coveralls'
13
- formatter SimpleCov::Formatter::MultiFormatter[SimpleCov::Formatter::QualityFormatter,
14
- Coveralls::SimpleCov::Formatter]
15
- else
16
- formatter SimpleCov::Formatter::QualityFormatter
14
+ require 'codeclimate-test-reporter'
15
+
16
+ if CodeClimate::TestReporter.run?
17
+ formatters << CodeClimate::TestReporter::Formatter
18
+ end
17
19
  end
20
+
21
+ formatter SimpleCov::Formatter::MultiFormatter[*formatters]
18
22
  end
19
23
  end
20
24
  end
@@ -1,8 +1,12 @@
1
- class SimpleCov::Formatter::QualityFormatter
2
- def format(result)
3
- SimpleCov::Formatter::HTMLFormatter.new.format(result)
4
- File.open("coverage/covered_percent", "w") do |f|
5
- f.puts result.source_files.covered_percent.to_f
1
+ module SimpleCov
2
+ module Formatter
3
+ class QualityFormatter
4
+ def format(result)
5
+ SimpleCov::Formatter::HTMLFormatter.new.format(result)
6
+ File.open("coverage/covered_percent", "w") do |f|
7
+ f.puts result.source_files.covered_percent.to_f
8
+ end
9
+ end
6
10
  end
7
11
  end
8
- end
12
+ end
@@ -1,11 +1,11 @@
1
1
  require 'unit_spec_helper'
2
2
 
3
3
  describe Rpush, 'apns_feedback' do
4
- let!(:app) { Rpush::Apns::App.create!(:name => 'test', :environment => 'production', :certificate => TEST_CERT) }
5
- let(:receiver) { double(:check_for_feedback => nil) }
4
+ let!(:app) { Rpush::Apns::App.create!(name: 'test', environment: 'production', certificate: TEST_CERT) }
5
+ let(:receiver) { double(check_for_feedback: nil) }
6
6
 
7
7
  before do
8
- Rpush::Daemon::Apns::FeedbackReceiver.stub(:new => receiver)
8
+ Rpush::Daemon::Apns::FeedbackReceiver.stub(new: receiver)
9
9
  end
10
10
 
11
11
  it 'initializes the store' do
@@ -1,8 +1,8 @@
1
1
  require 'unit_spec_helper'
2
2
 
3
- describe Rpush::Adm::App do
4
- subject { Rpush::Adm::App.new(:name => 'test', :environment => 'development', :client_id => 'CLIENT_ID', :client_secret => 'CLIENT_SECRET') }
5
- let(:existing_app) { Rpush::Adm::App.create!(:name => 'existing', :environment => 'development', :client_id => 'CLIENT_ID', :client_secret => 'CLIENT_SECRET') }
3
+ describe Rpush::Client::ActiveRecord::Adm::App do
4
+ subject { Rpush::Client::ActiveRecord::Adm::App.new(name: 'test', environment: 'development', client_id: 'CLIENT_ID', client_secret: 'CLIENT_SECRET') }
5
+ let(:existing_app) { Rpush::Client::ActiveRecord::Adm::App.create!(name: 'existing', environment: 'development', client_id: 'CLIENT_ID', client_secret: 'CLIENT_SECRET') }
6
6
 
7
7
  it 'should be valid if properly instantiated' do
8
8
  subject.should be_valid
@@ -1,23 +1,21 @@
1
1
  require 'unit_spec_helper'
2
2
  require 'unit/notification_shared.rb'
3
3
 
4
- describe Rpush::Adm::Notification do
4
+ describe Rpush::Client::ActiveRecord::Adm::Notification do
5
5
  it_should_behave_like 'an Notification subclass'
6
6
 
7
- let(:app) { Rpush::Adm::App.create!(:name => 'test', :client_id => 'CLIENT_ID', :client_secret => 'CLIENT_SECRET') }
8
- let(:notification_class) { Rpush::Adm::Notification }
7
+ let(:app) { Rpush::Client::ActiveRecord::Adm::App.create!(name: 'test', client_id: 'CLIENT_ID', client_secret: 'CLIENT_SECRET') }
8
+ let(:notification_class) { Rpush::Client::ActiveRecord::Adm::Notification }
9
9
  let(:notification) { notification_class.new }
10
- let(:data_setter) { 'data=' }
11
- let(:data_getter) { 'data' }
12
10
 
13
11
  it "has a 'data' payload limit of 6144 bytes" do
14
- notification.data = { :key => "a" * 6144 }
12
+ notification.data = { key: "a" * 6144 }
15
13
  notification.valid?.should be_false
16
14
  notification.errors[:base].should eq ["Notification payload data cannot be larger than 6144 bytes."]
17
15
  end
18
16
 
19
17
  it 'limits the number of registration ids to 100' do
20
- notification.registration_ids = ['a']*(100+1)
18
+ notification.registration_ids = ['a'] * (100 + 1)
21
19
  notification.valid?.should be_false
22
20
  notification.errors[:base].should eq ["Number of registration_ids cannot be larger than 100."]
23
21
  end
@@ -0,0 +1,29 @@
1
+ require 'unit_spec_helper'
2
+
3
+ describe Rpush::Client::ActiveRecord::App do
4
+ it 'does not validate an app with an invalid certificate' do
5
+ app = Rpush::Client::ActiveRecord::Apns::App.new(name: 'test', environment: 'development', certificate: 'foo')
6
+ app.valid?
7
+ app.errors[:certificate].should eq ['Certificate value must contain a certificate and a private key.']
8
+ end
9
+
10
+ it 'validates a certificate without a password' do
11
+ app = Rpush::Client::ActiveRecord::Apns::App.new name: 'test', environment: 'development', certificate: TEST_CERT
12
+ app.valid?
13
+ app.errors[:certificate].should eq []
14
+ end
15
+
16
+ it 'validates a certificate with a password' do
17
+ app = Rpush::Client::ActiveRecord::Apns::App.new name: 'test', environment: 'development',
18
+ certificate: TEST_CERT_WITH_PASSWORD, password: 'fubar'
19
+ app.valid?
20
+ app.errors[:certificate].should eq []
21
+ end
22
+
23
+ it 'validates a certificate with an incorrect password' do
24
+ app = Rpush::Client::ActiveRecord::Apns::App.new name: 'test', environment: 'development',
25
+ certificate: TEST_CERT_WITH_PASSWORD, password: 'incorrect'
26
+ app.valid?
27
+ app.errors[:certificate].should eq ["Certificate value must contain a certificate and a private key."]
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ require 'unit_spec_helper'
2
+
3
+ describe Rpush::Client::ActiveRecord::Apns::Feedback do
4
+ it 'validates the format of the device_token' do
5
+ notification = Rpush::Client::ActiveRecord::Apns::Feedback.new(device_token: "{$%^&*()}")
6
+ notification.valid?.should be_false
7
+ notification.errors[:device_token].include?("is invalid").should be_true
8
+ end
9
+ end
@@ -0,0 +1,231 @@
1
+ # encoding: US-ASCII
2
+
3
+ require "unit_spec_helper"
4
+ require 'unit/notification_shared.rb'
5
+
6
+ describe Rpush::Client::ActiveRecord::Apns::Notification do
7
+ it_should_behave_like 'an Notification subclass'
8
+
9
+ let(:app) { Rpush::Client::ActiveRecord::Apns::App.create!(name: 'my_app', environment: 'development', certificate: TEST_CERT) }
10
+ let(:notification_class) { Rpush::Client::ActiveRecord::Apns::Notification }
11
+ let(:notification) { notification_class.new }
12
+
13
+ it "should validate the format of the device_token" do
14
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(device_token: "{$%^&*()}")
15
+ notification.valid?.should be_false
16
+ notification.errors[:device_token].include?("is invalid").should be_true
17
+ end
18
+
19
+ it "should validate the length of the binary conversion of the notification" do
20
+ notification.device_token = "a" * 64
21
+ notification.alert = "way too long!" * 100
22
+ notification.valid?.should be_false
23
+ notification.errors[:base].include?("APN notification cannot be larger than 256 bytes. Try condensing your alert and device attributes.").should be_true
24
+ end
25
+
26
+ it "should default the sound to 'default'" do
27
+ notification.sound.should eq('default')
28
+ end
29
+
30
+ it "should default the expiry to 1 day" do
31
+ notification.expiry.should eq 1.day.to_i
32
+ end
33
+ end
34
+
35
+ describe Rpush::Client::ActiveRecord::Apns::Notification, "when assigning the device token" do
36
+ it "should strip spaces from the given string" do
37
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(device_token: "o m g")
38
+ notification.device_token.should eq "omg"
39
+ end
40
+
41
+ it "should strip chevrons from the given string" do
42
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(device_token: "<omg>")
43
+ notification.device_token.should eq "omg"
44
+ end
45
+ end
46
+
47
+ describe Rpush::Client::ActiveRecord::Apns::Notification, "as_json" do
48
+ it "should include the alert if present" do
49
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(alert: "hi mom")
50
+ notification.as_json["aps"]["alert"].should eq "hi mom"
51
+ end
52
+
53
+ it "should not include the alert key if the alert is not present" do
54
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(alert: nil)
55
+ notification.as_json["aps"].key?("alert").should be_false
56
+ end
57
+
58
+ it "should encode the alert as JSON if it is a Hash" do
59
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(alert: { 'body' => "hi mom", 'alert-loc-key' => "View" })
60
+ notification.as_json["aps"]["alert"].should eq('body' => "hi mom", 'alert-loc-key' => "View")
61
+ end
62
+
63
+ it "should include the badge if present" do
64
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(badge: 6)
65
+ notification.as_json["aps"]["badge"].should eq 6
66
+ end
67
+
68
+ it "should not include the badge key if the badge is not present" do
69
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(badge: nil)
70
+ notification.as_json["aps"].key?("badge").should be_false
71
+ end
72
+
73
+ it "should include the sound if present" do
74
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(alert: "my_sound.aiff")
75
+ notification.as_json["aps"]["alert"].should eq "my_sound.aiff"
76
+ end
77
+
78
+ it "should not include the sound key if the sound is not present" do
79
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(sound: false)
80
+ notification.as_json["aps"].key?("sound").should be_false
81
+ end
82
+
83
+ it "should include attributes for the device" do
84
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new
85
+ notification.data = { omg: :lol, wtf: :dunno }
86
+ notification.as_json["omg"].should eq "lol"
87
+ notification.as_json["wtf"].should eq "dunno"
88
+ end
89
+
90
+ it "should allow attributes to include a hash" do
91
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new
92
+ notification.data = { omg: { ilike: :hashes } }
93
+ notification.as_json["omg"]["ilike"].should eq "hashes"
94
+ end
95
+
96
+ end
97
+
98
+ describe Rpush::Client::ActiveRecord::Apns::Notification, 'MDM' do
99
+ let(:magic) { 'abc123' }
100
+ let(:notification) { Rpush::Client::ActiveRecord::Apns::Notification.new }
101
+
102
+ it 'includes the mdm magic in the payload' do
103
+ notification.mdm = magic
104
+ notification.as_json.should eq('mdm' => magic)
105
+ end
106
+
107
+ it 'does not include aps attribute' do
108
+ notification.alert = "i'm doomed"
109
+ notification.mdm = magic
110
+ notification.as_json.key?('aps').should be_false
111
+ end
112
+ end
113
+
114
+ describe Rpush::Client::ActiveRecord::Apns::Notification, 'content-available' do
115
+ let(:notification) { Rpush::Client::ActiveRecord::Apns::Notification.new }
116
+
117
+ it 'includes content-available in the payload' do
118
+ notification.content_available = true
119
+ notification.as_json['aps']['content-available'].should eq 1
120
+ end
121
+
122
+ it 'does not include content-available in the payload if not set' do
123
+ notification.as_json['aps'].key?('content-available').should be_false
124
+ end
125
+
126
+ it 'does not include content-available as a non-aps attribute' do
127
+ notification.content_available = true
128
+ notification.as_json.key?('content-available').should be_false
129
+ end
130
+
131
+ it 'does not overwrite existing attributes for the device' do
132
+ notification.data = { hi: :mom }
133
+ notification.content_available = true
134
+ notification.as_json['aps']['content-available'].should eq 1
135
+ notification.as_json['hi'].should eq 'mom'
136
+ end
137
+
138
+ it 'does not overwrite the content-available flag when setting attributes for the device' do
139
+ notification.content_available = true
140
+ notification.data = { hi: :mom }
141
+ notification.as_json['aps']['content-available'].should eq 1
142
+ notification.as_json['hi'].should eq 'mom'
143
+ end
144
+ end
145
+
146
+ describe Rpush::Client::ActiveRecord::Apns::Notification, 'to_binary' do
147
+ let(:notification) { Rpush::Client::ActiveRecord::Apns::Notification.new }
148
+
149
+ before do
150
+ notification.device_token = "a" * 64
151
+ notification.id = 1234
152
+ end
153
+
154
+ it 'uses APNS_PRIORITY_CONSERVE_POWER if content-available is the only key' do
155
+ notification.alert = nil
156
+ notification.badge = nil
157
+ notification.sound = nil
158
+ notification.content_available = true
159
+ bytes = notification.to_binary.bytes.to_a[-4..-1]
160
+ bytes.first.should eq 5 # priority item ID
161
+ bytes.last.should eq Rpush::Client::ActiveRecord::Apns::Notification::APNS_PRIORITY_CONSERVE_POWER
162
+ end
163
+
164
+ it 'uses APNS_PRIORITY_IMMEDIATE if content-available is not the only key' do
165
+ notification.alert = "New stuff!"
166
+ notification.badge = nil
167
+ notification.sound = nil
168
+ notification.content_available = true
169
+ bytes = notification.to_binary.bytes.to_a[-4..-1]
170
+ bytes.first.should eq 5 # priority item ID
171
+ bytes.last.should eq Rpush::Client::ActiveRecord::Apns::Notification::APNS_PRIORITY_IMMEDIATE
172
+ end
173
+
174
+ it "should correctly convert the notification to binary" do
175
+ notification.sound = "1.aiff"
176
+ notification.badge = 3
177
+ notification.alert = "Don't panic Mr Mainwaring, don't panic!"
178
+ notification.data = { hi: :mom }
179
+ notification.expiry = 86_400 # 1 day, \x00\x01Q\x80
180
+ notification.priority = Rpush::Client::ActiveRecord::Apns::Notification::APNS_PRIORITY_IMMEDIATE
181
+ notification.app = Rpush::Client::ActiveRecord::Apns::App.new(name: 'my_app', environment: 'development', certificate: TEST_CERT)
182
+ notification.to_binary.should eq "\x02\x00\x00\x00\x99\x01\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\x02\x00a{\"aps\":{\"alert\":\"Don't panic Mr Mainwaring, don't panic!\",\"badge\":3,\"sound\":\"1.aiff\"},\"hi\":\"mom\"}\x03\x00\x04\x00\x00\x04\xD2\x04\x00\x04\x00\x01Q\x80\x05\x00\x01\n"
183
+ end
184
+ end
185
+
186
+ describe Rpush::Client::ActiveRecord::Apns::Notification, "bug #31" do
187
+ it 'does not confuse a JSON looking string as JSON' do
188
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new
189
+ notification.alert = "{\"one\":2}"
190
+ notification.alert.should eq "{\"one\":2}"
191
+ end
192
+
193
+ it 'does confuse a JSON looking string as JSON if the alert_is_json attribute is not present' do
194
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new
195
+ notification.stub(:has_attribute? => false)
196
+ notification.alert = "{\"one\":2}"
197
+ notification.alert.should eq('one' => 2)
198
+ end
199
+ end
200
+
201
+ describe Rpush::Client::ActiveRecord::Apns::Notification, "bug #35" do
202
+ it "should limit payload size to 256 bytes but not the entire packet" do
203
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new do |n|
204
+ n.device_token = "a" * 64
205
+ n.alert = "a" * 210
206
+ n.app = Rpush::Client::ActiveRecord::Apns::App.create!(name: 'my_app', environment: 'development', certificate: TEST_CERT)
207
+ end
208
+
209
+ notification.to_binary(for_validation: true).bytesize.should be > 256
210
+ notification.payload_size.should be < 256
211
+ notification.should be_valid
212
+ end
213
+ end
214
+
215
+ describe Rpush::Client::ActiveRecord::Apns::Notification, "multi_json usage" do
216
+ describe Rpush::Client::ActiveRecord::Apns::Notification, "alert" do
217
+ it "should call MultiJson.load when multi_json version is 1.3.0" do
218
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(alert: { a: 1 }, alert_is_json: true)
219
+ Gem.stub(:loaded_specs).and_return('multi_json' => Gem::Specification.new('multi_json', '1.3.0'))
220
+ MultiJson.should_receive(:load).with(any_args)
221
+ notification.alert
222
+ end
223
+
224
+ it "should call MultiJson.decode when multi_json version is 1.2.9" do
225
+ notification = Rpush::Client::ActiveRecord::Apns::Notification.new(alert: { a: 1 }, alert_is_json: true)
226
+ Gem.stub(:loaded_specs).and_return('multi_json' => Gem::Specification.new('multi_json', '1.2.9'))
227
+ MultiJson.should_receive(:decode).with(any_args)
228
+ notification.alert
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,30 @@
1
+ require 'unit_spec_helper'
2
+
3
+ describe Rpush::Client::ActiveRecord::App do
4
+ it 'validates the uniqueness of name within type and environment' do
5
+ Rpush::Client::ActiveRecord::Apns::App.create!(name: 'test', environment: 'production', certificate: TEST_CERT)
6
+ app = Rpush::Client::ActiveRecord::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::Client::ActiveRecord::Apns::App.new(name: 'test', environment: 'development', certificate: TEST_CERT)
11
+ app.valid?.should be_true
12
+
13
+ app = Rpush::Client::ActiveRecord::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::Client::ActiveRecord::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::Client::ActiveRecord::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
@@ -0,0 +1,4 @@
1
+ require 'unit_spec_helper'
2
+
3
+ describe Rpush::Client::ActiveRecord::Gcm::App do
4
+ end