Skip to content

Commit 1a85bc3

Browse files
authored
chore: Add some more tests to drive up coverage (#3284)
I think this is the last batch of the easy ones.
1 parent 819f23b commit 1a85bc3

5 files changed

Lines changed: 269 additions & 0 deletions

File tree

neqo-common/src/codec.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,4 +1331,9 @@ mod tests {
13311331
let v: Vec<u8> = cloned.into();
13321332
assert_eq!(v, vec![0x03, 0x04, 0x05, 0x06]);
13331333
}
1334+
1335+
#[test]
1336+
fn encoder_debug() {
1337+
assert_eq!(format!("{:?}", Encoder::from_hex("010203")), "[3]: 010203");
1338+
}
13341339
}

neqo-qpack/src/lib.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,47 @@ impl Error {
110110
})
111111
}
112112
}
113+
114+
#[cfg(test)]
115+
#[cfg_attr(coverage_nightly, coverage(off))]
116+
mod tests {
117+
use super::Error;
118+
119+
#[test]
120+
fn error_codes() {
121+
assert_eq!(Error::Decompression.code(), 0x200);
122+
assert_eq!(Error::EncoderStream.code(), 0x201);
123+
assert_eq!(Error::DecoderStream.code(), 0x202);
124+
assert_eq!(Error::ClosedCriticalStream.code(), 0x104);
125+
for err in [
126+
Error::Internal,
127+
Error::NeedMoreData,
128+
Error::HeaderLookup,
129+
Error::HuffmanDecompression,
130+
Error::BadUtf8,
131+
Error::ChangeCapacity,
132+
Error::DynamicTableFull,
133+
Error::IncrementAck,
134+
Error::IntegerOverflow,
135+
Error::WrongStreamCount,
136+
Error::Decoding,
137+
Error::EncoderStreamBlocked,
138+
Error::Transport(neqo_transport::Error::NoMoreData),
139+
Error::Qlog,
140+
] {
141+
assert_eq!(err.code(), 3);
142+
}
143+
}
144+
145+
#[test]
146+
fn map_error() {
147+
assert_eq!(
148+
Error::map_error::<()>(Err(Error::ClosedCriticalStream), Error::Internal),
149+
Err(Error::ClosedCriticalStream)
150+
);
151+
assert_eq!(
152+
Error::map_error::<()>(Err(Error::Internal), Error::Decompression),
153+
Err(Error::Decompression)
154+
);
155+
}
156+
}

neqo-transport/src/frame.rs

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,4 +1118,164 @@ mod tests {
11181118
e.pad_to(u16::MAX as usize + 1, 0);
11191119
assert_eq!(Frame::decode(&mut e.as_decoder()), Err(Error::TooMuchData));
11201120
}
1121+
1122+
#[test]
1123+
fn dump() {
1124+
let s = |id| StreamId::from(id);
1125+
assert_eq!(Frame::Padding(5).dump(), "Padding { len: 5 }");
1126+
assert_eq!(
1127+
Frame::Crypto {
1128+
offset: 1,
1129+
data: &[2, 3]
1130+
}
1131+
.dump(),
1132+
"Crypto { offset: 1, len: 2 }"
1133+
);
1134+
assert_eq!(
1135+
Frame::Stream {
1136+
stream_id: s(4),
1137+
offset: 10,
1138+
data: &[1],
1139+
fin: true,
1140+
fill: false
1141+
}
1142+
.dump(),
1143+
"Stream { stream_id: 4, offset: 10, len: 1, fin: true }"
1144+
);
1145+
assert_eq!(
1146+
Frame::Stream {
1147+
stream_id: s(4),
1148+
offset: 0,
1149+
data: &[1, 2],
1150+
fin: false,
1151+
fill: true
1152+
}
1153+
.dump(),
1154+
"Stream { stream_id: 4, offset: 0, len: >>2, fin: false }"
1155+
);
1156+
assert_eq!(
1157+
Frame::Datagram {
1158+
data: &[1, 2, 3],
1159+
fill: false
1160+
}
1161+
.dump(),
1162+
"Datagram { len: 3 }"
1163+
);
1164+
// Remaining frames use Debug format
1165+
assert_eq!(Frame::Ping.dump(), "Ping");
1166+
assert_eq!(
1167+
Frame::Ack {
1168+
largest_acknowledged: 1,
1169+
ack_delay: 2,
1170+
first_ack_range: 0,
1171+
ack_ranges: vec![],
1172+
ecn_count: None
1173+
}
1174+
.dump(),
1175+
"Ack { largest_acknowledged: 1, ack_delay: 2, first_ack_range: 0, ack_ranges: [], ecn_count: None }"
1176+
);
1177+
assert_eq!(
1178+
Frame::ResetStream {
1179+
stream_id: s(1),
1180+
application_error_code: 2,
1181+
final_size: 3
1182+
}
1183+
.dump(),
1184+
"ResetStream { stream_id: StreamId(1), application_error_code: 2, final_size: 3 }"
1185+
);
1186+
assert_eq!(
1187+
Frame::StopSending {
1188+
stream_id: s(1),
1189+
application_error_code: 2
1190+
}
1191+
.dump(),
1192+
"StopSending { stream_id: StreamId(1), application_error_code: 2 }"
1193+
);
1194+
assert_eq!(
1195+
Frame::NewToken { token: &[1] }.dump(),
1196+
"NewToken { token: [1] }"
1197+
);
1198+
assert_eq!(
1199+
Frame::MaxData { maximum_data: 100 }.dump(),
1200+
"MaxData { maximum_data: 100 }"
1201+
);
1202+
assert_eq!(
1203+
Frame::MaxStreamData {
1204+
stream_id: s(1),
1205+
maximum_stream_data: 100
1206+
}
1207+
.dump(),
1208+
"MaxStreamData { stream_id: StreamId(1), maximum_stream_data: 100 }"
1209+
);
1210+
assert_eq!(
1211+
Frame::MaxStreams {
1212+
stream_type: StreamType::BiDi,
1213+
maximum_streams: 10
1214+
}
1215+
.dump(),
1216+
"MaxStreams { stream_type: BiDi, maximum_streams: 10 }"
1217+
);
1218+
assert_eq!(
1219+
Frame::DataBlocked { data_limit: 50 }.dump(),
1220+
"DataBlocked { data_limit: 50 }"
1221+
);
1222+
assert_eq!(
1223+
Frame::StreamDataBlocked {
1224+
stream_id: s(1),
1225+
stream_data_limit: 50
1226+
}
1227+
.dump(),
1228+
"StreamDataBlocked { stream_id: StreamId(1), stream_data_limit: 50 }"
1229+
);
1230+
assert_eq!(
1231+
Frame::StreamsBlocked {
1232+
stream_type: StreamType::UniDi,
1233+
stream_limit: 5
1234+
}
1235+
.dump(),
1236+
"StreamsBlocked { stream_type: UniDi, stream_limit: 5 }"
1237+
);
1238+
assert_eq!(
1239+
Frame::NewConnectionId {
1240+
sequence_number: 1,
1241+
retire_prior: 0,
1242+
connection_id: &[1, 2],
1243+
stateless_reset_token: Srt::new([0; 16])
1244+
}
1245+
.dump(),
1246+
"NewConnectionId { sequence_number: 1, retire_prior: 0, connection_id: [1, 2], stateless_reset_token: Token([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) }"
1247+
);
1248+
assert_eq!(
1249+
Frame::RetireConnectionId { sequence_number: 1 }.dump(),
1250+
"RetireConnectionId { sequence_number: 1 }"
1251+
);
1252+
assert_eq!(
1253+
Frame::PathChallenge { data: [1; 8] }.dump(),
1254+
"PathChallenge { data: [1, 1, 1, 1, 1, 1, 1, 1] }"
1255+
);
1256+
assert_eq!(
1257+
Frame::PathResponse { data: [2; 8] }.dump(),
1258+
"PathResponse { data: [2, 2, 2, 2, 2, 2, 2, 2] }"
1259+
);
1260+
assert_eq!(
1261+
Frame::ConnectionClose {
1262+
error_code: CloseError::Transport(0),
1263+
frame_type: 0,
1264+
reason_phrase: String::new()
1265+
}
1266+
.dump(),
1267+
"ConnectionClose { error_code: Transport(0), frame_type: 0, reason_phrase: \"\" }"
1268+
);
1269+
assert_eq!(Frame::HandshakeDone.dump(), "HandshakeDone");
1270+
assert_eq!(
1271+
Frame::AckFrequency {
1272+
seqno: 1,
1273+
tolerance: 2,
1274+
delay: 3,
1275+
ignore_order: false
1276+
}
1277+
.dump(),
1278+
"AckFrequency { seqno: 1, tolerance: 2, delay: 3, ignore_order: false }"
1279+
);
1280+
}
11211281
}

neqo-transport/src/lib.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,3 +269,58 @@ impl CloseReason {
269269
}
270270

271271
pub type Res<T> = Result<T, Error>;
272+
273+
#[cfg(test)]
274+
#[cfg_attr(coverage_nightly, coverage(off))]
275+
mod tests {
276+
use super::{CloseReason, Error};
277+
278+
#[test]
279+
fn error_codes() {
280+
for (err, code) in [
281+
(Error::None, 0),
282+
(Error::IdleTimeout, 0),
283+
(Error::Peer(0), 0),
284+
(Error::PeerApplication(0), 0),
285+
(Error::ConnectionRefused, 2),
286+
(Error::FlowControl, 3),
287+
(Error::StreamLimit, 4),
288+
(Error::StreamState, 5),
289+
(Error::FinalSize, 6),
290+
(Error::FrameEncoding, 7),
291+
(Error::TransportParameter, 8),
292+
(Error::ProtocolViolation, 10),
293+
(Error::InvalidToken, 11),
294+
(Error::KeysExhausted, 15),
295+
(Error::Application, 12),
296+
(Error::NoAvailablePath, 16),
297+
(Error::CryptoBufferExceeded, 13),
298+
(Error::CryptoAlert(0x2a), 0x12a),
299+
(Error::EchRetry(vec![]), 0x179),
300+
(Error::VersionNegotiation, 0x53f8),
301+
(Error::Internal, 1),
302+
] {
303+
assert_eq!(err.code(), code);
304+
}
305+
}
306+
307+
#[test]
308+
fn close_reason_is_error() {
309+
assert!(!CloseReason::Transport(Error::None).is_error());
310+
assert!(!CloseReason::Application(0).is_error());
311+
assert!(CloseReason::Transport(Error::Internal).is_error());
312+
assert!(CloseReason::Application(1).is_error());
313+
}
314+
315+
#[test]
316+
fn error_from_impls() {
317+
assert_eq!(
318+
Error::from(neqo_crypto::Error::EchRetry(vec![1, 2])),
319+
Error::EchRetry(vec![1, 2])
320+
);
321+
assert!(matches!(
322+
Error::from(u64::try_from(-1_i32).unwrap_err()),
323+
Error::IntegerOverflow
324+
));
325+
}
326+
}

neqo-transport/src/tparams.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,4 +1286,9 @@ mod tests {
12861286
assert!(!current.ok_for_0rtt(&remembered));
12871287
assert!(!remembered.ok_for_0rtt(&current));
12881288
}
1289+
1290+
#[test]
1291+
fn transport_parameter_id_display() {
1292+
assert_eq!(format!("{IdleTimeout}"), "IdleTimeout((0x01))");
1293+
}
12891294
}

0 commit comments

Comments
 (0)