7
7
from io import BytesIO
8
8
except ImportError :
9
9
# python 2
10
- import StringIO . StringIO as BytesIO
10
+ from StringIO import StringIO as BytesIO
11
11
12
12
# local
13
- import xmodem
13
+ from xmodem import NAK
14
+ from xmodem import CRC
15
+ from xmodem import ACK
16
+ from xmodem import XMODEM
14
17
15
18
# 3rd-party
16
19
import pytest
@@ -24,24 +27,95 @@ def dummy_putc(data, timeout=1):
24
27
return 0
25
28
26
29
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
+
27
39
@pytest .mark .parametrize ('mode' , ['xmodem' , 'xmodem1k' ])
28
40
def test_xmodem_dummy_fails_send (mode ):
29
41
# 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 )
33
43
# exercise
34
44
status = modem .send (BytesIO (b'dummy-stream' ))
35
45
# verify
36
46
assert not status , ("Expected value of status `False'" )
37
47
38
48
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 """
40
55
# 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 )
45
85
# 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