rpush 1.0.0-java → 2.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
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