Index: net/base/mime_sniffer_unittest.cc |
diff --git a/net/base/mime_sniffer_unittest.cc b/net/base/mime_sniffer_unittest.cc |
deleted file mode 100644 |
index e4f2d5cf3a08cb6f5c5b7d27bad123a834345303..0000000000000000000000000000000000000000 |
--- a/net/base/mime_sniffer_unittest.cc |
+++ /dev/null |
@@ -1,487 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/basictypes.h" |
-#include "net/base/mime_sniffer.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "url/gurl.h" |
- |
-namespace net { |
- |
-struct SnifferTest { |
- const char* content; |
- size_t content_len; |
- std::string url; |
- std::string type_hint; |
- const char* mime_type; |
-}; |
- |
-static void TestArray(SnifferTest* tests, size_t count) { |
- std::string mime_type; |
- |
- for (size_t i = 0; i < count; ++i) { |
- SniffMimeType(tests[i].content, |
- tests[i].content_len, |
- GURL(tests[i].url), |
- tests[i].type_hint, |
- &mime_type); |
- EXPECT_EQ(tests[i].mime_type, mime_type); |
- } |
-} |
- |
-// TODO(evanm): convert other tests to use SniffMimeType instead of TestArray, |
-// so the error messages produced by test failures are more useful. |
-static std::string SniffMimeType(const std::string& content, |
- const std::string& url, |
- const std::string& mime_type_hint) { |
- std::string mime_type; |
- SniffMimeType(content.data(), content.size(), GURL(url), |
- mime_type_hint, &mime_type); |
- return mime_type; |
-} |
- |
-TEST(MimeSnifferTest, BoundaryConditionsTest) { |
- std::string mime_type; |
- std::string type_hint; |
- |
- char buf[] = { |
- 'd', '\x1f', '\xFF' |
- }; |
- |
- GURL url; |
- |
- SniffMimeType(buf, 0, url, type_hint, &mime_type); |
- EXPECT_EQ("text/plain", mime_type); |
- SniffMimeType(buf, 1, url, type_hint, &mime_type); |
- EXPECT_EQ("text/plain", mime_type); |
- SniffMimeType(buf, 2, url, type_hint, &mime_type); |
- EXPECT_EQ("application/octet-stream", mime_type); |
-} |
- |
-TEST(MimeSnifferTest, BasicSniffingTest) { |
- SnifferTest tests[] = { |
- { "<!DOCTYPE html PUBLIC", sizeof("<!DOCTYPE html PUBLIC")-1, |
- "http://www.example.com/", |
- "", "text/html" }, |
- { "<HtMl><Body></body></htMl>", sizeof("<HtMl><Body></body></htMl>")-1, |
- "http://www.example.com/foo.gif", |
- "application/octet-stream", "application/octet-stream" }, |
- { "GIF89a\x1F\x83\x94", sizeof("GIF89a\xAF\x83\x94")-1, |
- "http://www.example.com/foo", |
- "text/plain", "image/gif" }, |
- { "Gif87a\x1F\x83\x94", sizeof("Gif87a\xAF\x83\x94")-1, |
- "http://www.example.com/foo?param=tt.gif", |
- "", "application/octet-stream" }, |
- { "%!PS-Adobe-3.0", sizeof("%!PS-Adobe-3.0")-1, |
- "http://www.example.com/foo", |
- "text/plain", "text/plain" }, |
- { "\x89" "PNG\x0D\x0A\x1A\x0A", sizeof("\x89" "PNG\x0D\x0A\x1A\x0A")-1, |
- "http://www.example.com/foo", |
- "application/octet-stream", "application/octet-stream" }, |
- { "\xFF\xD8\xFF\x23\x49\xAF", sizeof("\xFF\xD8\xFF\x23\x49\xAF")-1, |
- "http://www.example.com/foo", |
- "", "image/jpeg" }, |
- }; |
- |
- TestArray(tests, arraysize(tests)); |
-} |
- |
-TEST(MimeSnifferTest, ChromeExtensionsTest) { |
- SnifferTest tests[] = { |
- // schemes |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo.crx", |
- "", "application/x-chrome-extension" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "https://www.example.com/foo.crx", |
- "", "application/x-chrome-extension" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "ftp://www.example.com/foo.crx", |
- "", "application/x-chrome-extension" }, |
- |
- // some other mimetypes that should get converted |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo.crx", |
- "text/plain", "application/x-chrome-extension" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo.crx", |
- "application/octet-stream", "application/x-chrome-extension" }, |
- |
- // success edge cases |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo.crx?query=string", |
- "", "application/x-chrome-extension" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo..crx", |
- "", "application/x-chrome-extension" }, |
- |
- // wrong file extension |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo.bin", |
- "", "application/octet-stream" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo.bin?monkey", |
- "", "application/octet-stream" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "invalid-url", |
- "", "application/octet-stream" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com", |
- "", "application/octet-stream" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/", |
- "", "application/octet-stream" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo", |
- "", "application/octet-stream" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foocrx", |
- "", "application/octet-stream" }, |
- { "Cr24\x02\x00\x00\x00", sizeof("Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo.crx.blech", |
- "", "application/octet-stream" }, |
- |
- // wrong magic |
- { "Cr24\x02\x00\x00\x01", sizeof("Cr24\x02\x00\x00\x01")-1, |
- "http://www.example.com/foo.crx?monkey", |
- "", "application/octet-stream" }, |
- { "PADDING_Cr24\x02\x00\x00\x00", sizeof("PADDING_Cr24\x02\x00\x00\x00")-1, |
- "http://www.example.com/foo.crx?monkey", |
- "", "application/octet-stream" }, |
- }; |
- |
- TestArray(tests, arraysize(tests)); |
-} |
- |
-TEST(MimeSnifferTest, MozillaCompatibleTest) { |
- SnifferTest tests[] = { |
- { " \n <hTmL>\n <hea", sizeof(" \n <hTmL>\n <hea")-1, |
- "http://www.example.com/", |
- "", "text/html" }, |
- { " \n <hTmL>\n <hea", sizeof(" \n <hTmL>\n <hea")-1, |
- "http://www.example.com/", |
- "text/plain", "text/plain" }, |
- { "BMjlakdsfk", sizeof("BMjlakdsfk")-1, |
- "http://www.example.com/foo", |
- "", "image/bmp" }, |
- { "\x00\x00\x30\x00", sizeof("\x00\x00\x30\x00")-1, |
- "http://www.example.com/favicon.ico", |
- "", "application/octet-stream" }, |
- { "#!/bin/sh\nls /\n", sizeof("#!/bin/sh\nls /\n")-1, |
- "http://www.example.com/foo", |
- "", "text/plain" }, |
- { "From: Fred\nTo: Bob\n\nHi\n.\n", |
- sizeof("From: Fred\nTo: Bob\n\nHi\n.\n")-1, |
- "http://www.example.com/foo", |
- "", "text/plain" }, |
- { "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", |
- sizeof("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")-1, |
- "http://www.example.com/foo", |
- "", "text/xml" }, |
- { "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", |
- sizeof("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")-1, |
- "http://www.example.com/foo", |
- "application/octet-stream", "application/octet-stream" }, |
- }; |
- |
- TestArray(tests, arraysize(tests)); |
-} |
- |
-TEST(MimeSnifferTest, DontAllowPrivilegeEscalationTest) { |
- SnifferTest tests[] = { |
- { "GIF87a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n", |
- sizeof("GIF87a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n")-1, |
- "http://www.example.com/foo", |
- "", "image/gif" }, |
- { "GIF87a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n", |
- sizeof("GIF87a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n")-1, |
- "http://www.example.com/foo?q=ttt.html", |
- "", "image/gif" }, |
- { "GIF87a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n", |
- sizeof("GIF87a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n")-1, |
- "http://www.example.com/foo#ttt.html", |
- "", "image/gif" }, |
- { "a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n", |
- sizeof("a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n")-1, |
- "http://www.example.com/foo", |
- "", "text/plain" }, |
- { "a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n", |
- sizeof("a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n")-1, |
- "http://www.example.com/foo?q=ttt.html", |
- "", "text/plain" }, |
- { "a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n", |
- sizeof("a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n")-1, |
- "http://www.example.com/foo#ttt.html", |
- "", "text/plain" }, |
- { "a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n", |
- sizeof("a\n<html>\n<body>" |
- "<script>alert('haxorzed');\n</script>" |
- "</body></html>\n")-1, |
- "http://www.example.com/foo.html", |
- "", "text/plain" }, |
- }; |
- |
- TestArray(tests, arraysize(tests)); |
-} |
- |
-TEST(MimeSnifferTest, UnicodeTest) { |
- SnifferTest tests[] = { |
- { "\xEF\xBB\xBF" "Hi there", sizeof("\xEF\xBB\xBF" "Hi there")-1, |
- "http://www.example.com/foo", |
- "", "text/plain" }, |
- { "\xEF\xBB\xBF\xED\x7A\xAD\x7A\x0D\x79", |
- sizeof("\xEF\xBB\xBF\xED\x7A\xAD\x7A\x0D\x79")-1, |
- "http://www.example.com/foo", |
- "", "text/plain" }, |
- { "\xFE\xFF\xD0\xA5\xD0\xBE\xD0\xBB\xD1\x83\xD0\xB9", |
- sizeof("\xFE\xFF\xD0\xA5\xD0\xBE\xD0\xBB\xD1\x83\xD0\xB9")-1, |
- "http://www.example.com/foo", |
- "", "text/plain" }, |
- { "\xFE\xFF\x00\x41\x00\x20\xD8\x00\xDC\x00\xD8\x00\xDC\x01", |
- sizeof("\xFE\xFF\x00\x41\x00\x20\xD8\x00\xDC\x00\xD8\x00\xDC\x01")-1, |
- "http://www.example.com/foo", |
- "", "text/plain" }, |
- }; |
- |
- TestArray(tests, arraysize(tests)); |
-} |
- |
-TEST(MimeSnifferTest, FlashTest) { |
- SnifferTest tests[] = { |
- { "CWSdd\x00\xB3", sizeof("CWSdd\x00\xB3")-1, |
- "http://www.example.com/foo", |
- "", "application/octet-stream" }, |
- { "FLVjdkl*(#)0sdj\x00", sizeof("FLVjdkl*(#)0sdj\x00")-1, |
- "http://www.example.com/foo?q=ttt.swf", |
- "", "application/octet-stream" }, |
- { "FWS3$9\r\b\x00", sizeof("FWS3$9\r\b\x00")-1, |
- "http://www.example.com/foo#ttt.swf", |
- "", "application/octet-stream" }, |
- { "FLVjdkl*(#)0sdj", sizeof("FLVjdkl*(#)0sdj")-1, |
- "http://www.example.com/foo.swf", |
- "", "text/plain" }, |
- { "FLVjdkl*(#)0s\x01dj", sizeof("FLVjdkl*(#)0s\x01dj")-1, |
- "http://www.example.com/foo/bar.swf", |
- "", "application/octet-stream" }, |
- { "FWS3$9\r\b\x1A", sizeof("FWS3$9\r\b\x1A")-1, |
- "http://www.example.com/foo.swf?clickTAG=http://www.adnetwork.com/bar", |
- "", "application/octet-stream" }, |
- { "FWS3$9\r\x1C\b", sizeof("FWS3$9\r\x1C\b")-1, |
- "http://www.example.com/foo.swf?clickTAG=http://www.adnetwork.com/bar", |
- "text/plain", "application/octet-stream" }, |
- }; |
- |
- TestArray(tests, arraysize(tests)); |
-} |
- |
-TEST(MimeSnifferTest, XMLTest) { |
- // An easy feed to identify. |
- EXPECT_EQ("application/atom+xml", |
- SniffMimeType("<?xml?><feed", std::string(), "text/xml")); |
- // Don't sniff out of plain text. |
- EXPECT_EQ("text/plain", |
- SniffMimeType("<?xml?><feed", std::string(), "text/plain")); |
- // Simple RSS. |
- EXPECT_EQ("application/rss+xml", |
- SniffMimeType( |
- "<?xml version='1.0'?>\r\n<rss", std::string(), "text/xml")); |
- |
- // The top of CNN's RSS feed, which we'd like to recognize as RSS. |
- static const char kCNNRSS[] = |
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" |
- "<?xml-stylesheet href=\"http://rss.cnn.com/~d/styles/rss2full.xsl\" " |
- "type=\"text/xsl\" media=\"screen\"?>" |
- "<?xml-stylesheet href=\"http://rss.cnn.com/~d/styles/itemcontent.css\" " |
- "type=\"text/css\" media=\"screen\"?>" |
- "<rss xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\" " |
- "version=\"2.0\">"; |
- // CNN's RSS |
- EXPECT_EQ("application/rss+xml", |
- SniffMimeType(kCNNRSS, std::string(), "text/xml")); |
- EXPECT_EQ("text/plain", SniffMimeType(kCNNRSS, std::string(), "text/plain")); |
- |
- // Don't sniff random XML as something different. |
- EXPECT_EQ("text/xml", |
- SniffMimeType("<?xml?><notafeed", std::string(), "text/xml")); |
- // Don't sniff random plain-text as something different. |
- EXPECT_EQ("text/plain", |
- SniffMimeType("<?xml?><notafeed", std::string(), "text/plain")); |
- |
- // Positive test for the two instances we upgrade to XHTML. |
- EXPECT_EQ("application/xhtml+xml", |
- SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", |
- std::string(), |
- "text/xml")); |
- EXPECT_EQ("application/xhtml+xml", |
- SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", |
- std::string(), |
- "application/xml")); |
- |
- // Following our behavior with HTML, don't call other mime types XHTML. |
- EXPECT_EQ("text/plain", |
- SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", |
- std::string(), |
- "text/plain")); |
- EXPECT_EQ("application/rss+xml", |
- SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", |
- std::string(), |
- "application/rss+xml")); |
- |
- // Don't sniff other HTML-looking bits as HTML. |
- EXPECT_EQ("text/xml", |
- SniffMimeType("<html><head>", std::string(), "text/xml")); |
- EXPECT_EQ("text/xml", |
- SniffMimeType("<foo><html xmlns=\"http://www.w3.org/1999/xhtml\">", |
- std::string(), |
- "text/xml")); |
-} |
- |
-// Test content which is >= 1024 bytes, and includes no open angle bracket. |
-// http://code.google.com/p/chromium/issues/detail?id=3521 |
-TEST(MimeSnifferTest, XMLTestLargeNoAngledBracket) { |
- // Make a large input, with 1024 bytes of "x". |
- std::string content; |
- content.resize(1024); |
- std::fill(content.begin(), content.end(), 'x'); |
- |
- // content.size() >= 1024 so the sniff is unambiguous. |
- std::string mime_type; |
- EXPECT_TRUE(SniffMimeType(content.data(), content.size(), GURL(), |
- "text/xml", &mime_type)); |
- EXPECT_EQ("text/xml", mime_type); |
-} |
- |
-// Test content which is >= 1024 bytes, and includes a binary looking byte. |
-// http://code.google.com/p/chromium/issues/detail?id=15314 |
-TEST(MimeSnifferTest, LooksBinary) { |
- // Make a large input, with 1024 bytes of "x" and 1 byte of 0x01. |
- std::string content; |
- content.resize(1024); |
- std::fill(content.begin(), content.end(), 'x'); |
- content[1000] = 0x01; |
- |
- // content.size() >= 1024 so the sniff is unambiguous. |
- std::string mime_type; |
- EXPECT_TRUE(SniffMimeType(content.data(), content.size(), GURL(), |
- "text/plain", &mime_type)); |
- EXPECT_EQ("application/octet-stream", mime_type); |
-} |
- |
-TEST(MimeSnifferTest, OfficeTest) { |
- SnifferTest tests[] = { |
- // Check for URLs incorrectly reported as Microsoft Office files. |
- { "Hi there", |
- sizeof("Hi there")-1, |
- "http://www.example.com/foo.doc", |
- "application/msword", "application/octet-stream" }, |
- { "Hi there", |
- sizeof("Hi there")-1, |
- "http://www.example.com/foo.xls", |
- "application/vnd.ms-excel", "application/octet-stream" }, |
- { "Hi there", |
- sizeof("Hi there")-1, |
- "http://www.example.com/foo.ppt", |
- "application/vnd.ms-powerpoint", "application/octet-stream" }, |
- // Check for Microsoft Office files incorrectly reported as text. |
- { "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there", |
- sizeof("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there")-1, |
- "http://www.example.com/foo.doc", |
- "text/plain", "application/msword" }, |
- { "PK\x03\x04" "Hi there", |
- sizeof("PK\x03\x04" "Hi there")-1, |
- "http://www.example.com/foo.doc", |
- "text/plain", |
- "application/vnd.openxmlformats-officedocument." |
- "wordprocessingml.document" }, |
- { "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there", |
- sizeof("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there")-1, |
- "http://www.example.com/foo.xls", |
- "text/plain", "application/vnd.ms-excel" }, |
- { "PK\x03\x04" "Hi there", |
- sizeof("PK\x03\x04" "Hi there")-1, |
- "http://www.example.com/foo.xls", |
- "text/plain", |
- "application/vnd.openxmlformats-officedocument." |
- "spreadsheetml.sheet" }, |
- { "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there", |
- sizeof("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" "Hi there")-1, |
- "http://www.example.com/foo.ppt", |
- "text/plain", "application/vnd.ms-powerpoint" }, |
- { "PK\x03\x04" "Hi there", |
- sizeof("PK\x03\x04" "Hi there")-1, |
- "http://www.example.com/foo.ppt", |
- "text/plain", |
- "application/vnd.openxmlformats-officedocument." |
- "presentationml.presentation" }, |
- }; |
- |
- TestArray(tests, arraysize(tests)); |
-} |
- |
-// TODO(thestig) Add more tests for other AV formats. Add another test case for |
-// RAW images. |
-TEST(MimeSnifferTest, AudioVideoTest) { |
- std::string mime_type; |
- const char kFlacTestData[] = |
- "fLaC\x00\x00\x00\x22\x12\x00\x12\x00\x00\x00\x00\x00"; |
- EXPECT_TRUE(SniffMimeTypeFromLocalData(kFlacTestData, |
- sizeof(kFlacTestData), |
- &mime_type)); |
- EXPECT_EQ("audio/x-flac", mime_type); |
- mime_type.clear(); |
- |
- const char kWMATestData[] = |
- "\x30\x26\xb2\x75\x8e\x66\xcf\x11\xa6\xd9\x00\xaa\x00\x62\xce\x6c"; |
- EXPECT_TRUE(SniffMimeTypeFromLocalData(kWMATestData, |
- sizeof(kWMATestData), |
- &mime_type)); |
- EXPECT_EQ("video/x-ms-asf", mime_type); |
- mime_type.clear(); |
- |
- // mp4a, m4b, m4p, and alac extension files which share the same container |
- // format. |
- const char kMP4TestData[] = |
- "\x00\x00\x00\x20\x66\x74\x79\x70\x4d\x34\x41\x20\x00\x00\x00\x00"; |
- EXPECT_TRUE(SniffMimeTypeFromLocalData(kMP4TestData, |
- sizeof(kMP4TestData), |
- &mime_type)); |
- EXPECT_EQ("video/mp4", mime_type); |
- mime_type.clear(); |
- |
- const char kAACTestData[] = |
- "\xff\xf1\x50\x80\x02\x20\xb0\x23\x0a\x83\x20\x7d\x61\x90\x3e\xb1"; |
- EXPECT_TRUE(SniffMimeTypeFromLocalData(kAACTestData, |
- sizeof(kAACTestData), |
- &mime_type)); |
- EXPECT_EQ("audio/mpeg", mime_type); |
- mime_type.clear(); |
-} |
- |
-} // namespace net |