1#![doc(hidden)]
2
3use std::io;
6use std::io::BufRead;
7use std::io::Read;
8use std::mem;
9use std::mem::MaybeUninit;
10use std::slice;
11
12#[cfg(feature = "bytes")]
13use bytes::Bytes;
14
15use crate::buf_read_iter::BufReadIter;
16#[cfg(feature = "bytes")]
17use crate::chars::Chars;
18use crate::enums::ProtobufEnum;
19use crate::error::ProtobufError;
20use crate::error::ProtobufResult;
21use crate::error::WireError;
22use crate::message::Message;
23use crate::misc::maybe_ununit_array_assume_init;
24use crate::unknown::UnknownValue;
25use crate::wire_format;
26use crate::zigzag::decode_zig_zag_32;
27use crate::zigzag::decode_zig_zag_64;
28
29const DEFAULT_RECURSION_LIMIT: u32 = 100;
31
32pub(crate) const READ_RAW_BYTES_MAX_ALLOC: usize = 10_000_000;
34
35pub struct CodedInputStream<'a> {
37 source: BufReadIter<'a>,
38 recursion_level: u32,
39 recursion_limit: u32,
40}
41
42impl<'a> CodedInputStream<'a> {
43 pub fn new(read: &'a mut dyn Read) -> CodedInputStream<'a> {
47 CodedInputStream::from_buf_read_iter(BufReadIter::from_read(read))
48 }
49
50 pub fn from_buffered_reader(buf_read: &'a mut dyn BufRead) -> CodedInputStream<'a> {
54 CodedInputStream::from_buf_read_iter(BufReadIter::from_buf_read(buf_read))
55 }
56
57 pub fn from_bytes(bytes: &'a [u8]) -> CodedInputStream<'a> {
59 CodedInputStream::from_buf_read_iter(BufReadIter::from_byte_slice(bytes))
60 }
61
62 #[cfg(feature = "bytes")]
68 pub fn from_carllerche_bytes(bytes: &'a Bytes) -> CodedInputStream<'a> {
69 CodedInputStream::from_buf_read_iter(BufReadIter::from_bytes(bytes))
70 }
71
72 fn from_buf_read_iter(source: BufReadIter<'a>) -> CodedInputStream<'a> {
73 CodedInputStream {
74 source: source,
75 recursion_level: 0,
76 recursion_limit: DEFAULT_RECURSION_LIMIT,
77 }
78 }
79
80 pub fn set_recursion_limit(&mut self, limit: u32) {
82 self.recursion_limit = limit;
83 }
84
85 #[inline]
86 pub(crate) fn incr_recursion(&mut self) -> ProtobufResult<()> {
87 if self.recursion_level >= self.recursion_limit {
88 return Err(ProtobufError::WireError(WireError::OverRecursionLimit));
89 }
90 self.recursion_level += 1;
91 Ok(())
92 }
93
94 #[inline]
95 pub(crate) fn decr_recursion(&mut self) {
96 self.recursion_level -= 1;
97 }
98
99 pub fn pos(&self) -> u64 {
101 self.source.pos()
102 }
103
104 pub fn bytes_until_limit(&self) -> u64 {
106 self.source.bytes_until_limit()
107 }
108
109 #[inline]
111 fn read_exact_uninit(&mut self, buf: &mut [MaybeUninit<u8>]) -> ProtobufResult<()> {
112 self.source.read_exact(buf)
113 }
114
115 pub fn read(&mut self, buf: &mut [u8]) -> ProtobufResult<()> {
120 let buf = unsafe {
122 slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len())
123 };
124 self.read_exact_uninit(buf)
125 }
126
127 #[cfg(feature = "bytes")]
132 fn read_raw_callerche_bytes(&mut self, count: usize) -> ProtobufResult<Bytes> {
133 self.source.read_exact_bytes(count)
134 }
135
136 #[inline(always)]
138 pub fn read_raw_byte(&mut self) -> ProtobufResult<u8> {
139 self.source.read_byte()
140 }
141
142 pub fn push_limit(&mut self, limit: u64) -> ProtobufResult<u64> {
144 self.source.push_limit(limit)
145 }
146
147 pub fn pop_limit(&mut self, old_limit: u64) {
149 self.source.pop_limit(old_limit);
150 }
151
152 #[inline(always)]
154 pub fn eof(&mut self) -> ProtobufResult<bool> {
155 self.source.eof()
156 }
157
158 pub fn check_eof(&mut self) -> ProtobufResult<()> {
162 let eof = self.eof()?;
163 if !eof {
164 return Err(ProtobufError::WireError(WireError::UnexpectedEof));
165 }
166 Ok(())
167 }
168
169 fn read_raw_varint64_slow(&mut self) -> ProtobufResult<u64> {
170 let mut r: u64 = 0;
171 let mut i = 0;
172 loop {
173 if i == 10 {
174 return Err(ProtobufError::WireError(WireError::IncorrectVarint));
175 }
176 let b = self.read_raw_byte()?;
177 r = r | (((b & 0x7f) as u64) << (i * 7));
179 i += 1;
180 if b < 0x80 {
181 return Ok(r);
182 }
183 }
184 }
185
186 #[inline(always)]
188 pub fn read_raw_varint64(&mut self) -> ProtobufResult<u64> {
189 'slow: loop {
190 let ret;
191 let consume;
192
193 loop {
194 let rem = self.source.remaining_in_buf();
195
196 if rem.len() >= 1 {
197 if rem[0] < 0x80 {
199 ret = rem[0] as u64;
200 consume = 1;
201 } else {
202 if rem.len() >= 2 && rem[1] < 0x80 {
204 ret = (rem[0] & 0x7f) as u64 | (rem[1] as u64) << 7;
205 consume = 2;
206 } else if rem.len() >= 10 {
207 let mut r: u64 = 0;
210 let mut i: usize = 0;
211 {
212 let rem = rem;
213 loop {
214 if i == 10 {
215 return Err(ProtobufError::WireError(
216 WireError::IncorrectVarint,
217 ));
218 }
219
220 let b = if true {
221 unsafe { *rem.get_unchecked(i) }
223 } else {
224 rem[i]
225 };
226
227 r = r | (((b & 0x7f) as u64) << (i * 7));
229 i += 1;
230 if b < 0x80 {
231 break;
232 }
233 }
234 }
235 consume = i;
236 ret = r;
237 } else {
238 break 'slow;
239 }
240 }
241 } else {
242 break 'slow;
243 }
244 break;
245 }
246
247 self.source.consume(consume);
248 return Ok(ret);
249 }
250
251 self.read_raw_varint64_slow()
252 }
253
254 #[inline(always)]
256 pub fn read_raw_varint32(&mut self) -> ProtobufResult<u32> {
257 self.read_raw_varint64().map(|v| v as u32)
258 }
259
260 pub fn read_raw_little_endian32(&mut self) -> ProtobufResult<u32> {
262 let mut bytes = [MaybeUninit::uninit(); 4];
263 self.read_exact_uninit(&mut bytes)?;
264 let bytes = unsafe { maybe_ununit_array_assume_init(bytes) };
266 Ok(u32::from_le_bytes(bytes))
267 }
268
269 pub fn read_raw_little_endian64(&mut self) -> ProtobufResult<u64> {
271 let mut bytes = [MaybeUninit::uninit(); 8];
272 self.read_exact_uninit(&mut bytes)?;
273 let bytes = unsafe { maybe_ununit_array_assume_init(bytes) };
275 Ok(u64::from_le_bytes(bytes))
276 }
277
278 #[inline]
280 pub fn read_tag(&mut self) -> ProtobufResult<wire_format::Tag> {
281 let v = self.read_raw_varint32()?;
282 match wire_format::Tag::new(v) {
283 Some(tag) => Ok(tag),
284 None => Err(ProtobufError::WireError(WireError::IncorrectTag(v))),
285 }
286 }
287
288 #[inline]
290 pub fn read_tag_unpack(&mut self) -> ProtobufResult<(u32, wire_format::WireType)> {
291 self.read_tag().map(|t| t.unpack())
292 }
293
294 pub fn read_double(&mut self) -> ProtobufResult<f64> {
296 let bits = self.read_raw_little_endian64()?;
297 unsafe { Ok(mem::transmute::<u64, f64>(bits)) }
298 }
299
300 pub fn read_float(&mut self) -> ProtobufResult<f32> {
302 let bits = self.read_raw_little_endian32()?;
303 unsafe { Ok(mem::transmute::<u32, f32>(bits)) }
304 }
305
306 pub fn read_int64(&mut self) -> ProtobufResult<i64> {
308 self.read_raw_varint64().map(|v| v as i64)
309 }
310
311 pub fn read_int32(&mut self) -> ProtobufResult<i32> {
313 self.read_raw_varint32().map(|v| v as i32)
314 }
315
316 pub fn read_uint64(&mut self) -> ProtobufResult<u64> {
318 self.read_raw_varint64()
319 }
320
321 pub fn read_uint32(&mut self) -> ProtobufResult<u32> {
323 self.read_raw_varint32()
324 }
325
326 pub fn read_sint64(&mut self) -> ProtobufResult<i64> {
328 self.read_uint64().map(decode_zig_zag_64)
329 }
330
331 pub fn read_sint32(&mut self) -> ProtobufResult<i32> {
333 self.read_uint32().map(decode_zig_zag_32)
334 }
335
336 pub fn read_fixed64(&mut self) -> ProtobufResult<u64> {
338 self.read_raw_little_endian64()
339 }
340
341 pub fn read_fixed32(&mut self) -> ProtobufResult<u32> {
343 self.read_raw_little_endian32()
344 }
345
346 pub fn read_sfixed64(&mut self) -> ProtobufResult<i64> {
348 self.read_raw_little_endian64().map(|v| v as i64)
349 }
350
351 pub fn read_sfixed32(&mut self) -> ProtobufResult<i32> {
353 self.read_raw_little_endian32().map(|v| v as i32)
354 }
355
356 pub fn read_bool(&mut self) -> ProtobufResult<bool> {
358 self.read_raw_varint32().map(|v| v != 0)
359 }
360
361 pub fn read_enum<E: ProtobufEnum>(&mut self) -> ProtobufResult<E> {
363 let i = self.read_int32()?;
364 match ProtobufEnum::from_i32(i) {
365 Some(e) => Ok(e),
366 None => Err(ProtobufError::WireError(WireError::InvalidEnumValue(i))),
367 }
368 }
369
370 pub fn read_repeated_packed_double_into(
372 &mut self,
373 target: &mut Vec<f64>,
374 ) -> ProtobufResult<()> {
375 let len = self.read_raw_varint64()?;
376
377 target.reserve((len / 4) as usize);
378
379 let old_limit = self.push_limit(len)?;
380 while !self.eof()? {
381 target.push(self.read_double()?);
382 }
383 self.pop_limit(old_limit);
384 Ok(())
385 }
386
387 pub fn read_repeated_packed_float_into(&mut self, target: &mut Vec<f32>) -> ProtobufResult<()> {
389 let len = self.read_raw_varint64()?;
390
391 target.reserve((len / 4) as usize);
392
393 let old_limit = self.push_limit(len)?;
394 while !self.eof()? {
395 target.push(self.read_float()?);
396 }
397 self.pop_limit(old_limit);
398 Ok(())
399 }
400
401 pub fn read_repeated_packed_int64_into(&mut self, target: &mut Vec<i64>) -> ProtobufResult<()> {
403 let len = self.read_raw_varint64()?;
404 let old_limit = self.push_limit(len as u64)?;
405 while !self.eof()? {
406 target.push(self.read_int64()?);
407 }
408 self.pop_limit(old_limit);
409 Ok(())
410 }
411
412 pub fn read_repeated_packed_int32_into(&mut self, target: &mut Vec<i32>) -> ProtobufResult<()> {
414 let len = self.read_raw_varint64()?;
415 let old_limit = self.push_limit(len)?;
416 while !self.eof()? {
417 target.push(self.read_int32()?);
418 }
419 self.pop_limit(old_limit);
420 Ok(())
421 }
422
423 pub fn read_repeated_packed_uint64_into(
425 &mut self,
426 target: &mut Vec<u64>,
427 ) -> ProtobufResult<()> {
428 let len = self.read_raw_varint64()?;
429 let old_limit = self.push_limit(len)?;
430 while !self.eof()? {
431 target.push(self.read_uint64()?);
432 }
433 self.pop_limit(old_limit);
434 Ok(())
435 }
436
437 pub fn read_repeated_packed_uint32_into(
439 &mut self,
440 target: &mut Vec<u32>,
441 ) -> ProtobufResult<()> {
442 let len = self.read_raw_varint64()?;
443 let old_limit = self.push_limit(len)?;
444 while !self.eof()? {
445 target.push(self.read_uint32()?);
446 }
447 self.pop_limit(old_limit);
448 Ok(())
449 }
450
451 pub fn read_repeated_packed_sint64_into(
453 &mut self,
454 target: &mut Vec<i64>,
455 ) -> ProtobufResult<()> {
456 let len = self.read_raw_varint64()?;
457 let old_limit = self.push_limit(len)?;
458 while !self.eof()? {
459 target.push(self.read_sint64()?);
460 }
461 self.pop_limit(old_limit);
462 Ok(())
463 }
464
465 pub fn read_repeated_packed_sint32_into(
467 &mut self,
468 target: &mut Vec<i32>,
469 ) -> ProtobufResult<()> {
470 let len = self.read_raw_varint64()?;
471 let old_limit = self.push_limit(len)?;
472 while !self.eof()? {
473 target.push(self.read_sint32()?);
474 }
475 self.pop_limit(old_limit);
476 Ok(())
477 }
478
479 pub fn read_repeated_packed_fixed64_into(
481 &mut self,
482 target: &mut Vec<u64>,
483 ) -> ProtobufResult<()> {
484 let len = self.read_raw_varint64()?;
485
486 target.reserve((len / 8) as usize);
487
488 let old_limit = self.push_limit(len)?;
489 while !self.eof()? {
490 target.push(self.read_fixed64()?);
491 }
492 self.pop_limit(old_limit);
493 Ok(())
494 }
495
496 pub fn read_repeated_packed_fixed32_into(
498 &mut self,
499 target: &mut Vec<u32>,
500 ) -> ProtobufResult<()> {
501 let len = self.read_raw_varint64()?;
502
503 target.reserve((len / 4) as usize);
504
505 let old_limit = self.push_limit(len)?;
506 while !self.eof()? {
507 target.push(self.read_fixed32()?);
508 }
509 self.pop_limit(old_limit);
510 Ok(())
511 }
512
513 pub fn read_repeated_packed_sfixed64_into(
515 &mut self,
516 target: &mut Vec<i64>,
517 ) -> ProtobufResult<()> {
518 let len = self.read_raw_varint64()?;
519
520 target.reserve((len / 8) as usize);
521
522 let old_limit = self.push_limit(len)?;
523 while !self.eof()? {
524 target.push(self.read_sfixed64()?);
525 }
526 self.pop_limit(old_limit);
527 Ok(())
528 }
529
530 pub fn read_repeated_packed_sfixed32_into(
532 &mut self,
533 target: &mut Vec<i32>,
534 ) -> ProtobufResult<()> {
535 let len = self.read_raw_varint64()?;
536
537 target.reserve((len / 4) as usize);
538
539 let old_limit = self.push_limit(len)?;
540 while !self.eof()? {
541 target.push(self.read_sfixed32()?);
542 }
543 self.pop_limit(old_limit);
544 Ok(())
545 }
546
547 pub fn read_repeated_packed_bool_into(&mut self, target: &mut Vec<bool>) -> ProtobufResult<()> {
549 let len = self.read_raw_varint64()?;
550
551 target.reserve(len as usize);
553
554 let old_limit = self.push_limit(len)?;
555 while !self.eof()? {
556 target.push(self.read_bool()?);
557 }
558 self.pop_limit(old_limit);
559 Ok(())
560 }
561
562 pub fn read_repeated_packed_enum_into<E: ProtobufEnum>(
564 &mut self,
565 target: &mut Vec<E>,
566 ) -> ProtobufResult<()> {
567 let len = self.read_raw_varint64()?;
568 let old_limit = self.push_limit(len)?;
569 while !self.eof()? {
570 target.push(self.read_enum()?);
571 }
572 self.pop_limit(old_limit);
573 Ok(())
574 }
575
576 pub fn read_unknown(
578 &mut self,
579 wire_type: wire_format::WireType,
580 ) -> ProtobufResult<UnknownValue> {
581 match wire_type {
582 wire_format::WireTypeVarint => {
583 self.read_raw_varint64().map(|v| UnknownValue::Varint(v))
584 }
585 wire_format::WireTypeFixed64 => self.read_fixed64().map(|v| UnknownValue::Fixed64(v)),
586 wire_format::WireTypeFixed32 => self.read_fixed32().map(|v| UnknownValue::Fixed32(v)),
587 wire_format::WireTypeLengthDelimited => {
588 let len = self.read_raw_varint32()?;
589 self.read_raw_bytes(len)
590 .map(|v| UnknownValue::LengthDelimited(v))
591 }
592 _ => Err(ProtobufError::WireError(WireError::UnexpectedWireType(
593 wire_type,
594 ))),
595 }
596 }
597
598 pub fn skip_field(&mut self, wire_type: wire_format::WireType) -> ProtobufResult<()> {
600 self.read_unknown(wire_type).map(|_| ())
601 }
602
603 pub fn read_raw_bytes_into(&mut self, count: u32, target: &mut Vec<u8>) -> ProtobufResult<()> {
606 self.source.read_exact_to_vec(count as usize, target)
607 }
608
609 pub fn read_raw_bytes(&mut self, count: u32) -> ProtobufResult<Vec<u8>> {
611 let mut r = Vec::new();
612 self.read_raw_bytes_into(count, &mut r)?;
613 Ok(r)
614 }
615
616 pub fn skip_raw_bytes(&mut self, count: u32) -> ProtobufResult<()> {
618 self.read_raw_bytes(count).map(|_| ())
620 }
621
622 pub fn read_bytes(&mut self) -> ProtobufResult<Vec<u8>> {
624 let mut r = Vec::new();
625 self.read_bytes_into(&mut r)?;
626 Ok(r)
627 }
628
629 #[cfg(feature = "bytes")]
631 pub fn read_carllerche_bytes(&mut self) -> ProtobufResult<Bytes> {
632 let len = self.read_raw_varint32()?;
633 self.read_raw_callerche_bytes(len as usize)
634 }
635
636 #[cfg(feature = "bytes")]
638 pub fn read_carllerche_chars(&mut self) -> ProtobufResult<Chars> {
639 let bytes = self.read_carllerche_bytes()?;
640 Ok(Chars::from_bytes(bytes)?)
641 }
642
643 pub fn read_bytes_into(&mut self, target: &mut Vec<u8>) -> ProtobufResult<()> {
645 let len = self.read_raw_varint32()?;
646 self.read_raw_bytes_into(len, target)?;
647 Ok(())
648 }
649
650 pub fn read_string(&mut self) -> ProtobufResult<String> {
652 let mut r = String::new();
653 self.read_string_into(&mut r)?;
654 Ok(r)
655 }
656
657 pub fn read_string_into(&mut self, target: &mut String) -> ProtobufResult<()> {
659 target.clear();
660 let mut vec = mem::replace(target, String::new()).into_bytes();
662 self.read_bytes_into(&mut vec)?;
663
664 let s = match String::from_utf8(vec) {
665 Ok(t) => t,
666 Err(_) => return Err(ProtobufError::WireError(WireError::Utf8Error)),
667 };
668 *target = s;
669 Ok(())
670 }
671
672 pub fn merge_message<M: Message>(&mut self, message: &mut M) -> ProtobufResult<()> {
674 let len = self.read_raw_varint64()?;
675 let old_limit = self.push_limit(len)?;
676 message.merge_from(self)?;
677 self.pop_limit(old_limit);
678 Ok(())
679 }
680
681 pub fn read_message<M: Message>(&mut self) -> ProtobufResult<M> {
683 let mut r: M = Message::new();
684 self.merge_message(&mut r)?;
685 r.check_initialized()?;
686 Ok(r)
687 }
688}
689
690impl<'a> Read for CodedInputStream<'a> {
691 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
692 self.source.read(buf).map_err(Into::into)
693 }
694}
695
696impl<'a> BufRead for CodedInputStream<'a> {
697 fn fill_buf(&mut self) -> io::Result<&[u8]> {
698 self.source.fill_buf().map_err(Into::into)
699 }
700
701 fn consume(&mut self, amt: usize) {
702 self.source.consume(amt)
703 }
704}
705
706#[doc(hidden)]
708pub trait WithCodedInputStream {
709 fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
710 where
711 F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>;
712}
713
714impl<'a> WithCodedInputStream for &'a mut (dyn Read + 'a) {
715 fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
716 where
717 F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
718 {
719 let mut is = CodedInputStream::new(self);
720 let r = cb(&mut is)?;
721 is.check_eof()?;
722 Ok(r)
723 }
724}
725
726impl<'a> WithCodedInputStream for &'a mut (dyn BufRead + 'a) {
727 fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
728 where
729 F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
730 {
731 let mut is = CodedInputStream::from_buffered_reader(self);
732 let r = cb(&mut is)?;
733 is.check_eof()?;
734 Ok(r)
735 }
736}
737
738impl<'a> WithCodedInputStream for &'a [u8] {
739 fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
740 where
741 F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
742 {
743 let mut is = CodedInputStream::from_bytes(self);
744 let r = cb(&mut is)?;
745 is.check_eof()?;
746 Ok(r)
747 }
748}
749
750#[cfg(feature = "bytes")]
751impl<'a> WithCodedInputStream for &'a Bytes {
752 fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
753 where
754 F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
755 {
756 let mut is = CodedInputStream::from_carllerche_bytes(self);
757 let r = cb(&mut is)?;
758 is.check_eof()?;
759 Ok(r)
760 }
761}
762
763#[cfg(test)]
764mod test {
765
766 use std::fmt::Debug;
767 use std::io;
768 use std::io::BufRead;
769 use std::io::Read;
770
771 use super::CodedInputStream;
772 use super::READ_RAW_BYTES_MAX_ALLOC;
773 use crate::error::ProtobufError;
774 use crate::error::ProtobufResult;
775 use crate::hex::decode_hex;
776
777 fn test_read_partial<F>(hex: &str, mut callback: F)
778 where
779 F: FnMut(&mut CodedInputStream),
780 {
781 let d = decode_hex(hex);
782 let mut reader = io::Cursor::new(d);
783 let mut is = CodedInputStream::from_buffered_reader(&mut reader as &mut dyn BufRead);
784 assert_eq!(0, is.pos());
785 callback(&mut is);
786 }
787
788 fn test_read<F>(hex: &str, mut callback: F)
789 where
790 F: FnMut(&mut CodedInputStream),
791 {
792 let len = decode_hex(hex).len();
793 test_read_partial(hex, |reader| {
794 callback(reader);
795 assert!(reader.eof().expect("eof"));
796 assert_eq!(len as u64, reader.pos());
797 });
798 }
799
800 fn test_read_v<F, V>(hex: &str, v: V, mut callback: F)
801 where
802 F: FnMut(&mut CodedInputStream) -> ProtobufResult<V>,
803 V: PartialEq + Debug,
804 {
805 test_read(hex, |reader| {
806 assert_eq!(v, callback(reader).unwrap());
807 });
808 }
809
810 #[test]
811 fn test_input_stream_read_raw_byte() {
812 test_read("17", |is| {
813 assert_eq!(23, is.read_raw_byte().unwrap());
814 });
815 }
816
817 #[test]
818 fn test_input_stream_read_raw_varint() {
819 test_read_v("07", 7, |reader| reader.read_raw_varint32());
820 test_read_v("07", 7, |reader| reader.read_raw_varint64());
821
822 test_read_v("96 01", 150, |reader| reader.read_raw_varint32());
823 test_read_v("96 01", 150, |reader| reader.read_raw_varint64());
824
825 test_read_v(
826 "ff ff ff ff ff ff ff ff ff 01",
827 0xffffffffffffffff,
828 |reader| reader.read_raw_varint64(),
829 );
830
831 test_read_v("ff ff ff ff 0f", 0xffffffff, |reader| {
832 reader.read_raw_varint32()
833 });
834 test_read_v("ff ff ff ff 0f", 0xffffffff, |reader| {
835 reader.read_raw_varint64()
836 });
837 }
838
839 #[test]
840 fn test_input_stream_read_raw_vaint_malformed() {
841 test_read_partial("ff ff ff ff ff ff ff ff ff ff 01", |reader| {
843 let result = reader.read_raw_varint64();
844 match result {
845 Err(ProtobufError::WireError(..)) => (),
847 _ => panic!(),
848 }
849 });
850 test_read_partial("ff ff ff ff ff ff ff ff ff ff 01", |reader| {
851 let result = reader.read_raw_varint32();
852 match result {
853 Err(ProtobufError::WireError(..)) => (),
855 _ => panic!(),
856 }
857 });
858 }
859
860 #[test]
861 fn test_input_stream_read_raw_varint_unexpected_eof() {
862 test_read_partial("96 97", |reader| {
863 let result = reader.read_raw_varint32();
864 match result {
865 Err(ProtobufError::WireError(..)) => (),
866 _ => panic!(),
867 }
868 });
869 }
870
871 #[test]
872 fn test_input_stream_read_raw_varint_pos() {
873 test_read_partial("95 01 98", |reader| {
874 assert_eq!(149, reader.read_raw_varint32().unwrap());
875 assert_eq!(2, reader.pos());
876 });
877 }
878
879 #[test]
880 fn test_input_stream_read_int32() {
881 test_read_v("02", 2, |reader| reader.read_int32());
882 }
883
884 #[test]
885 fn test_input_stream_read_float() {
886 test_read_v("95 73 13 61", 17e19, |is| is.read_float());
887 }
888
889 #[test]
890 fn test_input_stream_read_double() {
891 test_read_v("40 d5 ab 68 b3 07 3d 46", 23e29, |is| is.read_double());
892 }
893
894 #[test]
895 fn test_input_stream_skip_raw_bytes() {
896 test_read("", |reader| {
897 reader.skip_raw_bytes(0).unwrap();
898 });
899 test_read("aa bb", |reader| {
900 reader.skip_raw_bytes(2).unwrap();
901 });
902 test_read("aa bb cc dd ee ff", |reader| {
903 reader.skip_raw_bytes(6).unwrap();
904 });
905 }
906
907 #[test]
908 fn test_input_stream_read_raw_bytes() {
909 test_read("", |reader| {
910 assert_eq!(
911 Vec::from(&b""[..]),
912 reader.read_raw_bytes(0).expect("read_raw_bytes")
913 );
914 })
915 }
916
917 #[test]
918 fn test_input_stream_limits() {
919 test_read("aa bb cc", |is| {
920 let old_limit = is.push_limit(1).unwrap();
921 assert_eq!(1, is.bytes_until_limit());
922 let r1 = is.read_raw_bytes(1).unwrap();
923 assert_eq!(&[0xaa as u8], &r1[..]);
924 is.pop_limit(old_limit);
925 let r2 = is.read_raw_bytes(2).unwrap();
926 assert_eq!(&[0xbb as u8, 0xcc], &r2[..]);
927 });
928 }
929
930 #[test]
931 fn test_input_stream_io_read() {
932 test_read("aa bb cc", |is| {
933 let mut buf = [0; 3];
934 assert_eq!(Read::read(is, &mut buf).expect("io::Read"), 3);
935 assert_eq!(buf, [0xaa, 0xbb, 0xcc]);
936 });
937 }
938
939 #[test]
940 fn test_input_stream_io_bufread() {
941 test_read("aa bb cc", |is| {
942 assert_eq!(
943 BufRead::fill_buf(is).expect("io::BufRead::fill_buf"),
944 &[0xaa, 0xbb, 0xcc]
945 );
946 BufRead::consume(is, 3);
947 });
948 }
949
950 #[test]
951 fn test_input_stream_read_raw_bytes_into_huge() {
952 let mut v = Vec::new();
953 for i in 0..READ_RAW_BYTES_MAX_ALLOC + 1000 {
954 v.push((i % 10) as u8);
955 }
956
957 let mut slice: &[u8] = v.as_slice();
958
959 let mut is = CodedInputStream::new(&mut slice);
960
961 let mut buf = Vec::new();
962
963 is.read_raw_bytes_into(READ_RAW_BYTES_MAX_ALLOC as u32 + 10, &mut buf)
964 .expect("read");
965
966 assert_eq!(READ_RAW_BYTES_MAX_ALLOC + 10, buf.len());
967
968 buf.clear();
969
970 is.read_raw_bytes_into(1000 - 10, &mut buf).expect("read");
971
972 assert_eq!(1000 - 10, buf.len());
973
974 assert!(is.eof().expect("eof"));
975 }
976}