View Javadoc
1   /*
2    * Copyright (C) 2013 4th Line GmbH, Switzerland
3    *
4    * The contents of this file are subject to the terms of either the GNU
5    * Lesser General Public License Version 2 or later ("LGPL") or the
6    * Common Development and Distribution License Version 1 or later
7    * ("CDDL") (collectively, the "License"). You may not use this file
8    * except in compliance with the License. See LICENSE.txt for more
9    * information.
10   *
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14   */
15  
16  package org.fourthline.cling.test.model;
17  
18  import org.fourthline.cling.model.Constants;
19  import org.fourthline.cling.model.ServerClientTokens;
20  import org.fourthline.cling.model.message.header.*;
21  import org.fourthline.cling.model.types.DeviceType;
22  import org.fourthline.cling.model.types.NamedDeviceType;
23  import org.fourthline.cling.model.types.NamedServiceType;
24  import org.fourthline.cling.model.types.ServiceType;
25  import org.fourthline.cling.model.types.UDADeviceType;
26  import org.fourthline.cling.model.types.UDAServiceType;
27  import org.seamless.util.MimeType;
28  import org.testng.annotations.Test;
29  
30  import java.net.URI;
31  import java.util.Locale;
32  
33  import static org.testng.Assert.assertEquals;
34  
35  
36  public class HeaderParsingTest {
37  
38      @Test
39      public void parseContentTypeHeader() {
40          ContentTypeHeader header = new ContentTypeHeader(MimeType.valueOf("foo/bar;charset=\"utf-8\""));
41          assertEquals(header.getString(), "foo/bar;charset=\"utf-8\"");
42      }
43  
44      @Test
45      public void parseDeviceType() {
46          DeviceType deviceType = DeviceType.valueOf("urn:foo-bar:device:MyDeviceType:123");
47          assertEquals(deviceType.getNamespace(), "foo-bar");
48          assertEquals(deviceType.getType(), "MyDeviceType");
49          assertEquals(deviceType.getVersion(), 123);
50      }
51  
52      @Test
53      public void parseUDADeviceType() {
54          UDADeviceType deviceType = (UDADeviceType)DeviceType.valueOf("urn:schemas-upnp-org:device:MyDeviceType:123");
55          assertEquals(deviceType.getType(), "MyDeviceType");
56          assertEquals(deviceType.getVersion(), 123);
57      }
58  
59      @Test
60      public void parseInvalidDeviceTypeHeader() {
61          DeviceTypeHeader header = new DeviceTypeHeader();
62          header.setString("urn:foo-bar:device:!@#:123");
63          assertEquals(header.getValue().getNamespace(), "foo-bar");
64          assertEquals(header.getValue().getType(), "---");
65          assertEquals(header.getValue().getVersion(), 123);
66          assertEquals(header.getString(), "urn:foo-bar:device:---:123");
67      }
68  
69      @Test
70      public void parseDeviceTypeHeaderURI() {
71          DeviceTypeHeader header = new DeviceTypeHeader(URI.create("urn:schemas-upnp-org:device:MyDeviceType:123"));
72          assertEquals(header.getValue().getNamespace(), "schemas-upnp-org");
73          assertEquals(header.getValue().getType(), "MyDeviceType");
74          assertEquals(header.getValue().getVersion(), 123);
75          assertEquals(header.getString(), "urn:schemas-upnp-org:device:MyDeviceType:123");
76  
77      }
78  
79      @Test
80      public void parseDeviceUSNHeader() {
81          DeviceUSNHeader header = new DeviceUSNHeader();
82          header.setString("uuid:MY-DEVICE-123::urn:schemas-upnp-org:device:MY-DEVICE-TYPE:1");
83          assertEquals(header.getValue().getUdn().getIdentifierString(), "MY-DEVICE-123");
84          assert header.getValue().getDeviceType() instanceof UDADeviceType;
85      }
86  
87      @Test
88      public void parseDeviceUSNHeaderStatic() {
89          DeviceUSNHeader header = new DeviceUSNHeader(
90                  NamedDeviceType.valueOf("uuid:MY-DEVICE-123::urn:schemas-upnp-org:device:MY-DEVICE-TYPE:1")
91          );
92          assertEquals(header.getValue().getUdn().getIdentifierString(), "MY-DEVICE-123");
93          assert header.getValue().getDeviceType() instanceof UDADeviceType;
94      }
95  
96      @Test(expectedExceptions = InvalidHeaderException.class)
97      public void parseInvalidDeviceUSNHeader() {
98          DeviceUSNHeader header = new DeviceUSNHeader();
99          header.setString("uuid:MY-DEVICE-123--urn:schemas-upnp-org:device:MY-DEVICE-TYPE:1");
100     }
101 
102     @Test(expectedExceptions = InvalidHeaderException.class)
103     public void parseInvalidEXTHeader() {
104         EXTHeader header = new EXTHeader();
105         header.setString("MUST BE EMPTY STRING");
106     }
107 
108     @Test
109     public void parseHostHeaderConstructor() {
110         HostHeader header = new HostHeader("foo.bar", 1234);
111         assertEquals(header.getValue().getHost(), "foo.bar");
112         assertEquals(header.getValue().getPort(), 1234);
113 
114         header = new HostHeader(1234);
115         assertEquals(header.getValue().getHost(), Constants.IPV4_UPNP_MULTICAST_GROUP);
116         assertEquals(header.getValue().getPort(), 1234);
117     }
118 
119     @Test
120     public void parseHostHeader() {
121         HostHeader header = new HostHeader();
122         assertEquals(header.getValue().getHost(), Constants.IPV4_UPNP_MULTICAST_GROUP);
123         assertEquals(header.getValue().getPort(), Constants.UPNP_MULTICAST_PORT);
124 
125         header = new HostHeader();
126         header.setString("foo.bar:1234");
127         assertEquals(header.getValue().getHost(), "foo.bar");
128         assertEquals(header.getValue().getPort(), 1234);
129 
130         header = new HostHeader();
131         header.setString("foo.bar");
132         assertEquals(header.getValue().getHost(), "foo.bar");
133         assertEquals(header.getValue().getPort(), Constants.UPNP_MULTICAST_PORT);
134     }
135 
136     @Test(expectedExceptions = InvalidHeaderException.class)
137     public void parseInvalidHostHeader() {
138         HostHeader header = new HostHeader();
139         header.setString("foo.bar:abc");
140     }
141 
142     @Test(expectedExceptions = InvalidHeaderException.class)
143     public void parseInvalidLocationHeader() {
144         LocationHeader header = new LocationHeader();
145         header.setString("this://is.not...a valid URL");
146     }
147 
148     @Test(expectedExceptions = InvalidHeaderException.class)
149     public void parseInvalidMANHeader() {
150         MANHeader header = new MANHeader("abc");
151         header.setString("\"foo.bar\"; ns = baz"); // Not valid
152     }
153 
154     @Test
155     public void parseMANHeaderNoNS() {
156         MANHeader header = new MANHeader("abc");
157         header.setString("\"foo.bar\"");
158         assert header.getValue().equals("foo.bar");
159         assert header.getNamespace() == null;
160         assert header.getString().equals("\"foo.bar\"");
161     }
162 
163     @Test
164     public void parseMANHeaderNS() {
165         MANHeader header = new MANHeader("abc");
166         header.setString("\"foo.bar\"; ns =12");
167         assert header.getValue().equals("foo.bar");
168         assert header.getNamespace().equals("12");
169         assert header.getString().equals("\"foo.bar\"; ns=12");
170     }
171 
172     @Test
173     public void parseMaxAgeHeader() {
174         MaxAgeHeader header = new MaxAgeHeader();
175         header.setString("max-age=1234, foobar=baz");
176         assertEquals(header.getValue(), new Integer(1234));
177     }
178 
179     @Test(expectedExceptions = InvalidHeaderException.class)
180     public void parseInvalidMaxAgeHeader() {
181         MaxAgeHeader header = new MaxAgeHeader();
182         header.setString("max-foo=123");
183     }
184 
185     @Test
186     public void parseMXHeader() {
187         MXHeader header = new MXHeader();
188         header.setString("111");
189         assertEquals(header.getValue(), new Integer(111));
190         
191         header = new MXHeader();
192         header.setString("123");
193         assertEquals(header.getValue(), MXHeader.DEFAULT_VALUE);
194 
195     }
196 
197     @Test(expectedExceptions = InvalidHeaderException.class)
198     public void parseInvalidMXHeader() {
199         MXHeader header = new MXHeader();
200         header.setString("abc");
201     }
202 
203     @Test(expectedExceptions = InvalidHeaderException.class)
204     public void parseInvalidNTSHeader() {
205         NTSHeader header = new NTSHeader();
206         header.setString("foo");
207     }
208 
209     @Test(expectedExceptions = InvalidHeaderException.class)
210     public void parseInvalidRootDeviceHeader() {
211         RootDeviceHeader header = new RootDeviceHeader();
212         header.setString("upnp:foodevice");
213     }
214 
215     @Test
216     public void parseServerHeader() {
217         ServerHeader header = new ServerHeader();
218         header.setString("foo/1 UPnP/1.1 bar/2");
219         assertEquals(header.getValue().getOsName(), "foo");
220         assertEquals(header.getValue().getOsVersion(), "1");
221         assertEquals(header.getValue().getProductName(), "bar");
222         assertEquals(header.getValue().getProductVersion(), "2");
223         assertEquals(header.getValue().getMajorVersion(), 1);
224         assertEquals(header.getValue().getMinorVersion(), 1);
225 
226         // Commas...
227         header = new ServerHeader();
228         header.setString("foo/1, UPnP/1.1, bar/2");
229         assertEquals(header.getValue().getOsName(), "foo");
230         assertEquals(header.getValue().getOsVersion(), "1");
231         assertEquals(header.getValue().getProductName(), "bar");
232         assertEquals(header.getValue().getProductVersion(), "2");
233         assertEquals(header.getValue().getMajorVersion(), 1);
234         assertEquals(header.getValue().getMinorVersion(), 1);
235 
236         // Whitespace in tokens
237         header = new ServerHeader();
238         header.setString("foo baz/1 UPnP/1.1 bar abc/2");
239         assertEquals(header.getValue().getOsName(), "foo baz");
240         assertEquals(header.getValue().getOsVersion(), "1");
241         assertEquals(header.getValue().getProductName(), "bar abc");
242         assertEquals(header.getValue().getProductVersion(), "2");
243         assertEquals(header.getValue().getMajorVersion(), 1);
244         assertEquals(header.getValue().getMinorVersion(), 1);
245 
246         // Commas and whitespace!
247         header = new ServerHeader();
248         header.setString("foo baz/1, UPnP/1.1, bar abc/2");
249         assertEquals(header.getValue().getOsName(), "foo baz");
250         assertEquals(header.getValue().getOsVersion(), "1");
251         assertEquals(header.getValue().getProductName(), "bar abc");
252         assertEquals(header.getValue().getProductVersion(), "2");
253         assertEquals(header.getValue().getMajorVersion(), 1);
254         assertEquals(header.getValue().getMinorVersion(), 1);
255 
256         // Absolutely not valid!
257         header = new ServerHeader();
258         header.setString("foo/1 UPnP/1.");
259         assertEquals(header.getValue().getOsName(), ServerClientTokens.UNKNOWN_PLACEHOLDER);
260         assertEquals(header.getValue().getOsVersion(), ServerClientTokens.UNKNOWN_PLACEHOLDER);
261         assertEquals(header.getValue().getProductName(), ServerClientTokens.UNKNOWN_PLACEHOLDER);
262         assertEquals(header.getValue().getProductVersion(), ServerClientTokens.UNKNOWN_PLACEHOLDER);
263         assertEquals(header.getValue().getMajorVersion(), 1);
264         assertEquals(header.getValue().getMinorVersion(), 0); // Assume UDA 1.0
265 
266     }
267 
268     @Test(expectedExceptions = InvalidHeaderException.class)
269     public void parseInvalidServerHeader() {
270         ServerHeader header = new ServerHeader();
271         header.setString("foo/1 baz/123 bar/2");
272     }
273 
274     @Test
275     public void parseServiceType() {
276         ServiceType serviceType = ServiceType.valueOf("urn:foo-bar:service:MyServiceType:123");
277         assertEquals(serviceType.getNamespace(), "foo-bar");
278         assertEquals(serviceType.getType(), "MyServiceType");
279         assertEquals(serviceType.getVersion(), 123);
280     }
281 
282     @Test
283     public void parseUDAServiceType() {
284         UDAServiceType serviceType = (UDAServiceType)ServiceType.valueOf("urn:schemas-upnp-org:service:MyServiceType:123");
285         assertEquals(serviceType.getType(), "MyServiceType");
286         assertEquals(serviceType.getVersion(), 123);
287     }
288 
289     @Test
290     public void parseInvalidServiceTypeHeader() {
291         ServiceTypeHeader header = new ServiceTypeHeader();
292         header.setString("urn:foo-bar:service:!@#:123");
293         assertEquals(header.getValue().getNamespace(), "foo-bar");
294         assertEquals(header.getValue().getType(), "---");
295         assertEquals(header.getValue().getVersion(), 123);
296         assertEquals(header.getString(), "urn:foo-bar:service:---:123");
297     }
298 
299     @Test
300     public void parseServiceTypeHeaderURI() {
301         ServiceTypeHeader header = new ServiceTypeHeader(URI.create("urn:schemas-upnp-org:service:MyServiceType:123"));
302         assertEquals(header.getValue().getNamespace(), "schemas-upnp-org");
303         assertEquals(header.getValue().getType(), "MyServiceType");
304         assertEquals(header.getValue().getVersion(), 123);
305         assertEquals(header.getString(), "urn:schemas-upnp-org:service:MyServiceType:123");
306     }
307 
308     @Test
309     public void parseServiceUSNHeader() {
310         ServiceUSNHeader header = new ServiceUSNHeader();
311         header.setString("uuid:MY-SERVICE-123::urn:schemas-upnp-org:service:MY-SERVICE-TYPE:1");
312         assertEquals(header.getValue().getUdn().getIdentifierString(), "MY-SERVICE-123");
313         assert header.getValue().getServiceType() instanceof UDAServiceType;
314     }
315 
316     @Test
317     public void parseServiceUSNHeaderStatic() {
318         ServiceUSNHeader header = new ServiceUSNHeader(
319                 NamedServiceType.valueOf("uuid:MY-SERVICE-123::urn:schemas-upnp-org:service:MY-SERVICE-TYPE:1")
320         );
321         assertEquals(header.getValue().getUdn().getIdentifierString(), "MY-SERVICE-123");
322         assert header.getValue().getServiceType() instanceof UDAServiceType;
323     }
324 
325     @Test(expectedExceptions = InvalidHeaderException.class)
326     public void parseInvalidServiceUSNHeader() {
327         ServiceUSNHeader header = new ServiceUSNHeader();
328         header.setString("uuid:MY-SERVICE-123--urn:schemas-upnp-org:service:MY-SERVICE-TYPE:1");
329     }
330 
331     @Test(expectedExceptions = InvalidHeaderException.class)
332     public void parseInvalidSTAllHeader() {
333         STAllHeader header = new STAllHeader();
334         header.setString("ssdp:foo");
335     }
336 
337     @Test(expectedExceptions = InvalidHeaderException.class)
338     public void parseInvalidUDADeviceTypeHeader() {
339         UDADeviceTypeHeader header = new UDADeviceTypeHeader();
340         header.setString("urn:foo-bar:device:!@#:123");
341     }
342 
343     @Test
344     public void parseUDADeviceTypeHeaderURI() {
345         UDADeviceTypeHeader header = new UDADeviceTypeHeader(URI.create("urn:schemas-upnp-org:device:MyDeviceType:123"));
346         assertEquals(header.getValue().getNamespace(), "schemas-upnp-org");
347         assertEquals(header.getValue().getType(), "MyDeviceType");
348         assertEquals(header.getValue().getVersion(), 123);
349         assertEquals(header.getString(), "urn:schemas-upnp-org:device:MyDeviceType:123");
350     }
351 
352     @Test(expectedExceptions = InvalidHeaderException.class)
353     public void parseInvalidUDAServiceTypeHeader() {
354         UDAServiceTypeHeader header = new UDAServiceTypeHeader();
355         header.setString("urn:foo-bar:service:!@#:123");
356     }
357 
358     @Test
359     public void parseUDAServiceTypeHeaderURI() {
360         UDAServiceTypeHeader header = new UDAServiceTypeHeader(URI.create("urn:schemas-upnp-org:service:MyServiceType:123"));
361         assertEquals(header.getValue().getNamespace(), "schemas-upnp-org");
362         assertEquals(header.getValue().getType(), "MyServiceType");
363         assertEquals(header.getValue().getVersion(), 123);
364         assertEquals(header.getString(), "urn:schemas-upnp-org:service:MyServiceType:123");
365 
366     }
367 
368     @Test
369     public void parseUDNHeader() {
370         UDNHeader header = new UDNHeader();
371         header.setString("uuid:MY-UUID-1234");
372         assertEquals(header.getValue().getIdentifierString(), "MY-UUID-1234");
373     }
374 
375     @Test(expectedExceptions = InvalidHeaderException.class)
376     public void parseInvalidUDNHeaderPrefix() {
377         UDNHeader header = new UDNHeader();
378         header.setString("MY-UUID-1234");
379     }
380 
381     @Test(expectedExceptions = InvalidHeaderException.class)
382     public void parseInvalidUDNHeaderURN() {
383         UDNHeader header = new UDNHeader();
384         header.setString("uuid:MY-UUID-1234::urn:foo-bar:baz");
385     }
386 
387     @Test(expectedExceptions = InvalidHeaderException.class)
388     public void parseInvalidUSNRootDeviceHeader() {
389         USNRootDeviceHeader header = new USNRootDeviceHeader();
390         header.setString("uuid:MY-UUID-1234::upnp:rootfoo");
391     }
392 
393     @Test
394     public void parseSoapActionHeader() {
395         SoapActionHeader header = new SoapActionHeader(URI.create("urn:schemas-upnp-org:service:MyServiceType:1#MyAction"));
396         assertEquals(header.getValue().getServiceType().getNamespace(), "schemas-upnp-org");
397         assertEquals(header.getValue().getServiceType().getType(), "MyServiceType");
398         assertEquals(header.getValue().getServiceType().getVersion(), 1);
399         assertEquals(header.getValue().getActionName(), "MyAction");
400         assertEquals(header.getString(), "\"urn:schemas-upnp-org:service:MyServiceType:1#MyAction\"");
401 
402     }
403 
404     @Test
405     public void parseSoapActionHeaderString() {
406         SoapActionHeader header = new SoapActionHeader();
407         header.setString("\"urn:schemas-upnp-org:service:MyServiceType:1#MyAction\"");
408         assertEquals(header.getValue().getServiceType().getNamespace(), "schemas-upnp-org");
409         assertEquals(header.getValue().getServiceType().getType(), "MyServiceType");
410         assertEquals(header.getValue().getServiceType().getVersion(), 1);
411         assertEquals(header.getValue().getActionName(), "MyAction");
412         assertEquals(header.getString(), "\"urn:schemas-upnp-org:service:MyServiceType:1#MyAction\"");
413     }
414 
415     @Test
416     public void parseSoapActionHeaderQueryString() {
417         SoapActionHeader header = new SoapActionHeader();
418         header.setString("\"urn:schemas-upnp-org:control-1-0#QueryStateVariable\"");
419         assertEquals(header.getValue().getServiceType(), null);
420         assertEquals(header.getValue().getType(), "control-1-0");
421         assertEquals(header.getValue().getVersion(), null);
422         assertEquals(header.getValue().getActionName(), "QueryStateVariable");
423         assertEquals(header.getString(), "\"urn:schemas-upnp-org:control-1-0#QueryStateVariable\"");
424     }
425 
426     @Test
427     public void parseEventSequenceHeaderString() {
428         EventSequenceHeader header = new EventSequenceHeader();
429         header.setString("0");
430         assertEquals(header.getValue().getValue(), Long.valueOf(0));
431         header.setString("001");
432         assertEquals(header.getValue().getValue(), Long.valueOf(1));
433         header.setString("123");
434         assertEquals(header.getValue().getValue(), Long.valueOf(123));
435 
436     }
437 
438     @Test
439     public void parseTimeoutHeaderString() {
440         TimeoutHeader header = new TimeoutHeader();
441         header.setString("Second-123");
442         assertEquals(header.getValue(), Integer.valueOf(123));
443         header.setString("Second-infinite");
444         assertEquals(header.getValue(), TimeoutHeader.INFINITE_VALUE);
445     }
446 
447     @Test
448     public void parseCallbackHeaderString() {
449         CallbackHeader header = new CallbackHeader();
450         header.setString("<http://127.0.0.1/foo>");
451         assertEquals(header.getValue().size(), 1);
452         assertEquals(header.getValue().get(0).toString(), "http://127.0.0.1/foo");
453 
454         header.setString("<http://127.0.0.1/foo><http://127.0.0.1/bar>");
455         assertEquals(header.getValue().size(), 2);
456         assertEquals(header.getValue().get(0).toString(), "http://127.0.0.1/foo");
457         assertEquals(header.getValue().get(1).toString(), "http://127.0.0.1/bar");
458 
459         header.setString("<http://127.0.0.1/foo> <http://127.0.0.1/bar>");
460         assertEquals(header.getValue().size(), 2);
461         assertEquals(header.getValue().get(0).toString(), "http://127.0.0.1/foo");
462         assertEquals(header.getValue().get(1).toString(), "http://127.0.0.1/bar");
463     }
464 
465     @Test
466     public void parseInvalidCallbackHeaderString() {
467         CallbackHeader header = new CallbackHeader();
468         header.setString("<http://127.0.0.1/foo> <ftp://127.0.0.1/bar>");
469         assertEquals(header.getValue().size(), 1);
470         assertEquals(header.getValue().get(0).toString(), "http://127.0.0.1/foo");
471 
472         /* TODO: I'm having trouble finding a valid URL that is
473            an invalid URI in the standard JDK...
474         header.setString("<http://127.0.0.1/foo> <http://we_need_a_valid_URL_but_invalid_URI>");
475         assertEquals(header.getValue().size(), 1);
476         assertEquals(header.getValue().get(0).toString(), "http://127.0.0.1/foo");
477         */
478     }
479 
480     @Test
481     public void parseSubscriptionIdHeaderString() {
482         SubscriptionIdHeader header = new SubscriptionIdHeader();
483         header.setString("uuid:123-123-123-123");
484         assertEquals(header.getValue(), "uuid:123-123-123-123");
485     }
486 
487     @Test(expectedExceptions = InvalidHeaderException.class)
488     public void parseInvalidSubscriptionIdHeaderString() {
489         SubscriptionIdHeader header = new SubscriptionIdHeader();
490         header.setString("abc:123-123-123-123");
491     }
492 
493     @Test
494     public void parseInterfaceMacAddress() {
495         InterfaceMacHeader header = new InterfaceMacHeader("00:17:ab:e9:65:a0");
496         assertEquals(header.getValue().length, 6);
497         assertEquals(header.getString().toUpperCase(Locale.ROOT), "00:17:AB:E9:65:A0");
498     }
499 
500     @Test
501     public void parseRange() {
502         RangeHeader header = new RangeHeader("bytes=1539686400-1540210688");
503         assertEquals(header.getValue().getFirstByte(),new Long(1539686400));
504         assertEquals(header.getValue().getLastByte(), new Long(1540210688));
505         assertEquals(header.getString(), "bytes=1539686400-1540210688");
506     }
507     
508     @Test
509     public void parseContentRange() {
510         ContentRangeHeader header = new ContentRangeHeader("bytes 1539686400-1540210688/21323123");
511         assertEquals(header.getValue().getFirstByte(),new Long(1539686400));
512         assertEquals(header.getValue().getLastByte(), new Long(1540210688));
513         assertEquals(header.getValue().getByteLength(), new Long(21323123));
514         assertEquals(header.getString(), "bytes 1539686400-1540210688/21323123");
515     }
516     
517     @Test
518     public void parsePragma() {
519         PragmaHeader header = new PragmaHeader("no-cache");
520         assertEquals(header.getValue().getValue(),"no-cache");
521         assertEquals(header.getString(), "no-cache");
522         
523         header.setString("token=value");
524         assertEquals(header.getValue().getToken(),"token");
525         assertEquals(header.getValue().getValue(),"value");
526         assertEquals(header.getString(), "token=value");
527         
528         header.setString("token=\"value\"");
529         assertEquals(header.getValue().getToken(),"token");
530         assertEquals(header.getValue().getValue(),"value");
531         assertEquals(header.getString(), "token=\"value\"");
532     }
533 }