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.
@@ -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