ruby_ami 0.1.1

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.
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module RubyAMI
4
+ describe Error do
5
+ pending
6
+ end # Error
7
+ end # RubyAMI
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module RubyAMI
4
+ describe Event do
5
+ pending
6
+ end # Event
7
+ end # RubyAMI
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module RubyAMI
4
+ describe Response do
5
+ pending
6
+ end # Response
7
+ end # RubyAMI
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+
3
+ module RubyAMI
4
+ describe Stream do
5
+ def mocked_server(times = nil, fake_client = nil, &block)
6
+ MockServer.any_instance.expects(:receive_data).send(*(times ? [:times, times] : [:at_least, 1])).with &block
7
+ EventMachine::run {
8
+ EM.add_timer(0.5) { EM.stop if EM.reactor_running? }
9
+
10
+ port = 50000 - rand(1000)
11
+
12
+ # Mocked server
13
+ EventMachine::start_server '127.0.0.1', port, ServerMock
14
+
15
+ # Stream connection
16
+ EM.connect('127.0.0.1', port, Stream, lambda { |m| client.message_received m }) {|c| @stream = c}
17
+
18
+ fake_client.call if fake_client.respond_to? :call
19
+ }
20
+ end
21
+
22
+ def expect_connected_event
23
+ client.expects(:message_received).with Stream::Connected.new
24
+ end
25
+
26
+ def expect_disconnected_event
27
+ client.expects(:message_received).with Stream::Disconnected.new
28
+ end
29
+
30
+ before { @sequence = 1 }
31
+
32
+ it 'can be started' do
33
+ EM.expects(:connect).with do |*params|
34
+ params[0].should == 'example.com'
35
+ params[1].should == 1234
36
+ params[2].should == Stream
37
+ params[3].should be_a Proc
38
+ end
39
+
40
+ Stream.start 'example.com', 1234, lambda {}
41
+ end
42
+
43
+ describe "after connection" do
44
+ it "should be started" do
45
+ expect_connected_event
46
+ expect_disconnected_event
47
+ mocked_server(1, lambda { @stream.send_data 'Foo' }) do |val, server|
48
+ @stream.started?.should be_true
49
+ end
50
+ end
51
+
52
+ it "can send a command" do
53
+ expect_connected_event
54
+ expect_disconnected_event
55
+ action = Action.new('Command', 'Command' => 'RECORD FILE evil', 'ActionID' => 666, 'Events' => 'On')
56
+ mocked_server(1, lambda { @stream.send_action action }) do |val, server|
57
+ val.should == action.to_s
58
+ end
59
+ end
60
+ end
61
+
62
+ it 'sends events to the client when the stream is ready' do
63
+ client.expects(:message_received).times(3).with do |e|
64
+ case @sequence
65
+ when 1
66
+ e.should be_a Stream::Connected
67
+ when 2
68
+ EM.stop
69
+ e.should be_a Event
70
+ e.name.should == 'Hangup'
71
+ e['Channel'].should == 'SIP/101-3f3f'
72
+ e['Uniqueid'].should == '1094154427.10'
73
+ e['Cause'].should == '0'
74
+ when 3
75
+ e.should be_a Stream::Disconnected
76
+ end
77
+ @sequence += 1
78
+ end
79
+
80
+ mocked_server(1, lambda { @stream.send_data 'Foo' }) do |val, server|
81
+ server.send_data <<-EVENT
82
+ Event: Hangup
83
+ Channel: SIP/101-3f3f
84
+ Uniqueid: 1094154427.10
85
+ Cause: 0
86
+
87
+ EVENT
88
+ end
89
+ end
90
+
91
+ it 'sends responses to the client when the stream is ready' do
92
+ client.expects(:message_received).times(3).with do |r|
93
+ case @sequence
94
+ when 1
95
+ r.should be_a Stream::Connected
96
+ when 2
97
+ EM.stop
98
+ r.should be_a Response
99
+ r['ActionID'].should == 'ee33eru2398fjj290'
100
+ r['Message'].should == 'Authentication accepted'
101
+ when 3
102
+ r.should be_a Stream::Disconnected
103
+ end
104
+ @sequence += 1
105
+ end
106
+
107
+ mocked_server(1, lambda { @stream.send_data 'Foo' }) do |val, server|
108
+ server.send_data <<-EVENT
109
+ Response: Success
110
+ ActionID: ee33eru2398fjj290
111
+ Message: Authentication accepted
112
+
113
+ EVENT
114
+ end
115
+ end
116
+
117
+ it 'sends error to the client when the stream is ready and a bad command was send' do
118
+ client.expects(:message_received).times(3).with do |r|
119
+ case @sequence
120
+ when 1
121
+ r.should be_a Stream::Connected
122
+ when 2
123
+ EM.stop
124
+ r.should be_a Error
125
+ r['ActionID'].should == 'ee33eru2398fjj290'
126
+ r['Message'].should == 'You stupid git'
127
+ when 3
128
+ r.should be_a Stream::Disconnected
129
+ end
130
+ @sequence += 1
131
+ end
132
+
133
+ mocked_server(1, lambda { @stream.send_data 'Foo' }) do |val, server|
134
+ server.send_data <<-EVENT
135
+ Response: Error
136
+ ActionID: ee33eru2398fjj290
137
+ Message: You stupid git
138
+
139
+ EVENT
140
+ end
141
+ end
142
+
143
+ it 'puts itself in the stopped state and fires a disconnected event when unbound' do
144
+ expect_connected_event
145
+ expect_disconnected_event
146
+ mocked_server(1, lambda { @stream.send_data 'Foo' }) do |val, server|
147
+ EM.stop
148
+ @stream.stopped?.should be false
149
+ end
150
+ @stream.stopped?.should be true
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,31 @@
1
+ require 'simplecov'
2
+ require 'simplecov-rcov'
3
+ class SimpleCov::Formatter::MergedFormatter
4
+ def format(result)
5
+ SimpleCov::Formatter::HTMLFormatter.new.format(result)
6
+ SimpleCov::Formatter::RcovFormatter.new.format(result)
7
+ end
8
+ end
9
+ SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
10
+ SimpleCov.start do
11
+ add_filter "/vendor/"
12
+ end
13
+
14
+ require 'ruby_ami'
15
+ require 'mocha'
16
+ require 'countdownlatch'
17
+
18
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
19
+
20
+ include RubyAMI
21
+
22
+ RSpec.configure do |config|
23
+ config.mock_with :mocha
24
+ config.filter_run :focus => true
25
+ config.run_all_when_everything_filtered = true
26
+
27
+ config.before :each do
28
+ uuid = UUIDTools::UUID.random_create
29
+ UUIDTools::UUID.stubs :random_create => uuid
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ MockServer = Class.new
2
+
3
+ module ServerMock
4
+ def receive_data(data)
5
+ @server ||= MockServer.new
6
+ @server.receive_data data, self
7
+ end
8
+
9
+ def send_data(data)
10
+ super data.gsub("\n", "\r\n")
11
+ end
12
+ end
13
+
14
+ def client
15
+ @client ||= mock('Client')
16
+ end
metadata ADDED
@@ -0,0 +1,296 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_ami
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ben Langfeld
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: &2164856540 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.9
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2164856540
25
+ - !ruby/object:Gem::Dependency
26
+ name: uuidtools
27
+ requirement: &2164855280 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2164855280
36
+ - !ruby/object:Gem::Dependency
37
+ name: eventmachine
38
+ requirement: &2164854540 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2164854540
47
+ - !ruby/object:Gem::Dependency
48
+ name: future-resource
49
+ requirement: &2164853780 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2164853780
58
+ - !ruby/object:Gem::Dependency
59
+ name: girl_friday
60
+ requirement: &2164852500 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *2164852500
69
+ - !ruby/object:Gem::Dependency
70
+ name: countdownlatch
71
+ requirement: &2164852020 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.0.0
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *2164852020
80
+ - !ruby/object:Gem::Dependency
81
+ name: i18n
82
+ requirement: &2164851500 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *2164851500
91
+ - !ruby/object:Gem::Dependency
92
+ name: bundler
93
+ requirement: &2164850980 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 1.0.0
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *2164850980
102
+ - !ruby/object:Gem::Dependency
103
+ name: rspec
104
+ requirement: &2164850420 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 2.5.0
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *2164850420
113
+ - !ruby/object:Gem::Dependency
114
+ name: cucumber
115
+ requirement: &2164849900 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *2164849900
124
+ - !ruby/object:Gem::Dependency
125
+ name: ci_reporter
126
+ requirement: &2164849400 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: 1.6.3
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *2164849400
135
+ - !ruby/object:Gem::Dependency
136
+ name: yard
137
+ requirement: &2164848720 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ~>
141
+ - !ruby/object:Gem::Version
142
+ version: 0.6.0
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: *2164848720
146
+ - !ruby/object:Gem::Dependency
147
+ name: rcov
148
+ requirement: &2164848020 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: *2164848020
157
+ - !ruby/object:Gem::Dependency
158
+ name: rake
159
+ requirement: &2164846940 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: *2164846940
168
+ - !ruby/object:Gem::Dependency
169
+ name: mocha
170
+ requirement: &2164846340 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: *2164846340
179
+ - !ruby/object:Gem::Dependency
180
+ name: simplecov
181
+ requirement: &2164845360 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: *2164845360
190
+ - !ruby/object:Gem::Dependency
191
+ name: simplecov-rcov
192
+ requirement: &2164844160 !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: *2164844160
201
+ - !ruby/object:Gem::Dependency
202
+ name: guard-rspec
203
+ requirement: &2164843760 !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :development
210
+ prerelease: false
211
+ version_requirements: *2164843760
212
+ description: A Ruby client library for the Asterisk Management Interface build on
213
+ eventmachine.
214
+ email:
215
+ - ben@langfeld.me
216
+ executables: []
217
+ extensions: []
218
+ extra_rdoc_files: []
219
+ files:
220
+ - .gitignore
221
+ - .rspec
222
+ - CHANGELOG.md
223
+ - Gemfile
224
+ - Guardfile
225
+ - LICENSE.txt
226
+ - README.md
227
+ - Rakefile
228
+ - cucumber.yml
229
+ - features/lexer.feature
230
+ - features/step_definitions/lexer_steps.rb
231
+ - features/support/ami_fixtures.yml
232
+ - features/support/env.rb
233
+ - features/support/introspective_lexer.rb
234
+ - features/support/lexer_helper.rb
235
+ - lib/ruby_ami.rb
236
+ - lib/ruby_ami/Guardfile
237
+ - lib/ruby_ami/action.rb
238
+ - lib/ruby_ami/client.rb
239
+ - lib/ruby_ami/error.rb
240
+ - lib/ruby_ami/event.rb
241
+ - lib/ruby_ami/lexer.rl.rb
242
+ - lib/ruby_ami/lexer_machine.rl
243
+ - lib/ruby_ami/metaprogramming.rb
244
+ - lib/ruby_ami/response.rb
245
+ - lib/ruby_ami/stream.rb
246
+ - lib/ruby_ami/version.rb
247
+ - ruby_ami.gemspec
248
+ - spec/ruby_ami/action_spec.rb
249
+ - spec/ruby_ami/client_spec.rb
250
+ - spec/ruby_ami/error_spec.rb
251
+ - spec/ruby_ami/event_spec.rb
252
+ - spec/ruby_ami/response_spec.rb
253
+ - spec/ruby_ami/stream_spec.rb
254
+ - spec/spec_helper.rb
255
+ - spec/support/mock_server.rb
256
+ - lib/ruby_ami/lexer.rb
257
+ homepage: ''
258
+ licenses: []
259
+ post_install_message:
260
+ rdoc_options: []
261
+ require_paths:
262
+ - lib
263
+ required_ruby_version: !ruby/object:Gem::Requirement
264
+ none: false
265
+ requirements:
266
+ - - ! '>='
267
+ - !ruby/object:Gem::Version
268
+ version: '0'
269
+ required_rubygems_version: !ruby/object:Gem::Requirement
270
+ none: false
271
+ requirements:
272
+ - - ! '>='
273
+ - !ruby/object:Gem::Version
274
+ version: '0'
275
+ requirements: []
276
+ rubyforge_project: ruby_ami
277
+ rubygems_version: 1.8.10
278
+ signing_key:
279
+ specification_version: 3
280
+ summary: Futzing with AMI so you don't have to
281
+ test_files:
282
+ - features/lexer.feature
283
+ - features/step_definitions/lexer_steps.rb
284
+ - features/support/ami_fixtures.yml
285
+ - features/support/env.rb
286
+ - features/support/introspective_lexer.rb
287
+ - features/support/lexer_helper.rb
288
+ - spec/ruby_ami/action_spec.rb
289
+ - spec/ruby_ami/client_spec.rb
290
+ - spec/ruby_ami/error_spec.rb
291
+ - spec/ruby_ami/event_spec.rb
292
+ - spec/ruby_ami/response_spec.rb
293
+ - spec/ruby_ami/stream_spec.rb
294
+ - spec/spec_helper.rb
295
+ - spec/support/mock_server.rb
296
+ has_rdoc: