1 use super::*; 2 use bytes::Bytes; 3 4 // generates a valid ogg file that can be used for tests 5 fn build_ogg_container() -> Vec<u8> { 6 vec![ 7 0x4f, 0x67, 0x67, 0x53, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 8 0x9b, 0x20, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x61, 0xee, 0x61, 0x17, 0x01, 0x13, 0x4f, 0x70, 9 0x75, 0x73, 0x48, 0x65, 0x61, 0x64, 0x01, 0x02, 0x00, 0x0f, 0x80, 0xbb, 0x00, 0x00, 0x00, 10 0x00, 0x00, 0x4f, 0x67, 0x67, 0x53, 0x00, 0x00, 0xda, 0x93, 0xc2, 0xd9, 0x00, 0x00, 0x00, 11 0x00, 0x8e, 0x9b, 0x20, 0xaa, 0x02, 0x00, 0x00, 0x00, 0x49, 0x97, 0x03, 0x37, 0x01, 0x05, 12 0x98, 0x36, 0xbe, 0x88, 0x9e, 13 ] 14 } 15 16 #[test] 17 fn test_ogg_reader_parse_valid_header() -> Result<()> { 18 let ogg = build_ogg_container(); 19 let r = Cursor::new(&ogg); 20 let (_reader, header) = OggReader::new(r, true)?; 21 22 assert_eq!(header.channel_map, 0); 23 assert_eq!(header.channels, 2); 24 assert_eq!(header.output_gain, 0); 25 assert_eq!(header.pre_skip, 0xf00); 26 assert_eq!(header.sample_rate, 48000); 27 assert_eq!(header.version, 1); 28 29 Ok(()) 30 } 31 32 #[test] 33 fn test_ogg_reader_parse_next_page() -> Result<()> { 34 let ogg = build_ogg_container(); 35 let r = Cursor::new(&ogg); 36 let (mut reader, _header) = OggReader::new(r, true)?; 37 38 let (payload, _) = reader.parse_next_page()?; 39 assert_eq!(Bytes::from_static(&[0x98, 0x36, 0xbe, 0x88, 0x9e]), payload); 40 41 let result = reader.parse_next_page(); 42 assert!(result.is_err()); 43 44 Ok(()) 45 } 46 47 #[test] 48 fn test_ogg_reader_parse_errors() -> Result<()> { 49 //"Invalid ID Page Header Signature" 50 { 51 let mut ogg = build_ogg_container(); 52 ogg[0] = 0; 53 54 let result = OggReader::new(Cursor::new(ogg), false); 55 assert!(result.is_err()); 56 if let Err(err) = result { 57 assert_eq!(Error::ErrBadIDPageSignature, err); 58 } 59 } 60 61 //"Invalid ID Page Header Type" 62 { 63 let mut ogg = build_ogg_container(); 64 ogg[5] = 0; 65 66 let result = OggReader::new(Cursor::new(ogg), false); 67 assert!(result.is_err()); 68 if let Err(err) = result { 69 assert_eq!(Error::ErrBadIDPageType, err); 70 } 71 } 72 73 //"Invalid ID Page Payload Length" 74 { 75 let mut ogg = build_ogg_container(); 76 ogg[27] = 0; 77 78 let result = OggReader::new(Cursor::new(ogg), false); 79 assert!(result.is_err()); 80 if let Err(err) = result { 81 assert_eq!(Error::ErrBadIDPageLength, err); 82 } 83 } 84 85 //"Invalid ID Page Payload Length" 86 { 87 let mut ogg = build_ogg_container(); 88 ogg[35] = 0; 89 90 let result = OggReader::new(Cursor::new(ogg), false); 91 assert!(result.is_err()); 92 if let Err(err) = result { 93 assert_eq!(Error::ErrBadIDPagePayloadSignature, err); 94 } 95 } 96 97 //"Invalid Page Checksum" 98 { 99 let mut ogg = build_ogg_container(); 100 ogg[22] = 0; 101 102 let result = OggReader::new(Cursor::new(ogg), true); 103 assert!(result.is_err()); 104 if let Err(err) = result { 105 assert_eq!(Error::ErrChecksumMismatch, err); 106 } 107 } 108 109 Ok(()) 110 } 111