Skip to content

Commit a025480

Browse files
committed
attributes: add some tests for some write_into() implementations
1 parent ccedb46 commit a025480

File tree

3 files changed

+63
-23
lines changed

3 files changed

+63
-23
lines changed

stun-types/src/attribute/alternate.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,18 @@ mod tests {
217217
})
218218
));
219219
// provide incorrectly typed data
220-
let mut data: Vec<_> = raw.into();
220+
let mut data: Vec<_> = raw.clone().into();
221221
BigEndian::write_u16(&mut data[0..2], 0);
222222
assert!(matches!(
223223
AlternateServer::try_from(&RawAttribute::from_bytes(data.as_ref()).unwrap()),
224224
Err(StunParseError::WrongAttributeImplementation)
225225
));
226+
227+
let mut dest = vec![0; raw.padded_len()];
228+
mapped.write_into(&mut dest).unwrap();
229+
let raw = RawAttribute::from_bytes(&dest).unwrap();
230+
let mapped2 = AlternateServer::try_from(&raw).unwrap();
231+
assert_eq!(mapped2.server(), *addr);
226232
}
227233
}
228234

@@ -246,12 +252,18 @@ mod tests {
246252
AlternateDomain::try_from(&RawAttribute::from_bytes(data.as_ref()).unwrap()),
247253
Err(StunParseError::WrongAttributeImplementation)
248254
));
249-
let mut data: Vec<_> = raw.into();
255+
let mut data: Vec<_> = raw.clone().into();
250256
// invalid utf-8 data
251257
data[8] = 0x88;
252258
assert!(matches!(
253259
AlternateDomain::try_from(&RawAttribute::from_bytes(data.as_ref()).unwrap()),
254260
Err(StunParseError::InvalidAttributeData)
255261
));
262+
263+
let mut dest = vec![0; raw.padded_len()];
264+
attr.write_into(&mut dest).unwrap();
265+
let raw = RawAttribute::from_bytes(&dest).unwrap();
266+
let mapped2 = AlternateDomain::try_from(&raw).unwrap();
267+
assert_eq!(mapped2.domain(), dns);
256268
}
257269
}

stun-types/src/attribute/error.rs

+40-20
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,8 @@ impl AttributeWrite for ErrorCode {
4949

5050
fn write_into_unchecked(&self, dest: &mut [u8]) {
5151
let len = self.padded_len();
52-
let offset = self.write_header_unchecked(dest);
53-
dest[offset] = 0u8;
54-
dest[offset + 1] = 0u8;
55-
dest[offset + 2] = (self.code / 100) as u8;
56-
dest[offset + 3] = (self.code % 100) as u8;
57-
let offset = offset + 4;
58-
dest[offset..offset + self.reason.len()].copy_from_slice(self.reason.as_bytes());
59-
let offset = offset + self.reason.len();
52+
let mut offset = self.write_header_unchecked(dest);
53+
offset += self.write_into_data(&mut dest[offset..]);
6054
if len - offset > 0 {
6155
dest[offset..len].fill(0);
6256
}
@@ -247,6 +241,16 @@ impl ErrorCode {
247241
_ => "Unknown",
248242
}
249243
}
244+
245+
fn write_into_data(&self, dest: &mut [u8]) -> usize {
246+
dest[0] = 0u8;
247+
dest[1] = 0u8;
248+
dest[2] = (self.code / 100) as u8;
249+
dest[3] = (self.code % 100) as u8;
250+
let bytes = self.reason.as_bytes();
251+
dest[4..4 + bytes.len()].copy_from_slice(bytes);
252+
4 + bytes.len()
253+
}
250254
}
251255

252256
impl std::fmt::Display for ErrorCode {
@@ -273,23 +277,15 @@ impl Attribute for UnknownAttributes {
273277
}
274278
impl AttributeWrite for UnknownAttributes {
275279
fn to_raw(&self) -> RawAttribute {
276-
let mut data = Vec::with_capacity(self.length() as usize);
277-
for attr in &self.attributes {
278-
let mut encoded = [0; 2];
279-
BigEndian::write_u16(&mut encoded, (*attr).into());
280-
data.extend(encoded);
281-
}
280+
let mut data = vec![0; self.length() as usize];
281+
self.write_into_data(&mut data);
282282
RawAttribute::new_owned(UnknownAttributes::TYPE, data.into_boxed_slice())
283283
}
284284

285285
fn write_into_unchecked(&self, dest: &mut [u8]) {
286286
let len = self.padded_len();
287287
let mut offset = self.write_header_unchecked(dest);
288-
for attr in &self.attributes {
289-
let mut encoded = [0; 2];
290-
BigEndian::write_u16(&mut encoded, (*attr).into());
291-
offset += 2;
292-
}
288+
offset += self.write_into_data(&mut dest[offset..]);
293289
if len - offset > 0 {
294290
dest[offset..len].fill(0);
295291
}
@@ -360,6 +356,15 @@ impl UnknownAttributes {
360356
pub fn has_attribute(&self, attr: AttributeType) -> bool {
361357
self.attributes.iter().any(|&a| a == attr)
362358
}
359+
360+
fn write_into_data(&self, dest: &mut [u8]) -> usize {
361+
let mut offset = 0;
362+
for attr in &self.attributes {
363+
BigEndian::write_u16(&mut dest[offset..offset + 2], (*attr).into());
364+
offset += 2;
365+
}
366+
offset
367+
}
363368
}
364369

365370
impl std::fmt::Display for UnknownAttributes {
@@ -392,6 +397,13 @@ mod tests {
392397
let err2 = ErrorCode::try_from(&raw).unwrap();
393398
assert_eq!(err2.code(), code);
394399
assert_eq!(err2.reason(), reason);
400+
401+
let mut dest = vec![0; raw.padded_len()];
402+
err.write_into(&mut dest).unwrap();
403+
let raw = RawAttribute::from_bytes(&dest).unwrap();
404+
let err2 = ErrorCode::try_from(&raw).unwrap();
405+
assert_eq!(err2.code(), code);
406+
assert_eq!(err2.reason(), reason);
395407
}
396408
}
397409

@@ -527,11 +539,19 @@ mod tests {
527539
})
528540
));
529541
// provide incorrectly typed data
530-
let mut data: Vec<_> = raw.into();
542+
let mut data: Vec<_> = raw.clone().into();
531543
BigEndian::write_u16(&mut data[0..2], 0);
532544
assert!(matches!(
533545
UnknownAttributes::try_from(&RawAttribute::from_bytes(data.as_ref()).unwrap()),
534546
Err(StunParseError::WrongAttributeImplementation)
535547
));
548+
549+
let mut dest = vec![0; raw.padded_len()];
550+
unknown.write_into(&mut dest).unwrap();
551+
tracing::error!("{dest:?}");
552+
let raw = RawAttribute::from_bytes(&dest).unwrap();
553+
let unknown2 = UnknownAttributes::try_from(&raw).unwrap();
554+
assert!(unknown2.has_attribute(Realm::TYPE));
555+
assert!(unknown2.has_attribute(AlternateServer::TYPE));
536556
}
537557
}

stun-types/src/attribute/fingerprint.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ impl std::fmt::Display for Fingerprint {
116116

117117
#[cfg(test)]
118118
mod tests {
119+
use crate::prelude::AttributeExt;
120+
119121
use super::*;
120122
use byteorder::{BigEndian, ByteOrder};
121123
use tracing::trace;
@@ -145,11 +147,17 @@ mod tests {
145147
})
146148
));
147149
// provide incorrectly typed data
148-
let mut data: Vec<_> = raw.into();
150+
let mut data: Vec<_> = raw.clone().into();
149151
BigEndian::write_u16(&mut data[0..2], 0);
150152
assert!(matches!(
151153
Fingerprint::try_from(&RawAttribute::from_bytes(data.as_ref()).unwrap()),
152154
Err(StunParseError::WrongAttributeImplementation)
153155
));
156+
157+
let mut dest = vec![0; raw.padded_len()];
158+
attr.write_into(&mut dest).unwrap();
159+
let raw = RawAttribute::from_bytes(&dest).unwrap();
160+
let attr2 = Fingerprint::try_from(&raw).unwrap();
161+
assert_eq!(attr2.fingerprint(), &val);
154162
}
155163
}

0 commit comments

Comments
 (0)