1 use super::*; 2 3 use std::io::{BufReader, BufWriter}; 4 5 use util::Error; 6 7 //TODO: BenchmarkMarshal 8 //TODO: BenchmarkUnmarshal 9 10 #[test] 11 fn test_basic() -> Result<(), Error> { 12 let empty_bytes = vec![]; 13 let mut reader = BufReader::new(empty_bytes.as_slice()); 14 let result = Packet::unmarshal(&mut reader); 15 if result.is_ok() { 16 assert!(false, "Unmarshal did not error on zero length packet"); 17 } 18 19 let raw_pkt = vec![ 20 0x90, 0xe0, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 0x00, 0x01, 0x00, 21 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x36, 0xbe, 0x88, 0x9e, 22 ]; 23 let parsed_packet = Packet { 24 header: Header { 25 version: 2, 26 padding: false, 27 extension: true, 28 marker: true, 29 payload_type: 96, 30 sequence_number: 27023, 31 timestamp: 3653407706, 32 ssrc: 476325762, 33 csrc: vec![], 34 extension_profile: 1, 35 extensions: vec![Extension { 36 id: 0, 37 payload: vec![0xFF, 0xFF, 0xFF, 0xFF], 38 }], 39 payload_offset: 20, 40 ..Default::default() 41 }, 42 payload: vec![0x98, 0x36, 0xbe, 0x88, 0x9e], 43 }; 44 45 let mut reader = BufReader::new(raw_pkt.as_slice()); 46 let packet = Packet::unmarshal(&mut reader)?; 47 assert_eq!( 48 packet, parsed_packet, 49 "TestBasic unmarshal: got {}, want {}", 50 packet, parsed_packet 51 ); 52 53 assert_eq!(packet.size(), raw_pkt.len(), "wrong computed marshal size"); 54 55 let mut raw: Vec<u8> = vec![]; 56 { 57 let mut writer = BufWriter::<&mut Vec<u8>>::new(raw.as_mut()); 58 packet.marshal(&mut writer)?; 59 } 60 61 assert_eq!( 62 raw.len(), 63 raw_pkt.len(), 64 "wrong raw marshal size {} vs {}", 65 raw.len(), 66 raw_pkt.len() 67 ); 68 assert_eq!( 69 raw, raw_pkt, 70 "TestBasic marshal: got {:?}, want {:?}", 71 raw, raw_pkt 72 ); 73 74 Ok(()) 75 } 76 77 #[test] 78 fn test_extension() -> Result<(), Error> { 79 let missing_extension_pkt = vec![ 80 0x90, 0x60, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 81 ]; 82 let mut reader = BufReader::new(missing_extension_pkt.as_slice()); 83 let result = Packet::unmarshal(&mut reader); 84 if result.is_ok() { 85 assert!( 86 false, 87 "Unmarshal did not error on packet with missing extension data" 88 ); 89 } 90 91 let invalid_extension_length_pkt = vec![ 92 0x90, 0x60, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 0x99, 0x99, 0x99, 93 0x99, 94 ]; 95 let mut reader = BufReader::new(invalid_extension_length_pkt.as_slice()); 96 let result = Packet::unmarshal(&mut reader); 97 if result.is_ok() { 98 assert!( 99 false, 100 "Unmarshal did not error on packet with invalid extension length" 101 ); 102 } 103 104 let packet = Packet { 105 header: Header { 106 extension: true, 107 extension_profile: 3, 108 extensions: vec![Extension { 109 id: 0, 110 payload: vec![0], 111 }], 112 ..Default::default() 113 }, 114 payload: vec![], 115 }; 116 117 let mut raw: Vec<u8> = vec![]; 118 { 119 let mut writer = BufWriter::<&mut Vec<u8>>::new(raw.as_mut()); 120 let result = packet.marshal(&mut writer); 121 if result.is_ok() { 122 assert!( 123 false, 124 "Marshal did not error on packet with invalid extension length" 125 ); 126 } 127 } 128 129 Ok(()) 130 } 131 132 #[test] 133 fn test_rfc8285_one_byte_extension() -> Result<(), Error> { 134 let raw_pkt = vec![ 135 0x90, 0xe0, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 0xBE, 0xDE, 0x00, 136 0x01, 0x50, 0xAA, 0x00, 0x00, 0x98, 0x36, 0xbe, 0x88, 0x9e, 137 ]; 138 let mut reader = BufReader::new(raw_pkt.as_slice()); 139 Packet::unmarshal(&mut reader)?; 140 141 let p = Packet { 142 header: Header { 143 marker: true, 144 extension: true, 145 extension_profile: 0xBEDE, 146 extensions: vec![Extension { 147 id: 5, 148 payload: vec![0xAA], 149 }], 150 version: 2, 151 payload_offset: 18, 152 payload_type: 96, 153 sequence_number: 27023, 154 timestamp: 3653407706, 155 ssrc: 476325762, 156 csrc: vec![], 157 ..Default::default() 158 }, 159 payload: raw_pkt[20..].to_vec(), 160 }; 161 162 let mut dst: Vec<u8> = vec![]; 163 { 164 let mut writer = BufWriter::<&mut Vec<u8>>::new(dst.as_mut()); 165 p.marshal(&mut writer)?; 166 } 167 assert_eq!(dst, raw_pkt); 168 169 Ok(()) 170 } 171 172 #[test] 173 fn test_rfc8285one_byte_two_extension_of_two_bytes() -> Result<(), Error> { 174 // 0 1 2 3 175 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 176 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 177 // | 0xBE | 0xDE | length=1 | 178 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 179 // | ID | L=0 | data | ID | L=0 | data... 180 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 181 let raw_pkt = vec![ 182 0x90, 0xe0, 0x69, 0x8f, 0xd9, 0xc2, 0x93, 0xda, 0x1c, 0x64, 0x27, 0x82, 0xBE, 0xDE, 0x00, 183 0x01, 0x10, 0xAA, 0x20, 0xBB, // Payload 184 0x98, 0x36, 0xbe, 0x88, 0x9e, 185 ]; 186 let mut reader = BufReader::new(raw_pkt.as_slice()); 187 let p = Packet::unmarshal(&mut reader)?; 188 189 let ext1 = p.header.get_extension(1); 190 let ext1_expect = &[0xAA]; 191 if let Some(ext1) = ext1 { 192 assert_eq!(ext1, ext1_expect); 193 } else { 194 assert!(false, "ext1 is none"); 195 } 196 197 let ext2 = p.header.get_extension(2); 198 let ext2_expect = [0xBB]; 199 if let Some(ext2) = ext2 { 200 assert_eq!(ext2, ext2_expect); 201 } else { 202 assert!(false, "ext2 is none"); 203 } 204 205 // Test Marshal 206 let p = Packet { 207 header: Header { 208 marker: true, 209 extension: true, 210 extension_profile: 0xBEDE, 211 extensions: vec![ 212 Extension { 213 id: 1, 214 payload: vec![0xAA], 215 }, 216 Extension { 217 id: 2, 218 payload: vec![0xBB], 219 }, 220 ], 221 version: 2, 222 payload_offset: 26, 223 payload_type: 96, 224 sequence_number: 27023, 225 timestamp: 3653407706, 226 ssrc: 476325762, 227 csrc: vec![], 228 ..Default::default() 229 }, 230 payload: raw_pkt[20..].to_vec(), 231 }; 232 233 let mut dst: Vec<u8> = vec![]; 234 { 235 let mut writer = BufWriter::<&mut Vec<u8>>::new(dst.as_mut()); 236 p.marshal(&mut writer)?; 237 } 238 assert_eq!(dst, raw_pkt); 239 240 Ok(()) 241 } 242 243 //TODO: TestRFC8285OneByteMultipleExtensionsWithPadding 244 //TODO: ... 245 //TODO: TestRoundtrip 246