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.support.test.model.dlna;
17  
18  import org.fourthline.cling.support.model.dlna.message.header.BufferInfoHeader;
19  import org.fourthline.cling.support.model.dlna.message.header.SupportedHeader;
20  import org.fourthline.cling.support.model.dlna.message.header.EventTypeHeader;
21  import org.fourthline.cling.support.model.dlna.message.header.MaxPrateHeader;
22  import org.fourthline.cling.support.model.dlna.message.header.WCTHeader;
23  import org.fourthline.cling.support.model.dlna.message.header.ScmsFlagHeader;
24  import org.fourthline.cling.support.model.dlna.message.header.RealTimeInfoHeader;
25  import org.fourthline.cling.support.model.dlna.message.header.PeerManagerHeader;
26  import org.fourthline.cling.support.model.dlna.message.header.TransferModeHeader;
27  import java.util.EnumSet;
28  import org.fourthline.cling.support.avtransport.lastchange.AVTransportVariable.TransportPlaySpeed;
29  import org.fourthline.cling.support.model.dlna.DLNAAttribute.Type;
30  import org.fourthline.cling.support.model.dlna.DLNAConversionIndicator;
31  import org.fourthline.cling.support.model.dlna.DLNAFlags;
32  import org.fourthline.cling.support.model.dlna.DLNAProfiles;
33  import org.fourthline.cling.support.model.dlna.message.header.ContentFeaturesHeader;
34  import org.fourthline.cling.support.model.dlna.message.header.GetContentFeaturesHeader;
35  import org.fourthline.cling.support.model.dlna.message.header.GetAvailableSeekRangeHeader;
36  import org.fourthline.cling.support.model.dlna.types.AvailableSeekRangeType;
37  import org.fourthline.cling.support.model.dlna.message.header.AvailableSeekRangeHeader;
38  import org.fourthline.cling.support.model.dlna.message.header.PlaySpeedHeader;
39  import org.fourthline.cling.model.message.header.InvalidHeaderException;
40  import org.fourthline.cling.support.model.dlna.message.header.TimeSeekRangeHeader;
41  import org.fourthline.cling.support.model.dlna.types.CodedDataBuffer.TransferMechanism;
42  import org.testng.annotations.Test;
43  
44  import static org.testng.Assert.assertEquals;
45  
46  
47  public class DLNAHeaderParsingTest {
48  
49      @Test
50      public void parseTimeSeekRangeHeader() {
51          TimeSeekRangeHeader header = new TimeSeekRangeHeader();
52          header.setString("npt=335.11-336.08");
53          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeStart().getMilliseconds(),335110);
54          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeEnd().getMilliseconds(),336080);
55          assertEquals(header.getString(), "npt=335.110-336.080/*");
56          
57          header.setString("npt=00:05:35.3-00:05:37.5");
58          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeStart().getMilliseconds(),335300);
59          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeEnd().getMilliseconds(),337500);
60          assertEquals(header.getString(), "npt=335.300-337.500/*");
61          
62          header.setString("npt=335.1-336.1/40445.4");
63          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeStart().getMilliseconds(),335100);
64          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeEnd().getMilliseconds(),336100);
65          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeDuration().getMilliseconds(),40445400);
66          assertEquals(header.getString(), "npt=335.100-336.100/40445.400");
67          
68          header.setString("npt=335.1-336.1/*");
69          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeStart().getMilliseconds(),335100);
70          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeEnd().getMilliseconds(),336100);
71          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeDuration(), null);
72          assertEquals(header.getString(), "npt=335.100-336.100/*");
73          
74          
75          header.setString("npt=335.1-336.1/40445.4 bytes=1539686400-1540210688/304857907200");
76          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeStart().getMilliseconds(),335100);
77          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeEnd().getMilliseconds(),336100);
78          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeDuration().getMilliseconds(), 40445400);
79          assertEquals(header.getValue().getBytesRange().getFirstByte(),new Long(1539686400));
80          assertEquals(header.getValue().getBytesRange().getLastByte(), new Long(1540210688));
81          assertEquals(header.getValue().getBytesRange().getByteLength(), new Long(304857907200L));
82          assertEquals(header.getString(), "npt=335.100-336.100/40445.400 bytes=1539686400-1540210688/304857907200");
83          
84          header.setString("npt=335.1-336.1/40445.4 bytes=1539686400-1540210688/*");
85          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeStart().getMilliseconds(),335100);
86          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeEnd().getMilliseconds(),336100);
87          assertEquals(header.getValue().getNormalPlayTimeRange().getTimeDuration().getMilliseconds(), 40445400);
88          assertEquals(header.getValue().getBytesRange().getFirstByte(),new Long(1539686400));
89          assertEquals(header.getValue().getBytesRange().getLastByte(), new Long(1540210688));
90          assertEquals(header.getValue().getBytesRange().getByteLength(), null);
91          assertEquals(header.getString(), "npt=335.100-336.100/40445.400 bytes=1539686400-1540210688/*");
92      }
93  
94  
95      @Test(expectedExceptions = InvalidHeaderException.class)
96      public void parseInvalidTimeSeekRangeHeader() {
97          TimeSeekRangeHeader header = new TimeSeekRangeHeader();
98          header.setString("npt=335.1111-336.08");
99      }
100 
101     @Test
102     public void parsePlaySpeedHeader() {
103         PlaySpeedHeader header = new PlaySpeedHeader();
104         
105         header.setString("10");
106         assertEquals(header.getValue().getValue(),"10");
107         assertEquals(header.getString(), "10");
108         
109         header.setString("-10");
110         assertEquals(header.getValue().getValue(),"-10");
111         assertEquals(header.getString(), "-10");
112         
113         header.setString("-1/10");
114         assertEquals(header.getValue().getValue(),"-1/10");
115         assertEquals(header.getString(), "-1/10");
116     }
117     
118     @Test(expectedExceptions = InvalidHeaderException.class)
119     public void parseInvalidPlaySpeedHeader() {
120         PlaySpeedHeader header = new PlaySpeedHeader();
121         header.setString("2.1");
122     }
123     
124     @Test
125     public void parseAvailableSeekRangeHeader() {
126         AvailableSeekRangeHeader header = new AvailableSeekRangeHeader();
127         
128         header.setString("1 npt=335.1-336.1 bytes=1539686400-1540210688");
129         assertEquals(header.getValue().getModeFlag(),AvailableSeekRangeType.Mode.MODE_1);
130         assertEquals(header.getValue().getNormalPlayTimeRange().getTimeStart().getMilliseconds(),335100);
131         assertEquals(header.getValue().getNormalPlayTimeRange().getTimeEnd().getMilliseconds(),336100);
132         assertEquals(header.getValue().getBytesRange().getFirstByte(),new Long(1539686400));
133         assertEquals(header.getValue().getBytesRange().getLastByte(), new Long(1540210688));
134         assertEquals(header.getString(), "1 npt=335.100-336.100 bytes=1539686400-1540210688");
135         
136         header.setString("0 npt=335.1-336.1");
137         assertEquals(header.getValue().getModeFlag(),AvailableSeekRangeType.Mode.MODE_0);
138         assertEquals(header.getValue().getNormalPlayTimeRange().getTimeStart().getMilliseconds(),335100);
139         assertEquals(header.getValue().getNormalPlayTimeRange().getTimeEnd().getMilliseconds(),336100);
140         assertEquals(header.getString(), "0 npt=335.100-336.100");
141         
142         header.setString("1 bytes=1539686400-1540210688");
143         assertEquals(header.getValue().getModeFlag(),AvailableSeekRangeType.Mode.MODE_1);
144         assertEquals(header.getValue().getBytesRange().getFirstByte(),new Long(1539686400));
145         assertEquals(header.getValue().getBytesRange().getLastByte(), new Long(1540210688));
146         assertEquals(header.getString(), "1 bytes=1539686400-1540210688");
147     }
148     
149     @Test(expectedExceptions = InvalidHeaderException.class)
150     public void parseInvalidAvailableSeekRangeHeader() {
151         AvailableSeekRangeHeader header = new AvailableSeekRangeHeader();
152         header.setString("1 npt=335.1-");
153     }
154     
155     @Test
156     public void parseGetAvailableSeekRangeHeader() {
157         GetAvailableSeekRangeHeader header = new GetAvailableSeekRangeHeader();
158         header.setString("1");
159         assertEquals(header.getValue().intValue(),1);
160         assertEquals(header.getString(), "1");
161     }
162     
163     @Test(expectedExceptions = InvalidHeaderException.class)
164     public void parseInvalidGetAvailableSeekRangeHeader() {
165         GetAvailableSeekRangeHeader header = new GetAvailableSeekRangeHeader();
166         header.setString("2");
167     }
168 
169     @Test
170     public void parseContentFeaturesHeader() {
171         ContentFeaturesHeader header = new ContentFeaturesHeader();
172         header.setString("DLNA.ORG_PN=JPEG_TN;DLNA.ORG_PS=-1,1/2,4;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000");
173 
174         EnumSet<DLNAFlags> dflags = (EnumSet<DLNAFlags>) header.getValue().get(Type.DLNA_ORG_FLAGS).getValue();
175         TransportPlaySpeed[] speeds = (TransportPlaySpeed[]) header.getValue().get(Type.DLNA_ORG_PS).getValue();
176         
177         assertEquals(header.getValue().get(Type.DLNA_ORG_PN).getValue(), DLNAProfiles.JPEG_TN);
178         assertEquals(header.getValue().get(Type.DLNA_ORG_CI).getValue(), DLNAConversionIndicator.TRANSCODED);
179         
180         assertEquals(speeds.length, 3);
181         assertEquals(speeds[0].getValue(),"-1");
182         assertEquals(speeds[1].getValue(),"1/2");
183         assertEquals(speeds[2].getValue(),"4");
184         
185         assertEquals(dflags.size(), 4);
186         assertEquals(dflags.contains(DLNAFlags.DLNA_V15), true);
187         assertEquals(dflags.contains(DLNAFlags.CONNECTION_STALL), true);
188         assertEquals(dflags.contains(DLNAFlags.RTSP_PAUSE), false);
189         
190         assertEquals(header.getString(), "DLNA.ORG_PN=JPEG_TN;DLNA.ORG_PS=-1,1/2,4;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000");
191     }
192 
193     @Test
194     public void parseGetContentFeaturesHeader() {
195         GetContentFeaturesHeader header = new GetContentFeaturesHeader();
196         header.setString("1");
197         assertEquals(header.getValue().intValue(),1);
198         assertEquals(header.getString(), "1");
199     }
200     
201     @Test(expectedExceptions = InvalidHeaderException.class)
202     public void parseInvalidGetContentFeaturesHeader() {
203         GetContentFeaturesHeader header = new GetContentFeaturesHeader();
204         header.setString("2");
205     }
206     
207     @Test
208     public void parseTransferModeHeader() {
209         TransferModeHeader header = new TransferModeHeader();
210         header.setString("Streaming");
211         assertEquals(header.getValue(),TransferModeHeader.Type.Streaming);
212         assertEquals(header.getString(), "Streaming");
213     }
214     
215     @Test(expectedExceptions = InvalidHeaderException.class)
216     public void parseInvalidTransferModeHeader() {
217         TransferModeHeader header = new TransferModeHeader();
218         header.setString("TEST");
219     }
220 
221     @Test
222     public void parsePeerManagerHeader() {
223         PeerManagerHeader header = new PeerManagerHeader();
224         header.setString("uuid:12345678123456781234567812345678/urn:schemas-upnp-org:serviceId:ConnectionManager");
225         assertEquals(header.getValue().getUdn().getIdentifierString(),"12345678123456781234567812345678");
226         assertEquals(header.getValue().getServiceId().getId(),"ConnectionManager");
227         assertEquals(header.getString(), "uuid:12345678123456781234567812345678/urn:schemas-upnp-org:serviceId:ConnectionManager");
228     }
229     
230     @Test
231     public void parseRealTimeInfoHeader() {
232         RealTimeInfoHeader header = new RealTimeInfoHeader();
233         
234         header.setString("DLNA.ORG_TLAG=1.75");
235         assertEquals(header.getValue().getMilliseconds(),1750);
236         assertEquals(header.getString(), "DLNA.ORG_TLAG=1.750");
237         
238         header.setString("DLNA.ORG_TLAG=*");
239         assertEquals(header.getValue(),null);
240         assertEquals(header.getString(), "DLNA.ORG_TLAG=*");
241         
242     }
243     
244     @Test(expectedExceptions = InvalidHeaderException.class)
245     public void parseInvalidRealTimeInfoHeader() {
246         RealTimeInfoHeader header = new RealTimeInfoHeader();
247         header.setString("DLNA.ORG_TLAG=1.7521");
248     }
249     
250     @Test
251     public void parseScmsFlagHeader() {
252         ScmsFlagHeader header = new ScmsFlagHeader();
253         
254         header.setString("00");
255         assertEquals(header.getValue().isCopyright(),true);
256         assertEquals(header.getValue().isOriginal(),true);
257         assertEquals(header.getString(), "00");
258         
259         header.setString("01");
260         assertEquals(header.getValue().isCopyright(),true);
261         assertEquals(header.getValue().isOriginal(),false);
262         assertEquals(header.getString(), "01");
263         
264         header.setString("10");
265         assertEquals(header.getValue().isCopyright(),false);
266         assertEquals(header.getValue().isOriginal(),true);
267         assertEquals(header.getString(), "10");
268 
269         header.setString("11");
270         assertEquals(header.getValue().isCopyright(),false);
271         assertEquals(header.getValue().isOriginal(),false);
272         assertEquals(header.getString(), "11");
273     }
274     
275     @Test(expectedExceptions = InvalidHeaderException.class)
276     public void parseInvalidScmsFlagHeader() {
277         ScmsFlagHeader header = new ScmsFlagHeader();
278         header.setString("2");
279     }
280     
281     @Test
282     public void parseWCTHeader() {
283         WCTHeader header = new WCTHeader();
284         
285         header.setString("0");
286         assertEquals(header.getValue().booleanValue(),false);
287         assertEquals(header.getString(), "0");
288         
289         header.setString("1");
290         assertEquals(header.getValue().booleanValue(),true);
291         assertEquals(header.getString(), "1");
292         
293     }
294     
295     @Test(expectedExceptions = InvalidHeaderException.class)
296     public void parseInvalidWCTHeader() {
297         WCTHeader header = new WCTHeader();
298         header.setString("2");
299     }
300 
301     @Test
302     public void parseMaxPrateHeader() {
303         MaxPrateHeader header = new MaxPrateHeader();
304         
305         header.setString("120");
306         assertEquals(header.getValue().longValue(),120);
307         assertEquals(header.getString(), "120");
308         
309     }
310     
311     @Test(expectedExceptions = InvalidHeaderException.class)
312     public void parseInvalidMaxPrateHeader() {
313         MaxPrateHeader header = new MaxPrateHeader();
314         header.setString("A");
315     }
316     
317     @Test
318     public void parseEventTypeHeader() {
319         EventTypeHeader header = new EventTypeHeader();
320         
321         header.setString("2000");
322         assertEquals(header.getValue(),"2000");
323         assertEquals(header.getString(), "2000");
324         
325     }
326     
327     @Test(expectedExceptions = InvalidHeaderException.class)
328     public void parseInvalidEventTypeHeader() {
329         EventTypeHeader header = new EventTypeHeader();
330         header.setString("001");
331     }
332     
333     @Test
334     public void parseSupportedHeader() {
335         SupportedHeader header = new SupportedHeader();
336         
337         header.setString("dlna.announce, rtsp.basic");
338         assertEquals(header.getValue().length,2);
339         assertEquals(header.getValue()[0],"dlna.announce");
340         assertEquals(header.getValue()[1],"rtsp.basic");
341         assertEquals(header.getString(), "dlna.announce,rtsp.basic;");
342         
343         header.setString("dlna.announce  , rtsp.basic;");
344         assertEquals(header.getValue().length,2);
345         assertEquals(header.getValue()[0],"dlna.announce");
346         assertEquals(header.getValue()[1],"rtsp.basic");
347         assertEquals(header.getString(), "dlna.announce,rtsp.basic;");
348     }
349     
350     @Test
351     public void parseBufferInfoHeader() {
352         BufferInfoHeader header = new BufferInfoHeader();
353         
354         header.setString("dejitter=65536;CDB=98302;BTM=0;TD=1000;BFR=1");
355         assertEquals(header.getValue().getDejitterSize().longValue(), 65536L);
356         assertEquals(header.getValue().getCdb().getSize().longValue(), 98302L);
357         assertEquals(header.getValue().getCdb().getTranfer(), TransferMechanism.IMMEDIATELY);
358         assertEquals(header.getValue().getTargetDuration().longValue(), 1000L);
359         assertEquals(header.getValue().isFullnessReports().booleanValue(), true);
360         assertEquals(header.getString(), "dejitter=65536;CDB=98302;BTM=0;TD=1000;BFR=1");
361         
362         header.setString("dejitter=65536;CDB=98302;BTM=0;TD=1000");
363         assertEquals(header.getValue().getDejitterSize().longValue(), 65536L);
364         assertEquals(header.getValue().getCdb().getSize().longValue(), 98302L);
365         assertEquals(header.getValue().getCdb().getTranfer(), TransferMechanism.IMMEDIATELY);
366         assertEquals(header.getValue().getTargetDuration().longValue(), 1000L);
367         assertEquals(header.getValue().isFullnessReports(), null);
368         assertEquals(header.getString(), "dejitter=65536;CDB=98302;BTM=0;TD=1000");
369         
370         header.setString("dejitter=65536;CDB=98302;BTM=0");
371         assertEquals(header.getValue().getDejitterSize().longValue(), 65536L);
372         assertEquals(header.getValue().getCdb().getSize().longValue(), 98302L);
373         assertEquals(header.getValue().getCdb().getTranfer(), TransferMechanism.IMMEDIATELY);
374         assertEquals(header.getValue().getTargetDuration(), null);
375         assertEquals(header.getValue().isFullnessReports(), null);
376         assertEquals(header.getString(), "dejitter=65536;CDB=98302;BTM=0");
377         
378         header.setString("dejitter=65536");
379         assertEquals(header.getValue().getDejitterSize().longValue(), 65536L);
380         assertEquals(header.getValue().getCdb(), null);
381         assertEquals(header.getValue().getTargetDuration(), null);
382         assertEquals(header.getValue().isFullnessReports(), null);
383         assertEquals(header.getString(), "dejitter=65536");
384     }
385     
386     @Test(expectedExceptions = InvalidHeaderException.class)
387     public void parseInvalidBufferInfoHeader() {
388         BufferInfoHeader header = new BufferInfoHeader();
389         header.setString("dejitter=65536;CDB=98302");
390     }
391 }