1+ import unittest
2+
3+ import tinylink
4+
5+ class DummyHandle (object ):
6+ """
7+ Dummy handler, so the TinyLink class can exchange data with itself.
8+ """
9+
10+ def __init__ (self ):
11+ self .buffer = bytearray ()
12+ self .index = 0
13+ self .length = 0
14+
15+ def send (self , data ):
16+ self .buffer .extend (data )
17+ self .length += len (data )
18+
19+ # Return number of bytes written
20+ return len (data )
21+
22+ def recv (self , count ):
23+ data = self .buffer [self .index :min (self .length , self .index + count )]
24+ self .index += len (data )
25+
26+ # Return data
27+ return data
28+
29+ class TinyLinkTest (unittest .TestCase ):
30+ """
31+ Test TinyLink
32+ """
33+
34+ def test_basic (self ):
35+ """
36+ Test send/receive by using a dummy handle.
37+ """
38+
39+ handle = DummyHandle ()
40+ link = tinylink .TinyLink (handle )
41+
42+ message = "Hello, this is a test"
43+ size = link .write (message )
44+
45+ self .assertEqual (size , tinylink .LEN_PREAMBLE + tinylink .LEN_HEADER +
46+ tinylink .LEN_BODY + len (message ))
47+
48+ # Read `size' bytes to receive the full frame, test it partially
49+ link .read (1 )
50+ link .read (1 )
51+ link .read (1 )
52+ frames = link .read (size - 3 )
53+
54+ self .assertEqual (len (frames ), 1 )
55+ self .assertEqual (frames [0 ].data , message )
56+
57+ def test_reset (self ):
58+ """
59+ Test reset feature.
60+ """
61+
62+ handle = DummyHandle ()
63+ link = tinylink .TinyLink (handle )
64+
65+ size = link .reset ()
66+ frames = link .read (size )
67+
68+ self .assertEqual (len (frames ), 1 )
69+ self .assertIsInstance (frames [0 ], tinylink .ResetFrame )
70+
71+ def test_multiple (self ):
72+ """
73+ Test multiple messages
74+ """
75+
76+ handle = DummyHandle ()
77+ link = tinylink .TinyLink (handle )
78+
79+ size = 0
80+
81+ for i in xrange (5 ):
82+ size += link .write (chr (97 + i ))
83+
84+ frames = link .read (size )
85+
86+ self .assertEqual (len (frames ), 5 )
87+
88+ for i in xrange (5 ):
89+ self .assertEqual (frames [i ].data , chr (97 + i ))
90+
91+ def test_sync (self ):
92+ """
93+ Test preamble synchronization.
94+ """
95+
96+ handle = DummyHandle ()
97+ link = tinylink .TinyLink (handle )
98+
99+ garbage = "Garbage here that doesn't synchronize."
100+ message = "Hi!"
101+
102+ size = handle .send (garbage ) + link .write (message )
103+ frames = link .read (size )
104+
105+ self .assertEqual (len (frames ), 1 )
106+ self .assertEqual (frames [0 ].data , message )
107+
108+ def test_sync_small (self ):
109+ """
110+ Test preamble synchronization with smaller buffer.
111+ """
112+
113+ handle = DummyHandle ()
114+ link = tinylink .TinyLink (handle , max_length = 4 )
115+
116+ garbage = "Garbage here that doesn't synchronize."
117+ message = "Hi!"
118+
119+ size = handle .send (garbage ) + link .write (message )
120+ frames = link .read (size )
121+
122+ self .assertEqual (len (frames ), 1 )
123+ self .assertEqual (frames [0 ].data , message )
124+
125+ def test_size_fit (self ):
126+ """
127+ Test smaller sized TinyLink that does fit.
128+ """
129+
130+ handle = DummyHandle ()
131+ link = tinylink .TinyLink (handle , max_length = 4 )
132+
133+ message = "blub"
134+
135+ size = link .write (message )
136+ frames = link .read (size )
137+
138+ self .assertEqual (len (frames ), 1 )
139+ self .assertEqual (frames [0 ].data , message )
140+
141+ def test_size_no_fit (self ):
142+ """
143+ Test smaller sized TinyLink that does not fit.
144+ """
145+
146+ handle = DummyHandle ()
147+ link = tinylink .TinyLink (handle , max_length = 2 )
148+
149+ message = "blub"
150+
151+ with self .assertRaises (ValueError ):
152+ size = link .write (message )
153+
154+ def test_damaged_a (self ):
155+ """
156+ Test damaged frame (in total) that will return a DamagedFrame.
157+ """
158+
159+ handle = DummyHandle ()
160+ link = tinylink .TinyLink (handle )
161+
162+ message = "Hello, this is a test"
163+
164+ size = link .write (message )
165+ handle .buffer [- tinylink .LEN_CRC :] = "\x00 " * tinylink .LEN_CRC
166+ frames = link .read (size )
167+
168+ self .assertEqual (len (frames ), 1 )
169+ self .assertEqual (frames [0 ].data , message )
170+ self .assertIsInstance (frames [0 ], tinylink .DamagedFrame )
171+
172+ def test_damaged_a (self ):
173+ """
174+ Test damaged frame (header) that won't return anything.
175+ """
176+
177+ handle = DummyHandle ()
178+ link = tinylink .TinyLink (handle )
179+
180+ message = "Hello, this is a test"
181+
182+ size = link .write (message )
183+ handle .buffer [tinylink .LEN_PREAMBLE + tinylink .LEN_HEADER - 1 ] = "\x00 "
184+ frames = link .read (size )
185+
186+ self .assertEqual (len (frames ), 0 )
0 commit comments