1use super::{
2 overall_structure::{FromBytes, WriteBytes},
3 types::{ParameterId, Time},
4};
5
6use crate::{
7 parameter_id_values::PID_SENTINEL,
8 rtps::{
9 messages::types::{Count, FragmentNumber},
10 types::{EntityId, GuidPrefix, Locator, ProtocolVersion, SequenceNumber, VendorId},
11 },
12};
13use std::{
14 io::BufRead,
15 ops::{Index, Range, RangeFrom, RangeTo},
16 sync::Arc,
17};
18#[allow(dead_code)]
24#[derive(Debug, PartialEq, Eq)]
25pub enum SubmessageElement<'a> {
26 Count(Count),
27 EntityId(EntityId),
28 FragmentNumber(FragmentNumber),
29 FragmentNumberSet(FragmentNumberSet),
30 GuidPrefix(GuidPrefix),
31 LocatorList(LocatorList),
32 Long(i32),
33 ParameterList(&'a ParameterList),
34 ProtocolVersion(ProtocolVersion),
35 SequenceNumber(SequenceNumber),
36 SequenceNumberSet(SequenceNumberSet),
37 SerializedData(&'a Data),
38 Timestamp(Time),
39 ULong(u32),
40 UShort(u16),
41 VendorId(VendorId),
42}
43
44impl WriteBytes for SubmessageElement<'_> {
45 #[inline]
46 fn write_bytes(&self, buf: &mut [u8]) -> usize {
47 match self {
48 SubmessageElement::Count(e) => e.write_bytes(buf),
49 SubmessageElement::EntityId(e) => e.write_bytes(buf),
50 SubmessageElement::FragmentNumber(e) => e.write_bytes(buf),
51 SubmessageElement::FragmentNumberSet(e) => e.write_bytes(buf),
52 SubmessageElement::GuidPrefix(e) => e.write_bytes(buf),
53 SubmessageElement::LocatorList(e) => e.write_bytes(buf),
54 SubmessageElement::Long(e) => e.write_bytes(buf),
55 SubmessageElement::ParameterList(e) => e.write_bytes(buf),
56 SubmessageElement::ProtocolVersion(e) => e.write_bytes(buf),
57 SubmessageElement::SequenceNumber(e) => e.write_bytes(buf),
58 SubmessageElement::SequenceNumberSet(e) => e.write_bytes(buf),
59 SubmessageElement::SerializedData(e) => e.write_bytes(buf),
60 SubmessageElement::Timestamp(e) => e.write_bytes(buf),
61 SubmessageElement::ULong(e) => e.write_bytes(buf),
62 SubmessageElement::UShort(e) => e.write_bytes(buf),
63 SubmessageElement::VendorId(e) => e.write_bytes(buf),
64 }
65 }
66}
67
68#[derive(Clone, Debug, PartialEq, Eq)]
69pub struct SequenceNumberSet {
70 base: SequenceNumber,
71 num_bits: u32,
72 bitmap: [i32; 8],
73}
74
75impl SequenceNumberSet {
76 pub fn new(base: SequenceNumber, set: impl IntoIterator<Item = SequenceNumber>) -> Self {
77 let mut bitmap = [0; 8];
78 let mut num_bits = 0;
79 for sequence_number in set {
80 let delta_n = <i64>::from(sequence_number - base) as u32;
81 let bitmap_num = delta_n / 32;
82 bitmap[bitmap_num as usize] |= 1 << (31 - delta_n % 32);
83 if delta_n + 1 > num_bits {
84 num_bits = delta_n + 1;
85 }
86 }
87
88 Self {
89 base,
90 num_bits,
91 bitmap,
92 }
93 }
94
95 pub fn base(&self) -> SequenceNumber {
96 self.base
97 }
98
99 pub fn set(&self) -> impl Iterator<Item = SequenceNumber> + '_ {
100 struct SequenceNumberSetIterator<'a> {
101 set: &'a SequenceNumberSet,
102 index: usize,
103 }
104
105 impl Iterator for SequenceNumberSetIterator<'_> {
106 type Item = SequenceNumber;
107
108 fn next(&mut self) -> Option<Self::Item> {
109 while self.index < self.set.num_bits as usize {
110 let delta_n = self.index;
111 self.index += 1;
112 let bitmap_num = delta_n / 32;
113 let mask = 1 << (31 - delta_n % 32);
114 if self.set.bitmap[bitmap_num] & mask == mask {
115 return Some(self.set.base + SequenceNumber::from(delta_n as i64));
116 }
117 }
118 None
119 }
120 }
121
122 SequenceNumberSetIterator {
123 set: self,
124 index: 0,
125 }
126 }
127}
128
129impl WriteBytes for SequenceNumberSet {
130 #[inline]
131 fn write_bytes(&self, buf: &mut [u8]) -> usize {
132 let number_of_bitmap_elements = ((self.num_bits + 31) / 32) as usize; self.base.write_bytes(&mut buf[0..]);
135 self.num_bits.write_bytes(&mut buf[8..]);
136 let mut len = 12;
137 for bitmap_element in &self.bitmap[..number_of_bitmap_elements] {
138 bitmap_element.write_bytes(&mut buf[len..]);
139 len += 4;
140 }
141 len
142 }
143}
144
145#[derive(Clone, Debug, PartialEq, Eq)]
146pub struct FragmentNumberSet {
147 base: FragmentNumber,
148 set: Vec<FragmentNumber>,
149}
150
151impl FragmentNumberSet {
152 pub fn new(base: FragmentNumber, set: impl IntoIterator<Item = FragmentNumber>) -> Self {
153 Self {
154 base,
155 set: set.into_iter().collect(),
156 }
157 }
158}
159
160impl WriteBytes for FragmentNumberSet {
161 fn write_bytes(&self, buf: &mut [u8]) -> usize {
162 let mut bitmap = [0; 8];
163 let mut num_bits = 0;
164 for fragment_number in &self.set {
165 let delta_n = *fragment_number - self.base;
166 let bitmap_num = delta_n / 32;
167 bitmap[bitmap_num as usize] |= 1 << (31 - delta_n % 32);
168 if delta_n + 1 > num_bits {
169 num_bits = delta_n + 1;
170 }
171 }
172 let number_of_bitmap_elements = ((num_bits + 31) / 32) as usize; let mut len = 0;
175 len += self.base.write_bytes(&mut buf[len..]);
176 len += num_bits.write_bytes(&mut buf[len..]);
177
178 for bitmap_element in &bitmap[..number_of_bitmap_elements] {
179 len += bitmap_element.write_bytes(&mut buf[len..]);
180 }
181 len
182 }
183}
184
185#[derive(Clone, Debug, PartialEq, Eq)]
186pub struct LocatorList {
187 value: Vec<Locator>,
188}
189
190impl LocatorList {
191 pub fn new(value: Vec<Locator>) -> Self {
192 Self { value }
193 }
194
195 pub fn value(&self) -> &[Locator] {
196 self.value.as_ref()
197 }
198}
199
200impl WriteBytes for LocatorList {
201 fn write_bytes(&self, buf: &mut [u8]) -> usize {
202 let num_locators = self.value().len() as u32;
203 num_locators.write_bytes(&mut buf[0..]);
204 let mut len = 4;
205 for locator in self.value().iter() {
206 len += locator.write_bytes(&mut buf[len..]);
207 }
208 len
209 }
210}
211
212#[derive(Debug, PartialEq, Eq, Clone)]
213pub struct Parameter {
214 parameter_id: ParameterId,
215 value: Vec<u8>,
216}
217
218impl Parameter {
219 pub fn new(parameter_id: ParameterId, value: Vec<u8>) -> Self {
220 Self {
221 parameter_id,
222 value,
223 }
224 }
225
226 pub fn parameter_id(&self) -> ParameterId {
227 self.parameter_id
228 }
229
230 pub fn value(&self) -> &[u8] {
231 self.value.as_ref()
232 }
233
234 pub fn length(&self) -> i16 {
235 self.value.len() as i16
236 }
237}
238
239#[derive(Debug, PartialEq, Eq)]
240pub struct ParameterList {
241 parameter: Vec<Parameter>,
242}
243
244impl ParameterList {
245 pub fn new(parameter: Vec<Parameter>) -> Self {
246 Self { parameter }
247 }
248
249 pub fn empty() -> Self {
250 Self { parameter: vec![] }
251 }
252
253 pub fn parameter(&self) -> &[Parameter] {
254 self.parameter.as_ref()
255 }
256}
257
258impl FromBytes for Parameter {
259 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
260 let parameter_id = E::read_i16(&v[0..]);
261 let length = E::read_i16(&v[2..]);
262 let value = if parameter_id == PID_SENTINEL {
263 &[]
264 } else {
265 &v[4..length as usize + 4]
266 };
267
268 Self::new(parameter_id, value.to_vec())
269 }
270}
271
272impl FromBytes for ParameterList {
273 fn from_bytes<E: byteorder::ByteOrder>(mut v: &[u8]) -> Self {
274 const MAX_PARAMETERS: usize = 2_usize.pow(16);
275
276 let mut parameter = vec![];
277 for _ in 0..MAX_PARAMETERS {
278 let parameter_i = Parameter::from_bytes::<E>(v);
279 if parameter_i.parameter_id() == PID_SENTINEL {
280 break;
281 } else {
282 v.consume(parameter_i.length() as usize + 4);
283 parameter.push(parameter_i);
284 }
285 }
286 Self::new(parameter)
287 }
288}
289
290impl WriteBytes for Parameter {
291 fn write_bytes(&self, mut buf: &mut [u8]) -> usize {
292 let padding_len = match self.value().len() % 4 {
293 1 => 3,
294 2 => 2,
295 3 => 1,
296 _ => 0,
297 };
298 let length = self.value().len() + padding_len;
299 self.parameter_id().write_bytes(&mut buf[0..]);
300 (length as i16).write_bytes(&mut buf[2..]);
301 buf = &mut buf[4..];
302 buf[..self.value().len()].copy_from_slice(self.value().as_ref());
303 buf[self.value().len()..length].fill(0);
304 4 + length
305 }
306}
307
308impl WriteBytes for &ParameterList {
309 fn write_bytes(&self, buf: &mut [u8]) -> usize {
310 let mut length = 0;
311 for parameter in self.parameter().iter() {
312 length += parameter.write_bytes(&mut buf[length..]);
313 }
314 PID_SENTINEL.write_bytes(&mut buf[length..]);
315 buf[length + 2..length + 4].fill(0);
316 length + 4
317 }
318}
319
320#[derive(Debug, Eq, Clone)]
321pub struct ArcSlice {
322 data: Arc<[u8]>,
323 range: Range<usize>,
324}
325
326impl ArcSlice {
327 pub fn new(data: Arc<[u8]>, range: Range<usize>) -> Self {
328 Self { data, range }
329 }
330
331 pub fn len(&self) -> usize {
332 self.range.len()
333 }
334
335 pub fn is_empty(&self) -> bool {
336 self.range.len() == 0
337 }
338
339 pub fn as_slice(&self) -> &[u8] {
340 &self.data[self.range.clone()]
341 }
342
343 pub fn sub_slice(&self, range: RangeFrom<usize>) -> ArcSlice {
344 ArcSlice {
345 data: self.data.clone(),
346 range: range.start + self.range.start..self.range.end,
347 }
348 }
349}
350
351impl PartialEq for ArcSlice {
352 fn eq(&self, other: &Self) -> bool {
353 self.as_slice() == other.as_slice()
354 }
355}
356
357impl AsRef<[u8]> for ArcSlice {
358 fn as_ref(&self) -> &[u8] {
359 &self.data[self.range.clone()]
360 }
361}
362
363impl Index<Range<usize>> for ArcSlice {
364 type Output = [u8];
365 fn index(&self, index: Range<usize>) -> &Self::Output {
366 &self.data[self.range.clone()][index]
367 }
368}
369impl Index<RangeFrom<usize>> for ArcSlice {
370 type Output = [u8];
371 fn index(&self, index: RangeFrom<usize>) -> &Self::Output {
372 &self.data[self.range.clone()][index]
373 }
374}
375impl Index<RangeTo<usize>> for ArcSlice {
376 type Output = [u8];
377 fn index(&self, index: RangeTo<usize>) -> &Self::Output {
378 &self.data[self.range.clone()][index]
379 }
380}
381impl Index<usize> for ArcSlice {
382 type Output = u8;
383 fn index(&self, index: usize) -> &Self::Output {
384 &self.data[self.range.clone()][index]
385 }
386}
387
388impl From<Arc<[u8]>> for ArcSlice {
389 fn from(data: Arc<[u8]>) -> Self {
390 let range = 0..data.len();
391 Self { data, range }
392 }
393}
394
395impl From<Vec<u8>> for ArcSlice {
396 fn from(value: Vec<u8>) -> Self {
397 let range = 0..value.len();
398 Self {
399 data: value.into(),
400 range,
401 }
402 }
403}
404
405#[derive(Debug, PartialEq, Eq, Clone)]
406pub struct Data(ArcSlice);
407
408impl Data {
409 pub fn new(data: ArcSlice) -> Self {
410 Self(data)
411 }
412 pub fn len(&self) -> usize {
413 self.0.len()
414 }
415 pub fn is_empty(&self) -> bool {
416 self.0.len() == 0
417 }
418}
419
420impl AsRef<[u8]> for Data {
421 fn as_ref(&self) -> &[u8] {
422 self.0.as_slice()
423 }
424}
425
426impl WriteBytes for &Data {
427 #[inline]
428 fn write_bytes(&self, buf: &mut [u8]) -> usize {
429 buf[..self.0.len()].copy_from_slice(self.0.as_slice());
430 let length_inclusive_padding = (self.0.len() + 3) & !3;
431 buf[self.0.len()..length_inclusive_padding].fill(0);
432 length_inclusive_padding
433 }
434}
435
436impl FromBytes for EntityId {
437 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
438 Self::new([v[0], v[1], v[2]], v[3])
439 }
440}
441
442impl FromBytes for GuidPrefix {
443 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
444 [
445 v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11],
446 ]
447 }
448}
449
450impl FromBytes for SequenceNumber {
451 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
452 let high = E::read_i32(&v[0..]);
453 let low = E::read_i32(&v[4..]);
454 let value = ((high as i64) << 32) + low as i64;
455 SequenceNumber::from(value)
456 }
457}
458
459impl FromBytes for Count {
460 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
461 E::read_i32(v)
462 }
463}
464
465impl FromBytes for SequenceNumberSet {
466 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
467 let high = E::read_i32(&v[0..]);
468 let low = E::read_i32(&v[4..]);
469 let base = SequenceNumber::from(((high as i64) << 32) + low as i64);
470
471 let num_bits = E::read_u32(&v[8..]);
472 let number_of_bitmap_elements = ((num_bits + 31) / 32) as usize; let mut bitmap = [0; 8];
474 let mut buf = &v[12..];
475 for bitmap_i in bitmap.iter_mut().take(number_of_bitmap_elements) {
476 *bitmap_i = E::read_i32(buf);
477 buf.consume(4);
478 }
479
480 SequenceNumberSet {
481 base,
482 num_bits,
483 bitmap,
484 }
485 }
486}
487
488impl FromBytes for u16 {
489 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
490 E::read_u16(v)
491 }
492}
493
494impl FromBytes for i16 {
495 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
496 E::read_i16(v)
497 }
498}
499
500impl FromBytes for u32 {
501 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
502 E::read_u32(v)
503 }
504}
505
506impl FromBytes for Locator {
507 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
508 let kind = E::read_i32(&v[0..]);
509 let port = E::read_u32(&v[4..]);
510 let address = [
511 v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15], v[16], v[17], v[18], v[19],
512 v[20], v[21], v[22], v[23],
513 ];
514 Self::new(kind, port, address)
515 }
516}
517
518impl FromBytes for LocatorList {
519 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
520 let num_locators = E::read_u32(v);
521 let mut buf = &v[4..];
522 let mut locator_list = Vec::new();
523 for _ in 0..num_locators {
524 locator_list.push(Locator::from_bytes::<E>(buf));
525 buf.consume(24)
526 }
527 Self::new(locator_list)
528 }
529}
530
531impl FromBytes for ProtocolVersion {
532 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
533 Self::new(v[0], v[1])
534 }
535}
536
537impl FromBytes for VendorId {
538 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
539 [v[0], v[1]]
540 }
541}
542
543impl FromBytes for Time {
544 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
545 let seconds = E::read_u32(&v[0..]);
546 let fractions = E::read_u32(&v[4..]);
547 Self::new(seconds, fractions)
548 }
549}
550
551impl FromBytes for FragmentNumberSet {
552 fn from_bytes<E: byteorder::ByteOrder>(v: &[u8]) -> Self {
553 let base = E::read_u32(&v[0..]);
554 let num_bits = E::read_u32(&v[4..]);
555 let number_of_bitmap_elements = ((num_bits + 31) / 32) as usize; let mut bitmap = [0; 8];
557 let mut buf = &v[8..];
558 for bitmap_i in bitmap.iter_mut().take(number_of_bitmap_elements) {
559 *bitmap_i = E::read_i32(buf);
560 buf.consume(4);
561 }
562
563 let mut set = Vec::with_capacity(256);
564 for delta_n in 0..num_bits as usize {
565 if (bitmap[delta_n / 32] & (1 << (31 - delta_n % 32))) == (1 << (31 - delta_n % 32)) {
566 set.push(base + delta_n as u32);
567 }
568 }
569 Self::new(base, set)
570 }
571}
572
573#[cfg(test)]
574mod tests {
575 use super::*;
576 use crate::rtps::{
577 messages::overall_structure::into_bytes_vec, types::Locator,
578 };
579
580 #[test]
581 fn sequence_number_set_methods() {
582 let base = SequenceNumber::from(100);
583 let set = [
584 SequenceNumber::from(102),
585 SequenceNumber::from(200),
586 SequenceNumber::from(355),
587 ];
588 let seq_num_set = SequenceNumberSet::new(base, set);
589
590 assert_eq!(seq_num_set.base(), base);
591 assert!(
592 seq_num_set.set().eq(set),
593 "{:?} not equal to {:?}",
594 seq_num_set.set().collect::<Vec<_>>(),
595 set
596 );
597 }
598
599 #[test]
600 fn serialize_fragment_number_max_gap() {
601 let fragment_number_set = FragmentNumberSet {
602 base: 2,
603 set: vec![2, 257],
604 };
605 #[rustfmt::skip]
606 assert_eq!(into_bytes_vec(fragment_number_set), vec![
607 2, 0, 0, 0, 0, 1, 0, 0, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_1000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0001, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, ]);
618 }
619
620 #[test]
621 fn serialize_locator_list() {
622 let locator_1 = Locator::new(1, 2, [3; 16]);
623 let locator_2 = Locator::new(2, 2, [3; 16]);
624 let locator_list = LocatorList::new(vec![locator_1, locator_2]);
625 assert_eq!(
626 into_bytes_vec(locator_list),
627 vec![
628 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 0, 0, 0, 2, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ]
642 );
643 }
644
645 #[test]
646 fn deserialize_count() {
647 let expected = 7;
648 assert_eq!(
649 expected,
650 Count::from_bytes::<byteorder::LittleEndian>(&[
651 7, 0, 0,0 , ])
653 );
654 }
655
656 #[test]
657 fn deserialize_locator_list() {
658 let locator_1 = Locator::new(1, 2, [3; 16]);
659 let locator_2 = Locator::new(2, 2, [3; 16]);
660 let expected = LocatorList::new(vec![locator_1, locator_2]);
661 #[rustfmt::skip]
662 let result = LocatorList::from_bytes::<byteorder::LittleEndian>(&[
663 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 0, 0, 0, 2, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ]);
678 assert_eq!(expected, result);
679 }
680
681 #[test]
682 fn deserialize_fragment_number() {
683 let expected = 7;
684 assert_eq!(
685 expected,
686 FragmentNumber::from_bytes::<byteorder::LittleEndian>(&[
687 7, 0, 0, 0, ])
689 );
690 }
691
692 #[test]
693 fn deserialize_fragment_number_set_max_gap() {
694 let expected = FragmentNumberSet {
695 base: 2,
696 set: vec![2, 257],
697 };
698 #[rustfmt::skip]
699 let result = FragmentNumberSet::from_bytes::<byteorder::LittleEndian>(&[
700 2, 0, 0, 0, 0, 1, 0, 0, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_1000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0001, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, ]);
712 assert_eq!(expected, result);
713 }
714
715 #[test]
716 fn deserialize_guid_prefix() {
717 let expected = [1; 12];
718 #[rustfmt::skip]
719 assert_eq!(expected, GuidPrefix::from_bytes::<byteorder::LittleEndian>(&[
720 1, 1, 1, 1,
721 1, 1, 1, 1,
722 1, 1, 1, 1,
723 ]));
724 }
725
726 #[test]
727 fn deserialize_protocol_version() {
728 let expected = ProtocolVersion::new(2, 3);
729 assert_eq!(
730 expected,
731 ProtocolVersion::from_bytes::<byteorder::LittleEndian>(&[2, 3])
732 );
733 }
734
735 #[test]
736 fn deserialize_vendor_id() {
737 let expected = [1, 2];
738 assert_eq!(
739 expected,
740 VendorId::from_bytes::<byteorder::LittleEndian>(&[1, 2,])
741 );
742 }
743
744 #[test]
745 fn deserialize_sequence_number() {
746 let expected = SequenceNumber::from(7);
747 assert_eq!(
748 expected,
749 SequenceNumber::from_bytes::<byteorder::LittleEndian>(&[
750 0, 0, 0, 0, 7, 0, 0, 0, ])
753 );
754 }
755
756 #[test]
757 fn serialize_sequence_number_max_gap() {
758 let sequence_number_set = SequenceNumberSet::new(
759 SequenceNumber::from(2),
760 [SequenceNumber::from(2), SequenceNumber::from(257)],
761 );
762 #[rustfmt::skip]
763 assert_eq!(into_bytes_vec(sequence_number_set), vec![
764 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_1000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0001, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, ]);
776 }
777
778 #[test]
779 fn deserialize_sequence_number_set_max_gap() {
780 let expected = SequenceNumberSet::new(
781 SequenceNumber::from(2),
782 [SequenceNumber::from(2), SequenceNumber::from(257)],
783 );
784 #[rustfmt::skip]
785 let result = SequenceNumberSet::from_bytes::<byteorder::LittleEndian>(&[
786 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_1000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b000_0001, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, ]);
798 assert_eq!(expected, result);
799 }
800
801 #[test]
802 fn serialize_parameter() {
803 let parameter = Parameter::new(2, vec![5, 6, 7, 8]);
804 #[rustfmt::skip]
805 assert_eq!(into_bytes_vec(parameter), vec![
806 0x02, 0x00, 4, 0, 5, 6, 7, 8, ]);
809 }
810
811 #[test]
812 fn serialize_parameter_non_multiple_4() {
813 let parameter = Parameter::new(2, vec![5, 6, 7]);
814 #[rustfmt::skip]
815 assert_eq!(into_bytes_vec(parameter), vec![
816 0x02, 0x00, 4, 0, 5, 6, 7, 0, ]);
819 }
820
821 #[test]
822 fn serialize_parameter_zero_size() {
823 let parameter = Parameter::new(2, vec![]);
824 assert_eq!(
825 into_bytes_vec(parameter),
826 vec![
827 0x02, 0x00, 0, 0, ]
829 );
830 }
831
832 #[test]
833 fn serialize_parameter_list() {
834 let parameter_1 = Parameter::new(2, vec![51, 61, 71, 81]);
835 let parameter_2 = Parameter::new(3, vec![52, 62, 0, 0]);
836 let parameter_list_submessage_element = &ParameterList::new(vec![parameter_1, parameter_2]);
837 #[rustfmt::skip]
838 assert_eq!(into_bytes_vec(parameter_list_submessage_element), vec![
839 0x02, 0x00, 4, 0, 51, 61, 71, 81, 0x03, 0x00, 4, 0, 52, 62, 0, 0, 0x01, 0x00, 0, 0, ]);
845 }
846
847 #[test]
848 fn serialize_parameter_list_empty() {
849 let parameter = &ParameterList::empty();
850 #[rustfmt::skip]
851 assert_eq!(into_bytes_vec(parameter), vec![
852 0x01, 0x00, 0, 0, ]);
854 }
855
856 #[test]
857 fn deserialize_parameter_non_multiple_of_4() {
858 let expected = Parameter::new(2, vec![5, 6, 7, 8, 9, 10, 11, 0]);
859 #[rustfmt::skip]
860 let result = Parameter::from_bytes::<byteorder::LittleEndian>(&[
861 0x02, 0x00, 8, 0, 5, 6, 7, 8, 9, 10, 11, 0, ]);
865 assert_eq!(expected, result);
866 }
867
868 #[test]
869 fn deserialize_parameter() {
870 let expected = Parameter::new(2, vec![5, 6, 7, 8, 9, 10, 11, 12]);
871 #[rustfmt::skip]
872 let result = Parameter::from_bytes::<byteorder::LittleEndian>(&[
873 0x02, 0x00, 8, 0, 5, 6, 7, 8, 9, 10, 11, 12, ]);
877 assert_eq!(expected, result);
878 }
879
880 #[test]
881 fn deserialize_parameter_list() {
882 let expected = ParameterList::new(vec![
883 Parameter::new(2, vec![15, 16, 17, 18]),
884 Parameter::new(3, vec![25, 26, 27, 28]),
885 ]);
886 #[rustfmt::skip]
887 let result = ParameterList::from_bytes::<byteorder::LittleEndian>(&[
888 0x02, 0x00, 4, 0, 15, 16, 17, 18, 0x03, 0x00, 4, 0, 25, 26, 27, 28, 0x01, 0x00, 0, 0, ]);
894 assert_eq!(expected, result);
895 }
896
897 #[test]
898 fn deserialize_parameter_list_with_long_parameter_including_sentinel() {
899 #[rustfmt::skip]
900 let parameter_value_expected = vec![
901 0x01, 0x00, 0x00, 0x00,
902 0x01, 0x00, 0x00, 0x00,
903 0x01, 0x01, 0x01, 0x01,
904 0x01, 0x01, 0x01, 0x01,
905 0x01, 0x01, 0x01, 0x01,
906 0x01, 0x01, 0x01, 0x01,
907 ];
908
909 let expected = ParameterList::new(vec![Parameter::new(0x32, parameter_value_expected)]);
910 #[rustfmt::skip]
911 let result = ParameterList::from_bytes::<byteorder::LittleEndian>(&[
912 0x32, 0x00, 24, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, ]);
921 assert_eq!(expected, result);
922 }
923
924 #[test]
925 fn deserialize_parameter_list_with_multiple_parameters_with_same_id() {
926 #[rustfmt::skip]
927 let parameter_value_expected1 = vec![
928 0x01, 0x00, 0x00, 0x00,
929 0x01, 0x00, 0x00, 0x00,
930 0x01, 0x01, 0x01, 0x01,
931 0x01, 0x01, 0x01, 0x01,
932 0x01, 0x01, 0x01, 0x01,
933 0x01, 0x01, 0x01, 0x01,
934 ];
935 #[rustfmt::skip]
936 let parameter_value_expected2 = vec![
937 0x01, 0x00, 0x00, 0x00,
938 0x01, 0x00, 0x00, 0x00,
939 0x02, 0x02, 0x02, 0x02,
940 0x02, 0x02, 0x02, 0x02,
941 0x02, 0x02, 0x02, 0x02,
942 0x02, 0x02, 0x02, 0x02,
943 ];
944
945 let expected = ParameterList::new(vec![
946 Parameter::new(0x32, parameter_value_expected1),
947 Parameter::new(0x32, parameter_value_expected2),
948 ]);
949 #[rustfmt::skip]
950 let result = ParameterList::from_bytes::<byteorder::LittleEndian>(&[
951 0x32, 0x00, 24, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x32, 0x00, 24, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, ]);
967 assert_eq!(expected, result);
968 }
969}