Skip to content

Commit dc00598

Browse files
author
Francesco Fiorentino
committed
Add unit test for retry parameter in send() method
1 parent 437d4f8 commit dc00598

File tree

2 files changed

+88
-12
lines changed

2 files changed

+88
-12
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@
66
/xmodem.egg-info
77
/.coverage
88
/.tox
9+
/.cache
10+
/.idea
911
*.py.swp

test/unit/test_xmodem.py

+86-12
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
from io import BytesIO
88
except ImportError:
99
# python 2
10-
import StringIO.StringIO as BytesIO
10+
from StringIO import StringIO as BytesIO
1111

1212
# local
13-
import xmodem
13+
from xmodem import NAK
14+
from xmodem import CRC
15+
from xmodem import ACK
16+
from xmodem import XMODEM
1417

1518
# 3rd-party
1619
import pytest
@@ -24,24 +27,95 @@ def dummy_putc(data, timeout=1):
2427
return 0
2528

2629

30+
def test_xmodem_bad_mode():
31+
# given,
32+
mode = 'XXX'
33+
modem = XMODEM(getc=dummy_getc, putc=dummy_putc, mode=mode)
34+
# exercise
35+
with pytest.raises(ValueError):
36+
status = modem.send(BytesIO(b'dummy-stream'))
37+
38+
2739
@pytest.mark.parametrize('mode', ['xmodem', 'xmodem1k'])
2840
def test_xmodem_dummy_fails_send(mode):
2941
# given,
30-
modem = xmodem.XMODEM(getc=dummy_getc,
31-
putc=dummy_putc,
32-
mode=mode)
42+
modem = XMODEM(getc=dummy_getc, putc=dummy_putc, mode=mode)
3343
# exercise
3444
status = modem.send(BytesIO(b'dummy-stream'))
3545
# verify
3646
assert not status, ("Expected value of status `False'")
3747

3848

39-
def test_xmodem_bad_mode():
49+
@pytest.mark.parametrize('mode', ['xmodem', 'xmodem1k'])
50+
@pytest.mark.parametrize('stream_data', [BytesIO(b'dummy-stream ' * 17),
51+
BytesIO(b'dummy-stream ' * 1000)])
52+
def test_xmodem_send_exceed_maximum_number_of_resend(mode, stream_data):
53+
""" XMODEM has retry parameter this function ensure that xmodem.send() will
54+
return False dude to the fact that resend exceeded """
4055
# given,
41-
mode = 'XXX'
42-
modem = xmodem.XMODEM(getc=dummy_getc,
43-
putc=dummy_putc,
44-
mode=mode)
56+
max_resend = 16
57+
58+
def generator():
59+
if mode == 'xmodem':
60+
yield NAK
61+
else:
62+
yield CRC
63+
64+
if mode == 'xmodem':
65+
yield ACK
66+
67+
for i in range(max_resend + 1):
68+
yield None
69+
70+
while True:
71+
yield ACK
72+
73+
mock = generator()
74+
75+
def mock_getc(size, timeout=1):
76+
try:
77+
# python 2
78+
x = mock.next()
79+
except AttributeError:
80+
# python 3
81+
x = next(mock)
82+
return x
83+
84+
xmodem = XMODEM(getc=mock_getc, putc=dummy_putc, mode=mode)
4585
# exercise
46-
with pytest.raises(ValueError):
47-
status = modem.send(BytesIO(b'dummy-stream'))
86+
assert not xmodem.send(stream=stream_data, retry=max_resend)
87+
88+
89+
@pytest.mark.parametrize('mode', ['xmodem', 'xmodem1k'])
90+
@pytest.mark.parametrize('stream_data', [BytesIO(b'dummy-stream ' * 17),
91+
BytesIO(b'dummy-stream ' * 1000)])
92+
def test_xmodem_send_fails_once_each_packet(mode, stream_data):
93+
""" XMODEM has retry parameter this test ensure that the number of retry for
94+
the whole stream_data will be higher the max_resend pro packet """
95+
# given,
96+
max_resend = 16
97+
98+
def generator():
99+
if mode == 'xmodem':
100+
yield NAK
101+
else:
102+
yield CRC
103+
104+
while True:
105+
yield None
106+
yield ACK
107+
108+
mock = generator()
109+
110+
def mock_getc(size, timeout=1):
111+
try:
112+
# python 2
113+
x = mock.next()
114+
except AttributeError:
115+
# python 3
116+
x = next(mock)
117+
return x
118+
119+
xmodem = XMODEM(getc=mock_getc, putc=dummy_putc, mode=mode)
120+
# exercise
121+
assert xmodem.send(stream=stream_data, retry=max_resend)

0 commit comments

Comments
 (0)