33import android .util .Log ;
44
55import com .smartdevicelink .protocol .SdlPacket ;
6+ import com .smartdevicelink .protocol .SdlPacketFactory ;
67import com .smartdevicelink .protocol .SdlProtocol ;
8+ import com .smartdevicelink .protocol .enums .ControlFrameTags ;
9+ import com .smartdevicelink .protocol .enums .SessionType ;
710import com .smartdevicelink .test .TestValues ;
811import com .smartdevicelink .transport .SdlPsm ;
912
1013import junit .framework .TestCase ;
1114
15+ import org .junit .Assert ;
16+
1217import java .lang .reflect .Field ;
1318import java .lang .reflect .Method ;
1419
1823 */
1924public class SdlPsmTests extends TestCase {
2025 private static final String TAG = "SdlPsmTests" ;
21- private static final int MAX_DATA_LENGTH = SdlProtocol .V1_V2_MTU_SIZE - SdlProtocol .V1_HEADER_SIZE ;
26+ private static final int MAX_DATA_LENGTH_V1 = SdlProtocol .V1_V2_MTU_SIZE - SdlProtocol .V1_HEADER_SIZE ;
27+ private static final int MAX_DATA_LENGTH_V2 = SdlProtocol .V1_V2_MTU_SIZE - SdlProtocol .V2_HEADER_SIZE ;
2228 SdlPsm sdlPsm ;
2329 Field frameType , dataLength , version , controlFrameInfo ;
2430 Method transitionOnInput ;
2531 byte rawByte = (byte ) 0x0 ;
2632
33+ SdlPacket startServiceACK ;
34+
2735 protected void setUp () throws Exception {
2836 super .setUp ();
2937 sdlPsm = new SdlPsm ();
@@ -38,37 +46,91 @@ protected void setUp() throws Exception {
3846 dataLength .setAccessible (true );
3947 version .setAccessible (true );
4048 controlFrameInfo .setAccessible (true );
49+
50+ startServiceACK = SdlPacketFactory .createStartSessionACK (SessionType .RPC , (byte ) 0x01 , (byte ) 0x05 , (byte ) 0x05 );
51+ startServiceACK .putTag (ControlFrameTags .RPC .StartServiceACK .HASH_ID , "3bb34978fe3a" );
52+ startServiceACK .putTag (ControlFrameTags .RPC .StartServiceACK .MTU , "150000" );
53+ startServiceACK .putTag (ControlFrameTags .RPC .StartServiceACK .PROTOCOL_VERSION , "5.1.0" );
4154 }
4255
4356
57+ public void testHappyPath () {
58+
59+
60+ byte [] packetBytes = startServiceACK .constructPacket ();
61+
62+ SdlPsm sdlPsm = new SdlPsm ();
63+ boolean didTransition = false ;
64+
65+ for (byte packetByte : packetBytes ) {
66+ didTransition = sdlPsm .handleByte (packetByte );
67+ assertTrue (didTransition );
68+ }
69+
70+ assertEquals (SdlPsm .FINISHED_STATE , sdlPsm .getState ());
71+ SdlPacket parsedPacket = sdlPsm .getFormedPacket ();
72+ assertNotNull (parsedPacket );
73+
74+ assertEquals (startServiceACK .getVersion (), parsedPacket .getVersion ());
75+ assertEquals (startServiceACK .getServiceType (), parsedPacket .getServiceType ());
76+ assertEquals (startServiceACK .getFrameInfo (), parsedPacket .getFrameInfo ());
77+ assertEquals (startServiceACK .getFrameType (), parsedPacket .getFrameType ());
78+ assertEquals (startServiceACK .getDataSize (), parsedPacket .getDataSize ());
79+ assertEquals (startServiceACK .getMessageId (), parsedPacket .getMessageId ());
80+
81+ assertTrue (startServiceACK .getTag (ControlFrameTags .RPC .StartServiceACK .HASH_ID ).equals (parsedPacket .getTag (ControlFrameTags .RPC .StartServiceACK .HASH_ID )));
82+ assertTrue (startServiceACK .getTag (ControlFrameTags .RPC .StartServiceACK .MTU ).equals (parsedPacket .getTag (ControlFrameTags .RPC .StartServiceACK .MTU )));
83+ assertTrue (startServiceACK .getTag (ControlFrameTags .RPC .StartServiceACK .PROTOCOL_VERSION ).equals (parsedPacket .getTag (ControlFrameTags .RPC .StartServiceACK .PROTOCOL_VERSION )));
84+
85+ }
86+
4487 public void testGarbledControlFrame () {
4588 try {
4689 rawByte = 0x0 ;
4790 version .set (sdlPsm , 1 );
4891 controlFrameInfo .set (sdlPsm , SdlPacket .FRAME_INFO_START_SERVICE );
4992 frameType .set (sdlPsm , SdlPacket .FRAME_TYPE_CONTROL );
5093
51- dataLength .set (sdlPsm , MAX_DATA_LENGTH + 1 );
94+ dataLength .set (sdlPsm , MAX_DATA_LENGTH_V1 + 1 );
5295 int STATE = (Integer ) transitionOnInput .invoke (sdlPsm , rawByte , SdlPsm .DATA_SIZE_4_STATE );
5396
5497 assertEquals (TestValues .MATCH , SdlPsm .ERROR_STATE , STATE );
5598 } catch (Exception e ) {
99+ Assert .fail (e .toString ());
56100 Log .e (TAG , e .toString ());
57101 }
58102 }
59103
60- public void testMaximumControlFrame () {
104+ public void testMaximumControlFrameForVersion1 () {
61105 try {
62106 rawByte = 0x0 ;
63107 version .set (sdlPsm , 1 );
64108 controlFrameInfo .set (sdlPsm , SdlPacket .FRAME_INFO_START_SERVICE );
65109 frameType .set (sdlPsm , SdlPacket .FRAME_TYPE_CONTROL );
66110
67- dataLength .set (sdlPsm , MAX_DATA_LENGTH );
111+ dataLength .set (sdlPsm , MAX_DATA_LENGTH_V1 );
68112 int STATE = (Integer ) transitionOnInput .invoke (sdlPsm , rawByte , SdlPsm .DATA_SIZE_4_STATE );
69113
70114 assertEquals (TestValues .MATCH , SdlPsm .DATA_PUMP_STATE , STATE );
71115 } catch (Exception e ) {
116+ Assert .fail (e .toString ());
117+ Log .e (TAG , e .toString ());
118+ }
119+ }
120+
121+ public void testMaximumControlFrameForVersion2Plus () {
122+ try {
123+ rawByte = 0x0 ;
124+ version .set (sdlPsm , 2 );
125+ controlFrameInfo .set (sdlPsm , SdlPacket .FRAME_INFO_START_SERVICE );
126+ frameType .set (sdlPsm , SdlPacket .FRAME_TYPE_CONTROL );
127+
128+ dataLength .set (sdlPsm , MAX_DATA_LENGTH_V2 );
129+ int STATE = (Integer ) transitionOnInput .invoke (sdlPsm , rawByte , SdlPsm .DATA_SIZE_4_STATE );
130+
131+ assertEquals (TestValues .MATCH , SdlPsm .MESSAGE_1_STATE , STATE );
132+ } catch (Exception e ) {
133+ Assert .fail (e .toString ());
72134 Log .e (TAG , e .toString ());
73135 }
74136 }
@@ -80,14 +142,117 @@ public void testOutOfMemoryDS4() {
80142 frameType .set (sdlPsm , SdlPacket .FRAME_TYPE_SINGLE );
81143
82144 dataLength .set (sdlPsm , 2147483647 );
83- int STATE = (Integer ) transitionOnInput .invoke (sdlPsm , rawByte , SdlPsm .DATA_SIZE_4_STATE );
145+ int STATE = (Integer ) transitionOnInput .invoke (sdlPsm , rawByte , SdlPsm .MESSAGE_4_STATE );
84146
85147 assertEquals (TestValues .MATCH , SdlPsm .ERROR_STATE , STATE );
86148 } catch (Exception e ) {
149+ Assert .fail (e .toString ());
87150 Log .e (TAG , e .toString ());
88151 }
89152 }
90153
154+ public void testNegativeDataSize () {
155+ byte [] packetBytes = startServiceACK .constructPacket ();
156+
157+ SdlPsm sdlPsm = new SdlPsm ();
158+ boolean didTransition = false ;
159+
160+ for (byte packetByte : packetBytes ) {
161+ int state = sdlPsm .getState ();
162+ switch (state ) {
163+ case SdlPsm .MESSAGE_4_STATE :
164+ didTransition = sdlPsm .handleByte (packetByte );
165+ assertFalse (didTransition );
166+ assertEquals (SdlPsm .ERROR_STATE , sdlPsm .getState ());
167+ return ;
168+ case SdlPsm .DATA_SIZE_1_STATE :
169+ case SdlPsm .DATA_SIZE_2_STATE :
170+ case SdlPsm .DATA_SIZE_3_STATE :
171+ case SdlPsm .DATA_SIZE_4_STATE :
172+ didTransition = sdlPsm .handleByte ((byte ) 0xFF );
173+ assertTrue (didTransition );
174+ break ;
175+ default :
176+ didTransition = sdlPsm .handleByte (packetByte );
177+ assertTrue (didTransition );
178+ }
179+ }
180+ }
181+
182+ public void testIncorrectVersion () {
183+ SdlPacket startServiceACK = SdlPacketFactory .createStartSessionACK (SessionType .RPC , (byte ) 0x01 , (byte ) 0x05 , (byte ) 0x06 );
184+ startServiceACK .putTag (ControlFrameTags .RPC .StartServiceACK .HASH_ID , "3bb34978fe3a" );
185+ startServiceACK .putTag (ControlFrameTags .RPC .StartServiceACK .MTU , "150000" );
186+ startServiceACK .putTag (ControlFrameTags .RPC .StartServiceACK .PROTOCOL_VERSION , "5.1.0" );
187+ byte [] packetBytes = startServiceACK .constructPacket ();
188+
189+ SdlPsm sdlPsm = new SdlPsm ();
190+ boolean didTransition = sdlPsm .handleByte (packetBytes [0 ]);
191+ assertFalse (didTransition );
192+ }
193+
194+ public void testIncorrectService () {
195+
196+ byte [] packetBytes = startServiceACK .constructPacket ();
197+
198+ SdlPsm sdlPsm = new SdlPsm ();
199+ boolean didTransition = false ;
200+
201+ for (byte packetByte : packetBytes ) {
202+ int state = sdlPsm .getState ();
203+ switch (state ) {
204+ case SdlPsm .SERVICE_TYPE_STATE :
205+ didTransition = sdlPsm .handleByte ((byte ) 0xFF );
206+ assertFalse (didTransition );
207+ assertEquals (SdlPsm .ERROR_STATE , sdlPsm .getState ());
208+ return ;
209+ default :
210+ didTransition = sdlPsm .handleByte (packetByte );
211+ assertTrue (didTransition );
212+ }
213+ }
214+ }
215+
216+ public void testRecovery () {
217+ byte [] packetBytes = startServiceACK .constructPacket ();
218+ byte [] processingBytes = new byte [packetBytes .length + 15 ];
219+
220+ System .arraycopy (packetBytes , 10 , processingBytes , 0 , 15 );
221+ System .arraycopy (packetBytes , 0 , processingBytes , 15 , packetBytes .length );
222+
223+
224+ SdlPsm sdlPsm = new SdlPsm ();
225+ boolean didTransition = false ;
226+ byte packetByte ;
227+ int state = SdlPsm .START_STATE , i = 0 , limit = 0 ;
228+
229+ while (state != SdlPsm .FINISHED_STATE && limit < 10 ) {
230+
231+ packetByte = processingBytes [i ];
232+ didTransition = sdlPsm .handleByte (packetByte );
233+ state = sdlPsm .getState ();
234+ if (!didTransition ) {
235+ assertEquals (SdlPsm .ERROR_STATE , state );
236+ sdlPsm .reset ();
237+ } else if (state == SdlPsm .FINISHED_STATE ) {
238+ break ;
239+ }
240+
241+ if (i == processingBytes .length - 1 ) {
242+ i = 0 ;
243+ limit ++;
244+ } else {
245+ i ++;
246+ }
247+ }
248+
249+ assertEquals (SdlPsm .FINISHED_STATE , sdlPsm .getState ());
250+ SdlPacket parsedPacket = sdlPsm .getFormedPacket ();
251+ assertNotNull (parsedPacket );
252+
253+ }
254+
255+
91256 protected void tearDown () throws Exception {
92257 super .tearDown ();
93258 }
0 commit comments