|
| 1 | +extern crate data_url; |
| 2 | +extern crate rustc_test; |
| 3 | +extern crate serde_json; |
| 4 | + |
| 5 | +fn run_data_url(input: String, expected_mime: Option<String>, expected_body: Option<Vec<u8>>) { |
| 6 | + let url = data_url::DataUrl::process(&input); |
| 7 | + if let Some(expected_mime) = expected_mime { |
| 8 | + let url = url.unwrap(); |
| 9 | + let (body, _) = url.decode_to_vec().unwrap(); |
| 10 | + if expected_mime == "" { |
| 11 | + assert_eq!(*url.mime_type(), "text/plain;charset=US-ASCII") |
| 12 | + } else { |
| 13 | + assert_eq!(*url.mime_type(), &*expected_mime) |
| 14 | + } |
| 15 | + if let Some(expected_body) = expected_body { |
| 16 | + assert_eq!(body, expected_body) |
| 17 | + } |
| 18 | + } else if let Ok(url) = url { |
| 19 | + assert!(url.decode_to_vec().is_err(), "{:?}", url.mime_type()) |
| 20 | + } |
| 21 | +} |
| 22 | + |
| 23 | +fn collect_data_url<F>(add_test: &mut F) |
| 24 | + where F: FnMut(String, bool, rustc_test::TestFn) |
| 25 | +{ |
| 26 | + let json = include_str!("data-urls.json"); |
| 27 | + let v: serde_json::Value = serde_json::from_str(json).unwrap(); |
| 28 | + for test in v.as_array().unwrap() { |
| 29 | + let input = test.get(0).unwrap().as_str().unwrap().to_owned(); |
| 30 | + |
| 31 | + let expected_mime = test.get(1).unwrap(); |
| 32 | + let expected_mime = if expected_mime.is_null() { |
| 33 | + None |
| 34 | + } else { |
| 35 | + Some(expected_mime.as_str().unwrap().to_owned()) |
| 36 | + }; |
| 37 | + |
| 38 | + let expected_body = test.get(2).map(|j| { |
| 39 | + j.as_array().unwrap().iter().map(|byte| { |
| 40 | + let byte = byte.as_u64().unwrap(); |
| 41 | + assert!(byte <= 0xFF); |
| 42 | + byte as u8 |
| 43 | + }).collect::<Vec<u8>>() |
| 44 | + }); |
| 45 | + |
| 46 | + let should_panic = [ |
| 47 | + "data://test:test/,X", |
| 48 | + "data:;%62ase64,WA", |
| 49 | + "data:;base 64,WA", |
| 50 | + "data:;base64;,WA", |
| 51 | + "data:;base64;base64,WA", |
| 52 | + "data:;charset =x,X", |
| 53 | + "data:;charset,X", |
| 54 | + "data:;charset=,X", |
| 55 | + "data:text/plain;,X", |
| 56 | + "data:text/plain;a=\",\",X", |
| 57 | + "data:x/x;base64;base64,WA", |
| 58 | + "data:x/x;base64;base64x,WA", |
| 59 | + "data:x/x;base64;charset=x,WA", |
| 60 | + "data:x/x;base64;charset=x;base64,WA", |
| 61 | + ].contains(&&*input); |
| 62 | + add_test( |
| 63 | + format!("data: URL {:?}", input), |
| 64 | + should_panic, |
| 65 | + rustc_test::TestFn::dyn_test_fn(move || { |
| 66 | + run_data_url(input, expected_mime, expected_body) |
| 67 | + }) |
| 68 | + ); |
| 69 | + } |
| 70 | +} |
| 71 | + |
| 72 | +fn main() { |
| 73 | + let mut tests = Vec::new(); |
| 74 | + { |
| 75 | + let mut add_one = |name: String, should_panic: bool, run: rustc_test::TestFn| { |
| 76 | + let mut desc = rustc_test::TestDesc::new(rustc_test::DynTestName(name)); |
| 77 | + if should_panic { |
| 78 | + desc.should_panic = rustc_test::ShouldPanic::Yes |
| 79 | + } |
| 80 | + tests.push(rustc_test::TestDescAndFn { desc, testfn: run }) |
| 81 | + }; |
| 82 | + collect_data_url(&mut add_one); |
| 83 | + } |
| 84 | + rustc_test::test_main(&std::env::args().collect::<Vec<_>>(), tests) |
| 85 | +} |
0 commit comments