Skip to content

Commit ff4c844

Browse files
committed
tests: datagrams should only be sent if both local and peer have sent SETTINGS_H3_DATAGRAM
1 parent 704b37a commit ff4c844

1 file changed

Lines changed: 64 additions & 0 deletions

File tree

h3-datagram/src/datagram_handler.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,67 @@ impl Display for SendDatagramError {
137137
}
138138

139139
impl Error for SendDatagramError {}
140+
141+
#[cfg(test)]
142+
mod tests {
143+
use super::*;
144+
145+
use crate::datagram::EncodedDatagram;
146+
use h3::proto::frame;
147+
148+
use bytes::Bytes;
149+
150+
mod sender {
151+
use super::*;
152+
153+
pub fn create(shared: Arc<SharedState>) -> DatagramSender<CountingSender, Bytes> {
154+
DatagramSender {
155+
handler: CountingSender::default(),
156+
_marker: PhantomData,
157+
shared_state: shared,
158+
stream_id: StreamId::try_from(0u64).unwrap(),
159+
}
160+
}
161+
162+
#[derive(Default)]
163+
pub struct CountingSender {
164+
pub calls: usize,
165+
}
166+
167+
impl SendDatagram<Bytes> for CountingSender {
168+
fn send_datagram<T: Into<EncodedDatagram<Bytes>>>(
169+
&mut self,
170+
_data: T,
171+
) -> Result<(), SendDatagramErrorIncoming> {
172+
self.calls += 1;
173+
Ok(())
174+
}
175+
}
176+
}
177+
178+
#[test]
179+
fn refuses_send_when_datagrams_not_negotiated() {
180+
let mut s = sender::create(Arc::new(SharedState::default()));
181+
let res = s.send_datagram(Bytes::from_static(b"hi"));
182+
183+
assert!(res.is_err());
184+
assert!(matches!(res.unwrap_err(), SendDatagramError::NotAvailable));
185+
assert_eq!(s.handler.calls, 0);
186+
}
187+
188+
#[test]
189+
fn sends_when_datagrams_negotiated() {
190+
let mut s = {
191+
let mut settings = frame::Settings::default();
192+
settings.insert(frame::SettingId::H3_DATAGRAM, 1).unwrap();
193+
194+
let shared_settings = Arc::new(SharedState::default());
195+
shared_settings.set_settings((&settings).into());
196+
197+
sender::create(shared_settings)
198+
};
199+
200+
s.send_datagram(Bytes::from_static(b"hi")).unwrap();
201+
assert_eq!(s.handler.calls, 1, "should delegate to the QUIC backend");
202+
}
203+
}

0 commit comments

Comments
 (0)