sippy_cup 0.3.0 → 0.4.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.
- checksums.yaml +5 -13
- data/.travis.yml +2 -0
- data/CHANGELOG.md +10 -2
- data/README.markdown +19 -5
- data/lib/sippy_cup/media.rb +4 -2
- data/lib/sippy_cup/runner.rb +43 -36
- data/lib/sippy_cup/scenario.rb +146 -41
- data/lib/sippy_cup/version.rb +1 -1
- data/sippy_cup.gemspec +1 -1
- data/spec/sippy_cup/media_spec.rb +9 -0
- data/spec/sippy_cup/runner_spec.rb +81 -20
- data/spec/sippy_cup/scenario_spec.rb +124 -45
- metadata +29 -30
- data/lib/sippy_cup/rtp_generator.rb +0 -19
@@ -7,7 +7,7 @@ describe SippyCup::Runner do
|
|
7
7
|
|
8
8
|
let(:settings) { {} }
|
9
9
|
let(:default_settings) { { logger: logger } }
|
10
|
-
let(:command) { "sudo sipp -i 127.0.0.1" }
|
10
|
+
let(:command) { "sudo $(which sipp) -i 127.0.0.1" }
|
11
11
|
let(:pid) { '1234' }
|
12
12
|
|
13
13
|
let(:logger) { double }
|
@@ -17,8 +17,8 @@ describe SippyCup::Runner do
|
|
17
17
|
let(:manifest) do
|
18
18
|
<<-MANIFEST
|
19
19
|
name: foobar
|
20
|
-
source: '
|
21
|
-
destination: '
|
20
|
+
source: 'dah.com'
|
21
|
+
destination: 'bar.com'
|
22
22
|
max_concurrent: 5
|
23
23
|
calls_per_second: 2
|
24
24
|
number_of_calls: 10
|
@@ -47,7 +47,7 @@ steps:
|
|
47
47
|
describe '#run' do
|
48
48
|
it "executes the correct command to invoke SIPp" do
|
49
49
|
full_scenario_path = File.join(Dir.tmpdir, '/scenario.*')
|
50
|
-
expect_command_execution %r{sudo sipp -i
|
50
|
+
expect_command_execution %r{sudo \$\(which sipp\) -i dah.com -p 8836 -sf #{full_scenario_path} -l 5 -m 10 -r 2 -s 1 bar.com}
|
51
51
|
subject.run
|
52
52
|
end
|
53
53
|
|
@@ -72,12 +72,52 @@ steps:
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
context "async" do
|
76
|
+
let(:settings) { {async: true} }
|
77
|
+
it 'should not wait for SIPp to terminate' do
|
78
|
+
subject.stub :process_exit_status
|
79
|
+
subject.should_receive :spawn
|
80
|
+
Process.should_not_receive :wait2
|
81
|
+
subject.run
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "specifying arbitrary options in the manifest" do
|
86
|
+
let(:manifest) do
|
87
|
+
<<-MANIFEST
|
88
|
+
name: foobar
|
89
|
+
source: 'dah.com'
|
90
|
+
destination: 'bar.com'
|
91
|
+
max_concurrent: 5
|
92
|
+
calls_per_second: 2
|
93
|
+
number_of_calls: 10
|
94
|
+
options:
|
95
|
+
trace_err: ~
|
96
|
+
foo: bar
|
97
|
+
steps:
|
98
|
+
- invite
|
99
|
+
- wait_for_answer
|
100
|
+
- ack_answer
|
101
|
+
- sleep 3
|
102
|
+
- send_digits 'abc'
|
103
|
+
- sleep 5
|
104
|
+
- send_digits '#'
|
105
|
+
- wait_for_hangup
|
106
|
+
MANIFEST
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should pass the options to sipp' do
|
110
|
+
expect_command_execution(/-trace_err -foo bar/)
|
111
|
+
subject.run
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
75
115
|
context "specifying a source port in the manifest" do
|
76
116
|
let(:manifest) do
|
77
117
|
<<-MANIFEST
|
78
118
|
name: foobar
|
79
|
-
source: '
|
80
|
-
destination: '
|
119
|
+
source: 'dah.com'
|
120
|
+
destination: 'bar.com'
|
81
121
|
max_concurrent: 5
|
82
122
|
calls_per_second: 2
|
83
123
|
number_of_calls: 10
|
@@ -100,16 +140,17 @@ steps:
|
|
100
140
|
end
|
101
141
|
end
|
102
142
|
|
103
|
-
context "specifying a
|
143
|
+
context "specifying a to_user in the Scenario" do
|
104
144
|
let(:manifest) do
|
105
145
|
<<-MANIFEST
|
106
146
|
name: foobar
|
107
|
-
source: '
|
108
|
-
destination: '
|
147
|
+
source: 'dah.com'
|
148
|
+
destination: 'bar.com'
|
109
149
|
max_concurrent: 5
|
110
150
|
calls_per_second: 2
|
111
151
|
number_of_calls: 10
|
112
|
-
from_user:
|
152
|
+
from_user: pat
|
153
|
+
to_user: frank
|
113
154
|
steps:
|
114
155
|
- invite
|
115
156
|
- wait_for_answer
|
@@ -132,8 +173,8 @@ steps:
|
|
132
173
|
let(:manifest) do
|
133
174
|
<<-MANIFEST
|
134
175
|
name: foobar
|
135
|
-
source: '
|
136
|
-
destination: '
|
176
|
+
source: 'dah.com'
|
177
|
+
destination: 'bar.com'
|
137
178
|
max_concurrent: 5
|
138
179
|
calls_per_second: 2
|
139
180
|
number_of_calls: 10
|
@@ -160,8 +201,8 @@ steps:
|
|
160
201
|
let(:manifest) do
|
161
202
|
<<-MANIFEST
|
162
203
|
name: foobar
|
163
|
-
source: '
|
164
|
-
destination: '
|
204
|
+
source: 'dah.com'
|
205
|
+
destination: 'bar.com'
|
165
206
|
max_concurrent: 5
|
166
207
|
calls_per_second: 2
|
167
208
|
number_of_calls: 10
|
@@ -187,8 +228,8 @@ steps:
|
|
187
228
|
let(:manifest) do
|
188
229
|
<<-MANIFEST
|
189
230
|
name: foobar
|
190
|
-
source: '
|
191
|
-
destination: '
|
231
|
+
source: 'dah.com'
|
232
|
+
destination: 'bar.com'
|
192
233
|
max_concurrent: 5
|
193
234
|
calls_per_second: 2
|
194
235
|
number_of_calls: 10
|
@@ -231,8 +272,8 @@ steps:
|
|
231
272
|
let(:manifest) do
|
232
273
|
<<-MANIFEST
|
233
274
|
name: foobar
|
234
|
-
source: '
|
235
|
-
destination: '
|
275
|
+
source: 'dah.com'
|
276
|
+
destination: 'bar.com'
|
236
277
|
max_concurrent: 5
|
237
278
|
calls_per_second: 2
|
238
279
|
number_of_calls: 10
|
@@ -261,8 +302,8 @@ steps:
|
|
261
302
|
let(:manifest) do
|
262
303
|
<<-MANIFEST
|
263
304
|
name: foobar
|
264
|
-
source: '
|
265
|
-
destination: '
|
305
|
+
source: 'dah.com'
|
306
|
+
destination: 'bar.com'
|
266
307
|
max_concurrent: 5
|
267
308
|
calls_per_second: 2
|
268
309
|
number_of_calls: 10
|
@@ -427,6 +468,26 @@ steps:
|
|
427
468
|
end
|
428
469
|
end
|
429
470
|
|
471
|
+
describe '#wait' do
|
472
|
+
before { subject.sipp_pid = pid }
|
473
|
+
it "waits for the SIPp process" do
|
474
|
+
Process.should_receive(:wait2).with pid.to_i
|
475
|
+
subject.should_receive(:process_exit_status)
|
476
|
+
subject.should_receive(:cleanup_input_files)
|
477
|
+
subject.wait
|
478
|
+
end
|
479
|
+
|
480
|
+
context "async" do
|
481
|
+
subject { SippyCup::Runner.new scenario, logger: logger, async: true }
|
482
|
+
it "waits for the SIPp process and cleans up input files" do
|
483
|
+
Process.should_receive(:wait2).with pid.to_i
|
484
|
+
subject.should_receive(:process_exit_status)
|
485
|
+
subject.should_receive(:cleanup_input_files)
|
486
|
+
subject.wait
|
487
|
+
end
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
430
491
|
describe '#stop' do
|
431
492
|
before { subject.sipp_pid = pid }
|
432
493
|
|
@@ -233,6 +233,26 @@ describe SippyCup::Scenario do
|
|
233
233
|
end
|
234
234
|
end
|
235
235
|
|
236
|
+
describe '#receive_200' do
|
237
|
+
it "expects a 200" do
|
238
|
+
subject.receive_200
|
239
|
+
|
240
|
+
scenario.to_xml.should match(%q{<recv response="200"/>})
|
241
|
+
end
|
242
|
+
|
243
|
+
it "allows passing options to the recv expectation" do
|
244
|
+
subject.receive_200 foo: 'bar'
|
245
|
+
|
246
|
+
scenario.to_xml.should match(%q{<recv response="200" foo="bar"/>})
|
247
|
+
end
|
248
|
+
|
249
|
+
it "allows overriding options" do
|
250
|
+
subject.receive_200 response: 999 # Silly but still...
|
251
|
+
|
252
|
+
scenario.to_xml.should match(%q{<recv response="999"/>})
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
236
256
|
describe '#ack_answer' do
|
237
257
|
it "sends an ACK message" do
|
238
258
|
subject.ack_answer
|
@@ -246,10 +266,20 @@ describe SippyCup::Scenario do
|
|
246
266
|
subject.to_xml.should match(%r{<send foo="bar".*>})
|
247
267
|
end
|
248
268
|
|
249
|
-
|
250
|
-
subject.
|
269
|
+
context "when media is present" do
|
270
|
+
before { subject.sleep 1 }
|
271
|
+
|
272
|
+
it "starts the PCAP media" do
|
273
|
+
subject.ack_answer
|
274
|
+
subject.to_xml(:pcap_path => "/dev/null").should match(%r{<nop>\n.*<action>\n.*<exec play_pcap_audio="/dev/null"/>\n.*</action>\n.*</nop>})
|
275
|
+
end
|
276
|
+
end
|
251
277
|
|
252
|
-
|
278
|
+
context "when media is not present" do
|
279
|
+
it "does not start the PCAP media" do
|
280
|
+
subject.ack_answer
|
281
|
+
subject.to_xml(:pcap_path => "/dev/null").should_not match(%r{<nop>\n.*<action>\n.*<exec play_pcap_audio="/dev/null"/>\n.*</action>\n.*</nop>})
|
282
|
+
end
|
253
283
|
end
|
254
284
|
|
255
285
|
context "when a from user is specified" do
|
@@ -276,11 +306,11 @@ describe SippyCup::Scenario do
|
|
276
306
|
scenario.wait_for_answer
|
277
307
|
|
278
308
|
xml = scenario.to_xml
|
279
|
-
xml.should =~ /recv
|
280
|
-
xml.should =~ /recv
|
281
|
-
xml.should =~ /recv
|
309
|
+
xml.should =~ /recv response="100".*optional="true"/
|
310
|
+
xml.should =~ /recv response="180".*optional="true"/
|
311
|
+
xml.should =~ /recv response="183".*optional="true"/
|
282
312
|
xml.should =~ /recv response="200"/
|
283
|
-
xml.should_not =~ /recv
|
313
|
+
xml.should_not =~ /recv response="200".*optional="true"/
|
284
314
|
end
|
285
315
|
|
286
316
|
it "passes through additional options" do
|
@@ -294,6 +324,30 @@ describe SippyCup::Scenario do
|
|
294
324
|
end
|
295
325
|
end
|
296
326
|
|
327
|
+
describe '#receive_message' do
|
328
|
+
it "expects a MESSAGE and acks it" do
|
329
|
+
subject.receive_message
|
330
|
+
subject.to_xml.should match(%r{<recv request="MESSAGE"/>.*SIP/2\.0 200 OK}m)
|
331
|
+
end
|
332
|
+
|
333
|
+
it "allows a string to be given as a regexp for matching" do
|
334
|
+
subject.receive_message "Hello World!"
|
335
|
+
subject.to_xml.should match(%r{<action>\s*<ereg regexp="Hello World!" search_in="body" check_it="true" assign_to="[^"]+"/>\s*</action>}m)
|
336
|
+
end
|
337
|
+
|
338
|
+
it "increments the variable name used for regexp matching because SIPp requires it to be unique" do
|
339
|
+
subject.receive_message "Hello World!"
|
340
|
+
subject.receive_message "Hello Again World!"
|
341
|
+
subject.receive_message "Goodbye World!"
|
342
|
+
subject.to_xml.should match(%r{<ereg [^>]* assign_to="([^"]+)_1"/>.*<ereg [^>]* assign_to="\1_2"/>.*<ereg [^>]* assign_to="\1_3"/>}m)
|
343
|
+
end
|
344
|
+
|
345
|
+
it "declares the variable used for regexp matching so that SIPp doesn't complain that it's unused" do
|
346
|
+
subject.receive_message "Hello World!"
|
347
|
+
subject.to_xml.should match(%r{<ereg [^>]* assign_to="([^"]+)"/>.*<Reference variables="\1"/>}m)
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
297
351
|
describe '#send_bye' do
|
298
352
|
it "sends a BYE message" do
|
299
353
|
subject.send_bye
|
@@ -340,16 +394,16 @@ describe SippyCup::Scenario do
|
|
340
394
|
end
|
341
395
|
end
|
342
396
|
|
343
|
-
describe '#
|
397
|
+
describe '#okay' do
|
344
398
|
it "sends a 200 OK" do
|
345
|
-
subject.
|
399
|
+
subject.okay
|
346
400
|
|
347
401
|
subject.to_xml.should match(%r{<send>})
|
348
402
|
subject.to_xml.should match(%r{SIP/2.0 200 OK})
|
349
403
|
end
|
350
404
|
|
351
405
|
it "allows setting options on the send instruction" do
|
352
|
-
subject.
|
406
|
+
subject.okay foo: 'bar'
|
353
407
|
subject.to_xml.should match(%r{<send foo="bar".*>})
|
354
408
|
end
|
355
409
|
|
@@ -357,14 +411,14 @@ describe SippyCup::Scenario do
|
|
357
411
|
let(:args) { {from_user: 'frank'} }
|
358
412
|
|
359
413
|
it "includes the specified user in the Contact header" do
|
360
|
-
subject.
|
414
|
+
subject.okay
|
361
415
|
subject.to_xml.should match(%r{Contact: <sip:frank@})
|
362
416
|
end
|
363
417
|
end
|
364
418
|
|
365
419
|
context "when no from user is specified" do
|
366
420
|
it "uses a default of 'sipp' in the Contact header" do
|
367
|
-
subject.
|
421
|
+
subject.okay
|
368
422
|
subject.to_xml.should match(%r{Contact: <sip:sipp@})
|
369
423
|
end
|
370
424
|
end
|
@@ -379,15 +433,6 @@ describe SippyCup::Scenario do
|
|
379
433
|
end
|
380
434
|
end
|
381
435
|
|
382
|
-
describe '#ack_bye' do
|
383
|
-
it "sends a 200 OK" do
|
384
|
-
subject.ack_bye
|
385
|
-
|
386
|
-
subject.to_xml.should match(%r{<send>})
|
387
|
-
subject.to_xml.should match(%r{SIP/2.0 200 OK})
|
388
|
-
end
|
389
|
-
end
|
390
|
-
|
391
436
|
describe 'media-dependent operations' do
|
392
437
|
let(:media) { double :media }
|
393
438
|
before do
|
@@ -437,6 +482,28 @@ describe SippyCup::Scenario do
|
|
437
482
|
end
|
438
483
|
end
|
439
484
|
|
485
|
+
describe "#send_digits with a SIP INFO DTMF mode" do
|
486
|
+
let(:args) { {dtmf_mode: 'info'} }
|
487
|
+
|
488
|
+
it "creates the requested DTMF string as SIP INFO messages" do
|
489
|
+
scenario.send_digits '136'
|
490
|
+
|
491
|
+
xml = scenario.to_xml
|
492
|
+
scenario.to_xml.should match(%r{(<send>.*INFO \[next_url\] SIP/2\.0.*</send>.*){3}}m)
|
493
|
+
scenario.to_xml.should match(%r{Signal=1(\nDuration=250\n).*Signal=3\1.*Signal=6\1}m)
|
494
|
+
end
|
495
|
+
|
496
|
+
it "expects a response for each digit sent" do
|
497
|
+
scenario.send_digits '123'
|
498
|
+
scenario.to_xml.should match(%r{(<send>.*INFO.*</send>.*<recv response="200"/>.*){3}}m)
|
499
|
+
end
|
500
|
+
|
501
|
+
it "inserts 250ms pauses between each digit" do
|
502
|
+
scenario.send_digits '321'
|
503
|
+
scenario.to_xml.should match(%r{(<send>.*INFO.*</send>.*<pause milliseconds="250"/>.*){3}}m)
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
440
507
|
describe "#compile!" do
|
441
508
|
context "when a filename is not provided" do
|
442
509
|
it "writes the scenario XML to disk at name.xml" do
|
@@ -499,15 +566,32 @@ describe SippyCup::Scenario do
|
|
499
566
|
File.read(files[:scenario].path).should eql(scenario.to_xml)
|
500
567
|
end
|
501
568
|
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
569
|
+
context "without media" do
|
570
|
+
it "does not write a PCAP media file" do
|
571
|
+
files = scenario.to_tmpfiles
|
572
|
+
files[:media].should be_nil
|
573
|
+
end
|
506
574
|
end
|
507
575
|
|
508
|
-
|
509
|
-
|
510
|
-
|
576
|
+
context "with media" do
|
577
|
+
before { scenario.sleep 1 }
|
578
|
+
|
579
|
+
it "writes the PCAP media to a Tempfile and returns it" do
|
580
|
+
files = scenario.to_tmpfiles
|
581
|
+
files[:media].should be_a(Tempfile)
|
582
|
+
files[:media].read.should_not be_empty
|
583
|
+
end
|
584
|
+
|
585
|
+
it "allows the PCAP media to be read from disk independently" do
|
586
|
+
files = scenario.to_tmpfiles
|
587
|
+
File.read(files[:media].path).should_not be_empty
|
588
|
+
end
|
589
|
+
|
590
|
+
it "puts the PCAP file path into the scenario XML" do
|
591
|
+
scenario.ack_answer
|
592
|
+
files = scenario.to_tmpfiles
|
593
|
+
files[:scenario].read.should match(%r{play_pcap_audio="#{files[:media].path}"})
|
594
|
+
end
|
511
595
|
end
|
512
596
|
end
|
513
597
|
|
@@ -540,16 +624,16 @@ a=rtpmap:101 telephone-event/8000
|
|
540
624
|
a=fmtp:101 0-15
|
541
625
|
]]>
|
542
626
|
</send>
|
543
|
-
<recv
|
544
|
-
<recv
|
545
|
-
<recv
|
627
|
+
<recv response="100" optional="true"/>
|
628
|
+
<recv response="180" optional="true"/>
|
629
|
+
<recv response="183" optional="true"/>
|
546
630
|
<recv response="200" rrs="true" rtd="true"/>
|
547
631
|
<send>
|
548
632
|
<![CDATA[
|
549
633
|
ACK [next_url] SIP/2.0
|
550
634
|
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
|
551
635
|
From: "sipp" <sip:sipp@[local_ip]>;tag=[call_number]
|
552
|
-
[
|
636
|
+
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
|
553
637
|
Call-ID: [call_id]
|
554
638
|
CSeq: [cseq] ACK
|
555
639
|
Contact: <sip:sipp@[local_ip]:[local_port];transport=[transport]>
|
@@ -559,11 +643,6 @@ Content-Length: 0
|
|
559
643
|
[routes]
|
560
644
|
]]>
|
561
645
|
</send>
|
562
|
-
<nop>
|
563
|
-
<action>
|
564
|
-
<exec play_pcap_audio="/tmp/test.pcap"/>
|
565
|
-
</action>
|
566
|
-
</nop>
|
567
646
|
<recv request="BYE"/>
|
568
647
|
<send>
|
569
648
|
<![CDATA[
|
@@ -589,7 +668,7 @@ Content-Length: 0
|
|
589
668
|
|
590
669
|
it "runs each step" do
|
591
670
|
subject.build(steps)
|
592
|
-
subject.to_xml.should == scenario_xml
|
671
|
+
subject.to_xml(:pcap_path => "/dev/null").should == scenario_xml
|
593
672
|
end
|
594
673
|
end
|
595
674
|
|
@@ -653,16 +732,16 @@ a=rtpmap:101 telephone-event/8000
|
|
653
732
|
a=fmtp:101 0-15
|
654
733
|
]]>
|
655
734
|
</send>
|
656
|
-
<recv
|
657
|
-
<recv
|
658
|
-
<recv
|
735
|
+
<recv response="100" optional="true"/>
|
736
|
+
<recv response="180" optional="true"/>
|
737
|
+
<recv response="183" optional="true"/>
|
659
738
|
<recv response="200" rrs="true" rtd="true"/>
|
660
739
|
<send>
|
661
740
|
<![CDATA[
|
662
741
|
ACK [next_url] SIP/2.0
|
663
742
|
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
|
664
743
|
From: "#{specs_from}" <sip:#{specs_from}@[local_ip]>;tag=[call_number]
|
665
|
-
[
|
744
|
+
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
|
666
745
|
Call-ID: [call_id]
|
667
746
|
CSeq: [cseq] ACK
|
668
747
|
Contact: <sip:#{specs_from}@[local_ip]:[local_port];transport=[transport]>
|
@@ -674,7 +753,7 @@ Content-Length: 0
|
|
674
753
|
</send>
|
675
754
|
<nop>
|
676
755
|
<action>
|
677
|
-
<exec play_pcap_audio="/
|
756
|
+
<exec play_pcap_audio="/dev/null"/>
|
678
757
|
</action>
|
679
758
|
</nop>
|
680
759
|
<pause milliseconds="3000"/>
|
@@ -705,7 +784,7 @@ Content-Length: 0
|
|
705
784
|
|
706
785
|
it "generates the correct XML" do
|
707
786
|
scenario = described_class.from_manifest(scenario_yaml)
|
708
|
-
scenario.to_xml.should == scenario_xml
|
787
|
+
scenario.to_xml(:pcap_path => "/dev/null").should == scenario_xml
|
709
788
|
end
|
710
789
|
|
711
790
|
it "sets the proper options" do
|
@@ -835,7 +914,7 @@ steps:
|
|
835
914
|
|
836
915
|
it "overrides keys with values from the options hash" do
|
837
916
|
scenario = described_class.from_manifest(scenario_yaml, override_options)
|
838
|
-
scenario.to_xml.should == scenario_xml
|
917
|
+
scenario.to_xml(:pcap_path => "/dev/null").should == scenario_xml
|
839
918
|
end
|
840
919
|
|
841
920
|
it "sets the proper options" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sippy_cup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Klang
|
@@ -9,132 +9,132 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-08-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: packetfu
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: nokogiri
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - ~>
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 1.6.0
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - ~>
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: 1.6.0
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: activesupport
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ">"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '3.0'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">"
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '3.0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: psych
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - ~>
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 2.0.
|
62
|
+
version: 2.0.1
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - ~>
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 2.0.
|
69
|
+
version: 2.0.1
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: guard-rspec
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- -
|
81
|
+
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: rspec
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- - ~>
|
88
|
+
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: '2.11'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - ~>
|
95
|
+
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '2.11'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: simplecov
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - ">="
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- -
|
109
|
+
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: simplecov-rcov
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
|
-
- -
|
116
|
+
- - ">="
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: '0'
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
|
-
- -
|
123
|
+
- - ">="
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: fakefs
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
|
-
- -
|
130
|
+
- - ">="
|
131
131
|
- !ruby/object:Gem::Version
|
132
132
|
version: '0'
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
|
-
- -
|
137
|
+
- - ">="
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
140
|
description: This tool makes it easier to generate SIPp load tests with DTMF interactions.
|
@@ -146,10 +146,10 @@ executables:
|
|
146
146
|
extensions: []
|
147
147
|
extra_rdoc_files: []
|
148
148
|
files:
|
149
|
-
- .gitignore
|
150
|
-
- .rspec
|
151
|
-
- .ruby-version
|
152
|
-
- .travis.yml
|
149
|
+
- ".gitignore"
|
150
|
+
- ".rspec"
|
151
|
+
- ".ruby-version"
|
152
|
+
- ".travis.yml"
|
153
153
|
- CHANGELOG.md
|
154
154
|
- Gemfile
|
155
155
|
- Guardfile
|
@@ -163,7 +163,6 @@ files:
|
|
163
163
|
- lib/sippy_cup/media/pcmu_payload.rb
|
164
164
|
- lib/sippy_cup/media/rtp_header.rb
|
165
165
|
- lib/sippy_cup/media/rtp_payload.rb
|
166
|
-
- lib/sippy_cup/rtp_generator.rb
|
167
166
|
- lib/sippy_cup/runner.rb
|
168
167
|
- lib/sippy_cup/scenario.rb
|
169
168
|
- lib/sippy_cup/tasks.rb
|
@@ -188,17 +187,17 @@ require_paths:
|
|
188
187
|
- lib
|
189
188
|
required_ruby_version: !ruby/object:Gem::Requirement
|
190
189
|
requirements:
|
191
|
-
- -
|
190
|
+
- - ">="
|
192
191
|
- !ruby/object:Gem::Version
|
193
192
|
version: '0'
|
194
193
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
195
194
|
requirements:
|
196
|
-
- -
|
195
|
+
- - ">="
|
197
196
|
- !ruby/object:Gem::Version
|
198
197
|
version: '0'
|
199
198
|
requirements: []
|
200
199
|
rubyforge_project:
|
201
|
-
rubygems_version: 2.
|
200
|
+
rubygems_version: 2.2.2
|
202
201
|
signing_key:
|
203
202
|
specification_version: 4
|
204
203
|
summary: SIPp profile and RTP stream generator
|