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