wpt.rs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. use tester as test;
  2. #[macro_use]
  3. extern crate serde;
  4. fn run_data_url(
  5. input: String,
  6. expected_mime: Option<String>,
  7. expected_body: Option<Vec<u8>>,
  8. expected_panic: bool,
  9. ) {
  10. let priorhook = std::panic::take_hook();
  11. std::panic::set_hook(Box::new(move |p| {
  12. if !expected_panic {
  13. priorhook(p);
  14. }
  15. }));
  16. let url = data_url::DataUrl::process(&input);
  17. if let Some(expected_mime) = expected_mime {
  18. let url = url.unwrap();
  19. let (body, _) = url.decode_to_vec().unwrap();
  20. if expected_mime.is_empty() {
  21. assert_eq!(url.mime_type().to_string(), "text/plain;charset=US-ASCII")
  22. } else {
  23. assert_eq!(url.mime_type().to_string(), expected_mime)
  24. }
  25. if let Some(expected_body) = expected_body {
  26. assert_eq!(body, expected_body)
  27. }
  28. } else if let Ok(url) = url {
  29. assert!(url.decode_to_vec().is_err(), "{:?}", url.mime_type())
  30. }
  31. }
  32. fn collect_data_url<F>(add_test: &mut F)
  33. where
  34. F: FnMut(String, bool, test::TestFn),
  35. {
  36. let known_failures = ["data://test:test/,X"];
  37. #[derive(Deserialize)]
  38. #[serde(untagged)]
  39. enum TestCase {
  40. Two(String, Option<String>),
  41. Three(String, Option<String>, Vec<u8>),
  42. }
  43. let v: Vec<TestCase> = serde_json::from_str(include_str!("data-urls.json")).unwrap();
  44. for test in v {
  45. let (input, expected_mime, expected_body) = match test {
  46. TestCase::Two(i, m) => (i, m, None),
  47. TestCase::Three(i, m, b) => (i, m, Some(b)),
  48. };
  49. let should_panic = known_failures.contains(&&*input);
  50. add_test(
  51. format!("data: URL {:?}", input),
  52. should_panic,
  53. test::TestFn::DynTestFn(Box::new(move || {
  54. run_data_url(input, expected_mime, expected_body, should_panic)
  55. })),
  56. );
  57. }
  58. }
  59. fn run_base64(input: String, expected: Option<Vec<u8>>) {
  60. let result = data_url::forgiving_base64::decode_to_vec(input.as_bytes());
  61. match (result, expected) {
  62. (Ok(bytes), Some(expected)) => assert_eq!(bytes, expected),
  63. (Ok(bytes), None) => panic!("Expected error, got {:?}", bytes),
  64. (Err(e), Some(expected)) => panic!("Expected {:?}, got error {:?}", expected, e),
  65. (Err(_), None) => {}
  66. }
  67. }
  68. fn collect_base64<F>(add_test: &mut F)
  69. where
  70. F: FnMut(String, bool, test::TestFn),
  71. {
  72. let known_failures = [];
  73. let v: Vec<(String, Option<Vec<u8>>)> =
  74. serde_json::from_str(include_str!("base64.json")).unwrap();
  75. for (input, expected) in v {
  76. let should_panic = known_failures.contains(&&*input);
  77. add_test(
  78. format!("base64 {:?}", input),
  79. should_panic,
  80. test::TestFn::DynTestFn(Box::new(move || run_base64(input, expected))),
  81. );
  82. }
  83. }
  84. fn run_mime(input: String, expected: Option<String>) {
  85. let result = input.parse::<data_url::mime::Mime>();
  86. match (result, expected) {
  87. (Ok(mime), Some(expected)) => assert_eq!(mime.to_string(), expected),
  88. (Ok(mime), None) => panic!("Expected error, got {:?}", mime),
  89. (Err(e), Some(expected)) => panic!("Expected {:?}, got error {:?}", expected, e),
  90. (Err(_), None) => {}
  91. }
  92. }
  93. fn collect_mime<F>(add_test: &mut F)
  94. where
  95. F: FnMut(String, bool, test::TestFn),
  96. {
  97. let known_failures = [];
  98. #[derive(Deserialize)]
  99. #[serde(untagged)]
  100. enum Entry {
  101. Comment(String),
  102. TestCase {
  103. input: String,
  104. output: Option<String>,
  105. },
  106. }
  107. let v: Vec<Entry> = serde_json::from_str(include_str!("mime-types.json")).unwrap();
  108. let v2: Vec<Entry> = serde_json::from_str(include_str!("generated-mime-types.json")).unwrap();
  109. let entries = v.into_iter().chain(v2);
  110. let mut last_comment = None;
  111. for entry in entries {
  112. let (input, expected) = match entry {
  113. Entry::TestCase { input, output } => (input, output),
  114. Entry::Comment(s) => {
  115. last_comment = Some(s);
  116. continue;
  117. }
  118. };
  119. let should_panic = known_failures.contains(&&*input);
  120. add_test(
  121. if let Some(ref s) = last_comment {
  122. format!("MIME type {:?} {:?}", s, input)
  123. } else {
  124. format!("MIME type {:?}", input)
  125. },
  126. should_panic,
  127. test::TestFn::DynTestFn(Box::new(move || run_mime(input, expected))),
  128. );
  129. }
  130. }
  131. fn main() {
  132. let mut tests = Vec::new();
  133. {
  134. let mut add_one = |name: String, should_panic: bool, run: test::TestFn| {
  135. let desc = test::TestDesc {
  136. name: test::DynTestName(name),
  137. ignore: false,
  138. should_panic: match should_panic {
  139. true => test::ShouldPanic::Yes,
  140. false => test::ShouldPanic::No,
  141. },
  142. allow_fail: false,
  143. test_type: test::TestType::Unknown,
  144. };
  145. tests.push(test::TestDescAndFn { desc, testfn: run })
  146. };
  147. collect_data_url(&mut add_one);
  148. collect_base64(&mut add_one);
  149. collect_mime(&mut add_one);
  150. }
  151. test::test_main(&std::env::args().collect::<Vec<_>>(), tests, None)
  152. }