1 use super::record_layer_header::*;
2 use super::*;
3 use crate::change_cipher_spec::ChangeCipherSpec;
4
5 use std::io::{BufReader, BufWriter};
6
7 #[test]
test_udp_decode() -> Result<()>8 fn test_udp_decode() -> Result<()> {
9 let tests = vec![
10 (
11 "Change Cipher Spec, single packet",
12 vec![
13 0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01,
14 ],
15 vec![vec![
16 0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01,
17 ]],
18 None,
19 ),
20 (
21 "Change Cipher Spec, multi packet",
22 vec![
23 0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01,
24 0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x01,
25 ],
26 vec![
27 vec![
28 0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01,
29 0x01,
30 ],
31 vec![
32 0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01,
33 0x01,
34 ],
35 ],
36 None,
37 ),
38 (
39 "Invalid packet length",
40 vec![0x14, 0xfe],
41 vec![],
42 Some(Error::ErrInvalidPacketLength),
43 ),
44 (
45 "Packet declared invalid length",
46 vec![
47 0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xFF, 0x01,
48 ],
49 vec![],
50 Some(Error::ErrInvalidPacketLength),
51 ),
52 ];
53
54 for (name, data, wanted, wanted_err) in tests {
55 let dtls_pkts = unpack_datagram(&data);
56 if let Some(err) = wanted_err {
57 if let Err(dtls) = dtls_pkts {
58 assert_eq!(err.to_string(), dtls.to_string());
59 } else {
60 panic!("something wrong for {name} when wanted_err is Some");
61 }
62 } else if let Ok(pkts) = dtls_pkts {
63 assert_eq!(
64 wanted, pkts,
65 "{name} UDP decode: got {pkts:?}, want {wanted:?}",
66 );
67 } else {
68 panic!("something wrong for {name} when wanted_err is None");
69 }
70 }
71
72 Ok(())
73 }
74
75 #[test]
test_record_layer_round_trip() -> Result<()>76 fn test_record_layer_round_trip() -> Result<()> {
77 let tests = vec![(
78 "Change Cipher Spec, single packet",
79 vec![
80 0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01,
81 ],
82 RecordLayer {
83 record_layer_header: RecordLayerHeader {
84 content_type: ContentType::ChangeCipherSpec,
85 protocol_version: ProtocolVersion {
86 major: 0xfe,
87 minor: 0xff,
88 },
89 epoch: 0,
90 sequence_number: 18,
91 content_len: 1,
92 },
93 content: Content::ChangeCipherSpec(ChangeCipherSpec {}),
94 },
95 )];
96
97 for (name, data, want) in tests {
98 let mut reader = BufReader::new(data.as_slice());
99 let r = RecordLayer::unmarshal(&mut reader)?;
100
101 assert_eq!(
102 want, r,
103 "{name} recordLayer.unmarshal: got {r:?}, want {want:?}"
104 );
105
106 let mut data2 = vec![];
107 {
108 let mut writer = BufWriter::<&mut Vec<u8>>::new(data2.as_mut());
109 r.marshal(&mut writer)?;
110 }
111 assert_eq!(
112 data, data2,
113 "{name} recordLayer.marshal: got {data2:?}, want {data:?}"
114 );
115 }
116
117 Ok(())
118 }
119