UPnP 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/.autotest +30 -0
- data/History.txt +6 -0
- data/Manifest.txt +18 -0
- data/README.txt +95 -0
- data/Rakefile +12 -0
- data/bin/upnp_discover +82 -0
- data/bin/upnp_listen +26 -0
- data/lib/UPnP.rb +35 -0
- data/lib/UPnP/SSDP.rb +495 -0
- data/lib/UPnP/control.rb +11 -0
- data/lib/UPnP/control/device.rb +238 -0
- data/lib/UPnP/control/service.rb +461 -0
- data/test/test_UPnP_SSDP.rb +237 -0
- data/test/test_UPnP_SSDP_notification.rb +74 -0
- data/test/test_UPnP_SSDP_response.rb +30 -0
- data/test/test_UPnP_control_device.rb +72 -0
- data/test/test_UPnP_control_service.rb +108 -0
- data/test/utilities.rb +1028 -0
- metadata +109 -0
- metadata.gz.sig +1 -0
@@ -0,0 +1,237 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/utilities'
|
3
|
+
require 'UPnP/SSDP'
|
4
|
+
|
5
|
+
class TestUPnPSSDP < UPnP::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@ssdp = UPnP::SSDP.new
|
9
|
+
@ssdp.timeout = 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
@ssdp.listener.kill if @ssdp.listener
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_discover
|
17
|
+
socket = UPnP::FakeSocket.new util_notify
|
18
|
+
@ssdp.socket = socket
|
19
|
+
|
20
|
+
notifications = @ssdp.discover
|
21
|
+
|
22
|
+
assert_equal [], socket.sent
|
23
|
+
assert_equal [Socket::INADDR_ANY, @ssdp.port], socket.bound
|
24
|
+
|
25
|
+
expected = [
|
26
|
+
[Socket::IPPROTO_IP, Socket::IP_TTL, [@ssdp.ttl].pack('i')],
|
27
|
+
[Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP,
|
28
|
+
"\357\377\377\372\000\000\000\000"]
|
29
|
+
]
|
30
|
+
|
31
|
+
assert_equal expected, socket.socket_options
|
32
|
+
|
33
|
+
assert_equal 1, notifications.length
|
34
|
+
assert_equal 'upnp:rootdevice', notifications.first.type
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_listen
|
38
|
+
@ssdp.socket = UPnP::FakeSocket.new util_notify
|
39
|
+
|
40
|
+
@ssdp.listen
|
41
|
+
|
42
|
+
notification = @ssdp.queue.pop
|
43
|
+
|
44
|
+
assert_equal 'upnp:rootdevice', notification.type
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_parse_bad
|
48
|
+
assert_raise UPnP::SSDP::Error do
|
49
|
+
@ssdp.parse ''
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_parse_notification
|
54
|
+
notification = @ssdp.parse util_notify
|
55
|
+
|
56
|
+
assert_equal 'upnp:rootdevice', notification.type
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_parse_notification_byebye
|
60
|
+
notification = @ssdp.parse util_notify
|
61
|
+
|
62
|
+
assert_equal 'upnp:rootdevice', notification.type
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_parse_search_response
|
66
|
+
response = @ssdp.parse util_search_response
|
67
|
+
|
68
|
+
assert_equal 'upnp:rootdevice', response.target
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_search
|
72
|
+
socket = UPnP::FakeSocket.new util_search_response
|
73
|
+
@ssdp.socket = socket
|
74
|
+
|
75
|
+
responses = @ssdp.search
|
76
|
+
|
77
|
+
assert_equal nil, socket.bound
|
78
|
+
|
79
|
+
m_search = <<-M_SEARCH
|
80
|
+
M-SEARCH * HTTP/1.1\r
|
81
|
+
HOST: 239.255.255.250:1900\r
|
82
|
+
MAN: \"ssdp:discover\"\r
|
83
|
+
MX: 0\r
|
84
|
+
ST: ssdp:all\r
|
85
|
+
\r
|
86
|
+
M_SEARCH
|
87
|
+
|
88
|
+
assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
|
89
|
+
|
90
|
+
expected = [
|
91
|
+
[Socket::IPPROTO_IP, Socket::IP_TTL, [@ssdp.ttl].pack('i')],
|
92
|
+
]
|
93
|
+
|
94
|
+
assert_equal expected, socket.socket_options
|
95
|
+
|
96
|
+
assert_equal 1, responses.length
|
97
|
+
assert_equal 'upnp:rootdevice', responses.first.target
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_search_device
|
101
|
+
socket = UPnP::FakeSocket.new util_search_response
|
102
|
+
@ssdp.socket = socket
|
103
|
+
|
104
|
+
responses = @ssdp.search [:device, 'MyDevice.1']
|
105
|
+
|
106
|
+
m_search = <<-M_SEARCH
|
107
|
+
M-SEARCH * HTTP/1.1\r
|
108
|
+
HOST: 239.255.255.250:1900\r
|
109
|
+
MAN: \"ssdp:discover\"\r
|
110
|
+
MX: 0\r
|
111
|
+
ST: urn:schemas-upnp-org:device:MyDevice.1\r
|
112
|
+
\r
|
113
|
+
M_SEARCH
|
114
|
+
|
115
|
+
assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_search_root
|
119
|
+
socket = UPnP::FakeSocket.new util_search_response
|
120
|
+
@ssdp.socket = socket
|
121
|
+
|
122
|
+
responses = @ssdp.search :root
|
123
|
+
|
124
|
+
m_search = <<-M_SEARCH
|
125
|
+
M-SEARCH * HTTP/1.1\r
|
126
|
+
HOST: 239.255.255.250:1900\r
|
127
|
+
MAN: \"ssdp:discover\"\r
|
128
|
+
MX: 0\r
|
129
|
+
ST: upnp:rootdevice\r
|
130
|
+
\r
|
131
|
+
M_SEARCH
|
132
|
+
|
133
|
+
assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_search_service
|
137
|
+
socket = UPnP::FakeSocket.new util_search_response
|
138
|
+
@ssdp.socket = socket
|
139
|
+
|
140
|
+
responses = @ssdp.search [:service, 'MyService.1']
|
141
|
+
|
142
|
+
m_search = <<-M_SEARCH
|
143
|
+
M-SEARCH * HTTP/1.1\r
|
144
|
+
HOST: 239.255.255.250:1900\r
|
145
|
+
MAN: \"ssdp:discover\"\r
|
146
|
+
MX: 0\r
|
147
|
+
ST: urn:schemas-upnp-org:service:MyService.1\r
|
148
|
+
\r
|
149
|
+
M_SEARCH
|
150
|
+
|
151
|
+
assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_search_ssdp
|
155
|
+
socket = UPnP::FakeSocket.new util_search_response
|
156
|
+
@ssdp.socket = socket
|
157
|
+
|
158
|
+
responses = @ssdp.search 'ssdp:foo'
|
159
|
+
|
160
|
+
m_search = <<-M_SEARCH
|
161
|
+
M-SEARCH * HTTP/1.1\r
|
162
|
+
HOST: 239.255.255.250:1900\r
|
163
|
+
MAN: \"ssdp:discover\"\r
|
164
|
+
MX: 0\r
|
165
|
+
ST: ssdp:foo\r
|
166
|
+
\r
|
167
|
+
M_SEARCH
|
168
|
+
|
169
|
+
assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_search_urn
|
173
|
+
socket = UPnP::FakeSocket.new util_search_response
|
174
|
+
@ssdp.socket = socket
|
175
|
+
|
176
|
+
responses = @ssdp.search 'urn:foo'
|
177
|
+
|
178
|
+
m_search = <<-M_SEARCH
|
179
|
+
M-SEARCH * HTTP/1.1\r
|
180
|
+
HOST: 239.255.255.250:1900\r
|
181
|
+
MAN: \"ssdp:discover\"\r
|
182
|
+
MX: 0\r
|
183
|
+
ST: urn:foo\r
|
184
|
+
\r
|
185
|
+
M_SEARCH
|
186
|
+
|
187
|
+
assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_search_uuid
|
191
|
+
socket = UPnP::FakeSocket.new util_search_response
|
192
|
+
@ssdp.socket = socket
|
193
|
+
|
194
|
+
responses = @ssdp.search 'uuid:foo'
|
195
|
+
|
196
|
+
m_search = <<-M_SEARCH
|
197
|
+
M-SEARCH * HTTP/1.1\r
|
198
|
+
HOST: 239.255.255.250:1900\r
|
199
|
+
MAN: \"ssdp:discover\"\r
|
200
|
+
MX: 0\r
|
201
|
+
ST: uuid:foo\r
|
202
|
+
\r
|
203
|
+
M_SEARCH
|
204
|
+
|
205
|
+
assert_equal [[m_search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_send_search
|
209
|
+
socket = UPnP::FakeSocket.new
|
210
|
+
@ssdp.socket = socket
|
211
|
+
|
212
|
+
@ssdp.send_search 'bunnies'
|
213
|
+
|
214
|
+
search = <<-SEARCH
|
215
|
+
M-SEARCH * HTTP/1.1\r
|
216
|
+
HOST: 239.255.255.250:1900\r
|
217
|
+
MAN: \"ssdp:discover\"\r
|
218
|
+
MX: 0\r
|
219
|
+
ST: bunnies\r
|
220
|
+
\r
|
221
|
+
SEARCH
|
222
|
+
|
223
|
+
assert_equal [[search, 0, @ssdp.broadcast, @ssdp.port]], socket.sent
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_stop_listening
|
227
|
+
thread = Thread.new do sleep end
|
228
|
+
@ssdp.listener = thread
|
229
|
+
|
230
|
+
@ssdp.stop_listening
|
231
|
+
|
232
|
+
assert_equal false, thread.alive?
|
233
|
+
assert_equal nil, @ssdp.listener
|
234
|
+
end
|
235
|
+
|
236
|
+
end
|
237
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/utilities'
|
3
|
+
require 'UPnP/SSDP'
|
4
|
+
|
5
|
+
class TestUPnPSSDPNotification < UPnP::TestCase
|
6
|
+
|
7
|
+
def test_self_parse_notify
|
8
|
+
notification = UPnP::SSDP::Notification.parse util_notify
|
9
|
+
|
10
|
+
assert_equal Time, notification.date.class
|
11
|
+
assert_equal '239.255.255.250', notification.host
|
12
|
+
assert_equal '1900', notification.port
|
13
|
+
assert_equal URI.parse('http://example.com/root_device.xml'),
|
14
|
+
notification.location
|
15
|
+
assert_equal 10, notification.max_age
|
16
|
+
assert_equal 'uuid:BOGUS::upnp:rootdevice', notification.name
|
17
|
+
assert_equal 'upnp:rootdevice', notification.type
|
18
|
+
assert_equal 'OS/5 UPnP/1.0 product/7', notification.server
|
19
|
+
assert_equal 'ssdp:alive', notification.sub_type
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_self_parse_notify_byebye
|
23
|
+
notification = UPnP::SSDP::Notification.parse util_notify_byebye
|
24
|
+
|
25
|
+
assert_equal Time, notification.date.class
|
26
|
+
assert_equal '239.255.255.250', notification.host
|
27
|
+
assert_equal '1900', notification.port
|
28
|
+
assert_equal nil, notification.location
|
29
|
+
assert_equal nil, notification.max_age
|
30
|
+
assert_equal 'uuid:BOGUS::upnp:rootdevice', notification.name
|
31
|
+
assert_equal 'upnp:rootdevice', notification.type
|
32
|
+
assert_equal 'ssdp:byebye', notification.sub_type
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_alive_eh
|
36
|
+
notification = UPnP::SSDP::Notification.parse util_notify
|
37
|
+
|
38
|
+
assert notification.alive?
|
39
|
+
|
40
|
+
notification = UPnP::SSDP::Notification.parse util_notify_byebye
|
41
|
+
|
42
|
+
assert !notification.alive?
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_byebye_eh
|
46
|
+
notification = UPnP::SSDP::Notification.parse util_notify_byebye
|
47
|
+
|
48
|
+
assert notification.byebye?
|
49
|
+
|
50
|
+
notification = UPnP::SSDP::Notification.parse util_notify
|
51
|
+
|
52
|
+
assert !notification.byebye?
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_inspect
|
56
|
+
notification = UPnP::SSDP::Notification.parse util_notify
|
57
|
+
|
58
|
+
id = notification.object_id.to_s 16
|
59
|
+
expected = "#<UPnP::SSDP::Notification:0x#{id} upnp:rootdevice ssdp:alive http://example.com/root_device.xml>"
|
60
|
+
|
61
|
+
assert_equal expected, notification.inspect
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_inspect_byebye
|
65
|
+
notification = UPnP::SSDP::Notification.parse util_notify_byebye
|
66
|
+
|
67
|
+
id = notification.object_id.to_s 16
|
68
|
+
expected = "#<UPnP::SSDP::Notification:0x#{id} upnp:rootdevice ssdp:byebye>"
|
69
|
+
|
70
|
+
assert_equal expected, notification.inspect
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/utilities'
|
3
|
+
require 'UPnP/SSDP'
|
4
|
+
|
5
|
+
class TestUPnPSSDPResponse < UPnP::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@response = UPnP::SSDP::Response.parse util_search_response
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_self_parse_notify
|
12
|
+
assert_equal Time, @response.date.class
|
13
|
+
assert_equal true, @response.ext
|
14
|
+
assert_equal URI.parse('http://example.com/root_device.xml'),
|
15
|
+
@response.location
|
16
|
+
assert_equal 10, @response.max_age
|
17
|
+
assert_equal 'uuid:BOGUS::upnp:rootdevice', @response.name
|
18
|
+
assert_equal 'OS/5 UPnP/1.0 product/7', @response.server
|
19
|
+
assert_equal 'upnp:rootdevice', @response.target
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_inspect
|
23
|
+
id = @response.object_id.to_s 16
|
24
|
+
expected = "#<UPnP::SSDP::Response:0x#{id} upnp:rootdevice http://example.com/root_device.xml>"
|
25
|
+
|
26
|
+
assert_equal expected, @response.inspect
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'stringio'
|
3
|
+
require 'test/utilities'
|
4
|
+
require 'UPnP/control/device'
|
5
|
+
|
6
|
+
class TestUPnPControlDevice < UPnP::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@device_url = URI.parse 'http://example.com/device.xml'
|
10
|
+
|
11
|
+
UPnP::OpenStub::FILES[@device_url] = StringIO.new UPnP::TestCase::IGD_XML
|
12
|
+
UPnP::OpenStub::FILES[@device_url + '/L3F.xml'] =
|
13
|
+
StringIO.new UPnP::TestCase::L3F_XML
|
14
|
+
UPnP::OpenStub::FILES[@device_url + '/WANCfg.xml'] =
|
15
|
+
StringIO.new UPnP::TestCase::CFG_XML
|
16
|
+
UPnP::OpenStub::FILES[@device_url + '/WANIPCn.xml'] =
|
17
|
+
StringIO.new UPnP::TestCase::IPCN_XML
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_self_create
|
21
|
+
device = UPnP::Control::Device.create @device_url
|
22
|
+
|
23
|
+
igd = UPnP::Control::Device::InternetGatewayDevice
|
24
|
+
|
25
|
+
assert_equal igd, device.class
|
26
|
+
assert igd.constants.include?('URN_1'), 'URN_1 constant missing'
|
27
|
+
assert_equal "#{UPnP::DEVICE_SCHEMA_PREFIX}:#{igd.name}:1", igd::URN_1
|
28
|
+
ensure
|
29
|
+
UPnP::Control::Device.send :remove_const, :InternetGatewayDevice
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_self_create_class_exists
|
33
|
+
UPnP::Control::Device.const_set :InternetGatewayDevice,
|
34
|
+
Class.new(UPnP::Control::Device)
|
35
|
+
|
36
|
+
device = UPnP::Control::Device.create @device_url
|
37
|
+
|
38
|
+
assert_equal UPnP::Control::Device::InternetGatewayDevice, device.class
|
39
|
+
ensure
|
40
|
+
UPnP::Control::Device.send :remove_const, :InternetGatewayDevice
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_initialize
|
44
|
+
device = UPnP::Control::Device.new @device_url
|
45
|
+
|
46
|
+
assert_equal 'http://example.com/', device.url.to_s
|
47
|
+
assert_equal 'urn:schemas-upnp-org:device:InternetGatewayDevice:1',
|
48
|
+
device.type
|
49
|
+
|
50
|
+
assert_equal 'FreeBSD router', device.friendly_name
|
51
|
+
|
52
|
+
assert_equal 'FreeBSD', device.manufacturer
|
53
|
+
assert_equal URI.parse('http://www.freebsd.org/'), device.manufacturer_url
|
54
|
+
|
55
|
+
assert_equal 'FreeBSD router', device.model_description
|
56
|
+
assert_equal 'FreeBSD router', device.model_name
|
57
|
+
assert_equal URI.parse('http://www.freebsd.org/'), device.model_url
|
58
|
+
assert_equal '1', device.model_number
|
59
|
+
|
60
|
+
assert_equal '00000000', device.serial_number
|
61
|
+
|
62
|
+
assert_equal 'uuid:ed56cff8-7d4e-11dc-b7db-000024c4931c', device.name
|
63
|
+
|
64
|
+
assert_equal 2, device.devices.length, 'devices count'
|
65
|
+
assert_equal 1, device.sub_devices.length, 'sub-devices count'
|
66
|
+
|
67
|
+
assert_equal 3, device.services.length, 'services count'
|
68
|
+
assert_equal 1, device.sub_services.length, 'sub-services count'
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/utilities'
|
3
|
+
require 'UPnP/control/service'
|
4
|
+
|
5
|
+
class TestUPnPControlService < UPnP::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@url = URI.parse 'http://example.com'
|
9
|
+
service_description = <<-XML
|
10
|
+
<service>
|
11
|
+
<serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType>
|
12
|
+
<serviceId>urn:upnp-org:serviceId:Layer3Forwarding1</serviceId>
|
13
|
+
<controlURL>/ctl/L3F</controlURL>
|
14
|
+
<eventSubURL>/evt/L3F</eventSubURL>
|
15
|
+
<SCPDURL>/L3F.xml</SCPDURL>
|
16
|
+
</service>
|
17
|
+
XML
|
18
|
+
|
19
|
+
service_description = REXML::Document.new service_description
|
20
|
+
@service_description = service_description.elements['service']
|
21
|
+
|
22
|
+
UPnP::Control::Service::FILES[@url + '/L3F.xml'] = StringIO.new L3F_XML
|
23
|
+
|
24
|
+
@methods = %w[
|
25
|
+
AddPortMapping
|
26
|
+
DeletePortMapping
|
27
|
+
ForceTermination
|
28
|
+
GetConnectionTypeInfo
|
29
|
+
GetExternalIPAddress
|
30
|
+
GetGenericPortMappingEntry
|
31
|
+
GetNATRSIPStatus
|
32
|
+
GetSpecificPortMappingEntry
|
33
|
+
GetStatusInfo
|
34
|
+
RequestConnection
|
35
|
+
SetConnectionType
|
36
|
+
]
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_self_create
|
40
|
+
device = UPnP::Control::Service.create @service_description, @url
|
41
|
+
|
42
|
+
l3f = UPnP::Control::Service::Layer3Forwarding
|
43
|
+
assert_equal l3f, device.class
|
44
|
+
|
45
|
+
assert l3f.constants.include?('URN_1'), 'URN_1 constant missing'
|
46
|
+
assert_equal "#{UPnP::SERVICE_SCHEMA_PREFIX}:#{l3f.name}:1", l3f::URN_1
|
47
|
+
ensure
|
48
|
+
UPnP::Control::Service.send :remove_const, :Layer3Forwarding
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_self_create_class_exists
|
52
|
+
UPnP::Control::Service.const_set :Layer3Forwarding,
|
53
|
+
Class.new(UPnP::Control::Service)
|
54
|
+
|
55
|
+
device = UPnP::Control::Service.create @service_description, @url
|
56
|
+
|
57
|
+
assert_equal UPnP::Control::Service::Layer3Forwarding, device.class
|
58
|
+
ensure
|
59
|
+
UPnP::Control::Service.send :remove_const, :Layer3Forwarding
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_initialize
|
63
|
+
service = UPnP::Control::Service.new @service_description, @url
|
64
|
+
|
65
|
+
assert_equal @url, service.url
|
66
|
+
|
67
|
+
assert_equal 'urn:schemas-upnp-org:service:Layer3Forwarding:1',
|
68
|
+
service.type
|
69
|
+
|
70
|
+
assert_equal 'urn:upnp-org:serviceId:Layer3Forwarding1', service.id
|
71
|
+
|
72
|
+
control_url = @url + '/ctl/L3F'
|
73
|
+
assert_equal control_url, service.control_url
|
74
|
+
|
75
|
+
evt_url = @url + '/evt/L3F'
|
76
|
+
assert_equal evt_url, service.event_sub_url
|
77
|
+
|
78
|
+
scpd_url = @url + '/L3F.xml'
|
79
|
+
assert_equal scpd_url, service.scpd_url
|
80
|
+
|
81
|
+
assert_not_nil service.driver
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_create_driver
|
85
|
+
service = UPnP::Control::Service.create @service_description, @url
|
86
|
+
|
87
|
+
assert_equal @methods, service.driver.methods(false).sort
|
88
|
+
|
89
|
+
registry = service.driver.mapping_registry
|
90
|
+
|
91
|
+
klass_def = registry.elename_schema_definition_from_class SOAP::SOAPString
|
92
|
+
assert_equal 'NewPossibleConnectionTypes', klass_def.elename.name
|
93
|
+
|
94
|
+
new_protocol = XSD::QName.new nil, 'NewProtocol'
|
95
|
+
mapping = registry.schema_definition_from_elename new_protocol
|
96
|
+
assert mapping, "Mapping for #{new_protocol} not found"
|
97
|
+
|
98
|
+
assert service.respond_to?(@methods.first)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_methods
|
102
|
+
service = UPnP::Control::Service.new @service_description, @url
|
103
|
+
|
104
|
+
assert_equal @methods, service.methods(false).sort
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|