Home | History | Annotate | Download | only in base
      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
    488