Skip to content

Commit e2b423a

Browse files
committed
Run data URL tests from WPT
1 parent 7c4eeea commit e2b423a

File tree

3 files changed

+97
-1
lines changed

3 files changed

+97
-1
lines changed

Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,15 @@ authors = ["Simon Sapin <simon.sapin@exyr.org>"]
66
[dependencies]
77
matches = "0.1"
88
mime = "0.3"
9+
10+
[dev-dependencies]
11+
rustc-test = "0.3"
12+
serde = "1.0"
13+
serde_json = "1.0"
14+
15+
[lib]
16+
test = false
17+
18+
[[test]]
19+
name = "wpt"
20+
harness = false

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ fn parse_header(from_colon_to_comma: &str) -> (mime::Mime, bool) {
207207
}
208208
}
209209

210-
211210
// FIXME: does Mime::from_str match the MIME Sniffing Standard’s parsing algorithm?
212211
// <https://mimesniff.spec.whatwg.org/#parse-a-mime-type>
213212
let mime_type = string.parse().unwrap_or_else(|_| {

tests/wpt.rs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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

Comments
 (0)