Skip to content

Commit 51507aa

Browse files
committed
add integration tests for protocol errors
1 parent 972d40b commit 51507aa

File tree

3 files changed

+133
-3
lines changed

3 files changed

+133
-3
lines changed

esp32-wroom-rp/src/protocol.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ pub(crate) struct NinaProtocolHandler<'a, B, C> {
239239
pub control_pins: &'a mut C,
240240
}
241241

242+
// TODO: look at Nina Firmware code to understand conditions
243+
// that lead to NinaProtocolVersionMismatch
242244
#[derive(Debug, PartialEq)]
243245
pub enum ProtocolError {
244246
NinaProtocolVersionMismatch,

esp32-wroom-rp/src/spi.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ use embedded_hal::blocking::spi::Transfer;
1515

1616
use core::convert::Infallible;
1717

18+
// FIXME: remove before commit
19+
//use defmt_rtt as _;
20+
1821
// TODO: this should eventually move into NinaCommandHandler
1922
#[repr(u8)]
2023
#[derive(Debug)]
@@ -199,8 +202,6 @@ where
199202

200203
for byte in buf {
201204
let write_buf = &mut [byte];
202-
// FIXME: temporary for test writing debugging
203-
defmt::debug!("0x{:02x}, ", write_buf[0]);
204205
self.bus.transfer(write_buf).ok();
205206
}
206207

host-tests/tests/spi.rs

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use embedded_hal_mock::delay::MockNoop;
2-
use embedded_hal_mock::pin::{Mock as PinMock, State as PinState, Transaction as PinTransaction};
32
use embedded_hal_mock::spi;
43

54
use esp32_wroom_rp::gpio::EspControlInterface;
@@ -31,6 +30,134 @@ impl EspControlInterface for EspControlMock {
3130
}
3231
}
3332

33+
#[test]
34+
fn too_many_parameters_error() {
35+
let spi_expectations = vec![
36+
// send_cmd()
37+
spi::Transaction::transfer(vec![0xe0], vec![0x0]),
38+
spi::Transaction::transfer(vec![0x37], vec![0x0]),
39+
spi::Transaction::transfer(vec![0x0], vec![0x0]),
40+
spi::Transaction::transfer(vec![0xee], vec![0x0]),
41+
// wait_response_cmd()
42+
spi::Transaction::transfer(vec![0xff], vec![0xe0]),
43+
spi::Transaction::transfer(vec![0xff], vec![0xb7]),
44+
spi::Transaction::transfer(vec![0xff], vec![0x1]),
45+
// test relies on max number of parameters being 8. This will probably change
46+
// as we understand more.
47+
spi::Transaction::transfer(vec![0xff], vec![0x9]),
48+
];
49+
let mut spi = spi::Mock::new(&spi_expectations);
50+
51+
let mut delay = MockNoop::new();
52+
53+
let mut pins = EspControlMock {};
54+
55+
let mut wifi = Wifi::init(&mut spi, &mut pins, &mut delay).ok().unwrap();
56+
let f = wifi.firmware_version();
57+
58+
assert_eq!(
59+
f.unwrap_err(),
60+
esp32_wroom_rp::Error::Protocol(esp32_wroom_rp::protocol::ProtocolError::TooManyParameters)
61+
);
62+
63+
spi.done();
64+
}
65+
66+
#[test]
67+
fn invalid_number_of_parameters_error() {
68+
let spi_expectations = vec![
69+
// send_cmd()
70+
spi::Transaction::transfer(vec![0xe0], vec![0x0]),
71+
spi::Transaction::transfer(vec![0x37], vec![0x0]),
72+
spi::Transaction::transfer(vec![0x0], vec![0x0]),
73+
spi::Transaction::transfer(vec![0xee], vec![0x0]),
74+
// wait_response_cmd()
75+
spi::Transaction::transfer(vec![0xff], vec![0xe0]),
76+
spi::Transaction::transfer(vec![0xff], vec![0xb7]),
77+
spi::Transaction::transfer(vec![0xff], vec![0x0]),
78+
];
79+
let mut spi = spi::Mock::new(&spi_expectations);
80+
81+
let mut delay = MockNoop::new();
82+
83+
let mut pins = EspControlMock {};
84+
85+
let mut wifi = Wifi::init(&mut spi, &mut pins, &mut delay).ok().unwrap();
86+
let f = wifi.firmware_version();
87+
88+
assert_eq!(
89+
f.unwrap_err(),
90+
esp32_wroom_rp::Error::Protocol(
91+
esp32_wroom_rp::protocol::ProtocolError::InvalidNumberOfParameters
92+
)
93+
);
94+
95+
spi.done();
96+
}
97+
98+
#[test]
99+
fn invalid_command_induces_invalid_command_error() {
100+
let spi_expectations = vec![
101+
// send_cmd()
102+
spi::Transaction::transfer(vec![0xe0], vec![0x0]),
103+
spi::Transaction::transfer(vec![0x37], vec![0x0]),
104+
spi::Transaction::transfer(vec![0x0], vec![0x0]),
105+
spi::Transaction::transfer(vec![0xee], vec![0x0]),
106+
// wait_response_cmd()
107+
spi::Transaction::transfer(vec![0xff], vec![0xe0]),
108+
spi::Transaction::transfer(vec![0xff], vec![0x0]),
109+
];
110+
let mut spi = spi::Mock::new(&spi_expectations);
111+
112+
let mut delay = MockNoop::new();
113+
114+
let mut pins = EspControlMock {};
115+
116+
let mut wifi = Wifi::init(&mut spi, &mut pins, &mut delay).ok().unwrap();
117+
let f = wifi.firmware_version();
118+
119+
assert_eq!(
120+
f.unwrap_err(),
121+
esp32_wroom_rp::Error::Protocol(esp32_wroom_rp::protocol::ProtocolError::InvalidCommand)
122+
);
123+
124+
spi.done();
125+
}
126+
127+
#[test]
128+
fn timeout_induces_communication_timeout_error() {
129+
let mut spi_expectations = vec![
130+
// send_cmd()
131+
spi::Transaction::transfer(vec![0xe0], vec![0x0]),
132+
spi::Transaction::transfer(vec![0x37], vec![0x0]),
133+
spi::Transaction::transfer(vec![0x0], vec![0x0]),
134+
spi::Transaction::transfer(vec![0xee], vec![0x0]),
135+
];
136+
137+
// simulate reading 1000 bytes which will exhaust the retry limit.
138+
for _ in 0..1000 {
139+
spi_expectations.push(spi::Transaction::transfer(vec![0xff], vec![0x0]))
140+
}
141+
142+
let mut spi = spi::Mock::new(&spi_expectations);
143+
144+
let mut delay = MockNoop::new();
145+
146+
let mut pins = EspControlMock {};
147+
148+
let mut wifi = Wifi::init(&mut spi, &mut pins, &mut delay).ok().unwrap();
149+
let f = wifi.firmware_version();
150+
151+
assert_eq!(
152+
f.unwrap_err(),
153+
esp32_wroom_rp::Error::Protocol(
154+
esp32_wroom_rp::protocol::ProtocolError::CommunicationTimeout
155+
)
156+
);
157+
158+
spi.done();
159+
}
160+
34161
#[test]
35162
fn invalid_command_induces_nina_protocol_version_mismatch_error() {
36163
let spi_expectations = vec![

0 commit comments

Comments
 (0)