rapns 0.2.3 → 1.0.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.
Files changed (36) hide show
  1. data/README.md +35 -10
  2. data/lib/generators/rapns_generator.rb +9 -1
  3. data/lib/generators/templates/create_rapns_feedback.rb +15 -0
  4. data/lib/generators/templates/rapns.yml +22 -9
  5. data/lib/rapns/daemon/configuration.rb +32 -14
  6. data/lib/rapns/daemon/connection.rb +35 -50
  7. data/lib/rapns/daemon/delivery_handler.rb +65 -15
  8. data/lib/rapns/daemon/delivery_handler_pool.rb +1 -5
  9. data/lib/rapns/daemon/delivery_queue.rb +10 -27
  10. data/lib/rapns/daemon/feedback_receiver.rb +57 -0
  11. data/lib/rapns/daemon/feeder.rb +9 -7
  12. data/lib/rapns/daemon/interruptible_sleep.rb +14 -0
  13. data/lib/rapns/daemon/pool.rb +0 -5
  14. data/lib/rapns/daemon.rb +9 -9
  15. data/lib/rapns/device_token_format_validator.rb +10 -0
  16. data/lib/rapns/feedback.rb +10 -0
  17. data/lib/rapns/notification.rb +15 -1
  18. data/lib/rapns/version.rb +1 -1
  19. data/lib/rapns.rb +3 -1
  20. data/spec/rapns/daemon/certificate_spec.rb +6 -0
  21. data/spec/rapns/daemon/configuration_spec.rb +124 -40
  22. data/spec/rapns/daemon/connection_spec.rb +81 -129
  23. data/spec/rapns/daemon/delivery_handler_pool_spec.rb +1 -6
  24. data/spec/rapns/daemon/delivery_handler_spec.rb +117 -30
  25. data/spec/rapns/daemon/delivery_queue_spec.rb +29 -0
  26. data/spec/rapns/daemon/feedback_receiver_spec.rb +86 -0
  27. data/spec/rapns/daemon/feeder_spec.rb +25 -9
  28. data/spec/rapns/daemon/interruptible_sleep_spec.rb +32 -0
  29. data/spec/rapns/daemon/logger_spec.rb +34 -14
  30. data/spec/rapns/daemon_spec.rb +34 -31
  31. data/spec/rapns/feedback_spec.rb +12 -0
  32. data/spec/rapns/notification_spec.rb +5 -0
  33. data/spec/spec_helper.rb +5 -2
  34. metadata +16 -5
  35. data/lib/rapns/daemon/connection_pool.rb +0 -31
  36. data/spec/rapns/daemon/connection_pool_spec.rb +0 -40
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+
3
+ describe Rapns::Daemon::FeedbackReceiver, 'check_for_feedback' do
4
+ let(:connection) { stub(:connect => nil, :read => nil, :close => nil) }
5
+ let(:logger) { stub(:error => nil, :info => nil) }
6
+
7
+ before do
8
+ Rapns::Daemon::FeedbackReceiver.stub(:interruptible_sleep)
9
+ Rapns::Daemon.logger = logger
10
+ Rapns::Daemon::Connection.stub(:new => connection)
11
+ Rapns::Feedback.stub(:create!)
12
+ Rapns::Daemon.configuration = stub(:feedback => stub(:host => 'feedback.push.apple.com', :port => 2196, :poll => 60))
13
+ Rapns::Daemon::FeedbackReceiver.instance_variable_set("@stop", false)
14
+ end
15
+
16
+ def stub_connection_read_with_tuple
17
+ connection.unstub(:read)
18
+
19
+ def connection.read(bytes)
20
+ if !@called
21
+ @called = true
22
+ "N\xE3\x84\r\x00 \x83OxfU\xEB\x9F\x84aJ\x05\xAD}\x00\xAF1\xE5\xCF\xE9:\xC3\xEA\a\x8F\x1D\xA4M*N\xB0\xCE\x17"
23
+ end
24
+ end
25
+ end
26
+
27
+ it 'instantiates a new connection' do
28
+ Rapns::Daemon::Connection.should_receive(:new).with("FeedbackReceiver", 'feedback.push.apple.com', 2196)
29
+ Rapns::Daemon::FeedbackReceiver.check_for_feedback
30
+ end
31
+
32
+ it 'connects to the feeback service' do
33
+ connection.should_receive(:connect)
34
+ Rapns::Daemon::FeedbackReceiver.check_for_feedback
35
+ end
36
+
37
+ it 'closes the connection' do
38
+ connection.should_receive(:close)
39
+ Rapns::Daemon::FeedbackReceiver.check_for_feedback
40
+ end
41
+
42
+ it 'reads from the connection' do
43
+ connection.should_receive(:read).with(38)
44
+ Rapns::Daemon::FeedbackReceiver.check_for_feedback
45
+ end
46
+
47
+ it 'logs the feedback' do
48
+ stub_connection_read_with_tuple
49
+ Rapns::Daemon.logger.should_receive(:info).with("[FeedbackReceiver] Delivery failed at 2011-12-10 16:08:45 UTC for 834f786655eb9f84614a05ad7d00af31e5cfe93ac3ea078f1da44d2a4eb0ce17")
50
+ Rapns::Daemon::FeedbackReceiver.check_for_feedback
51
+ end
52
+
53
+ it 'creates the feedback' do
54
+ stub_connection_read_with_tuple
55
+ Rapns::Feedback.should_receive(:create!).with(:failed_at => Time.at(1323533325), :device_token => '834f786655eb9f84614a05ad7d00af31e5cfe93ac3ea078f1da44d2a4eb0ce17')
56
+ Rapns::Daemon::FeedbackReceiver.check_for_feedback
57
+ end
58
+
59
+ it 'logs errors' do
60
+ error = StandardError.new('bork!')
61
+ connection.stub(:read).and_raise(error)
62
+ Rapns::Daemon.logger.should_receive(:error).with(error)
63
+ Rapns::Daemon::FeedbackReceiver.check_for_feedback
64
+ end
65
+
66
+ it 'sleeps for the feedback poll period' do
67
+ Rapns::Daemon::FeedbackReceiver.stub(:check_for_feedback)
68
+ Rapns::Daemon::FeedbackReceiver.should_receive(:interruptible_sleep).with(60).at_least(:once)
69
+ Thread.stub(:new).and_yield
70
+ Rapns::Daemon::FeedbackReceiver.stub(:loop).and_yield
71
+ Rapns::Daemon::FeedbackReceiver.start
72
+ end
73
+
74
+ it 'checks for feedback when started' do
75
+ Rapns::Daemon::FeedbackReceiver.should_receive(:check_for_feedback).at_least(:once)
76
+ Thread.stub(:new).and_yield
77
+ Rapns::Daemon::FeedbackReceiver.stub(:loop).and_yield
78
+ Rapns::Daemon::FeedbackReceiver.start
79
+ end
80
+
81
+ it 'interrupts sleep when stopped' do
82
+ Rapns::Daemon::FeedbackReceiver.stub(:check_for_feedback)
83
+ Rapns::Daemon::FeedbackReceiver.should_receive(:interrupt_sleep)
84
+ Rapns::Daemon::FeedbackReceiver.stop
85
+ end
86
+ end
@@ -3,12 +3,14 @@ require "spec_helper"
3
3
  describe Rapns::Daemon::Feeder do
4
4
  before do
5
5
  Rapns::Daemon::Feeder.stub(:sleep)
6
+ Rapns::Daemon::Feeder.stub(:interruptible_sleep)
6
7
  @notification = Rapns::Notification.create!(:device_token => "a" * 64)
7
8
  @logger = mock("Logger", :info => nil, :error => nil, :warn => nil)
8
9
  Rapns::Daemon.stub(:logger).and_return(@logger)
9
- @queue = mock(:push => nil, :wait_for_available_handler => nil)
10
+ @queue = mock(:push => nil, :notifications_processed? => true)
10
11
  Rapns::Daemon.stub(:delivery_queue).and_return(@queue)
11
- Rapns::Daemon.stub(:configuration => mock("Configuration", :poll => 2))
12
+ Rapns::Daemon.stub(:configuration => mock("Configuration", :push => stub(:poll => 2)))
13
+ Rapns::Daemon::Feeder.instance_variable_set("@stop", false)
12
14
  end
13
15
 
14
16
  it "should reconnect to the database when daemonized" do
@@ -59,13 +61,10 @@ describe Rapns::Daemon::Feeder do
59
61
  Rapns::Daemon::Feeder.enqueue_notifications
60
62
  end
61
63
 
62
- it "should sleep for the given period" do
63
- Rapns::Daemon::Feeder.should_receive(:sleep).with(2)
64
- Rapns::Daemon::Feeder.enqueue_notifications
65
- end
66
-
67
- it "should wait for a delivery handler to become available" do
68
- Rapns::Daemon.delivery_queue.should_receive(:wait_for_available_handler)
64
+ it "should not enqueue more notifications if other are still being processed" do
65
+ Rapns::Daemon.delivery_queue.stub(:notifications_processed? => false)
66
+ Rapns::Notification.should_not_receive(:ready_for_delivery)
67
+ Rapns::Daemon.delivery_queue.should_not_receive(:push)
69
68
  Rapns::Daemon::Feeder.enqueue_notifications
70
69
  end
71
70
 
@@ -76,6 +75,23 @@ describe Rapns::Daemon::Feeder do
76
75
  Rapns::Daemon::Feeder.enqueue_notifications
77
76
  end
78
77
 
78
+ it "interrupts sleep when stopped" do
79
+ Rapns::Daemon::Feeder.should_receive(:interrupt_sleep)
80
+ Rapns::Daemon::Feeder.stop
81
+ end
82
+
83
+ it "enqueues notifications when started" do
84
+ Rapns::Daemon::Feeder.should_receive(:enqueue_notifications).at_least(:once)
85
+ Rapns::Daemon::Feeder.stub(:loop).and_yield
86
+ Rapns::Daemon::Feeder.start(true)
87
+ end
88
+
89
+ it "should sleep for the given period" do
90
+ Rapns::Daemon::Feeder.should_receive(:interruptible_sleep).with(2)
91
+ Rapns::Daemon::Feeder.stub(:loop).and_yield
92
+ Rapns::Daemon::Feeder.start(true)
93
+ end
94
+
79
95
  context "when the database connection is lost" do
80
96
  let(:error) { adapter_error.new("db down!") }
81
97
  before do
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ describe Rapns::Daemon::InterruptibleSleep do
4
+ class SleepTest
5
+ extend Rapns::Daemon::InterruptibleSleep
6
+ end
7
+
8
+ before do
9
+ IO.stub(:pipe)
10
+ IO.stub(:select)
11
+ end
12
+
13
+ it 'creates a new pipe' do
14
+ IO.should_receive(:pipe)
15
+ SleepTest.interruptible_sleep 1
16
+ end
17
+
18
+ it 'selects on the reader' do
19
+ rd = stub
20
+ IO.stub(:pipe => [rd, stub])
21
+ IO.should_receive(:select).with([rd], nil, nil, 1)
22
+ SleepTest.interruptible_sleep 1
23
+ end
24
+
25
+ it 'closes the writer' do
26
+ wr = stub
27
+ IO.stub(:pipe => [stub, wr])
28
+ SleepTest.interruptible_sleep 1
29
+ wr.should_receive(:close)
30
+ SleepTest.interrupt_sleep
31
+ end
32
+ end
@@ -1,26 +1,26 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Rapns::Daemon::Logger do
4
- module Rails
5
- def self.logger
6
- @logger
7
- end
3
+ module Rails
4
+ def self.logger
5
+ @logger
6
+ end
8
7
 
9
- def self.logger=(logger)
10
- @logger = logger
11
- end
8
+ def self.logger=(logger)
9
+ @logger = logger
12
10
  end
11
+ end
13
12
 
14
- module HoptoadNotifier
15
- def self.notify(e)
16
- end
13
+ module HoptoadNotifier
14
+ def self.notify(e)
17
15
  end
16
+ end
18
17
 
19
- module Airbrake
20
- def self.notify(e)
21
- end
18
+ module Airbrake
19
+ def self.notify(e)
22
20
  end
21
+ end
23
22
 
23
+ describe Rapns::Daemon::Logger do
24
24
  before do
25
25
  Rails.stub(:root).and_return("/rails_root")
26
26
  @buffered_logger = mock("BufferedLogger", :info => nil, :error => nil, :level => 0, :auto_flushing => 1, :auto_flushing= => nil)
@@ -81,6 +81,26 @@ describe Rapns::Daemon::Logger do
81
81
  logger.error(e)
82
82
  end
83
83
 
84
+ context "without Airbrake defined" do
85
+ before do
86
+ Object.send(:remove_const, :Airbrake)
87
+ end
88
+
89
+ after do
90
+ module Airbrake
91
+ def self.notify(e)
92
+ end
93
+ end
94
+ end
95
+
96
+ it "should notify using HoptoadNotifier" do
97
+ e = RuntimeError.new("hi mom")
98
+ logger = Rapns::Daemon::Logger.new(:foreground => false, :airbrake_notify => true)
99
+ HoptoadNotifier.should_receive(:notify).with(e)
100
+ logger.error(e)
101
+ end
102
+ end
103
+
84
104
  it "should not notify Airbrake of the exception if the airbrake_notify option is false" do
85
105
  e = RuntimeError.new("hi mom")
86
106
  logger = Rapns::Daemon::Logger.new(:foreground => false, :airbrake_notify => false)
@@ -4,27 +4,43 @@ describe Rapns::Daemon, "when starting" do
4
4
  module Rails
5
5
  end
6
6
 
7
+ let(:config) do
8
+ {
9
+ "airbrake_notify" => true,
10
+ "certificate" => "development.pem",
11
+ "certificate_password" => "abc123",
12
+ "pid_file" => "rapns.pid",
13
+ "push" => {
14
+ "port" => 123,
15
+ "host" => "localhost",
16
+ "poll" => 4,
17
+ "connections" => 3
18
+ },
19
+ "feedback" => {
20
+ "port" => 123,
21
+ "host" => "localhost",
22
+ "poll" => 30,
23
+ }
24
+ }
25
+ end
26
+
7
27
  before do
8
28
  Rails.stub(:root).and_return("/rails_root")
9
29
 
10
30
  @configuration = Rapns::Daemon::Configuration.new("development", "/rails_root/config/rapns/rapns.yml")
11
- @configuration.stub(:read_config).and_return({"development" => {"port" => 123, "host" => "localhost", "certificate" => "development.pem", "certificate_password" => "abc123", "pid_file" => "rapns.pid"}})
31
+ @configuration.stub(:read_config).and_return({"development" => config})
12
32
  Rapns::Daemon::Configuration.stub(:new).and_return(@configuration)
13
33
 
14
34
  @certificate = Rapns::Daemon::Certificate.new("/rails_root/config/rapns/development.pem")
15
35
  @certificate.stub(:read_certificate).and_return("certificate contents")
16
36
  Rapns::Daemon::Certificate.stub(:new).and_return(@certificate)
17
37
 
18
- @connection_pool = Rapns::Daemon::ConnectionPool.new(3)
19
- @connection_pool.stub(:populate)
20
- Rapns::Daemon::ConnectionPool.stub(:new).and_return(@connection_pool)
21
-
22
38
  @handler_pool = Rapns::Daemon::DeliveryHandlerPool.new(3)
23
39
  @handler_pool.stub(:populate)
24
40
  Rapns::Daemon::DeliveryHandlerPool.stub(:new).and_return(@handler_pool)
25
41
 
42
+ Rapns::Daemon::FeedbackReceiver.stub(:start)
26
43
  Rapns::Daemon::Feeder.stub(:start)
27
- Rapns::Daemon::Feeder.stub(:wait)
28
44
  Rapns::Daemon.stub(:daemonize)
29
45
  Rapns::Daemon.stub(:write_pid_file)
30
46
  @logger = mock("Logger", :info => nil)
@@ -54,22 +70,11 @@ describe Rapns::Daemon, "when starting" do
54
70
  Rapns::Daemon.certificate.should == @certificate
55
71
  end
56
72
 
57
- it "should populate the connection pool" do
58
- Rapns::Daemon::ConnectionPool.should_receive(:new).with(3).and_return(@connection_pool)
59
- @connection_pool.should_receive(:populate)
60
- Rapns::Daemon.start("development", {})
61
- end
62
-
63
- it "should initialize the delivery queue with the number of connection as its signal point" do
64
- Rapns::Daemon::DeliveryQueue.should_receive(:new).with(3)
73
+ it "should initialize the delivery queue" do
74
+ Rapns::Daemon::DeliveryQueue.should_receive(:new)
65
75
  Rapns::Daemon.start("development", {})
66
76
  end
67
77
 
68
- it "should make the connection pool accessible" do
69
- Rapns::Daemon.start("development", {})
70
- Rapns::Daemon.connection_pool.should == @connection_pool
71
- end
72
-
73
78
  it "should populate the delivery handler pool" do
74
79
  Rapns::Daemon::DeliveryHandlerPool.should_receive(:new).with(3).and_return(@handler_pool)
75
80
  @handler_pool.should_receive(:populate)
@@ -97,6 +102,11 @@ describe Rapns::Daemon, "when starting" do
97
102
  Rapns::Daemon.start("development", {})
98
103
  end
99
104
 
105
+ it "should start the feedback receiver" do
106
+ Rapns::Daemon::FeedbackReceiver.should_receive(:start)
107
+ Rapns::Daemon.start("development", true)
108
+ end
109
+
100
110
  it "should start the feeder" do
101
111
  Rapns::Daemon::Feeder.should_receive(:start)
102
112
  Rapns::Daemon.start("development", true)
@@ -118,8 +128,7 @@ describe Rapns::Daemon, "when being shutdown" do
118
128
  before do
119
129
  Rails.stub(:root).and_return("/rails_root")
120
130
  Rapns::Daemon::Feeder.stub(:stop)
121
- @connection_pool = mock("ConnectionPool", :drain => nil)
122
- Rapns::Daemon.stub(:connection_pool).and_return(@connection_pool)
131
+ Rapns::Daemon::FeedbackReceiver.stub(:stop)
123
132
  @handler_pool = mock("DeliveryHandlerPool", :drain => nil)
124
133
  Rapns::Daemon.stub(:delivery_handler_pool).and_return(@handler_pool)
125
134
  @configuration = mock("Configuration", :pid_file => File.join(Rails.root, "rapns.pid"))
@@ -127,19 +136,13 @@ describe Rapns::Daemon, "when being shutdown" do
127
136
  Rapns::Daemon.stub(:puts)
128
137
  end
129
138
 
130
- it "should stop the feeder" do
131
- Rapns::Daemon::Feeder.should_receive(:stop)
139
+ it "should stop the feedback receiver" do
140
+ Rapns::Daemon::FeedbackReceiver.should_receive(:stop)
132
141
  Rapns::Daemon.send(:shutdown)
133
142
  end
134
143
 
135
- it "should drain the connection pool" do
136
- @connection_pool.should_receive(:drain)
137
- Rapns::Daemon.send(:shutdown)
138
- end
139
-
140
- it "should not attempt to drain the connection pool if it has not been initialized" do
141
- Rapns::Daemon.stub(:connection_pool).and_return(nil)
142
- @connection_pool.should_not_receive(:drain)
144
+ it "should stop the feeder" do
145
+ Rapns::Daemon::Feeder.should_receive(:stop)
143
146
  Rapns::Daemon.send(:shutdown)
144
147
  end
145
148
 
@@ -0,0 +1,12 @@
1
+ require "spec_helper"
2
+
3
+ describe Rapns::Feedback do
4
+ it { should validate_presence_of(:device_token) }
5
+ it { should validate_presence_of(:failed_at) }
6
+
7
+ it "should validate the format of the device_token" do
8
+ notification = Rapns::Feedback.new(:device_token => "{$%^&*()}")
9
+ notification.valid?.should be_false
10
+ notification.errors[:device_token].include?("is invalid").should be_true
11
+ end
12
+ end
@@ -68,6 +68,11 @@ describe Rapns::Notification, "as_json" do
68
68
  notification.as_json["aps"].key?("alert").should be_false
69
69
  end
70
70
 
71
+ it "should encode the alert as JSON if it is a Hash" do
72
+ notification = Rapns::Notification.new(:alert => { 'body' => "hi mom", 'alert-loc-key' => "View" })
73
+ notification.as_json["aps"]["alert"].should == { 'body' => "hi mom", 'alert-loc-key' => "View" }
74
+ end
75
+
71
76
  it "should include the badge if present" do
72
77
  notification = Rapns::Notification.new(:badge => 6)
73
78
  notification.as_json["aps"]["badge"].should == 6
data/spec/spec_helper.rb CHANGED
@@ -17,9 +17,12 @@ end
17
17
  puts "Using #{$adapter} adapter."
18
18
  ActiveRecord::Base.establish_connection('adapter' => $adapter, 'database' => 'rapns_test')
19
19
  require 'generators/templates/create_rapns_notifications'
20
+ require 'generators/templates/create_rapns_feedback'
20
21
 
21
- CreateRapnsNotifications.down rescue ActiveRecord::StatementInvalid
22
- CreateRapnsNotifications.up
22
+ [CreateRapnsNotifications, CreateRapnsFeedback].each do |migration|
23
+ migration.down rescue ActiveRecord::StatementInvalid
24
+ migration.up
25
+ end
23
26
 
24
27
  require 'bundler'
25
28
  Bundler.require(:default)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rapns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-04 00:00:00.000000000 Z
12
+ date: 2011-12-11 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Easy to use library for Apple's Push Notification Service with Rails
15
15
  3
@@ -21,6 +21,7 @@ extensions: []
21
21
  extra_rdoc_files: []
22
22
  files:
23
23
  - lib/generators/rapns_generator.rb
24
+ - lib/generators/templates/create_rapns_feedback.rb
24
25
  - lib/generators/templates/create_rapns_notifications.rb
25
26
  - lib/generators/templates/rapns.yml
26
27
  - lib/rapns.rb
@@ -29,14 +30,17 @@ files:
29
30
  - lib/rapns/daemon/certificate.rb
30
31
  - lib/rapns/daemon/configuration.rb
31
32
  - lib/rapns/daemon/connection.rb
32
- - lib/rapns/daemon/connection_pool.rb
33
33
  - lib/rapns/daemon/delivery_error.rb
34
34
  - lib/rapns/daemon/delivery_handler.rb
35
35
  - lib/rapns/daemon/delivery_handler_pool.rb
36
36
  - lib/rapns/daemon/delivery_queue.rb
37
+ - lib/rapns/daemon/feedback_receiver.rb
37
38
  - lib/rapns/daemon/feeder.rb
39
+ - lib/rapns/daemon/interruptible_sleep.rb
38
40
  - lib/rapns/daemon/logger.rb
39
41
  - lib/rapns/daemon/pool.rb
42
+ - lib/rapns/device_token_format_validator.rb
43
+ - lib/rapns/feedback.rb
40
44
  - lib/rapns/notification.rb
41
45
  - lib/rapns/patches.rb
42
46
  - lib/rapns/patches/rails/3.1.0/postgresql_adapter.rb
@@ -45,14 +49,17 @@ files:
45
49
  - README.md
46
50
  - spec/rapns/daemon/certificate_spec.rb
47
51
  - spec/rapns/daemon/configuration_spec.rb
48
- - spec/rapns/daemon/connection_pool_spec.rb
49
52
  - spec/rapns/daemon/connection_spec.rb
50
53
  - spec/rapns/daemon/delivery_error_spec.rb
51
54
  - spec/rapns/daemon/delivery_handler_pool_spec.rb
52
55
  - spec/rapns/daemon/delivery_handler_spec.rb
56
+ - spec/rapns/daemon/delivery_queue_spec.rb
57
+ - spec/rapns/daemon/feedback_receiver_spec.rb
53
58
  - spec/rapns/daemon/feeder_spec.rb
59
+ - spec/rapns/daemon/interruptible_sleep_spec.rb
54
60
  - spec/rapns/daemon/logger_spec.rb
55
61
  - spec/rapns/daemon_spec.rb
62
+ - spec/rapns/feedback_spec.rb
56
63
  - spec/rapns/notification_spec.rb
57
64
  - spec/spec_helper.rb
58
65
  - bin/rapns
@@ -83,13 +90,17 @@ summary: Easy to use library for Apple's Push Notification Service with Rails 3
83
90
  test_files:
84
91
  - spec/rapns/daemon/certificate_spec.rb
85
92
  - spec/rapns/daemon/configuration_spec.rb
86
- - spec/rapns/daemon/connection_pool_spec.rb
87
93
  - spec/rapns/daemon/connection_spec.rb
88
94
  - spec/rapns/daemon/delivery_error_spec.rb
89
95
  - spec/rapns/daemon/delivery_handler_pool_spec.rb
90
96
  - spec/rapns/daemon/delivery_handler_spec.rb
97
+ - spec/rapns/daemon/delivery_queue_spec.rb
98
+ - spec/rapns/daemon/feedback_receiver_spec.rb
91
99
  - spec/rapns/daemon/feeder_spec.rb
100
+ - spec/rapns/daemon/interruptible_sleep_spec.rb
92
101
  - spec/rapns/daemon/logger_spec.rb
93
102
  - spec/rapns/daemon_spec.rb
103
+ - spec/rapns/feedback_spec.rb
94
104
  - spec/rapns/notification_spec.rb
95
105
  - spec/spec_helper.rb
106
+ has_rdoc:
@@ -1,31 +0,0 @@
1
- module Rapns
2
- module Daemon
3
- class ConnectionPool < Pool
4
-
5
- def claim_connection
6
- connection = nil
7
- begin
8
- connection = @queue.pop
9
- yield connection
10
- ensure
11
- @queue.push(connection) if connection
12
- end
13
- connection
14
- end
15
-
16
- protected
17
-
18
- def new_object_for_pool(i)
19
- Connection.new("Connection #{i}")
20
- end
21
-
22
- def object_added_to_pool(object)
23
- object.connect
24
- end
25
-
26
- def object_removed_from_pool(object)
27
- object.close
28
- end
29
- end
30
- end
31
- end
@@ -1,40 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Rapns::Daemon::ConnectionPool do
4
- before do
5
- @connection = mock("Connection", :connect => nil)
6
- Rapns::Daemon::Connection.stub(:new).and_return(@connection)
7
- @pool = Rapns::Daemon::ConnectionPool.new(3)
8
- end
9
-
10
- it "should populate the pool" do
11
- Rapns::Daemon::Connection.should_receive(:new).exactly(3).times
12
- @pool.populate
13
- end
14
-
15
- it "should tell each connection to close when drained" do
16
- @pool.populate
17
- @connection.should_receive(:close).exactly(3).times
18
- @pool.drain
19
- end
20
- end
21
-
22
- describe Rapns::Daemon::ConnectionPool, "when claiming a connection" do
23
- before do
24
- @connection = mock("Connection", :connect => nil)
25
- Rapns::Daemon::Connection.stub(:new).and_return(@connection)
26
- @pool = Rapns::Daemon::ConnectionPool.new(3)
27
- end
28
-
29
- it "should pop the connection from the pool" do
30
- @pool.instance_variable_get("@queue").should_receive(:pop)
31
- @pool.claim_connection {}
32
- end
33
-
34
- it "shuld push the connection into the pool after use" do
35
- @pool.instance_variable_get("@queue").stub(:pop).and_return(@connection)
36
- @pool.instance_variable_get("@queue").should_receive(:push).with(@connection)
37
- @pool.claim_connection {}
38
- end
39
- end
40
-