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.
@@ -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: 'doo@dah.com'
21
- destination: 'foo@bar.com'
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 doo@dah.com -p 8836 -sf #{full_scenario_path} -l 5 -m 10 -r 2 -s 1 foo@bar.com}
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: 'doo@dah.com'
80
- destination: 'foo@bar.com'
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 from_user in the Scenario" do
143
+ context "specifying a to_user in the Scenario" do
104
144
  let(:manifest) do
105
145
  <<-MANIFEST
106
146
  name: foobar
107
- source: 'doo@dah.com'
108
- destination: 'foo@bar.com'
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: frank
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: 'doo@dah.com'
136
- destination: 'foo@bar.com'
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: 'doo@dah.com'
164
- destination: 'foo@bar.com'
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: 'doo@dah.com'
191
- destination: 'foo@bar.com'
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: 'doo@dah.com'
235
- destination: 'foo@bar.com'
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: 'doo@dah.com'
265
- destination: 'foo@bar.com'
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
- it "starts the PCAP media" do
250
- subject.ack_answer
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
- subject.to_xml.should match(%r{<nop>\n.*<action>\n.*<exec play_pcap_audio="/tmp/test.pcap"/>\n.*</action>\n.*</nop>})
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 optional="true".*response="100"/
280
- xml.should =~ /recv optional="true".*response="180"/
281
- xml.should =~ /recv optional="true".*response="183"/
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 optional="true".*response="200"/
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 '#ack_bye' do
397
+ describe '#okay' do
344
398
  it "sends a 200 OK" do
345
- subject.ack_bye
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.ack_bye foo: 'bar'
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.ack_bye
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.ack_bye
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
- it "writes the PCAP media to a Tempfile and returns it" do
503
- files = scenario.to_tmpfiles
504
- files[:media].should be_a(Tempfile)
505
- files[:media].read.should_not be_empty
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
- it "allows the PCAP media to be read from disk independently" do
509
- files = scenario.to_tmpfiles
510
- File.read(files[:media].path).should_not be_empty
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 optional="true" response="100"/>
544
- <recv optional="true" response="180"/>
545
- <recv optional="true" response="183"/>
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
- [last_To:]
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 optional="true" response="100"/>
657
- <recv optional="true" response="180"/>
658
- <recv optional="true" response="183"/>
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
- [last_To:]
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="/tmp/spec_scenario.pcap"/>
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.3.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: 2013-11-20 00:00:00.000000000 Z
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.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.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.1.10
200
+ rubygems_version: 2.2.2
202
201
  signing_key:
203
202
  specification_version: 4
204
203
  summary: SIPp profile and RTP stream generator