| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/basictypes.h" | |
| 6 #include "net/base/mime_sniffer.h" | |
| 7 #include "testing/gtest/include/gtest/gtest.h" | |
| 8 #include "url/gurl.h" | |
| 9 | |
| 10 namespace net { | |
| 11 | |
| 12 struct SnifferTest { | |
| 13 const char* content; | |
| 14 size_t content_len; | |
| 15 std::string url; | |
| 16 std::string type_hint; | |
| 17 const char* mime_type; | |
| 18 }; | |
| 19 | |
| 20 static void TestArray(SnifferTest* tests, size_t count) { | |
| 21 std::string mime_type; | |
| 22 | |
| 23 for (size_t i = 0; i < count; ++i) { | |
| 24 SniffMimeType(tests[i].content, | |
| 25 tests[i].content_len, | |
| 26 GURL(tests[i].url), | |
| 27 tests[i].type_hint, | |
| 28 &mime_type); | |
| 29 EXPECT_EQ(tests[i].mime_type, mime_type); | |
| 30 } | |
| 31 } | |
| 32 | |
| 33 // TODO(evanm): convert other tests to use SniffMimeType instead of TestArray, | |
| 34 // so the error messages produced by test failures are more useful. | |
| 35 static std::string SniffMimeType(const std::string& content, | |
| 36 const std::string& url, | |
| 37 const std::string& mime_type_hint) { | |
| 38 std::string mime_type; | |
| 39 SniffMimeType(content.data(), content.size(), GURL(url), | |
| 40 mime_type_hint, &mime_type); | |
| 41 return mime_type; | |
| 42 } | |
| 43 | |
| 44 TEST(MimeSnifferTest, BoundaryConditionsTest) { | |
| 45 std::string mime_type; | |
| 46 std::string type_hint; | |
| 47 | |
| 48 char buf[] = { | |
| 49 'd', '\x1f', '\xFF' | |
| 50 }; | |
| 51 | |
| 52 GURL url; | |
| 53 | |
| 54 SniffMimeType(buf, 0, url, type_hint, &mime_type); | |
| 55 EXPECT_EQ("text/plain", mime_type); | |
| 56 SniffMimeType(buf, 1, url, type_hint, &mime_type); | |
| 57 EXPECT_EQ("text/plain", mime_type); | |
| 58 SniffMimeType(buf, 2, url, type_hint, &mime_type); | |
| 59 EXPECT_EQ("application/octet-stream", mime_type); | |
| 60 } | |
| 61 | |
| 62 TEST(MimeSnifferTest, BasicSniffingTest) { | |
| 63 SnifferTest tests[] = { | |
| 64 { "<!DOCTYPE html PUBLIC", sizeof("<!DOCTYPE html PUBLIC")-1, | |
| 65 "http://www.example.com/", | |
| 66 "", "text/html" }, | |
| 67 { "<HtMl><Body></body></htMl>", sizeof("<HtMl><Body></body></htMl>")-1, | |
| 68 "http://www.example.com/foo.gif", | |
| 69 "application/octet-stream", "application/octet-stream" }, | |
| 70 { "GIF89a\x1F\x83\x94", sizeof("GIF89a\xAF\x83\x94")-1, | |
| 71 "http://www.example.com/foo", | |
| 72 "text/plain", "image/gif" }, | |
| 73 { "Gif87a\x1F\x83\x94", sizeof("Gif87a\xAF\x83\x94")-1, | |
| 74 "http://www.example.com/foo?param=tt.gif", | |
| 75 "", "application/octet-stream" }, | |
| 76 { "%!PS-Adobe-3.0", sizeof("%!PS-Adobe-3.0")-1, | |
| 77 "http://www.example.com/foo", | |
| 78 "text/plain", "text/plain" }, | |
| 79 { "\x89" "PNG\x0D\x0A\x1A\x0A", sizeof("\x89" "PNG\x0D\x0A\x1A\x0A")-1, | |
| 80 "http://www.example.com/foo", | |
| 81 "application/octet-stream", "application/octet-stream" }, | |
| 82 { "\xFF\xD8\xFF\x23\x49\xAF", sizeof("\xFF\xD8\xFF\x23\x49\xAF")-1, | |
| 83 "http://www.example.com/foo", | |
| 84 "", "image/jpeg" }, | |
| 85 }; | |
| 86 | |
| 87 TestArray(tests, arraysize(tests)); | |
| 88 } | |
| 89 | |
| 90 TEST(MimeSnifferTest, ChromeExtensionsTest) { | |
| 91 SnifferTest tests[] = { | |
| 92 // schemes | |
| 93 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 94 "http://www.example.com/foo.crx", | |
| 95 "", "application/x-chrome-extension" }, | |
| 96 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 97 "https://www.example.com/foo.crx", | |
| 98 "", "application/x-chrome-extension" }, | |
| 99 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 100 "ftp://www.example.com/foo.crx", | |
| 101 "", "application/x-chrome-extension" }, | |
| 102 | |
| 103 // some other mimetypes that should get converted | |
| 104 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 105 "http://www.example.com/foo.crx", | |
| 106 "text/plain", "application/x-chrome-extension" }, | |
| 107 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 108 "http://www.example.com/foo.crx", | |
| 109 "application/octet-stream", "application/x-chrome-extension" }, | |
| 110 | |
| 111 // success edge cases | |
| 112 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 113 "http://www.example.com/foo.crx?query=string", | |
| 114 "", "application/x-chrome-extension" }, | |
| 115 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 116 "http://www.example.com/foo..crx", | |
| 117 "", "application/x-chrome-extension" }, | |
| 118 | |
| 119 // wrong file extension | |
| 120 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 121 "http://www.example.com/foo.bin", | |
| 122 "", "application/octet-stream" }, | |
| 123 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 124 "http://www.example.com/foo.bin?monkey", | |
| 125 "", "application/octet-stream" }, | |
| 126 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 127 "invalid-url", | |
| 128 "", "application/octet-stream" }, | |
| 129 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 130 "http://www.example.com", | |
| 131 "", "application/octet-stream" }, | |
| 132 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 133 "http://www.example.com/", | |
| 134 "", "application/octet-stream" }, | |
| 135 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 136 "http://www.example.com/foo", | |
| 137 "", "application/octet-stream" }, | |
| 138 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 139 "http://www.example.com/foocrx", | |
| 140 "", "application/octet-stream" }, | |
| 141 { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, | |
| 142 "http://www.example.com/foo.crx.blech", | |
| 143 "", "application/octet-stream" }, | |
| 144 | |
| 145 // wrong magic | |
| 146 { "Cr24\x02\x00\x00\x01", sizeof("Cr24\x02\x00\x00\x01")-1, | |
| 147 "http://www.example.com/foo.crx?monkey", | |
| 148 "", "application/octet-stream" }, | |
| 149 { "PADDING_Cr24\x02\x00\x00\x00", sizeof("PADDING_Cr24\x02\x00\x00\x00")-1, | |
| 150 "http://www.example.com/foo.crx?monkey", | |
| 151 "", "application/octet-stream" }, | |
| 152 }; | |
| 153 | |
| 154 TestArray(tests, arraysize(tests)); | |
| 155 } | |
| 156 | |
| 157 TEST(MimeSnifferTest, MozillaCompatibleTest) { | |
| 158 SnifferTest tests[] = { | |
| 159 { " \n <hTmL>\n <hea", sizeof(" \n <hTmL>\n <hea")-1, | |
| 160 "http://www.example.com/", | |
| 161 "", "text/html" }, | |
| 162 { " \n <hTmL>\n <hea", sizeof(" \n <hTmL>\n <hea")-1, | |
| 163 "http://www.example.com/", | |
| 164 "text/plain", "text/plain" }, | |
| 165 { "BMjlakdsfk", sizeof("BMjlakdsfk")-1, | |
| 166 "http://www.example.com/foo", | |
| 167 "", "image/bmp" }, | |
| 168 { "\x00\x00\x30\x00", sizeof("\x00\x00\x30\x00")-1, | |
| 169 "http://www.example.com/favicon.ico", | |
| 170 "", "application/octet-stream" }, | |
| 171 { "#!/bin/sh\nls /\n", sizeof("#!/bin/sh\nls /\n")-1, | |
| 172 "http://www.example.com/foo", | |
| 173 "", "text/plain" }, | |
| 174 { "From: Fred\nTo: Bob\n\nHi\n.\n", | |
| 175 sizeof("From: Fred\nTo: Bob\n\nHi\n.\n")-1, | |
| 176 "http://www.example.com/foo", | |
| 177 "", "text/plain" }, | |
| 178 { "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", | |
| 179 sizeof("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")-1, | |
| 180 "http://www.example.com/foo", | |
| 181 "", "text/xml" }, | |
| 182 { "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", | |
| 183 sizeof("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")-1, | |
| 184 "http://www.example.com/foo", | |
| 185 "application/octet-stream", "application/octet-stream" }, | |
| 186 }; | |
| 187 | |
| 188 TestArray(tests, arraysize(tests)); | |
| 189 } | |
| 190 | |
| 191 TEST(MimeSnifferTest, DontAllowPrivilegeEscalationTest) { | |
| 192 SnifferTest tests[] = { | |
| 193 { "GIF87a\n<html>\n<body>" | |
| 194 "<script>alert('haxorzed');\n</script>" | |
| 195 "</body></html>\n", | |
| 196 sizeof("GIF87a\n<html>\n<body>" | |
| 197 "<script>alert('haxorzed');\n</script>" | |
| 198 "</body></html>\n")-1, | |
| 199 "http://www.example.com/foo", | |
| 200 "", "image/gif" }, | |
| 201 { "GIF87a\n<html>\n<body>" | |
| 202 "<script>alert('haxorzed');\n</script>" | |
| 203 "</body></html>\n", | |
| 204 sizeof("GIF87a\n<html>\n<body>" | |
| 205 "<script>alert('haxorzed');\n</script>" | |
| 206 "</body></html>\n")-1, | |
| 207 "http://www.example.com/foo?q=ttt.html", | |
| 208 "", "image/gif" }, | |
| 209 { "GIF87a\n<html>\n<body>" | |
| 210 "<script>alert('haxorzed');\n</script>" | |
| 211 "</body></html>\n", | |
| 212 sizeof("GIF87a\n<html>\n<body>" | |
| 213 "<script>alert('haxorzed');\n</script>" | |
| 214 "</body></html>\n")-1, | |
| 215 "http://www.example.com/foo#ttt.html", | |
| 216 "", "image/gif" }, | |
| 217 { "a\n<html>\n<body>" | |
| 218 "<script>alert('haxorzed');\n</script>" | |
| 219 "</body></html>\n", | |
| 220 sizeof("a\n<html>\n<body>" | |
| 221 "<script>alert('haxorzed');\n</script>" | |
| 222 "</body></html>\n")-1, | |
| 223 "http://www.example.com/foo", | |
| 224 "", "text/plain" }, | |
| 225 { "a\n<html>\n<body>" | |
| 226 "<script>alert('haxorzed');\n</script>" | |
| 227 "</body></html>\n", | |
| 228 sizeof("a\n<html>\n<body>" | |
| 229 "<script>alert('haxorzed');\n</script>" | |
| 230 "</body></html>\n")-1, | |
| 231 "http://www.example.com/foo?q=ttt.html", | |
| 232 "", "text/plain" }, | |
| 233 { "a\n<html>\n<body>" | |
| 234 "<script>alert('haxorzed');\n</script>" | |
| 235 "</body></html>\n", | |
| 236 sizeof("a\n<html>\n<body>" | |
| 237 "<script>alert('haxorzed');\n</script>" | |
| 238 "</body></html>\n")-1, | |
| 239 "http://www.example.com/foo#ttt.html", | |
| 240 "", "text/plain" }, | |
| 241 { "a\n<html>\n<body>" | |
| 242 "<script>alert('haxorzed');\n</script>" | |
| 243 "</body></html>\n", | |
| 244 sizeof("a\n<html>\n<body>" | |
| 245 "<script>alert('haxorzed');\n</script>" | |
| 246 "</body></html>\n")-1, | |
| 247 "http://www.example.com/foo.html", | |
| 248 "", "text/plain" }, | |
| 249 }; | |
| 250 | |
| 251 TestArray(tests, arraysize(tests)); | |
| 252 } | |
| 253 | |
| 254 TEST(MimeSnifferTest, UnicodeTest) { | |
| 255 SnifferTest tests[] = { | |
| 256 { "\xEF\xBB\xBF" "Hi there", sizeof("\xEF\xBB\xBF" "Hi there")-1, | |
| 257 "http://www.example.com/foo", | |
| 258 "", "text/plain" }, | |
| 259 { "\xEF\xBB\xBF\xED\x7A\xAD\x7A\x0D\x79", | |
| 260 sizeof("\xEF\xBB\xBF\xED\x7A\xAD\x7A\x0D\x79")-1, | |
| 261 "http://www.example.com/foo", | |
| 262 "", "text/plain" }, | |
| 263 { "\xFE\xFF\xD0\xA5\xD0\xBE\xD0\xBB\xD1\x83\xD0\xB9", | |
| 264 sizeof("\xFE\xFF\xD0\xA5\xD0\xBE\xD0\xBB\xD1\x83\xD0\xB9")-1, | |
| 265 "http://www.example.com/foo", | |
| 266 "", "text/plain" }, | |
| 267 { "\xFE\xFF\x00\x41\x00\x20\xD8\x00\xDC\x00\xD8\x00\xDC\x01", | |
| 268 sizeof("\xFE\xFF\x00\x41\x00\x20\xD8\x00\xDC\x00\xD8\x00\xDC\x01")-1, | |
| 269 "http://www.example.com/foo", | |
| 270 "", "text/plain" }, | |
| 271 }; | |
| 272 | |
| 273 TestArray(tests, arraysize(tests)); | |
| 274 } | |
| 275 | |
| 276 TEST(MimeSnifferTest, FlashTest) { | |
| 277 SnifferTest tests[] = { | |
| 278 { "CWSdd\x00\xB3", sizeof("CWSdd\x00\xB3")-1, | |
| 279 "http://www.example.com/foo", | |
| 280 "", "application/octet-stream" }, | |
| 281 { "FLVjdkl*(#)0sdj\x00", sizeof("FLVjdkl*(#)0sdj\x00")-1, | |
| 282 "http://www.example.com/foo?q=ttt.swf", | |
| 283 "", "application/octet-stream" }, | |
| 284 { "FWS3$9\r\b\x00", sizeof("FWS3$9\r\b\x00")-1, | |
| 285 "http://www.example.com/foo#ttt.swf", | |
| 286 "", "application/octet-stream" }, | |
| 287 { "FLVjdkl*(#)0sdj", sizeof("FLVjdkl*(#)0sdj")-1, | |
| 288 "http://www.example.com/foo.swf", | |
| 289 "", "text/plain" }, | |
| 290 { "FLVjdkl*(#)0s\x01dj", sizeof("FLVjdkl*(#)0s\x01dj")-1, | |
| 291 "http://www.example.com/foo/bar.swf", | |
| 292 "", "application/octet-stream" }, | |
| 293 { "FWS3$9\r\b\x1A", sizeof("FWS3$9\r\b\x1A")-1, | |
| 294 "http://www.example.com/foo.swf?clickTAG=http://www.adnetwork.com/bar", | |
| 295 "", "application/octet-stream" }, | |
| 296 { "FWS3$9\r\x1C\b", sizeof("FWS3$9\r\x1C\b")-1, | |
| 297 "http://www.example.com/foo.swf?clickTAG=http://www.adnetwork.com/bar", | |
| 298 "text/plain", "application/octet-stream" }, | |
| 299 }; | |
| 300 | |
| 301 TestArray(tests, arraysize(tests)); | |
| 302 } | |
| 303 | |
| 304 TEST(MimeSnifferTest, XMLTest) { | |
| 305 // An easy feed to identify. | |
| 306 EXPECT_EQ("application/atom+xml", | |
| 307 SniffMimeType("<?xml?><feed", std::string(), "text/xml")); | |
| 308 // Don't sniff out of plain text. | |
| 309 EXPECT_EQ("text/plain", | |
| 310 SniffMimeType("<?xml?><feed", std::string(), "text/plain")); | |
| 311 // Simple RSS. | |
| 312 EXPECT_EQ("application/rss+xml", | |
| 313 SniffMimeType( | |
| 314 "<?xml version='1.0'?>\r\n<rss", std::string(), "text/xml")); | |
| 315 | |
| 316 // The top of CNN's RSS feed, which we'd like to recognize as RSS. | |
| 317 static const char kCNNRSS[] = | |
| 318 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" | |
| 319 "<?xml-stylesheet href=\"http://rss.cnn.com/~d/styles/rss2full.xsl\" " | |
| 320 "type=\"text/xsl\" media=\"screen\"?>" | |
| 321 "<?xml-stylesheet href=\"http://rss.cnn.com/~d/styles/itemcontent.css\" " | |
| 322 "type=\"text/css\" media=\"screen\"?>" | |
| 323 "<rss xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\" " | |
| 324 "version=\"2.0\">"; | |
| 325 // CNN's RSS | |
| 326 EXPECT_EQ("application/rss+xml", | |
| 327 SniffMimeType(kCNNRSS, std::string(), "text/xml")); | |
| 328 EXPECT_EQ("text/plain", SniffMimeType(kCNNRSS, std::string(), "text/plain")); | |
| 329 | |
| 330 // Don't sniff random XML as something different. | |
| 331 EXPECT_EQ("text/xml", | |
| 332 SniffMimeType("<?xml?><notafeed", std::string(), "text/xml")); | |
| 333 // Don't sniff random plain-text as something different. | |
| 334 EXPECT_EQ("text/plain", | |
| 335 SniffMimeType("<?xml?><notafeed", std::string(), "text/plain")); | |
| 336 | |
| 337 // Positive test for the two instances we upgrade to XHTML. | |
| 338 EXPECT_EQ("application/xhtml+xml", | |
| 339 SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", | |
| 340 std::string(), | |
| 341 "text/xml")); | |
| 342 EXPECT_EQ("application/xhtml+xml", | |
| 343 SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", | |
| 344 std::string(), | |
| 345 "application/xml")); | |
| 346 | |
| 347 // Following our behavior with HTML, don't call other mime types XHTML. | |
| 348 EXPECT_EQ("text/plain", | |
| 349 SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", | |
| 350 std::string(), | |
| 351 "text/plain")); | |
| 352 EXPECT_EQ("application/rss+xml", | |
| 353 SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", | |
| 354 std::string(), | |
| 355 "application/rss+xml")); | |
| 356 | |
| 357 // Don't sniff other HTML-looking bits as HTML. | |
| 358 EXPECT_EQ("text/xml", | |
| 359 SniffMimeType("<html><head>", std::string(), "text/xml")); | |
| 360 EXPECT_EQ("text/xml", | |
| 361 SniffMimeType("<foo><html xmlns=\"http://www.w3.org/1999/xhtml\">", | |
| 362 std::string(), | |
| 363 "text/xml")); | |
| 364 } | |
| 365 | |
| 366 // Test content which is >= 1024 bytes, and includes no open angle bracket. | |
| 367 // http://code.google.com/p/chromium/issues/detail?id=3521 | |
| 368 TEST(MimeSnifferTest, XMLTestLargeNoAngledBracket) { | |
| 369 // Make a large input, with 1024 bytes of "x". | |
| 370 std::string content; | |
| 371 content.resize(1024); | |
| 372 std::fill(content.begin(), content.end(), 'x'); | |
| 373 | |
| 374 // content.size() >= 1024 so the sniff is unambiguous. | |
| 375 std::string mime_type; | |
| 376 EXPECT_TRUE(SniffMimeType(content.data(), content.size(), GURL(), | |
| 377 "text/xml", &mime_type)); | |
| 378 EXPECT_EQ("text/xml", mime_type); | |
| 379 } | |
| 380 | |
| 381 // Test content which is >= 1024 bytes, and includes a binary looking byte. | |
| 382 // http://code.google.com/p/chromium/issues/detail?id=15314 | |
| 383 TEST(MimeSnifferTest, LooksBinary) { | |
| 384 // Make a large input, with 1024 bytes of "x" and 1 byte of 0x01. | |
| 385 std::string content; | |
| 386 content.resize(1024); | |
| 387 std::fill(content.begin(), content.end(), 'x'); | |
| 388 content[1000] = 0x01; | |
| 389 | |
| 390 // content.size() >= 1024 so the sniff is unambiguous. | |
| 391 std::string mime_type; | |
| 392 EXPECT_TRUE(SniffMimeType(content.data(), content.size(), GURL(), | |
| 393 "text/plain", &mime_type)); | |
| 394 EXPECT_EQ("application/octet-stream", mime_type); | |
| 395 } | |
| 396 | |
| 397 TEST(MimeSnifferTest, OfficeTest) { | |
| 398 SnifferTest tests[] = { | |
| 399 // Check for URLs incorrectly reported as Microsoft Office files. | |
| 400 { "Hi there", | |
| 401 sizeof("Hi there")-1, | |
| 402 "http://www.example.com/foo.doc", | |
| 403 "application/msword", "application/octet-stream" }, | |
| 404 { "Hi there", | |
| 405 sizeof("Hi there")-1, | |
| 406 "http://www.example.com/foo.xls", | |
| 407 "application/vnd.ms-excel", "application/octet-stream" }, | |
| 408 { "Hi there", | |
| 409 sizeof("Hi there")-1, | |
| 410 "http://www.example.com/foo.ppt", | |
| 411 "application/vnd.ms-powerpoint", "application/octet-stream" }, | |
| 412 // Check for Microsoft Office files incorrectly reported as text. | |
| 413 { "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there", | |
| 414 sizeof("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there")-1, | |
| 415 "http://www.example.com/foo.doc", | |
| 416 "text/plain", "application/msword" }, | |
| 417 { "PK\x03\x04" "Hi there", | |
| 418 sizeof("PK\x03\x04" "Hi there")-1, | |
| 419 "http://www.example.com/foo.doc", | |
| 420 "text/plain", | |
| 421 "application/vnd.openxmlformats-officedocument." | |
| 422 "wordprocessingml.document" }, | |
| 423 { "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there", | |
| 424 sizeof("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there")-1, | |
| 425 "http://www.example.com/foo.xls", | |
| 426 "text/plain", "application/vnd.ms-excel" }, | |
| 427 { "PK\x03\x04" "Hi there", | |
| 428 sizeof("PK\x03\x04" "Hi there")-1, | |
| 429 "http://www.example.com/foo.xls", | |
| 430 "text/plain", | |
| 431 "application/vnd.openxmlformats-officedocument." | |
| 432 "spreadsheetml.sheet" }, | |
| 433 { "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there", | |
| 434 sizeof("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there")-1, | |
| 435 "http://www.example.com/foo.ppt", | |
| 436 "text/plain", "application/vnd.ms-powerpoint" }, | |
| 437 { "PK\x03\x04" "Hi there", | |
| 438 sizeof("PK\x03\x04" "Hi there")-1, | |
| 439 "http://www.example.com/foo.ppt", | |
| 440 "text/plain", | |
| 441 "application/vnd.openxmlformats-officedocument." | |
| 442 "presentationml.presentation" }, | |
| 443 }; | |
| 444 | |
| 445 TestArray(tests, arraysize(tests)); | |
| 446 } | |
| 447 | |
| 448 // TODO(thestig) Add more tests for other AV formats. Add another test case for | |
| 449 // RAW images. | |
| 450 TEST(MimeSnifferTest, AudioVideoTest) { | |
| 451 std::string mime_type; | |
| 452 const char kFlacTestData[] = | |
| 453 "fLaC\x00\x00\x00\x22\x12\x00\x12\x00\x00\x00\x00\x00"; | |
| 454 EXPECT_TRUE(SniffMimeTypeFromLocalData(kFlacTestData, | |
| 455 sizeof(kFlacTestData), | |
| 456 &mime_type)); | |
| 457 EXPECT_EQ("audio/x-flac", mime_type); | |
| 458 mime_type.clear(); | |
| 459 | |
| 460 const char kWMATestData[] = | |
| 461 "\x30\x26\xb2\x75\x8e\x66\xcf\x11\xa6\xd9\x00\xaa\x00\x62\xce\x6c"; | |
| 462 EXPECT_TRUE(SniffMimeTypeFromLocalData(kWMATestData, | |
| 463 sizeof(kWMATestData), | |
| 464 &mime_type)); | |
| 465 EXPECT_EQ("video/x-ms-asf", mime_type); | |
| 466 mime_type.clear(); | |
| 467 | |
| 468 // mp4a, m4b, m4p, and alac extension files which share the same container | |
| 469 // format. | |
| 470 const char kMP4TestData[] = | |
| 471 "\x00\x00\x00\x20\x66\x74\x79\x70\x4d\x34\x41\x20\x00\x00\x00\x00"; | |
| 472 EXPECT_TRUE(SniffMimeTypeFromLocalData(kMP4TestData, | |
| 473 sizeof(kMP4TestData), | |
| 474 &mime_type)); | |
| 475 EXPECT_EQ("video/mp4", mime_type); | |
| 476 mime_type.clear(); | |
| 477 | |
| 478 const char kAACTestData[] = | |
| 479 "\xff\xf1\x50\x80\x02\x20\xb0\x23\x0a\x83\x20\x7d\x61\x90\x3e\xb1"; | |
| 480 EXPECT_TRUE(SniffMimeTypeFromLocalData(kAACTestData, | |
| 481 sizeof(kAACTestData), | |
| 482 &mime_type)); | |
| 483 EXPECT_EQ("audio/mpeg", mime_type); | |
| 484 mime_type.clear(); | |
| 485 } | |
| 486 | |
| 487 } // namespace net | |
| OLD | NEW |