Skip to content
This repository was archived by the owner on Apr 10, 2024. It is now read-only.

Commit d2872ea

Browse files
committed
Fixed zmodem protocol tests.
1 parent d750f21 commit d2872ea

File tree

6 files changed

+191
-178
lines changed

6 files changed

+191
-178
lines changed

src/protocol/xymodem/sy.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ impl Sy {
5656
errors: 0,
5757
bytes_send: 0,
5858
block_number: match configuration.variant {
59-
XYModemVariant::YModem | XYModemVariant::YModemG => 1,
60-
_ => 0,
59+
XYModemVariant::YModem | XYModemVariant::YModemG => 0,
60+
_ => 1,
6161
},
6262
cur_file: 0,
6363
transfer_stopped: false,
@@ -82,7 +82,6 @@ impl Sy {
8282
transfer_info.check_size = self.configuration.get_check_and_size();
8383
transfer_info.update_bps();
8484
}
85-
println!("send state: {:?} {:?}", self.send_state, self.configuration.variant);
8685

8786
match self.send_state {
8887
SendState::None => {}

src/protocol/xymodem/tests.rs

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
use crate::protocol::Protocol;
33

44
#[cfg(test)]
5-
pub fn test_sender(test_connection: &mut dyn crate::ui::connect::DataConnection, files: Vec<crate::protocol::FileDescriptor>, send: &mut dyn Protocol) {
5+
pub fn test_sender(test_connection: &mut crate::ui::connect::TestConnection, files: Vec<crate::protocol::FileDescriptor>, send: &mut dyn Protocol) {
66
use crate::protocol::{TestStorageHandler, TransferState};
77
use std::sync::{Arc, Mutex};
8-
8+
test_connection.is_sender = true;
99
let send_transfer_state = Arc::new(Mutex::new(TransferState::default()));
1010
send.initiate_send(test_connection, files, &mut send_transfer_state.lock().unwrap())
1111
.expect("error.");
@@ -17,10 +17,11 @@ pub fn test_sender(test_connection: &mut dyn crate::ui::connect::DataConnection,
1717
}
1818

1919
#[cfg(test)]
20-
pub fn test_receiver(test_connection: &mut dyn crate::ui::connect::DataConnection, receiver: &mut dyn Protocol) -> crate::protocol::TestStorageHandler {
20+
pub fn test_receiver(test_connection: &mut crate::ui::connect::TestConnection, receiver: &mut dyn Protocol) -> crate::protocol::TestStorageHandler {
2121
use crate::protocol::{TestStorageHandler, TransferState};
2222
use std::sync::{Arc, Mutex};
2323

24+
test_connection.is_sender = false;
2425
let send_transfer_state = Arc::new(Mutex::new(TransferState::default()));
2526
receiver
2627
.initiate_recv(test_connection, &mut send_transfer_state.lock().unwrap())
@@ -58,7 +59,7 @@ mod xy_modem_tests {
5859

5960
#[test]
6061
fn test_xmodem_128block_sender() {
61-
let mut test_connection: TestConnection = TestConnection::new();
62+
let mut test_connection = TestConnection::new(false);
6263

6364
let mut send = crate::protocol::XYmodem::new(XYModemVariant::XModem);
6465

@@ -80,12 +81,12 @@ mod xy_modem_tests {
8081
result.push(0xAA); // CHECKSUM
8182
result.push(EOT);
8283

83-
assert_eq!(result, test_connection.read_buffer());
84+
assert_eq!(result, test_connection.read_receive_buffer());
8485
}
8586

8687
#[test]
8788
fn test_xmodem_128block_case2_sender() {
88-
let mut test_connection: TestConnection = TestConnection::new();
89+
let mut test_connection = TestConnection::new(false);
8990
let mut send = crate::protocol::XYmodem::new(XYModemVariant::XModem);
9091
let mut data = vec![1u8, 2, 5, 10];
9192
let files = vec![FileDescriptor::create_test("foo.bar".to_string(), data.clone())];
@@ -102,12 +103,12 @@ mod xy_modem_tests {
102103
result.push(207); // CHECKSUM
103104
result.push(EOT);
104105

105-
assert_eq!(result, test_connection.read_buffer());
106+
assert_eq!(result, test_connection.read_receive_buffer());
106107
}
107108

108109
#[test]
109110
fn test_xmodem_1kblock_sender() {
110-
let mut test_connection: TestConnection = TestConnection::new();
111+
let mut test_connection = TestConnection::new(false);
111112
let mut send = crate::protocol::XYmodem::new(XYModemVariant::XModem1k);
112113
let mut data = vec![5; 900];
113114
let files = vec![FileDescriptor::create_test("foo.bar".to_string(), data.clone())];
@@ -128,12 +129,12 @@ mod xy_modem_tests {
128129
result.push(85); // CHECKSUM
129130
result.push(EOT);
130131

131-
assert_eq!(result, test_connection.read_buffer());
132+
assert_eq!(result, test_connection.read_receive_buffer());
132133
}
133134

134135
#[test]
135136
fn test_xmodem_128block_receiver() {
136-
let mut test_connection: TestConnection = TestConnection::new();
137+
let mut test_connection = TestConnection::new(true);
137138
let mut recv = crate::protocol::XYmodem::new(XYModemVariant::XModem);
138139
let data = vec![1u8, 2, 5, 10];
139140

@@ -154,7 +155,7 @@ mod xy_modem_tests {
154155

155156
#[test]
156157
fn test_xmodem_1kblock_receiver() {
157-
let mut test_connection: TestConnection = TestConnection::new();
158+
let mut test_connection = TestConnection::new(true);
158159
let mut recv = crate::protocol::XYmodem::new(XYModemVariant::XModem1k);
159160
let data = vec![5; 900];
160161

@@ -176,7 +177,7 @@ mod xy_modem_tests {
176177

177178
#[test]
178179
fn test_ymodem_sender() {
179-
let mut test_connection: TestConnection = TestConnection::new();
180+
let mut test_connection = TestConnection::new(false);
180181

181182
let mut send = crate::protocol::XYmodem::new(XYModemVariant::YModem);
182183

@@ -205,29 +206,34 @@ mod xy_modem_tests {
205206
result.extend_from_slice(&[150, 207]); // CHECKSUM
206207
result.push(EOT);
207208

208-
assert_eq!(result, test_connection.read_buffer());
209+
assert_eq!(result, test_connection.read_receive_buffer());
209210
}
210211

211212
#[test]
212213
fn test_ymodem_receiver() {
213-
let mut test_connection: TestConnection = TestConnection::new();
214+
let mut test_connection = TestConnection::new(true);
214215
let mut recv = crate::protocol::XYmodem::new(XYModemVariant::YModem);
215216
let data = vec![1u8, 2, 5, 10];
216217
let mut result = vec![SOH, 0x00, 0xFF];
217218

218219
result.extend_from_slice(b"foo.bar");
219220
result.extend_from_slice(&[0, b'4']); // length
220-
221221
result.extend_from_slice(vec![0; 128 - "foo.bar".len() - 2].as_slice());
222222
result.extend_from_slice(&[108, 107]); // CHECKSUM
223-
224223
result.extend_from_slice(&[SOH, 0x01, 0xFE]);
225224

226225
let mut cloned_data = data.clone();
227226
cloned_data.resize(128, 0x1A);
228227
result.extend_from_slice(&cloned_data);
229228
result.extend_from_slice(&[150, 207]); // CHECKSUM
230-
result.push(EOT);
229+
result.push(EOT); // -> NACK
230+
result.push(EOT); // -> ACK
231+
232+
// No next file:
233+
result.extend_from_slice(&[SOH, 0x00, 0xFF]);
234+
result.extend_from_slice(vec![0; 128].as_slice());
235+
result.extend_from_slice(&[0, 0]);
236+
231237
test_connection.send(result).unwrap();
232238

233239
let storage_handler = test_receiver(&mut test_connection, &mut recv);

src/protocol/zmodem/headers.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,30 @@ impl Header {
114114
pub fn f0(&self) -> u8 {
115115
self.data[3]
116116
}
117+
pub fn p3(&self) -> u8 {
118+
self.data[3]
119+
}
117120

118121
pub fn f1(&self) -> u8 {
119122
self.data[2]
120123
}
124+
pub fn p2(&self) -> u8 {
125+
self.data[2]
126+
}
121127

122128
pub fn f2(&self) -> u8 {
123129
self.data[1]
124130
}
131+
pub fn p1(&self) -> u8 {
132+
self.data[1]
133+
}
125134

126135
pub fn f3(&self) -> u8 {
127136
self.data[0]
128137
}
138+
pub fn p0(&self) -> u8 {
139+
self.data[0]
140+
}
129141

130142
pub fn number(&self) -> u32 {
131143
u32::from_le_bytes(self.data)
@@ -178,7 +190,7 @@ impl Header {
178190
}
179191

180192
pub fn write(&self, com: &mut dyn DataConnection, header_type: HeaderType, escape_ctrl_chars: bool) -> TerminalResult<usize> {
181-
// println!("send header:{:?} - {:?}", header_type, self);
193+
println!("send header:{:?} - {:?}", header_type, self);
182194
com.send(self.build(header_type, escape_ctrl_chars))?;
183195
Ok(12)
184196
}

src/protocol/zmodem/sz.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ pub struct Sz {
3434
retries: usize,
3535
can_count: usize,
3636
receiver_capabilities: u8,
37+
38+
nonstop: bool,
3739
}
3840

3941
impl Sz {
@@ -50,6 +52,7 @@ impl Sz {
5052
receiver_capabilities: 0,
5153
can_count: 0,
5254
package_len: block_length,
55+
nonstop: true,
5356
}
5457
}
5558

@@ -125,7 +128,7 @@ impl Sz {
125128
transfer_info.check_size = format!("Crc32/{}", self.package_len);
126129
transfer_info.update_bps();
127130
}
128-
// println!("sz state: {:?}", self.state );
131+
println!("sz state: {:?}", self.state);
129132
match self.state {
130133
SendState::Await => {
131134
self.read_next_header(com)?;
@@ -156,15 +159,14 @@ impl Sz {
156159
}
157160
let old_pos = self.cur_file_pos;
158161
let end_pos = min(self.data.len(), self.cur_file_pos + self.package_len);
159-
let nonstop = !self.can_receive_data_during_io();
160-
162+
println!("nonstop:{}", self.nonstop);
161163
let crc_byte = if self.cur_file_pos + self.package_len < self.data.len() {
162-
if nonstop {
164+
if self.nonstop {
163165
ZCRCG
164166
} else {
165167
ZCRCQ
166168
}
167-
} else if nonstop {
169+
} else if self.nonstop {
168170
ZCRCE
169171
} else {
170172
ZCRCW
@@ -180,7 +182,7 @@ impl Sz {
180182
self.state = SendState::Await;
181183
}
182184
com.send(p)?;
183-
if !nonstop {
185+
if !self.nonstop {
184186
let ack = Header::read(com, &mut self.can_count)?;
185187
if let Some(header) = ack {
186188
// println!("got header after data package: {header}",);
@@ -249,6 +251,11 @@ impl Sz {
249251
}
250252
self.cur_file_pos = 0;
251253
self.receiver_capabilities = res.f0();
254+
let block_size = res.p0() as usize + ((res.p1() as usize) << 8);
255+
self.nonstop = block_size == 0;
256+
if block_size != 0 {
257+
self.package_len = block_size;
258+
}
252259
/*
253260
if self._can_decrypt() {
254261
println!("receiver can decrypt");

0 commit comments

Comments
 (0)