use bytes::BytesMut;
use specter::transport::h2::{
ErrorCode, FrameHeader, FrameType, GoAwayFrame, PingFrame, RstStreamFrame, SettingsFrame,
SettingsId, WindowUpdateFrame,
};
#[test]
fn test_frame_header_serialization() {
let header = FrameHeader {
length: 100,
frame_type: FrameType::Data,
flags: 0x1, stream_id: 5,
};
let mut buf = BytesMut::new();
header.serialize(&mut buf);
let bytes = buf.freeze();
assert_eq!(bytes.len(), 9);
assert_eq!(bytes[0], 0);
assert_eq!(bytes[1], 0);
assert_eq!(bytes[2], 0x64);
assert_eq!(bytes[3], 0);
assert_eq!(bytes[4], 1);
assert_eq!(bytes[5], 0);
assert_eq!(bytes[6], 0);
assert_eq!(bytes[7], 0);
assert_eq!(bytes[8], 5);
}
#[test]
fn test_settings_frame_rfc9113_section_6_5() {
let mut settings = SettingsFrame::new();
settings.set(SettingsId::HeaderTableSize, 4096);
settings.set(SettingsId::EnablePush, 0);
let buf = settings.serialize();
let bytes = buf.freeze();
assert_eq!(bytes.len(), 9 + 12);
let header = FrameHeader::parse(&bytes[..9]).unwrap();
assert_eq!(header.frame_type, FrameType::Settings);
assert_eq!(header.length, 12);
let _parsed = SettingsFrame::parse(header.flags, bytes.slice(9..));
}
#[test]
fn test_window_update_rfc9113_section_6_9() {
let wu = WindowUpdateFrame::new(5, 1024);
let buf = wu.serialize();
let bytes = buf.freeze();
assert_eq!(bytes.len(), 13);
let header = FrameHeader::parse(&bytes[..9]).unwrap();
assert_eq!(header.frame_type, FrameType::WindowUpdate);
assert_eq!(header.stream_id, 5);
let _parsed = WindowUpdateFrame::parse(5, bytes.slice(9..)).unwrap();
}
#[test]
fn test_ping_frame_rfc9113_section_6_7() {
let payload = 999u64;
let bytes_payload = payload.to_be_bytes();
let ping = PingFrame::new(bytes_payload);
let buf = ping.serialize();
let bytes = buf.freeze();
assert_eq!(bytes.len(), 9 + 8);
let header = FrameHeader::parse(&bytes[..9]).unwrap();
assert_eq!(header.frame_type, FrameType::Ping);
assert_eq!(header.flags, 0);
let ack = PingFrame::ack(bytes_payload);
let buf_ack = ack.serialize();
assert_eq!(buf_ack[4], 0x1); }
#[test]
fn test_goaway_frame_rfc9113_section_6_8() {
let goaway = GoAwayFrame::new(5, ErrorCode::ProtocolError);
let buf = goaway.serialize();
let bytes = buf.freeze();
assert_eq!(bytes.len(), 17);
let header = FrameHeader::parse(&bytes[..9]).unwrap();
assert_eq!(header.frame_type, FrameType::GoAway);
let _parsed = GoAwayFrame::parse(bytes.slice(9..)).unwrap();
}
#[test]
fn test_rst_stream_frame_rfc9113_section_6_4() {
let rst = RstStreamFrame::new(3, ErrorCode::Cancel);
let buf = rst.serialize();
let bytes = buf.freeze();
assert_eq!(bytes.len(), 13);
let header = FrameHeader::parse(&bytes[..9]).unwrap();
assert_eq!(header.stream_id, 3);
assert_eq!(header.frame_type, FrameType::RstStream);
}