wpt.rs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. extern crate data_url;
  2. extern crate rustc_test;
  3. extern crate serde_json;
  4. fn run_data_url(input: String, expected_mime: Option<String>, expected_body: Option<Vec<u8>>) {
  5. let url = data_url::DataUrl::process(&input);
  6. if let Some(expected_mime) = expected_mime {
  7. let url = url.unwrap();
  8. let (body, _) = url.decode_to_vec().unwrap();
  9. if expected_mime == "" {
  10. assert_eq!(*url.mime_type(), "text/plain;charset=US-ASCII")
  11. } else {
  12. assert_eq!(*url.mime_type(), &*expected_mime)
  13. }
  14. if let Some(expected_body) = expected_body {
  15. assert_eq!(body, expected_body)
  16. }
  17. } else if let Ok(url) = url {
  18. assert!(url.decode_to_vec().is_err(), "{:?}", url.mime_type())
  19. }
  20. }
  21. fn collect_data_url<F>(add_test: &mut F)
  22. where F: FnMut(String, bool, rustc_test::TestFn)
  23. {
  24. let known_failures = [
  25. "data://test:test/,X",
  26. "data:;%62ase64,WA",
  27. "data:;base 64,WA",
  28. "data:;base64;,WA",
  29. "data:;base64;base64,WA",
  30. "data:;charset =x,X",
  31. "data:;charset,X",
  32. "data:;charset=,X",
  33. "data:text/plain;,X",
  34. "data:text/plain;a=\",\",X",
  35. "data:x/x;base64;base64,WA",
  36. "data:x/x;base64;base64x,WA",
  37. "data:x/x;base64;charset=x,WA",
  38. "data:x/x;base64;charset=x;base64,WA",
  39. ];
  40. let json = include_str!("data-urls.json");
  41. let v: serde_json::Value = serde_json::from_str(json).unwrap();
  42. for test in v.as_array().unwrap() {
  43. let input = test.get(0).unwrap().as_str().unwrap().to_owned();
  44. let expected_mime = test.get(1).unwrap();
  45. let expected_mime = if expected_mime.is_null() {
  46. None
  47. } else {
  48. Some(expected_mime.as_str().unwrap().to_owned())
  49. };
  50. let expected_body = test.get(2).map(json_byte_array);
  51. let should_panic = known_failures.contains(&&*input);
  52. add_test(
  53. format!("data: URL {:?}", input),
  54. should_panic,
  55. rustc_test::TestFn::dyn_test_fn(move || {
  56. run_data_url(input, expected_mime, expected_body)
  57. })
  58. );
  59. }
  60. }
  61. fn run_base64(input: String, expected: Option<Vec<u8>>) {
  62. let result = data_url::forgiving_base64::decode_to_vec(input.as_bytes());
  63. match (result, expected) {
  64. (Ok(bytes), Some(expected)) => assert_eq!(bytes, expected),
  65. (Ok(bytes), None) => panic!("Expected error, got {:?}", bytes),
  66. (Err(e), Some(expected)) => panic!("Expected {:?}, got error {:?}", expected, e),
  67. (Err(_), None) => {}
  68. }
  69. }
  70. fn collect_base64<F>(add_test: &mut F)
  71. where F: FnMut(String, bool, rustc_test::TestFn)
  72. {
  73. let known_failures = [];
  74. let json = include_str!("base64.json");
  75. let v: serde_json::Value = serde_json::from_str(json).unwrap();
  76. for test in v.as_array().unwrap() {
  77. let input = test.get(0).unwrap().as_str().unwrap().to_owned();
  78. let expected = test.get(1).unwrap();
  79. let expected = if expected.is_null() {
  80. None
  81. } else {
  82. Some(json_byte_array(expected))
  83. };
  84. let should_panic = known_failures.contains(&&*input);
  85. add_test(
  86. format!("base64 {:?}", input),
  87. should_panic,
  88. rustc_test::TestFn::dyn_test_fn(move || {
  89. run_base64(input, expected)
  90. })
  91. );
  92. }
  93. }
  94. fn run_mime(input: String, expected: Option<String>) {
  95. let result = input.parse::<data_url::mime::Mime>();
  96. match (result, expected) {
  97. (Ok(bytes), Some(expected)) => assert_eq!(bytes, &*expected),
  98. (Ok(bytes), None) => panic!("Expected error, got {:?}", bytes),
  99. (Err(e), Some(expected)) => panic!("Expected {:?}, got error {:?}", expected, e),
  100. (Err(_), None) => {}
  101. }
  102. }
  103. fn collect_mime<F>(add_test: &mut F)
  104. where F: FnMut(String, bool, rustc_test::TestFn)
  105. {
  106. // Many WPT tests fail with the mime crate’s parser,
  107. // since that parser is not written for the same spec.
  108. // Only run a few of them for now, since listing all the failures individually is not useful.
  109. let only_run_first_n_tests = 5;
  110. let known_failures = [
  111. "text/html;charset=gbk(",
  112. ];
  113. let json = include_str!("mime-types.json");
  114. let json2 = include_str!("generated-mime-types.json");
  115. let v: serde_json::Value = serde_json::from_str(json).unwrap();
  116. let v2: serde_json::Value = serde_json::from_str(json2).unwrap();
  117. let tests = v.as_array().unwrap().iter().chain(v2.as_array().unwrap());
  118. let mut last_comment = None;
  119. for test in tests.take(only_run_first_n_tests) {
  120. if let Some(s) = test.as_str() {
  121. last_comment = Some(s);
  122. continue
  123. }
  124. let input = test.get("input").unwrap().as_str().unwrap().to_owned();
  125. let expected = test.get("output").unwrap();
  126. let expected = if expected.is_null() {
  127. None
  128. } else {
  129. Some(expected.as_str().unwrap().to_owned())
  130. };
  131. let should_panic = known_failures.contains(&&*input);
  132. add_test(
  133. if let Some(s) = last_comment {
  134. format!("MIME type {:?} {:?}", s, input)
  135. } else {
  136. format!("MIME type {:?}", input)
  137. },
  138. should_panic,
  139. rustc_test::TestFn::dyn_test_fn(move || {
  140. run_mime(input, expected)
  141. })
  142. );
  143. }
  144. }
  145. fn json_byte_array(j: &serde_json::Value) -> Vec<u8> {
  146. j.as_array().unwrap().iter().map(|byte| {
  147. let byte = byte.as_u64().unwrap();
  148. assert!(byte <= 0xFF);
  149. byte as u8
  150. }).collect()
  151. }
  152. fn main() {
  153. let mut tests = Vec::new();
  154. {
  155. let mut add_one = |name: String, should_panic: bool, run: rustc_test::TestFn| {
  156. let mut desc = rustc_test::TestDesc::new(rustc_test::DynTestName(name));
  157. if should_panic {
  158. desc.should_panic = rustc_test::ShouldPanic::Yes
  159. }
  160. tests.push(rustc_test::TestDescAndFn { desc, testfn: run })
  161. };
  162. collect_data_url(&mut add_one);
  163. collect_base64(&mut add_one);
  164. collect_mime(&mut add_one);
  165. }
  166. rustc_test::test_main(&std::env::args().collect::<Vec<_>>(), tests)
  167. }