Skip to content

Commit 226e0a4

Browse files
committed
Run (very few of) the WPT MIME parsing tests
1 parent 28c79fb commit 226e0a4

File tree

1 file changed

+78
-17
lines changed

1 file changed

+78
-17
lines changed

tests/wpt.rs

Lines changed: 78 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,23 @@ fn run_data_url(input: String, expected_mime: Option<String>, expected_body: Opt
2323
fn collect_data_url<F>(add_test: &mut F)
2424
where F: FnMut(String, bool, rustc_test::TestFn)
2525
{
26+
let known_failures = [
27+
"data://test:test/,X",
28+
"data:;%62ase64,WA",
29+
"data:;base 64,WA",
30+
"data:;base64;,WA",
31+
"data:;base64;base64,WA",
32+
"data:;charset =x,X",
33+
"data:;charset,X",
34+
"data:;charset=,X",
35+
"data:text/plain;,X",
36+
"data:text/plain;a=\",\",X",
37+
"data:x/x;base64;base64,WA",
38+
"data:x/x;base64;base64x,WA",
39+
"data:x/x;base64;charset=x,WA",
40+
"data:x/x;base64;charset=x;base64,WA",
41+
];
42+
2643
let json = include_str!("data-urls.json");
2744
let v: serde_json::Value = serde_json::from_str(json).unwrap();
2845
for test in v.as_array().unwrap() {
@@ -37,22 +54,7 @@ fn collect_data_url<F>(add_test: &mut F)
3754

3855
let expected_body = test.get(2).map(json_byte_array);
3956

40-
let should_panic = [
41-
"data://test:test/,X",
42-
"data:;%62ase64,WA",
43-
"data:;base 64,WA",
44-
"data:;base64;,WA",
45-
"data:;base64;base64,WA",
46-
"data:;charset =x,X",
47-
"data:;charset,X",
48-
"data:;charset=,X",
49-
"data:text/plain;,X",
50-
"data:text/plain;a=\",\",X",
51-
"data:x/x;base64;base64,WA",
52-
"data:x/x;base64;base64x,WA",
53-
"data:x/x;base64;charset=x,WA",
54-
"data:x/x;base64;charset=x;base64,WA",
55-
].contains(&&*input);
57+
let should_panic = known_failures.contains(&&*input);
5658
add_test(
5759
format!("data: URL {:?}", input),
5860
should_panic,
@@ -77,6 +79,8 @@ fn run_base64(input: String, expected: Option<Vec<u8>>) {
7779
fn collect_base64<F>(add_test: &mut F)
7880
where F: FnMut(String, bool, rustc_test::TestFn)
7981
{
82+
let known_failures = [];
83+
8084
let json = include_str!("base64.json");
8185
let v: serde_json::Value = serde_json::from_str(json).unwrap();
8286
for test in v.as_array().unwrap() {
@@ -88,7 +92,6 @@ fn collect_base64<F>(add_test: &mut F)
8892
Some(json_byte_array(expected))
8993
};
9094

91-
let known_failures = [];
9295
let should_panic = known_failures.contains(&&*input);
9396
add_test(
9497
format!("base64 {:?}", input),
@@ -100,6 +103,63 @@ fn collect_base64<F>(add_test: &mut F)
100103
}
101104
}
102105

106+
fn run_mime(input: String, expected: Option<String>) {
107+
let result = input.parse::<data_url::mime::Mime>();
108+
match (result, expected) {
109+
(Ok(bytes), Some(expected)) => assert_eq!(bytes, &*expected),
110+
(Ok(bytes), None) => panic!("Expected error, got {:?}", bytes),
111+
(Err(e), Some(expected)) => panic!("Expected {:?}, got error {:?}", expected, e),
112+
(Err(_), None) => {}
113+
}
114+
}
115+
116+
117+
fn collect_mime<F>(add_test: &mut F)
118+
where F: FnMut(String, bool, rustc_test::TestFn)
119+
{
120+
// Many WPT tests fail with the mime crate’s parser,
121+
// since that parser is not written for the same spec.
122+
// Only run a few of them for now, since listing all the failures individually is not useful.
123+
let only_run_first_n_tests = 5;
124+
let known_failures = [
125+
"text/html;charset=gbk(",
126+
];
127+
128+
let json = include_str!("mime-types.json");
129+
let json2 = include_str!("generated-mime-types.json");
130+
let v: serde_json::Value = serde_json::from_str(json).unwrap();
131+
let v2: serde_json::Value = serde_json::from_str(json2).unwrap();
132+
let tests = v.as_array().unwrap().iter().chain(v2.as_array().unwrap());
133+
134+
let mut last_comment = None;
135+
for test in tests.take(only_run_first_n_tests) {
136+
if let Some(s) = test.as_str() {
137+
last_comment = Some(s);
138+
continue
139+
}
140+
let input = test.get("input").unwrap().as_str().unwrap().to_owned();
141+
let expected = test.get("output").unwrap();
142+
let expected = if expected.is_null() {
143+
None
144+
} else {
145+
Some(expected.as_str().unwrap().to_owned())
146+
};
147+
148+
let should_panic = known_failures.contains(&&*input);
149+
add_test(
150+
if let Some(s) = last_comment {
151+
format!("MIME type {:?} {:?}", s, input)
152+
} else {
153+
format!("MIME type {:?}", input)
154+
},
155+
should_panic,
156+
rustc_test::TestFn::dyn_test_fn(move || {
157+
run_mime(input, expected)
158+
})
159+
);
160+
}
161+
}
162+
103163
fn json_byte_array(j: &serde_json::Value) -> Vec<u8> {
104164
j.as_array().unwrap().iter().map(|byte| {
105165
let byte = byte.as_u64().unwrap();
@@ -120,6 +180,7 @@ fn main() {
120180
};
121181
collect_data_url(&mut add_one);
122182
collect_base64(&mut add_one);
183+
collect_mime(&mut add_one);
123184
}
124185
rustc_test::test_main(&std::env::args().collect::<Vec<_>>(), tests)
125186
}

0 commit comments

Comments
 (0)