@@ -137,3 +137,67 @@ impl Display for SendDatagramError {
137137}
138138
139139impl 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