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