Skip to content

Commit 62880ef

Browse files
committed
Finished code and tests.
1 parent eff89d9 commit 62880ef

File tree

5 files changed

+426
-122
lines changed

5 files changed

+426
-122
lines changed

tests/__init__.py

Whitespace-only changes.

tests/test_tinylink.py

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
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

Comments
 (0)