punchblock 1.8.0 → 1.8.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +12 -0
- data/Gemfile +1 -1
- data/lib/punchblock/component/component_node.rb +1 -1
- data/lib/punchblock/component/stop.rb +2 -2
- data/lib/punchblock/connection/asterisk.rb +3 -3
- data/lib/punchblock/connection/freeswitch.rb +2 -2
- data/lib/punchblock/connection/xmpp.rb +1 -1
- data/lib/punchblock/translator.rb +1 -0
- data/lib/punchblock/translator/asterisk.rb +10 -9
- data/lib/punchblock/translator/asterisk/call.rb +15 -7
- data/lib/punchblock/translator/asterisk/component/asterisk/ami_action.rb +1 -1
- data/lib/punchblock/translator/asterisk/component/input.rb +3 -4
- data/lib/punchblock/translator/asterisk/component/output.rb +6 -6
- data/lib/punchblock/translator/asterisk/component/record.rb +7 -7
- data/lib/punchblock/translator/asterisk/component/stop_by_redirect.rb +3 -3
- data/lib/punchblock/translator/dtmf_recognizer.rb +87 -0
- data/lib/punchblock/translator/freeswitch.rb +9 -7
- data/lib/punchblock/translator/freeswitch/call.rb +6 -4
- data/lib/punchblock/translator/freeswitch/component/input.rb +1 -2
- data/lib/punchblock/translator/freeswitch/component/output.rb +1 -2
- data/lib/punchblock/translator/freeswitch/component/tts_output.rb +1 -1
- data/lib/punchblock/translator/input_component.rb +17 -64
- data/lib/punchblock/version.rb +1 -1
- data/punchblock.gemspec +1 -1
- data/spec/punchblock/component/input_spec.rb +1 -1
- data/spec/punchblock/component/output_spec.rb +33 -3
- data/spec/punchblock/component/record_spec.rb +1 -1
- data/spec/punchblock/connection/asterisk_spec.rb +3 -3
- data/spec/punchblock/connection/freeswitch_spec.rb +3 -2
- data/spec/punchblock/connection/xmpp_spec.rb +18 -6
- data/spec/punchblock/translator/asterisk/call_spec.rb +83 -31
- data/spec/punchblock/translator/asterisk/component/input_spec.rb +1 -1
- data/spec/punchblock/translator/asterisk/component/output_spec.rb +32 -27
- data/spec/punchblock/translator/asterisk/component/record_spec.rb +47 -43
- data/spec/punchblock/translator/asterisk/component/stop_by_redirect_spec.rb +2 -2
- data/spec/punchblock/translator/asterisk_spec.rb +28 -26
- data/spec/punchblock/translator/freeswitch/call_spec.rb +24 -15
- data/spec/punchblock/translator/freeswitch/component/input_spec.rb +1 -1
- data/spec/punchblock/translator/freeswitch/component/output_spec.rb +2 -3
- data/spec/punchblock/translator/freeswitch/component/record_spec.rb +1 -1
- data/spec/punchblock/translator/freeswitch_spec.rb +75 -18
- data/spec/spec_helper.rb +1 -1
- metadata +24 -74
|
@@ -15,7 +15,7 @@ module Punchblock
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
let(:mock_call) {
|
|
18
|
+
let(:mock_call) { Call.new 'SIP/foo', mock('Translator') }
|
|
19
19
|
subject { MockComponent.new Hash.new, mock_call }
|
|
20
20
|
|
|
21
21
|
describe "#execute_command" do
|
|
@@ -37,7 +37,7 @@ module Punchblock
|
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
it "sets the command response to true" do
|
|
40
|
-
mock_call.should_receive(:redirect_back
|
|
40
|
+
mock_call.async.should_receive(:redirect_back)
|
|
41
41
|
mock_call.should_receive(:register_handler).with do |type, *guards|
|
|
42
42
|
type.should be == :ami
|
|
43
43
|
guards.should have(2).guards
|
|
@@ -32,7 +32,7 @@ module Punchblock
|
|
|
32
32
|
describe '#shutdown' do
|
|
33
33
|
it "instructs all calls to shutdown" do
|
|
34
34
|
call = Asterisk::Call.new 'foo', subject
|
|
35
|
-
call.should_receive(:shutdown
|
|
35
|
+
call.async.should_receive(:shutdown).once
|
|
36
36
|
subject.register_call call
|
|
37
37
|
subject.shutdown
|
|
38
38
|
end
|
|
@@ -147,7 +147,7 @@ module Punchblock
|
|
|
147
147
|
end
|
|
148
148
|
|
|
149
149
|
it 'sends the command to the call for execution' do
|
|
150
|
-
call.should_receive(:execute_command
|
|
150
|
+
call.async.should_receive(:execute_command).once.with command
|
|
151
151
|
subject.execute_call_command command
|
|
152
152
|
end
|
|
153
153
|
end
|
|
@@ -235,10 +235,11 @@ module Punchblock
|
|
|
235
235
|
end
|
|
236
236
|
|
|
237
237
|
describe '#execute_component_command' do
|
|
238
|
-
let(:
|
|
239
|
-
let(:
|
|
238
|
+
let(:call) { Translator::Asterisk::Call.new 'SIP/foo', subject }
|
|
239
|
+
let(:component_node) { Component::Output.new }
|
|
240
|
+
let(:component) { Translator::Asterisk::Component::Output.new(component_node, call) }
|
|
240
241
|
|
|
241
|
-
let(:command) { Component::Stop.new.tap { |c| c.component_id =
|
|
242
|
+
let(:command) { Component::Stop.new.tap { |c| c.component_id = component.id } }
|
|
242
243
|
|
|
243
244
|
before do
|
|
244
245
|
command.request!
|
|
@@ -250,7 +251,7 @@ module Punchblock
|
|
|
250
251
|
end
|
|
251
252
|
|
|
252
253
|
it 'sends the command to the component for execution' do
|
|
253
|
-
component.should_receive(:execute_command
|
|
254
|
+
component.async.should_receive(:execute_command).once.with command
|
|
254
255
|
subject.execute_component_command command
|
|
255
256
|
end
|
|
256
257
|
end
|
|
@@ -258,7 +259,7 @@ module Punchblock
|
|
|
258
259
|
context "with an unknown component ID" do
|
|
259
260
|
it 'sends an error in response to the command' do
|
|
260
261
|
subject.execute_component_command command
|
|
261
|
-
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a component with ID #{
|
|
262
|
+
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a component with ID #{component.id}", nil, component.id)
|
|
262
263
|
end
|
|
263
264
|
end
|
|
264
265
|
end
|
|
@@ -283,7 +284,7 @@ module Punchblock
|
|
|
283
284
|
it 'should instruct the call to send a dial' do
|
|
284
285
|
mock_call = stub('Asterisk::Call').as_null_object
|
|
285
286
|
Asterisk::Call.should_receive(:new_link).once.and_return mock_call
|
|
286
|
-
mock_call.should_receive(:dial
|
|
287
|
+
mock_call.async.should_receive(:dial).once.with command
|
|
287
288
|
subject.execute_global_command command
|
|
288
289
|
end
|
|
289
290
|
end
|
|
@@ -297,7 +298,7 @@ module Punchblock
|
|
|
297
298
|
|
|
298
299
|
it 'should create a component actor and execute it asynchronously' do
|
|
299
300
|
Asterisk::Component::Asterisk::AMIAction.should_receive(:new).once.with(command, subject).and_return mock_action
|
|
300
|
-
mock_action.should_receive(:execute
|
|
301
|
+
mock_action.async.should_receive(:execute).once
|
|
301
302
|
subject.execute_global_command command
|
|
302
303
|
end
|
|
303
304
|
|
|
@@ -422,7 +423,7 @@ module Punchblock
|
|
|
422
423
|
mock_call = stub('Asterisk::Call').as_null_object
|
|
423
424
|
Asterisk::Call.should_receive(:new).once.and_return mock_call
|
|
424
425
|
subject.wrapped_object.should_receive(:link)
|
|
425
|
-
mock_call.should_receive(:send_offer
|
|
426
|
+
mock_call.async.should_receive(:send_offer).once
|
|
426
427
|
subject.handle_ami_event ami_event
|
|
427
428
|
end
|
|
428
429
|
|
|
@@ -554,7 +555,7 @@ module Punchblock
|
|
|
554
555
|
end
|
|
555
556
|
|
|
556
557
|
it 'sends the AMI event to the call and to the connection as a PB event' do
|
|
557
|
-
call.should_receive(:process_ami_event
|
|
558
|
+
call.async.should_receive(:process_ami_event).once.with ami_event
|
|
558
559
|
subject.handle_ami_event ami_event
|
|
559
560
|
end
|
|
560
561
|
|
|
@@ -576,8 +577,8 @@ module Punchblock
|
|
|
576
577
|
before { subject.register_call call2 }
|
|
577
578
|
|
|
578
579
|
it 'should send the event to both calls and to the connection once as a PB event' do
|
|
579
|
-
call.should_receive(:process_ami_event
|
|
580
|
-
call2.should_receive(:process_ami_event
|
|
580
|
+
call.async.should_receive(:process_ami_event).once.with ami_event
|
|
581
|
+
call2.async.should_receive(:process_ami_event).once.with ami_event
|
|
581
582
|
subject.handle_ami_event ami_event
|
|
582
583
|
end
|
|
583
584
|
end
|
|
@@ -612,12 +613,12 @@ module Punchblock
|
|
|
612
613
|
end
|
|
613
614
|
|
|
614
615
|
it 'sends the AMI event to the call and to the connection as a PB event if it is an allowed event' do
|
|
615
|
-
call.should_receive(:process_ami_event
|
|
616
|
+
call.async.should_receive(:process_ami_event).once.with ami_event
|
|
616
617
|
subject.handle_ami_event ami_event
|
|
617
618
|
end
|
|
618
619
|
|
|
619
620
|
it 'does not send the AMI event to a bridged channel if it is not allowed' do
|
|
620
|
-
call.should_receive(:process_ami_event
|
|
621
|
+
call.async.should_receive(:process_ami_event).never.with ami_event2
|
|
621
622
|
subject.handle_ami_event ami_event2
|
|
622
623
|
end
|
|
623
624
|
|
|
@@ -632,6 +633,8 @@ module Punchblock
|
|
|
632
633
|
end
|
|
633
634
|
|
|
634
635
|
describe '#run_at_fully_booted' do
|
|
636
|
+
let(:broken_path) { "/this/is/not/a/valid/path" }
|
|
637
|
+
|
|
635
638
|
let(:passed_show) do
|
|
636
639
|
OpenStruct.new({:text_body => "[ Context 'adhearsion-redirect' created by 'pbx_config' ]\n '1' => 1. AGI(agi:async)[pbx_config]\n\n-= 1 extension (1 priority) in 1 context. =-"})
|
|
637
640
|
end
|
|
@@ -658,22 +661,21 @@ module Punchblock
|
|
|
658
661
|
Punchblock.logger.should_receive(:error).once.with("Punchblock failed to add the #{Asterisk::REDIRECT_EXTENSION} extension to the #{Asterisk::REDIRECT_CONTEXT} context. Please add a [#{Asterisk::REDIRECT_CONTEXT}] entry to your dialplan.")
|
|
659
662
|
subject.run_at_fully_booted
|
|
660
663
|
end
|
|
664
|
+
|
|
665
|
+
it 'should check the recording directory for existence' do
|
|
666
|
+
stub_const('Punchblock::Translator::Asterisk::Component::Record::RECORDING_BASE_PATH', broken_path)
|
|
667
|
+
ami_client.should_receive(:send_action).once.with 'Command', 'Command' => "dialplan add extension #{Asterisk::REDIRECT_EXTENSION},#{Asterisk::REDIRECT_PRIORITY},AGI,agi:async into #{Asterisk::REDIRECT_CONTEXT}"
|
|
668
|
+
ami_client.should_receive(:send_action).once.with('Command', 'Command' => "dialplan show #{Asterisk::REDIRECT_CONTEXT}")
|
|
669
|
+
Punchblock.logger.should_receive(:warn).once.with("Recordings directory #{broken_path} does not exist. Recording might not work. This warning can be ignored if Adhearsion is running on a separate machine than Asterisk. See http://adhearsion.com/docs/call-controllers#recording")
|
|
670
|
+
subject.run_at_fully_booted
|
|
671
|
+
end
|
|
661
672
|
end
|
|
662
673
|
|
|
663
674
|
describe '#check_recording_directory' do
|
|
664
675
|
let(:broken_path) { "/this/is/not/a/valid/path" }
|
|
665
|
-
before do
|
|
666
|
-
@new_constant = broken_path
|
|
667
|
-
@old_constant = Punchblock::Translator::Asterisk::Component::Record::RECORDING_BASE_PATH
|
|
668
|
-
Punchblock::Translator::Asterisk::Component::Record.__send__(:remove_const,'RECORDING_BASE_PATH')
|
|
669
|
-
Punchblock::Translator::Asterisk::Component::Record.const_set('RECORDING_BASE_PATH', @new_constant)
|
|
670
|
-
end
|
|
671
|
-
after do
|
|
672
|
-
Punchblock::Translator::Asterisk::Component::Record.__send__(:remove_const,'RECORDING_BASE_PATH')
|
|
673
|
-
Punchblock::Translator::Asterisk::Component::Record.const_set('RECORDING_BASE_PATH', @old_constant)
|
|
674
|
-
end
|
|
675
676
|
it 'logs a warning if the recording directory does not exist' do
|
|
676
|
-
Punchblock
|
|
677
|
+
stub_const('Punchblock::Translator::Asterisk::Component::Record::RECORDING_BASE_PATH', broken_path)
|
|
678
|
+
Punchblock.logger.should_receive(:warn).once.with("Recordings directory #{broken_path} does not exist. Recording might not work. This warning can be ignored if Adhearsion is running on a separate machine than Asterisk. See http://adhearsion.com/docs/call-controllers#recording")
|
|
677
679
|
subject.check_recording_directory
|
|
678
680
|
end
|
|
679
681
|
end
|
|
@@ -279,6 +279,15 @@ module Punchblock
|
|
|
279
279
|
end
|
|
280
280
|
end
|
|
281
281
|
|
|
282
|
+
context 'with no from attribute' do
|
|
283
|
+
let(:from) { nil }
|
|
284
|
+
|
|
285
|
+
it 'sends an originate bgapi command with the cid fields set correctly' do
|
|
286
|
+
stream.should_receive(:bgapi).once.with "originate {return_ring_ready=true,origination_uuid=#{subject.id}}#{to} &park()"
|
|
287
|
+
subject.dial dial_command
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
282
291
|
context 'with a timeout specified' do
|
|
283
292
|
let :dial_command_options do
|
|
284
293
|
{ :timeout => 10000 }
|
|
@@ -765,7 +774,7 @@ module Punchblock
|
|
|
765
774
|
Punchblock::Component::Output.new
|
|
766
775
|
end
|
|
767
776
|
|
|
768
|
-
let(:mock_component) {
|
|
777
|
+
let(:mock_component) { Translator::Freeswitch::Component::Output.new(command, subject) }
|
|
769
778
|
|
|
770
779
|
['freeswitch', nil].each do |media_engine|
|
|
771
780
|
let(:media_engine) { media_engine }
|
|
@@ -773,9 +782,9 @@ module Punchblock
|
|
|
773
782
|
context "with a media engine of #{media_engine}" do
|
|
774
783
|
it 'should create an Output component and execute it asynchronously' do
|
|
775
784
|
Component::Output.should_receive(:new_link).once.with(command, subject).and_return mock_component
|
|
776
|
-
mock_component.should_receive(:execute
|
|
785
|
+
mock_component.async.should_receive(:execute).once
|
|
777
786
|
subject.execute_command command
|
|
778
|
-
subject.component_with_id(
|
|
787
|
+
subject.component_with_id(mock_component.id).should be mock_component
|
|
779
788
|
end
|
|
780
789
|
end
|
|
781
790
|
end
|
|
@@ -785,9 +794,9 @@ module Punchblock
|
|
|
785
794
|
|
|
786
795
|
it 'should create a FliteOutput component and execute it asynchronously using flite and the calls default voice' do
|
|
787
796
|
Component::FliteOutput.should_receive(:new_link).once.with(command, subject).and_return mock_component
|
|
788
|
-
mock_component.should_receive(:execute
|
|
797
|
+
mock_component.async.should_receive(:execute).once.with(media_engine, default_voice)
|
|
789
798
|
subject.execute_command command
|
|
790
|
-
subject.component_with_id(
|
|
799
|
+
subject.component_with_id(mock_component.id).should be mock_component
|
|
791
800
|
end
|
|
792
801
|
end
|
|
793
802
|
|
|
@@ -796,9 +805,9 @@ module Punchblock
|
|
|
796
805
|
|
|
797
806
|
it 'should create a TTSOutput component and execute it asynchronously using cepstral and the calls default voice' do
|
|
798
807
|
Component::TTSOutput.should_receive(:new_link).once.with(command, subject).and_return mock_component
|
|
799
|
-
mock_component.should_receive(:execute
|
|
808
|
+
mock_component.async.should_receive(:execute).once.with(media_engine, default_voice)
|
|
800
809
|
subject.execute_command command
|
|
801
|
-
subject.component_with_id(
|
|
810
|
+
subject.component_with_id(mock_component.id).should be mock_component
|
|
802
811
|
end
|
|
803
812
|
end
|
|
804
813
|
|
|
@@ -807,9 +816,9 @@ module Punchblock
|
|
|
807
816
|
|
|
808
817
|
it 'should create a TTSOutput component and execute it asynchronously using unimrcp and the calls default voice' do
|
|
809
818
|
Component::TTSOutput.should_receive(:new_link).once.with(command, subject).and_return mock_component
|
|
810
|
-
mock_component.should_receive(:execute
|
|
819
|
+
mock_component.async.should_receive(:execute).once.with(media_engine, default_voice)
|
|
811
820
|
subject.execute_command command
|
|
812
|
-
subject.component_with_id(
|
|
821
|
+
subject.component_with_id(mock_component.id).should be mock_component
|
|
813
822
|
end
|
|
814
823
|
end
|
|
815
824
|
|
|
@@ -822,9 +831,9 @@ module Punchblock
|
|
|
822
831
|
|
|
823
832
|
it "should use the component media engine and not the platform one if it is set" do
|
|
824
833
|
Component::Output.should_receive(:new_link).once.with(command_with_renderer, subject).and_return mock_component
|
|
825
|
-
mock_component.should_receive(:execute
|
|
834
|
+
mock_component.async.should_receive(:execute).once
|
|
826
835
|
subject.execute_command command_with_renderer
|
|
827
|
-
subject.component_with_id(
|
|
836
|
+
subject.component_with_id(mock_component.id).should be mock_component
|
|
828
837
|
end
|
|
829
838
|
end
|
|
830
839
|
end
|
|
@@ -834,11 +843,11 @@ module Punchblock
|
|
|
834
843
|
Punchblock::Component::Input.new
|
|
835
844
|
end
|
|
836
845
|
|
|
837
|
-
let(:mock_component) {
|
|
846
|
+
let(:mock_component) { Translator::Freeswitch::Component::Input.new(command, subject) }
|
|
838
847
|
|
|
839
848
|
it 'should create an Input component and execute it asynchronously' do
|
|
840
849
|
Component::Input.should_receive(:new_link).once.with(command, subject).and_return mock_component
|
|
841
|
-
mock_component.should_receive(:execute
|
|
850
|
+
mock_component.async.should_receive(:execute).once
|
|
842
851
|
subject.execute_command command
|
|
843
852
|
end
|
|
844
853
|
end
|
|
@@ -848,11 +857,11 @@ module Punchblock
|
|
|
848
857
|
Punchblock::Component::Record.new
|
|
849
858
|
end
|
|
850
859
|
|
|
851
|
-
let(:mock_component) {
|
|
860
|
+
let(:mock_component) { Translator::Freeswitch::Component::Record.new(command, subject) }
|
|
852
861
|
|
|
853
862
|
it 'should create a Record component and execute it asynchronously' do
|
|
854
863
|
Component::Record.should_receive(:new_link).once.with(command, subject).and_return mock_component
|
|
855
|
-
mock_component.should_receive(:execute
|
|
864
|
+
mock_component.async.should_receive(:execute).once
|
|
856
865
|
subject.execute_command command
|
|
857
866
|
end
|
|
858
867
|
end
|
|
@@ -270,10 +270,9 @@ module Punchblock
|
|
|
270
270
|
|
|
271
271
|
context 'set' do
|
|
272
272
|
let(:command_opts) { { :voice => 'alison' } }
|
|
273
|
-
it "should
|
|
273
|
+
it "should ignore the voice option" do
|
|
274
|
+
expect_playback
|
|
274
275
|
subject.execute
|
|
275
|
-
error = ProtocolError.new.setup 'option error', 'A voice value is unsupported.'
|
|
276
|
-
original_command.response(0.1).should be == error
|
|
277
276
|
end
|
|
278
277
|
end
|
|
279
278
|
end
|
|
@@ -143,7 +143,7 @@ module Punchblock
|
|
|
143
143
|
context "set to a positive number" do
|
|
144
144
|
let(:command_options) { { :final_timeout => 10 } }
|
|
145
145
|
it "should return an error and not execute any actions" do
|
|
146
|
-
mock_call.should_receive(:
|
|
146
|
+
mock_call.should_receive(:uuid_foo).never
|
|
147
147
|
subject.execute
|
|
148
148
|
error = ProtocolError.new.setup 'option error', 'A final-timeout value is unsupported.'
|
|
149
149
|
original_command.response(0.1).should be == error
|
|
@@ -7,7 +7,7 @@ module Punchblock
|
|
|
7
7
|
describe Freeswitch do
|
|
8
8
|
let(:connection) { mock 'Connection::Freeswitch' }
|
|
9
9
|
let(:media_engine) { :flite }
|
|
10
|
-
let(:default_voice)
|
|
10
|
+
let(:default_voice) { :hal }
|
|
11
11
|
|
|
12
12
|
let(:translator) { described_class.new connection, media_engine, default_voice }
|
|
13
13
|
let(:stream) { mock 'RubyFS::Stream' }
|
|
@@ -117,7 +117,7 @@ module Punchblock
|
|
|
117
117
|
end
|
|
118
118
|
|
|
119
119
|
it 'sends the command to the call for execution' do
|
|
120
|
-
call.should_receive(:execute_command
|
|
120
|
+
call.async.should_receive(:execute_command).once.with command
|
|
121
121
|
subject.execute_call_command command
|
|
122
122
|
end
|
|
123
123
|
end
|
|
@@ -201,10 +201,11 @@ module Punchblock
|
|
|
201
201
|
end
|
|
202
202
|
|
|
203
203
|
describe '#execute_component_command' do
|
|
204
|
-
let(:
|
|
205
|
-
let(:
|
|
204
|
+
let(:call) { Translator::Freeswitch::Call.new 'SIP/foo', subject }
|
|
205
|
+
let(:component_node) { Component::Output.new }
|
|
206
|
+
let(:component) { Translator::Freeswitch::Component::Output.new(component_node, call) }
|
|
206
207
|
|
|
207
|
-
let(:command) { Component::Stop.new.tap { |c| c.component_id =
|
|
208
|
+
let(:command) { Component::Stop.new.tap { |c| c.component_id = component.id } }
|
|
208
209
|
|
|
209
210
|
before do
|
|
210
211
|
command.request!
|
|
@@ -216,7 +217,7 @@ module Punchblock
|
|
|
216
217
|
end
|
|
217
218
|
|
|
218
219
|
it 'sends the command to the component for execution' do
|
|
219
|
-
component.should_receive(:execute_command
|
|
220
|
+
component.async.should_receive(:execute_command).once.with command
|
|
220
221
|
subject.execute_component_command command
|
|
221
222
|
end
|
|
222
223
|
end
|
|
@@ -224,7 +225,7 @@ module Punchblock
|
|
|
224
225
|
context "with an unknown component ID" do
|
|
225
226
|
it 'sends an error in response to the command' do
|
|
226
227
|
subject.execute_component_command command
|
|
227
|
-
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a component with ID #{
|
|
228
|
+
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a component with ID #{component.id}", nil, component.id)
|
|
228
229
|
end
|
|
229
230
|
end
|
|
230
231
|
end
|
|
@@ -257,7 +258,7 @@ module Punchblock
|
|
|
257
258
|
it 'should instruct the call to send a dial' do
|
|
258
259
|
mock_call = stub('Freeswitch::Call').as_null_object
|
|
259
260
|
Freeswitch::Call.should_receive(:new_link).once.and_return mock_call
|
|
260
|
-
mock_call.should_receive(:dial
|
|
261
|
+
mock_call.async.should_receive(:dial).once.with command
|
|
261
262
|
subject.execute_global_command command
|
|
262
263
|
end
|
|
263
264
|
end
|
|
@@ -532,7 +533,7 @@ module Punchblock
|
|
|
532
533
|
mock_call = stub('Freeswitch::Call').as_null_object
|
|
533
534
|
Freeswitch::Call.should_receive(:new).once.and_return mock_call
|
|
534
535
|
subject.wrapped_object.should_receive(:link)
|
|
535
|
-
mock_call.should_receive(:send_offer
|
|
536
|
+
mock_call.async.should_receive(:send_offer).once
|
|
536
537
|
subject.handle_es_event es_event
|
|
537
538
|
end
|
|
538
539
|
|
|
@@ -550,7 +551,67 @@ module Punchblock
|
|
|
550
551
|
end
|
|
551
552
|
end
|
|
552
553
|
|
|
553
|
-
describe
|
|
554
|
+
describe "with a CHANNEL_BRIDGE event" do
|
|
555
|
+
describe 'with an Other-Leg-Unique-ID value' do
|
|
556
|
+
let(:call_a) { Freeswitch::Call.new Punchblock.new_uuid, subject }
|
|
557
|
+
let(:call_b) { Freeswitch::Call.new Punchblock.new_uuid, subject }
|
|
558
|
+
|
|
559
|
+
before do
|
|
560
|
+
subject.register_call call_a
|
|
561
|
+
subject.register_call call_b
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
let :es_event do
|
|
565
|
+
RubyFS::Event.new nil, {
|
|
566
|
+
:event_name => 'CHANNEL_BRIDGE',
|
|
567
|
+
:unique_id => call_a.id,
|
|
568
|
+
:other_leg_unique_id => call_b.id
|
|
569
|
+
}
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
it "is delivered to the bridging leg" do
|
|
573
|
+
call_a.async.should_receive(:handle_es_event).once.with es_event
|
|
574
|
+
subject.handle_es_event es_event
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
it "is delivered to the other leg" do
|
|
578
|
+
call_b.async.should_receive(:handle_es_event).once.with es_event
|
|
579
|
+
subject.handle_es_event es_event
|
|
580
|
+
end
|
|
581
|
+
end
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
describe "with a CHANNEL_UNBRIDGE event" do
|
|
585
|
+
describe 'with an Other-Leg-Unique-ID value' do
|
|
586
|
+
let(:call_a) { Freeswitch::Call.new Punchblock.new_uuid, subject }
|
|
587
|
+
let(:call_b) { Freeswitch::Call.new Punchblock.new_uuid, subject }
|
|
588
|
+
|
|
589
|
+
before do
|
|
590
|
+
subject.register_call call_a
|
|
591
|
+
subject.register_call call_b
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
let :es_event do
|
|
595
|
+
RubyFS::Event.new nil, {
|
|
596
|
+
:event_name => 'CHANNEL_UNBRIDGE',
|
|
597
|
+
:unique_id => call_a.id,
|
|
598
|
+
:other_leg_unique_id => call_b.id
|
|
599
|
+
}
|
|
600
|
+
end
|
|
601
|
+
|
|
602
|
+
it "is delivered to the bridging leg" do
|
|
603
|
+
call_a.async.should_receive(:handle_es_event).once.with es_event
|
|
604
|
+
subject.handle_es_event es_event
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
it "is delivered to the other leg" do
|
|
608
|
+
call_b.async.should_receive(:handle_es_event).once.with es_event
|
|
609
|
+
subject.handle_es_event es_event
|
|
610
|
+
end
|
|
611
|
+
end
|
|
612
|
+
end
|
|
613
|
+
|
|
614
|
+
describe 'with an Other-Leg-Unique-ID value' do
|
|
554
615
|
let(:call_a) { Freeswitch::Call.new Punchblock.new_uuid, subject }
|
|
555
616
|
let(:call_b) { Freeswitch::Call.new Punchblock.new_uuid, subject }
|
|
556
617
|
|
|
@@ -566,13 +627,9 @@ module Punchblock
|
|
|
566
627
|
}
|
|
567
628
|
end
|
|
568
629
|
|
|
569
|
-
it "is delivered to the
|
|
570
|
-
call_a.should_receive(:handle_es_event
|
|
571
|
-
|
|
572
|
-
end
|
|
573
|
-
|
|
574
|
-
it "is delivered to the other leg" do
|
|
575
|
-
call_b.should_receive(:handle_es_event!).once.with es_event
|
|
630
|
+
it "is delivered only to the primary leg" do
|
|
631
|
+
call_a.async.should_receive(:handle_es_event).once.with es_event
|
|
632
|
+
call_b.async.should_receive(:handle_es_event).never
|
|
576
633
|
subject.handle_es_event es_event
|
|
577
634
|
end
|
|
578
635
|
end
|
|
@@ -587,7 +644,7 @@ module Punchblock
|
|
|
587
644
|
end
|
|
588
645
|
|
|
589
646
|
it 'sends the ES event to the call' do
|
|
590
|
-
call.should_receive(:handle_es_event
|
|
647
|
+
call.async.should_receive(:handle_es_event).once.with es_event
|
|
591
648
|
subject.handle_es_event es_event
|
|
592
649
|
end
|
|
593
650
|
end
|