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