1 use super::*;
2 use bytes::Bytes;
3 
4 // generates a valid ogg file that can be used for tests
build_ogg_container() -> Vec<u8>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]
test_ogg_reader_parse_valid_header() -> Result<()>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]
test_ogg_reader_parse_next_page() -> Result<()>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!(payload, Bytes::from_static(&[0x98, 0x36, 0xbe, 0x88, 0x9e]));
40 
41     let result = reader.parse_next_page();
42     assert!(result.is_err());
43 
44     Ok(())
45 }
46 
47 #[test]
test_ogg_reader_parse_errors() -> Result<()>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!(err, Error::ErrBadIDPageSignature);
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!(err, Error::ErrBadIDPageType);
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!(err, Error::ErrBadIDPageLength);
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!(err, Error::ErrBadIDPagePayloadSignature);
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!(err, Error::ErrChecksumMismatch);
106         }
107     }
108 
109     Ok(())
110 }
111