1010 import StringIO .StringIO as BytesIO
1111
1212# local
13- import xmodem
13+ from xmodem import XMODEM
14+ from xmodem import NAK , CRC , ACK
1415
1516# 3rd-party
1617import pytest
@@ -24,24 +25,83 @@ def dummy_putc(data, timeout=1):
2425 return 0
2526
2627
28+ def test_xmodem_bad_mode ():
29+ # given,
30+ mode = 'XXX'
31+ modem = XMODEM (getc = dummy_getc , putc = dummy_putc , mode = mode )
32+ # exercise
33+ with pytest .raises (ValueError ):
34+ status = modem .send (BytesIO (b'dummy-stream' ))
35+
36+
2737@pytest .mark .parametrize ('mode' , ['xmodem' , 'xmodem1k' ])
2838def test_xmodem_dummy_fails_send (mode ):
2939 # given,
30- modem = xmodem .XMODEM (getc = dummy_getc ,
31- putc = dummy_putc ,
32- mode = mode )
40+ modem = XMODEM (getc = dummy_getc , putc = dummy_putc , mode = mode )
3341 # exercise
3442 status = modem .send (BytesIO (b'dummy-stream' ))
3543 # verify
3644 assert not status , ("Expected value of status `False'" )
3745
3846
39- def test_xmodem_bad_mode ():
47+ @pytest .mark .parametrize ('mode' , ['xmodem' , 'xmodem1k' ])
48+ @pytest .mark .parametrize ('stream_data' , [BytesIO (b'dummy-stream ' * 17 ),
49+ BytesIO (b'dummy-stream ' * 1000 )])
50+ def test_xmodem_send_exceed_maximum_number_of_resend (mode , stream_data ):
4051 # given,
41- mode = 'XXX'
42- modem = xmodem .XMODEM (getc = dummy_getc ,
43- putc = dummy_putc ,
44- mode = mode )
52+ max_resend = 16
53+
54+ def generator ():
55+ if mode == 'xmodem' :
56+ yield NAK
57+ else :
58+ yield CRC
59+
60+ if mode == 'xmodem' :
61+ yield ACK
62+
63+ for i in range (max_resend + 1 ):
64+ yield None
65+
66+ mock = generator ()
67+
68+ def getc (size , timeout = 1 ):
69+ x = mock .next ()
70+ print ("mock_getc => {}" .format (x ),)
71+ return x
72+
73+ xmodem = XMODEM (getc = getc , putc = dummy_putc , mode = mode )
4574 # exercise
46- with pytest .raises (ValueError ):
47- status = modem .send (BytesIO (b'dummy-stream' ))
75+ assert not xmodem .send (stream = stream_data , retry = max_resend )
76+
77+
78+ @pytest .mark .parametrize ('mode' , ['xmodem' , 'xmodem1k' ])
79+ @pytest .mark .parametrize ('stream_data' , [BytesIO (b'dummy-stream ' * 17 ),
80+ BytesIO (b'dummy-stream ' * 1000 )])
81+ def test_xmodem_send_fails_once_each_packet (mode , stream_data ):
82+ # given,
83+ max_resend = 16
84+
85+ def generator ():
86+ if mode == 'xmodem' :
87+ yield NAK
88+ else :
89+ yield CRC
90+
91+ while True :
92+ yield None
93+ yield ACK
94+
95+ mock = generator ()
96+
97+ def getc (size , timeout = 1 ):
98+ x = mock .next ()
99+ print ("mock_getc => {}" .format (x ))
100+ return x
101+
102+ def putc (data , timeout = 1 ):
103+ return 0
104+
105+ xmodem = XMODEM (getc = getc , putc = dummy_putc , mode = mode )
106+ # exercise
107+ assert xmodem .send (stream = stream_data , retry = max_resend )
0 commit comments