sippy_cup 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,9 +7,9 @@ namespace :sippy_cup do
7
7
  require File.expand_path(args[:scenario])
8
8
  end
9
9
 
10
- desc "Run the scenario described by the given YAML file"
10
+ desc "Run the scenario described by the given manifest file"
11
11
  task :run, :options_file do |t, args|
12
- options = YAML.load_file args[:options_file]
13
- SippyCup::Runner.new(options).run
12
+ scenario = SippyCup::Scenario.from_manifest File.read(args[:options_file])
13
+ SippyCup::Runner.new(scenario).run
14
14
  end
15
15
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module SippyCup
4
- VERSION = '0.2.3'
4
+ VERSION = '0.3.0'
5
5
  end
@@ -0,0 +1,57 @@
1
+ require 'tempfile'
2
+
3
+ module SippyCup
4
+ #
5
+ # A representation of a SIPp XML scenario
6
+ #
7
+ class XMLScenario
8
+ # @return [Hash] The options the scenario was created with, either from a manifest or passed as overrides
9
+ attr_reader :scenario_options
10
+
11
+ #
12
+ # Create a scenario instance
13
+ #
14
+ # @param [String] name The scenario's name
15
+ # @param [String] xml The XML document representing the scenario
16
+ # @param [String] media The media to be invoked by the scenario in PCAP format
17
+ # @param [Hash] args options to customise the scenario. @see Scenario#initialize.
18
+ #
19
+ def initialize(name, xml, media, args = {})
20
+ @xml, @media = xml, media
21
+ @scenario_options = args.merge name: name
22
+ end
23
+
24
+ #
25
+ # Write compiled Scenario XML and PCAP media to tempfiles.
26
+ #
27
+ # These will automatically be closed and deleted once they have gone out of scope, and can be used to execute the scenario without leaving stuff behind.
28
+ #
29
+ # @return [Hash<Symbol => Tempfile>] handles to created Tempfiles at :scenario and :media
30
+ #
31
+ # @see http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html
32
+ #
33
+ def to_tmpfiles
34
+ scenario_file = Tempfile.new 'scenario'
35
+ scenario_file.write @xml
36
+ scenario_file.rewind
37
+
38
+ if @media
39
+ media_file = Tempfile.new 'media'
40
+ media_file.write @media
41
+ media_file.rewind
42
+ else
43
+ media_file = nil
44
+ end
45
+
46
+ {scenario: scenario_file, media: media_file}
47
+ end
48
+
49
+ #
50
+ # Dump the scenario to a SIPp XML string
51
+ #
52
+ # @return [String] the SIPp XML scenario
53
+ def to_xml
54
+ @xml
55
+ end
56
+ end
57
+ end
data/lib/sippy_cup.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  %w{
2
2
  scenario
3
+ xml_scenario
3
4
  media
4
5
  runner
5
6
  }.each {|r| require "sippy_cup/#{r}"}
data/sippy_cup.gemspec CHANGED
@@ -21,10 +21,11 @@ Gem::Specification.new do |s|
21
21
  s.add_runtime_dependency 'packetfu'
22
22
  s.add_runtime_dependency 'nokogiri', ["~> 1.6.0"]
23
23
  s.add_runtime_dependency 'activesupport', ["> 3.0"]
24
+ s.add_runtime_dependency 'psych', ["~> 2.0.0"] unless RUBY_PLATFORM == 'java'
24
25
 
25
26
  s.add_development_dependency 'guard-rspec'
26
27
  s.add_development_dependency 'rspec', ["~> 2.11"]
27
28
  s.add_development_dependency 'simplecov'
28
29
  s.add_development_dependency 'simplecov-rcov'
29
- s.add_development_dependency 'ci_reporter'
30
+ s.add_development_dependency 'fakefs'
30
31
  end
File without changes
@@ -0,0 +1,73 @@
1
+ <?xml version="1.0"?>
2
+ <scenario name="spec scenario">
3
+ <send retrans="500">
4
+ <![CDATA[
5
+ INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
6
+ Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
7
+ From: "#{specs_from}" <sip:#{specs_from}@[local_ip]>;tag=[call_number]
8
+ To: <sip:[service]@[remote_ip]:[remote_port]>
9
+ Call-ID: [call_id]
10
+ CSeq: [cseq] INVITE
11
+ Contact: <sip:#{specs_from}@[local_ip]:[local_port];transport=[transport]>
12
+ Max-Forwards: 100
13
+ User-Agent: SIPp/sippy_cup
14
+ Content-Type: application/sdp
15
+ Content-Length: [len]
16
+
17
+ v=0
18
+ o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
19
+ s=-
20
+ c=IN IP[media_ip_type] [media_ip]
21
+ t=0 0
22
+ m=audio [media_port] RTP/AVPF 0 101
23
+ a=rtcp:[media_port+1]
24
+ a=rtpmap:0 PCMU/8000
25
+ a=rtpmap:101 telephone-event/8000
26
+ a=fmtp:101 0-15
27
+ ]]>
28
+ </send>
29
+ <recv optional="true" response="100"/>
30
+ <recv optional="true" response="180"/>
31
+ <recv optional="true" response="183"/>
32
+ <recv response="200" rrs="true" rtd="true"/>
33
+ <send>
34
+ <![CDATA[
35
+ ACK [next_url] SIP/2.0
36
+ Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
37
+ From: "#{specs_from}" <sip:#{specs_from}@[local_ip]>;tag=[call_number]
38
+ [last_To:]
39
+ Call-ID: [call_id]
40
+ CSeq: [cseq] ACK
41
+ Contact: <sip:#{specs_from}@[local_ip]:[local_port];transport=[transport]>
42
+ Max-Forwards: 100
43
+ User-Agent: SIPp/sippy_cup
44
+ Content-Length: 0
45
+ [routes]
46
+ ]]>
47
+ </send>
48
+ <nop>
49
+ <action>
50
+ <exec play_pcap_audio="/tmp/spec_scenario.pcap"/>
51
+ </action>
52
+ </nop>
53
+ <pause milliseconds="3000"/>
54
+ <pause milliseconds="5000"/>
55
+ <pause milliseconds="5000"/>
56
+ <pause milliseconds="500"/>
57
+ <recv request="BYE"/>
58
+ <send>
59
+ <![CDATA[
60
+ SIP/2.0 200 OK
61
+ [last_Via:]
62
+ [last_From:]
63
+ [last_To:]
64
+ [last_Call-ID:]
65
+ [last_CSeq:]
66
+ Contact: <sip:#{specs_from}@[local_ip]:[local_port];transport=[transport]>
67
+ Max-Forwards: 100
68
+ User-Agent: SIPp/sippy_cup
69
+ Content-Length: 0
70
+ [routes]
71
+ ]]>
72
+ </send>
73
+ </scenario>
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: My test scenario
3
+ source: 192.0.2.15
4
+ destination: 192.0.2.200
5
+ max_concurrent: 10
6
+ calls_per_second: 5
7
+ number_of_calls: 20
8
+ steps:
9
+ - invite
10
+ - wait_for_answer
11
+ - ack_answer
12
+ - sleep 3
13
+ - send_digits '3125551234'
14
+ - sleep 5
15
+ - send_digits '#'
16
+ - wait_for_hangup