wpt.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 json = include_str!("data-urls.json");
  25. let v: serde_json::Value = serde_json::from_str(json).unwrap();
  26. for test in v.as_array().unwrap() {
  27. let input = test.get(0).unwrap().as_str().unwrap().to_owned();
  28. let expected_mime = test.get(1).unwrap();
  29. let expected_mime = if expected_mime.is_null() {
  30. None
  31. } else {
  32. Some(expected_mime.as_str().unwrap().to_owned())
  33. };
  34. let expected_body = test.get(2).map(json_byte_array);
  35. let should_panic = [
  36. "data://test:test/,X",
  37. "data:;%62ase64,WA",
  38. "data:;base 64,WA",
  39. "data:;base64;,WA",
  40. "data:;base64;base64,WA",
  41. "data:;charset =x,X",
  42. "data:;charset,X",
  43. "data:;charset=,X",
  44. "data:text/plain;,X",
  45. "data:text/plain;a=\",\",X",
  46. "data:x/x;base64;base64,WA",
  47. "data:x/x;base64;base64x,WA",
  48. "data:x/x;base64;charset=x,WA",
  49. "data:x/x;base64;charset=x;base64,WA",
  50. ].contains(&&*input);
  51. add_test(
  52. format!("data: URL {:?}", input),
  53. should_panic,
  54. rustc_test::TestFn::dyn_test_fn(move || {
  55. run_data_url(input, expected_mime, expected_body)
  56. })
  57. );
  58. }
  59. }
  60. fn run_base64(input: String, expected: Option<Vec<u8>>) {
  61. let result = data_url::forgiving_base64::decode_to_vec(input.as_bytes());
  62. match (result, expected) {
  63. (Ok(bytes), Some(expected)) => assert_eq!(bytes, expected),
  64. (Ok(bytes), None) => panic!("Expected error, got {:?}", bytes),
  65. (Err(_), Some(expected)) => panic!("Expected {:?}, got error", expected),
  66. (Err(_), None) => {}
  67. }
  68. }
  69. fn collect_base64<F>(add_test: &mut F)
  70. where F: FnMut(String, bool, rustc_test::TestFn)
  71. {
  72. let json = include_str!("base64.json");
  73. let v: serde_json::Value = serde_json::from_str(json).unwrap();
  74. for test in v.as_array().unwrap() {
  75. let input = test.get(0).unwrap().as_str().unwrap().to_owned();
  76. let expected = test.get(1).unwrap();
  77. let expected = if expected.is_null() {
  78. None
  79. } else {
  80. Some(json_byte_array(expected))
  81. };
  82. let should_panic = [
  83. " \t\n\u{c}\r ab\t\n\u{c}\r cd\t\n\u{c}\r ",
  84. " abcd",
  85. "////A",
  86. "///A",
  87. "AAA/",
  88. "AAAA/",
  89. "ab cd",
  90. "ab==",
  91. "ab\ncd",
  92. "ab\rcd",
  93. "ab\t\n\u{c}\r =\t\n\u{c}\r =\t\n\u{c}\r ",
  94. "ab\t\n\u{c}\r cd",
  95. "ab\tcd",
  96. "ab\u{c}cd",
  97. "abc=",
  98. "abcd ",
  99. "abcd",
  100. "abcde",
  101. ].contains(&&*input);
  102. add_test(
  103. format!("base64 {:?}", input),
  104. should_panic,
  105. rustc_test::TestFn::dyn_test_fn(move || {
  106. run_base64(input, expected)
  107. })
  108. );
  109. }
  110. }
  111. fn json_byte_array(j: &serde_json::Value) -> Vec<u8> {
  112. j.as_array().unwrap().iter().map(|byte| {
  113. let byte = byte.as_u64().unwrap();
  114. assert!(byte <= 0xFF);
  115. byte as u8
  116. }).collect()
  117. }
  118. fn main() {
  119. let mut tests = Vec::new();
  120. {
  121. let mut add_one = |name: String, should_panic: bool, run: rustc_test::TestFn| {
  122. let mut desc = rustc_test::TestDesc::new(rustc_test::DynTestName(name));
  123. if should_panic {
  124. desc.should_panic = rustc_test::ShouldPanic::Yes
  125. }
  126. tests.push(rustc_test::TestDescAndFn { desc, testfn: run })
  127. };
  128. collect_data_url(&mut add_one);
  129. collect_base64(&mut add_one);
  130. }
  131. rustc_test::test_main(&std::env::args().collect::<Vec<_>>(), tests)
  132. }