sdp 0.2.8 → 0.2.9
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.
- data/ChangeLog.rdoc +13 -0
- data/LICENSE.rdoc +1 -1
- data/README.rdoc +31 -11
- data/Rakefile +3 -10
- data/lib/sdp/description.rb +132 -16
- data/lib/sdp/parser.rb +4 -4
- data/lib/sdp/version.rb +1 -1
- data/sdp.gemspec +15 -15
- data/spec/integration/builds_descriptions_spec.rb +39 -0
- data/spec/integration/coverage/assets/0.7.1/application.css +1110 -0
- data/spec/integration/coverage/assets/0.7.1/application.js +626 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/favicon_green.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/favicon_red.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/favicon_yellow.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/loading.gif +0 -0
- data/spec/integration/coverage/assets/0.7.1/magnify.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/spec/integration/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/spec/integration/coverage/index.html +72 -0
- data/spec/integration/parses_descriptions_spec.rb +129 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/parser_matcher.rb +33 -0
- data/{features → spec}/support/sdp_file.txt +0 -0
- data/spec/support/test_descriptions.rb +137 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/application.css +1110 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/application.js +626 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/favicon_green.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/favicon_red.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/favicon_yellow.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/loading.gif +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/magnify.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/spec/unit/sdp/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/spec/unit/sdp/coverage/index.html +72 -0
- data/spec/unit/sdp/description_spec.rb +321 -0
- data/spec/unit/sdp/parser_spec.rb +154 -0
- data/spec/{sdp_spec.rb → unit/sdp_spec.rb} +2 -2
- metadata +189 -43
- data/features/accepts_description_text.feature +0 -12
- data/features/sdp_create.feature +0 -15
- data/features/sdp_get.feature +0 -37
- data/features/step_definitions/accepts_description_text_steps.rb +0 -15
- data/features/step_definitions/sdp_create_steps.rb +0 -48
- data/features/step_definitions/sdp_get_steps.rb +0 -23
- data/features/support/env.rb +0 -3
- data/lib/sdp/session_template.erb +0 -46
- data/spec/sdp/description_spec.rb +0 -392
- data/spec/sdp/parser_spec.rb +0 -207
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
Feature: Accept description as a String
|
|
2
|
-
As an SDP user
|
|
3
|
-
I want to be able to parse a String of an SDP description
|
|
4
|
-
(that I received from a server, perhaps) and turn it into Ruby
|
|
5
|
-
objects
|
|
6
|
-
So that I can more easily work with each piece of the description
|
|
7
|
-
|
|
8
|
-
Scenario: Description without time zone fields
|
|
9
|
-
Given a description with no time zone fields
|
|
10
|
-
When I parse the description
|
|
11
|
-
Then I can access the protocol_version field value
|
|
12
|
-
And put the description back to a String
|
data/features/sdp_create.feature
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
Feature: Programmatically create an SDP file
|
|
2
|
-
As a utility using SDP to describe a multimedia session
|
|
3
|
-
I want to be able to turn Ruby code in to an SDP description,
|
|
4
|
-
as specified in RFC 4566
|
|
5
|
-
So that I can use Ruby to describe the multimedia session
|
|
6
|
-
|
|
7
|
-
Scenario: Create an SDP file from a Ruby object
|
|
8
|
-
Given I know what the SDP file should look like
|
|
9
|
-
When I build the Ruby object with the appropriate fields
|
|
10
|
-
Then the resulting file should look like the intended description
|
|
11
|
-
|
|
12
|
-
Scenario: Create a basic SDP object
|
|
13
|
-
Given I create an SDP object with no parameters
|
|
14
|
-
When I convert it to a String
|
|
15
|
-
Then it should have :version set to 0
|
data/features/sdp_get.feature
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
Feature: Get SDP file fields and marshall into Ruby data types
|
|
2
|
-
As an RTSP consumer
|
|
3
|
-
I want to be able to be able to read SDP files into Ruby data types
|
|
4
|
-
So that it's easy to determine how to work with the RTSP stream
|
|
5
|
-
|
|
6
|
-
Scenario: Parse the RFC 4566 example
|
|
7
|
-
Given the RFC 4566 SDP example in a file
|
|
8
|
-
When I parse the file
|
|
9
|
-
Then the <value> for <field> is accessible via the SDP object
|
|
10
|
-
| field | value |
|
|
11
|
-
| protocol_version | 0 |
|
|
12
|
-
| username | jdoe |
|
|
13
|
-
| id | 2890844526 |
|
|
14
|
-
| version | 2890842807 |
|
|
15
|
-
| network_type | IN |
|
|
16
|
-
| address_type | IP4 |
|
|
17
|
-
| unicast_address | 10.47.16.5 |
|
|
18
|
-
| name | SDP Seminar |
|
|
19
|
-
| information | A Seminar on the session description protocol |
|
|
20
|
-
| uri | http://www.example.com/seminars/sdp.pdf |
|
|
21
|
-
| email_address | j.doe@example.com (Jane Doe) |
|
|
22
|
-
| connection_network_type | IN |
|
|
23
|
-
| connection_address_type | IP4 |
|
|
24
|
-
| connection_address | 224.2.17.12/127 |
|
|
25
|
-
| start_time | 2873397496 |
|
|
26
|
-
| stop_time | 2873404696 |
|
|
27
|
-
| attributes | recvonly |
|
|
28
|
-
# | m[0][1] | 49170 |
|
|
29
|
-
# | m[0][2] | "RTP/AVP" |
|
|
30
|
-
# | m[0][3] | 0 |
|
|
31
|
-
# | m[1][1] | 51372 |
|
|
32
|
-
# | m[1][2] | "RTP/AVP" |
|
|
33
|
-
# | m[1][3] | 99 |
|
|
34
|
-
# | a[1][1] | 99 |
|
|
35
|
-
# | a[1][2] | "h263-1998" |
|
|
36
|
-
# | a[1][3] | 90000 |
|
|
37
|
-
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
Given /^a description with no time zone fields$/ do
|
|
2
|
-
@sdp_missing_time = "v=0\r\no=- 1809368942 3379601213 IN IP4 127.0.0.1\r\ns=Secret Agent from SomaFM\r\ni=Downtempo Spy Lounge\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=x-qt-text-cmt:Orban Opticodec-PCx-qt-text-nam:Secret Agent from SomaFMx-qt-text-inf:Downtempo Spy Loungecontrol:*\r\nm=audio 0 RTP/AVP 96\r\na=rtpmap:96 MP4A-LATM/44100/2a=fmtp:96 cpresent=0;config=400027200000a=control:trackID=1\r\n"
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
When /^I parse the description$/ do
|
|
6
|
-
@sdp = SDP.parse @sdp_missing_time
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
Then /^I can access the protocol_version field value$/ do
|
|
10
|
-
@sdp.protocol_version.should == "0"
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
Then /^put the description back to a String$/ do
|
|
14
|
-
@sdp.to_s.should == @sdp_missing_time
|
|
15
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
require 'sdp/description'
|
|
2
|
-
|
|
3
|
-
Given /^I know what the SDP file should look like$/ do
|
|
4
|
-
@example_sdp_file = File.read(File.dirname(__FILE__) + "/../support/sdp_file.txt")
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
When /^I build the Ruby object with the appropriate fields$/ do
|
|
8
|
-
@session = SDP::Description.new
|
|
9
|
-
@session.protocol_version = 0
|
|
10
|
-
@session.username = "jdoe"
|
|
11
|
-
@session.id = 2890844526
|
|
12
|
-
@session.version = 2890842807
|
|
13
|
-
@session.network_type = :IN
|
|
14
|
-
@session.address_type = :IP4
|
|
15
|
-
@session.unicast_address = "10.47.16.5"
|
|
16
|
-
@session.name = "SDP Seminar"
|
|
17
|
-
@session.information = "A Seminar on the session description protocol"
|
|
18
|
-
@session.uri = "http://www.example.com/seminars/sdp.pdf"
|
|
19
|
-
@session.email_address = "j.doe@example.com (Jane Doe)"
|
|
20
|
-
@session.connection_network_type = "IN"
|
|
21
|
-
@session.connection_address_type = "IP4"
|
|
22
|
-
@session.connection_address = "224.2.17.12/127"
|
|
23
|
-
@session.start_time = 2873397496
|
|
24
|
-
@session.stop_time = 2873404696
|
|
25
|
-
@session.attributes << { :attribute => "recvonly" }
|
|
26
|
-
@session.media_sections <<
|
|
27
|
-
{ :media => "audio", :port => 49170, :protocol => "RTP/AVP", :format => 0 }
|
|
28
|
-
@session.media_sections <<
|
|
29
|
-
{ :media => "video", :port => 51372, :protocol => "RTP/AVP", :format => 99,
|
|
30
|
-
:attributes => [{ :attribute => "rtpmap", :value => "99 h263-1998/90000" }]
|
|
31
|
-
}
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
Then /^the resulting file should look like the intended description$/ do
|
|
35
|
-
@session.to_s.should == @example_sdp_file
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
Given /^I create an SDP object with no parameters$/ do
|
|
39
|
-
@session = SDP::Description.new
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
When /^I convert it to a String$/ do
|
|
43
|
-
@sdp_string = @session.to_s
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
Then /^it should have :version set to (\d+)$/ do |value|
|
|
47
|
-
@sdp_string.should match /v=#{value}/
|
|
48
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
Given /^the RFC 4566 SDP example in a file$/ do
|
|
2
|
-
@sdp_file = File.open(File.dirname(__FILE__) + '/../support/sdp_file.txt', 'r').read
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
When /^I parse the file$/ do
|
|
6
|
-
@sdp = SDP.parse @sdp_file
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
Then /^the <value> for <field> is accessible via the SDP object$/ do |table|
|
|
10
|
-
# table is a Cucumber::Ast::Table
|
|
11
|
-
table.hashes.each do |sdp_field|
|
|
12
|
-
field_type = sdp_field["field"].to_sym
|
|
13
|
-
value = sdp_field["value"]
|
|
14
|
-
|
|
15
|
-
actual_value = @sdp.send(field_type)
|
|
16
|
-
|
|
17
|
-
if field_type == :attributes
|
|
18
|
-
actual_value.first[:attribute].should == value
|
|
19
|
-
else
|
|
20
|
-
actual_value.to_s.should == value
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
data/features/support/env.rb
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
<%# -*- coding: UTF-8 -*- %>
|
|
2
|
-
v=<%= protocol_version %>
|
|
3
|
-
o=<%= username %> <%= id %> <%= version %> <%= network_type %> <%= address_type %> <%= unicast_address %>
|
|
4
|
-
s=<%= name %>
|
|
5
|
-
<% if information %>
|
|
6
|
-
i=<%= information %>
|
|
7
|
-
<% end %>
|
|
8
|
-
<% if uri %>
|
|
9
|
-
u=<%= uri %>
|
|
10
|
-
<% end %>
|
|
11
|
-
<% if email_address %>
|
|
12
|
-
e=<%= email_address %>
|
|
13
|
-
<% end %>
|
|
14
|
-
<% if phone_number %>
|
|
15
|
-
p=<%= phone_number %>
|
|
16
|
-
<% end %>
|
|
17
|
-
<% if connection_network_type %>
|
|
18
|
-
c=<%= connection_network_type %> <%= connection_address_type %> <%= connection_address %>
|
|
19
|
-
<% end %>
|
|
20
|
-
<% if bandwidth %>
|
|
21
|
-
b=<%= bandwidth_type %>:<%= bandwidth %>
|
|
22
|
-
<% end %>
|
|
23
|
-
t=<%= start_time %> <%= stop_time %>
|
|
24
|
-
<% if repeat_interval %>
|
|
25
|
-
r=<%= repeat_interval %> <%= active_duration %> <%= offsets_from_start_time %>
|
|
26
|
-
<% end %>
|
|
27
|
-
<% unless time_zones.nil? || time_zones.empty? %>
|
|
28
|
-
<% if time_zones.class == Array %>
|
|
29
|
-
z=<% time_zones.each do |time_zone| %><%= time_zone[:adjustment_time] %> <%= time_zone[:offset] %><% end %>
|
|
30
|
-
<% else %>
|
|
31
|
-
z=<%= time_zones[:adjustment_time] %> <%= time_zones[:offset] %><% end %>
|
|
32
|
-
<% end %>
|
|
33
|
-
<% if encryption_method %>
|
|
34
|
-
k=<%= encryption_method %><% if encryption_key %>:<%= encryption_key %><% end %>
|
|
35
|
-
<% end %>
|
|
36
|
-
<% unless attributes.empty? %>
|
|
37
|
-
<% attributes.each do |a| %>
|
|
38
|
-
a=<%= a[:attribute] %><% if a[:value] %>:<%= a[:value] %><% end %>
|
|
39
|
-
<% end %>
|
|
40
|
-
<% end %>
|
|
41
|
-
<% media_sections.each do |media_section| %>
|
|
42
|
-
m=<%= media_section[:media] %> <%= media_section[:port]%> <%= media_section[:protocol]%> <%= media_section[:format]%>
|
|
43
|
-
<% if media_section[:attributes] %>
|
|
44
|
-
<% media_section[:attributes].each do |attribute| %>
|
|
45
|
-
a=<%= attribute[:attribute] %><% if attribute[:value] %>:<%= attribute[:value] %>
|
|
46
|
-
<% end %><% end %><% end %><% end %>
|
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
|
-
require 'sdp'
|
|
3
|
-
require 'sdp/description'
|
|
4
|
-
require 'base64'
|
|
5
|
-
|
|
6
|
-
describe SDP::Description do
|
|
7
|
-
before :each do
|
|
8
|
-
@sdp = SDP::Description.new
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it "initializes with the protocol_version value set" do
|
|
12
|
-
@sdp.protocol_version.should == SDP::PROTOCOL_VERSION
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
context "can add and retrieve fields" do
|
|
16
|
-
it "protocol_version" do
|
|
17
|
-
@sdp.protocol_version = 1
|
|
18
|
-
@sdp.protocol_version.should == 1
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it "username" do
|
|
22
|
-
@sdp.username = "jdoe"
|
|
23
|
-
@sdp.username.should == "jdoe"
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "id" do
|
|
27
|
-
@sdp.id = 2890844526
|
|
28
|
-
@sdp.id.should == 2890844526
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "version" do
|
|
32
|
-
@sdp.version = 2890842807
|
|
33
|
-
@sdp.version.should == 2890842807
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "network_type" do
|
|
37
|
-
@sdp.network_type = :IN
|
|
38
|
-
@sdp.network_type.should == :IN
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it "address_type" do
|
|
42
|
-
@sdp.address_type = :IP4
|
|
43
|
-
@sdp.address_type.should == :IP4
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it "unicast_address" do
|
|
47
|
-
@sdp.unicast_address = "10.47.16.5"
|
|
48
|
-
@sdp.unicast_address.should == "10.47.16.5"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it "name" do
|
|
52
|
-
@sdp.name = "This is a session"
|
|
53
|
-
@sdp.name.should == "This is a session"
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "name can be a ' '" do
|
|
57
|
-
@sdp.name = " "
|
|
58
|
-
@sdp.name.should == " "
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "information" do
|
|
62
|
-
@sdp.information = "This is a session"
|
|
63
|
-
@sdp.information.should == "This is a session"
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it "uri" do
|
|
67
|
-
@sdp.uri = "http://localhost"
|
|
68
|
-
@sdp.uri.should == "http://localhost"
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it "email_address" do
|
|
72
|
-
@sdp.email_address = 'me@me.com'
|
|
73
|
-
@sdp.email_address.should == 'me@me.com'
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
it "email_address in alternate form" do
|
|
77
|
-
@sdp.email_address = "Jane Doe <j.doe@example.com>"
|
|
78
|
-
@sdp.email_address.should == "Jane Doe <j.doe@example.com>"
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "phone_number" do
|
|
82
|
-
@sdp.phone_number = "+1 555 123 4567"
|
|
83
|
-
@sdp.phone_number.should == "+1 555 123 4567"
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "connection_network_type" do
|
|
87
|
-
@sdp.connection_network_type = 'IN'
|
|
88
|
-
@sdp.connection_network_type.should == 'IN'
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
it "connection_address_type" do
|
|
92
|
-
@sdp.connection_address_type = 'IP4'
|
|
93
|
-
@sdp.connection_address_type.should == 'IP4'
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "connection_address" do
|
|
97
|
-
@sdp.connection_address = 'localhost'
|
|
98
|
-
@sdp.connection_address.should == 'localhost'
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
it "connection_address using TTL" do
|
|
102
|
-
@sdp.connection_address = "224.2.36.42/127"
|
|
103
|
-
@sdp.connection_address.should == "224.2.36.42/127"
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it "connection_address using IPv6 address and count" do
|
|
107
|
-
@sdp.connection_address = "FF15::101/3"
|
|
108
|
-
@sdp.connection_address.should == "FF15::101/3"
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "bandwidth_type" do
|
|
112
|
-
@sdp.bandwidth = :CT
|
|
113
|
-
@sdp.bandwidth.should == :CT
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
it "bandwidth" do
|
|
117
|
-
@sdp.bandwidth = 100
|
|
118
|
-
@sdp.bandwidth.should == 100
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
it "start_time" do
|
|
122
|
-
@sdp.start_time = 99112299
|
|
123
|
-
@sdp.start_time.should == 99112299
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
it "stop_time" do
|
|
127
|
-
@sdp.stop_time = 99999999
|
|
128
|
-
@sdp.stop_time.should == 99999999
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "repeat_interval" do
|
|
132
|
-
@sdp.repeat_interval = 12345
|
|
133
|
-
@sdp.repeat_interval.should == 12345
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it "active_duration" do
|
|
137
|
-
@sdp.active_duration = 12345
|
|
138
|
-
@sdp.active_duration.should == 12345
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
it "offsets_from_start_time" do
|
|
142
|
-
@sdp.offsets_from_start_time = 99
|
|
143
|
-
@sdp.offsets_from_start_time.should == 99
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
context "time_zones" do
|
|
147
|
-
it "one time zone" do
|
|
148
|
-
new_values = { :adjustment_time => 111111,
|
|
149
|
-
:offset => 99 }
|
|
150
|
-
@sdp.time_zones << new_values
|
|
151
|
-
@sdp.time_zones.should == [new_values]
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
it "two time_zones" do
|
|
155
|
-
new_values1 = { :adjustment_time => 111111,
|
|
156
|
-
:offset => 99 }
|
|
157
|
-
new_values2 = { :adjustment_time => 222222,
|
|
158
|
-
:offset => 88 }
|
|
159
|
-
@sdp.time_zones << new_values1
|
|
160
|
-
@sdp.time_zones << new_values2
|
|
161
|
-
@sdp.time_zones.should == [new_values1, new_values2]
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
context "encryption keys" do
|
|
166
|
-
it "clear" do
|
|
167
|
-
@sdp.encryption_method = 'clear'
|
|
168
|
-
@sdp.encryption_method.should == 'clear'
|
|
169
|
-
@sdp.encryption_key = 'password'
|
|
170
|
-
@sdp.encryption_key.should == 'password'
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "base64" do
|
|
174
|
-
@sdp.encryption_method = 'base64'
|
|
175
|
-
@sdp.encryption_method.should == 'base64'
|
|
176
|
-
enc = Base64.encode64('password')
|
|
177
|
-
@sdp.encryption_key = enc
|
|
178
|
-
@sdp.encryption_key.should == enc
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
it "uri" do
|
|
182
|
-
@sdp.encryption_method = 'uri'
|
|
183
|
-
@sdp.encryption_method.should == 'uri'
|
|
184
|
-
uri = "http://aserver.com/thing.pdf"
|
|
185
|
-
@sdp.encryption_key = uri
|
|
186
|
-
@sdp.encryption_key.should == uri
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
it "prompt" do
|
|
190
|
-
@sdp.encryption_method = 'prompt'
|
|
191
|
-
@sdp.encryption_method.should == 'prompt'
|
|
192
|
-
@sdp.encryption_key.should be_nil
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
context "attributes" do
|
|
197
|
-
it "one attribute with value" do
|
|
198
|
-
new_values = { :attribute => 'rtpmap',
|
|
199
|
-
:value => "99 h263-1998/90000" }
|
|
200
|
-
@sdp.attributes << new_values
|
|
201
|
-
@sdp.attributes.first.should == new_values
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
it "one attribute with empty value" do
|
|
205
|
-
new_values = { :attribute => 'rtpmap',
|
|
206
|
-
:value => "" }
|
|
207
|
-
@sdp.attributes << new_values
|
|
208
|
-
@sdp.attributes.first.should == new_values
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
it "one attribute with nil value" do
|
|
212
|
-
new_values = { :attribute => 'rtpmap' }
|
|
213
|
-
@sdp.attributes << new_values
|
|
214
|
-
@sdp.attributes.first.should == new_values
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
it "two attributes" do
|
|
218
|
-
new_values1 = { :attribute => 'test' }
|
|
219
|
-
new_values2 = { :attribute => 'rtpmap',
|
|
220
|
-
:value => "99 h263-1998/90000" }
|
|
221
|
-
@sdp.attributes << new_values1
|
|
222
|
-
@sdp.attributes << new_values2
|
|
223
|
-
@sdp.attributes.should == [new_values1, new_values2]
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
context "media_sections" do
|
|
228
|
-
it "can add a basic media section" do
|
|
229
|
-
new_values = { :media => 'audio',
|
|
230
|
-
:port => 12345,
|
|
231
|
-
:protocol => 'RTP/AVP',
|
|
232
|
-
:format => 99 }
|
|
233
|
-
@sdp.media_sections << new_values
|
|
234
|
-
@sdp.media_sections.first.should == new_values
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
it "can add a basic media section with attributes" do
|
|
238
|
-
new_values = { :media => 'audio',
|
|
239
|
-
:port => 12345,
|
|
240
|
-
:protocol => 'RTP/AVP',
|
|
241
|
-
:format => 99,
|
|
242
|
-
:attributes => [
|
|
243
|
-
{
|
|
244
|
-
:attribute => "rtpmap",
|
|
245
|
-
:value => "99 h263-1998/90000"
|
|
246
|
-
}
|
|
247
|
-
]
|
|
248
|
-
}
|
|
249
|
-
@sdp.media_sections << new_values
|
|
250
|
-
@sdp.media_sections.first.should == new_values
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
it "can add 2 basic media sections" do
|
|
254
|
-
new_values = []
|
|
255
|
-
new_values << { :media => 'audio',
|
|
256
|
-
:port => 12345,
|
|
257
|
-
:protocol => 'RTP/AVP',
|
|
258
|
-
:format => 99 }
|
|
259
|
-
@sdp.media_sections << new_values[0]
|
|
260
|
-
|
|
261
|
-
new_values << { :media => 'video',
|
|
262
|
-
:port => 5678,
|
|
263
|
-
:protocol => 'RTP/AVP',
|
|
264
|
-
:format => 33 }
|
|
265
|
-
@sdp.media_sections << new_values[1]
|
|
266
|
-
|
|
267
|
-
@sdp.media_sections.class.should == Array
|
|
268
|
-
@sdp.media_sections[0].should == new_values[0]
|
|
269
|
-
@sdp.media_sections[1].should == new_values[1]
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
context "#to_s" do
|
|
275
|
-
it "contains required session section values" do
|
|
276
|
-
@sdp.to_s.should match /v=0/
|
|
277
|
-
@sdp.to_s.should match /o=/
|
|
278
|
-
@sdp.to_s.should match /s=/
|
|
279
|
-
@sdp.to_s.should match /t=/
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
it "ends each line with \r\n" do
|
|
283
|
-
@sdp.to_s.each_line do |l|
|
|
284
|
-
l.should match /\r\n$/
|
|
285
|
-
end
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
it "handles descriptions with no time zone" do
|
|
289
|
-
sdp = SDP.parse(SDP_MISSING_TIME)
|
|
290
|
-
lambda { sdp.to_s }.should_not raise_error
|
|
291
|
-
end
|
|
292
|
-
end
|
|
293
|
-
|
|
294
|
-
context "#valid?" do
|
|
295
|
-
before :each do
|
|
296
|
-
@sdp = SDP::Description.new
|
|
297
|
-
|
|
298
|
-
@sdp.protocol_version = 0
|
|
299
|
-
@sdp.username = "jdoe"
|
|
300
|
-
@sdp.id = 12345
|
|
301
|
-
@sdp.version = 12345
|
|
302
|
-
@sdp.network_type = :IN
|
|
303
|
-
@sdp.address_type = :IP4
|
|
304
|
-
@sdp.unicast_address = "127.0.0.1"
|
|
305
|
-
@sdp.name = "This is a test"
|
|
306
|
-
@sdp.start_time = 12345678
|
|
307
|
-
@sdp.stop_time = 12345680
|
|
308
|
-
@sdp.media_sections << { :media => "audio", :port => 123,
|
|
309
|
-
:protocol => "RTP/AVP", :format => 99 }
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
it "is valid when all required fields have values" do
|
|
313
|
-
@sdp.valid?.should be_true
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
it "is NOT valid when protocol_version isn't set" do
|
|
317
|
-
@sdp.protocol_version = nil
|
|
318
|
-
@sdp.valid?.should be_false
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
it "is NOT valid when username isn't set" do
|
|
322
|
-
@sdp.username = nil
|
|
323
|
-
@sdp.valid?.should be_false
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
it "is NOT valid when id isn't set" do
|
|
327
|
-
@sdp.id = nil
|
|
328
|
-
@sdp.valid?.should be_false
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
it "is NOT valid when version isn't set" do
|
|
332
|
-
@sdp.version = nil
|
|
333
|
-
@sdp.valid?.should be_false
|
|
334
|
-
end
|
|
335
|
-
|
|
336
|
-
it "is NOT valid when network_type isn't set" do
|
|
337
|
-
@sdp.network_type = nil
|
|
338
|
-
@sdp.valid?.should be_false
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
it "is NOT valid when address_type isn't set" do
|
|
342
|
-
@sdp.address_type = nil
|
|
343
|
-
@sdp.valid?.should be_false
|
|
344
|
-
end
|
|
345
|
-
|
|
346
|
-
it "is NOT valid when unicast_address isn't set" do
|
|
347
|
-
@sdp.unicast_address = nil
|
|
348
|
-
@sdp.valid?.should be_false
|
|
349
|
-
end
|
|
350
|
-
|
|
351
|
-
it "is NOT valid when name isn't set" do
|
|
352
|
-
@sdp.name = nil
|
|
353
|
-
@sdp.valid?.should be_false
|
|
354
|
-
end
|
|
355
|
-
|
|
356
|
-
it "is valid when name is ' '" do
|
|
357
|
-
@sdp.name = ' '
|
|
358
|
-
@sdp.valid?.should be_true
|
|
359
|
-
end
|
|
360
|
-
|
|
361
|
-
it "is NOT valid when start_time isn't set" do
|
|
362
|
-
@sdp.start_time = nil
|
|
363
|
-
@sdp.valid?.should be_false
|
|
364
|
-
end
|
|
365
|
-
|
|
366
|
-
it "is NOT valid when stop_time isn't set" do
|
|
367
|
-
@sdp.stop_time = nil
|
|
368
|
-
@sdp.valid?.should be_false
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
it "is NOT valid when media_sections is empty" do
|
|
372
|
-
@sdp[:media_sections] = []
|
|
373
|
-
@sdp.valid?.should be_false
|
|
374
|
-
end
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
context "bad initialize values" do
|
|
378
|
-
it "ensures a Hash is passed in" do
|
|
379
|
-
lambda do
|
|
380
|
-
SDP::Description.new 1
|
|
381
|
-
end.should raise_error SDP::RuntimeError
|
|
382
|
-
end
|
|
383
|
-
|
|
384
|
-
it "handles a Hash with irrelvant keys" do
|
|
385
|
-
session_values = { :bobo => "thing" }
|
|
386
|
-
|
|
387
|
-
lambda do
|
|
388
|
-
SDP::Description.new session_values
|
|
389
|
-
end.should raise_error SDP::RuntimeError
|
|
390
|
-
end
|
|
391
|
-
end
|
|
392
|
-
end
|