77 from io import BytesIO
88except 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
1619import 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' ])
2840def 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