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