xref: /aosp_15_r20/external/cronet/net/base/mime_sniffer_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/base/mime_sniffer.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
8*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
10*6777b538SAndroid Build Coastguard Worker #include "url/url_constants.h"
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker namespace net {
13*6777b538SAndroid Build Coastguard Worker namespace {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker using ::testing::Range;
16*6777b538SAndroid Build Coastguard Worker using ::testing::Values;
17*6777b538SAndroid Build Coastguard Worker using ::net::SniffMimeType;  // It is shadowed by SniffMimeType(), below.
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker // Turn |str|, a constant string with one or more embedded NULs, along with
20*6777b538SAndroid Build Coastguard Worker // a NUL terminator, into an std::string() containing just that data.
21*6777b538SAndroid Build Coastguard Worker // Turn |str|, a string with one or more embedded NULs, into an std::string()
22*6777b538SAndroid Build Coastguard Worker template <size_t N>
MakeConstantString(const char (& str)[N])23*6777b538SAndroid Build Coastguard Worker std::string MakeConstantString(const char (&str)[N]) {
24*6777b538SAndroid Build Coastguard Worker   return std::string(str, N - 1);
25*6777b538SAndroid Build Coastguard Worker }
26*6777b538SAndroid Build Coastguard Worker 
SniffMimeType(std::string_view content,const std::string & url,const std::string & mime_type_hint)27*6777b538SAndroid Build Coastguard Worker static std::string SniffMimeType(std::string_view content,
28*6777b538SAndroid Build Coastguard Worker                                  const std::string& url,
29*6777b538SAndroid Build Coastguard Worker                                  const std::string& mime_type_hint) {
30*6777b538SAndroid Build Coastguard Worker   std::string mime_type;
31*6777b538SAndroid Build Coastguard Worker   SniffMimeType(content, GURL(url), mime_type_hint,
32*6777b538SAndroid Build Coastguard Worker                 ForceSniffFileUrlsForHtml::kDisabled, &mime_type);
33*6777b538SAndroid Build Coastguard Worker   return mime_type;
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,SniffableSchemes)36*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, SniffableSchemes) {
37*6777b538SAndroid Build Coastguard Worker   struct {
38*6777b538SAndroid Build Coastguard Worker     const char* scheme;
39*6777b538SAndroid Build Coastguard Worker     bool sniffable;
40*6777b538SAndroid Build Coastguard Worker   } kTestCases[] = {
41*6777b538SAndroid Build Coastguard Worker     {url::kAboutScheme, false},
42*6777b538SAndroid Build Coastguard Worker     {url::kBlobScheme, false},
43*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
44*6777b538SAndroid Build Coastguard Worker     {url::kContentScheme, true},
45*6777b538SAndroid Build Coastguard Worker #else
46*6777b538SAndroid Build Coastguard Worker     {url::kContentScheme, false},
47*6777b538SAndroid Build Coastguard Worker #endif
48*6777b538SAndroid Build Coastguard Worker     {url::kContentIDScheme, false},
49*6777b538SAndroid Build Coastguard Worker     {url::kDataScheme, false},
50*6777b538SAndroid Build Coastguard Worker     {url::kFileScheme, true},
51*6777b538SAndroid Build Coastguard Worker     {url::kFileSystemScheme, true},
52*6777b538SAndroid Build Coastguard Worker     {url::kFtpScheme, false},
53*6777b538SAndroid Build Coastguard Worker     {url::kHttpScheme, true},
54*6777b538SAndroid Build Coastguard Worker     {url::kHttpsScheme, true},
55*6777b538SAndroid Build Coastguard Worker     {url::kJavaScriptScheme, false},
56*6777b538SAndroid Build Coastguard Worker     {url::kMailToScheme, false},
57*6777b538SAndroid Build Coastguard Worker     {url::kWsScheme, false},
58*6777b538SAndroid Build Coastguard Worker     {url::kWssScheme, false}
59*6777b538SAndroid Build Coastguard Worker   };
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker   for (const auto test_case : kTestCases) {
62*6777b538SAndroid Build Coastguard Worker     GURL url(std::string(test_case.scheme) + "://host/path/whatever");
63*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(test_case.sniffable, ShouldSniffMimeType(url, ""));
64*6777b538SAndroid Build Coastguard Worker   }
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,BoundaryConditionsTest)67*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, BoundaryConditionsTest) {
68*6777b538SAndroid Build Coastguard Worker   std::string mime_type;
69*6777b538SAndroid Build Coastguard Worker   std::string type_hint;
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   char buf[] = {
72*6777b538SAndroid Build Coastguard Worker     'd', '\x1f', '\xFF'
73*6777b538SAndroid Build Coastguard Worker   };
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   GURL url;
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   SniffMimeType(std::string_view(), url, type_hint,
78*6777b538SAndroid Build Coastguard Worker                 ForceSniffFileUrlsForHtml::kDisabled, &mime_type);
79*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", mime_type);
80*6777b538SAndroid Build Coastguard Worker   SniffMimeType(std::string_view(buf, 1), url, type_hint,
81*6777b538SAndroid Build Coastguard Worker                 ForceSniffFileUrlsForHtml::kDisabled, &mime_type);
82*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", mime_type);
83*6777b538SAndroid Build Coastguard Worker   SniffMimeType(std::string_view(buf, 2), url, type_hint,
84*6777b538SAndroid Build Coastguard Worker                 ForceSniffFileUrlsForHtml::kDisabled, &mime_type);
85*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream", mime_type);
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,BasicSniffingTest)88*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, BasicSniffingTest) {
89*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/html",
90*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("<!DOCTYPE html PUBLIC"),
91*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/", ""));
92*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
93*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("<HtMl><Body></body></htMl>"),
94*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.gif",
95*6777b538SAndroid Build Coastguard Worker                           "application/octet-stream"));
96*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("image/gif",
97*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("GIF89a\x1F\x83\x94"),
98*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo", "text/plain"));
99*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
100*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Gif87a\x1F\x83\x94"),
101*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo?param=tt.gif", ""));
102*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain",
103*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("%!PS-Adobe-3.0"),
104*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo", "text/plain"));
105*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
106*6777b538SAndroid Build Coastguard Worker       "application/octet-stream",
107*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("\x89"
108*6777b538SAndroid Build Coastguard Worker                                        "PNG\x0D\x0A\x1A\x0A"),
109*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo", "application/octet-stream"));
110*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("image/jpeg",
111*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("\xFF\xD8\xFF\x23\x49\xAF"),
112*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo", ""));
113*6777b538SAndroid Build Coastguard Worker }
114*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,ChromeExtensionsTest)115*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, ChromeExtensionsTest) {
116*6777b538SAndroid Build Coastguard Worker   // schemes
117*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/x-chrome-extension",
118*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
119*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.crx", ""));
120*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/x-chrome-extension",
121*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
122*6777b538SAndroid Build Coastguard Worker                           "https://www.example.com/foo.crx", ""));
123*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/x-chrome-extension",
124*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
125*6777b538SAndroid Build Coastguard Worker                           "ftp://www.example.com/foo.crx", ""));
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   // some other mimetypes that should get converted
128*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/x-chrome-extension",
129*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
130*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.crx", "text/plain"));
131*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/x-chrome-extension",
132*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
133*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.crx",
134*6777b538SAndroid Build Coastguard Worker                           "application/octet-stream"));
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   // success edge cases
137*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/x-chrome-extension",
138*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
139*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.crx?query=string", ""));
140*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/x-chrome-extension",
141*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
142*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo..crx", ""));
143*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/x-chrome-extension",
144*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x03\x00\x00\x00"),
145*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo..crx", ""));
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker   // wrong file extension
148*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
149*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
150*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.bin", ""));
151*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
152*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
153*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.bin?monkey", ""));
154*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
155*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
156*6777b538SAndroid Build Coastguard Worker                           "invalid-url", ""));
157*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
158*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
159*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com", ""));
160*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
161*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
162*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/", ""));
163*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
164*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
165*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo", ""));
166*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
167*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
168*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foocrx", ""));
169*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
170*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x00"),
171*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.crx.blech", ""));
172*6777b538SAndroid Build Coastguard Worker 
173*6777b538SAndroid Build Coastguard Worker   // wrong magic
174*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
175*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("Cr24\x02\x00\x00\x01"),
176*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.crx?monkey", ""));
177*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
178*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("PADDING_Cr24\x02\x00\x00\x00"),
179*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.crx?monkey", ""));
180*6777b538SAndroid Build Coastguard Worker }
181*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,MozillaCompatibleTest)182*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, MozillaCompatibleTest) {
183*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/html", SniffMimeType(MakeConstantString(" \n <hTmL>\n <hea"),
184*6777b538SAndroid Build Coastguard Worker                                        "http://www.example.com/", ""));
185*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain",
186*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString(" \n <hTmL>\n <hea"),
187*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/", "text/plain"));
188*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("image/bmp", SniffMimeType(MakeConstantString("BMjlakdsfk"),
189*6777b538SAndroid Build Coastguard Worker                                        "http://www.example.com/foo", ""));
190*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
191*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("\x00\x00\x30\x00"),
192*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/favicon.ico", ""));
193*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", SniffMimeType(MakeConstantString("#!/bin/sh\nls /\n"),
194*6777b538SAndroid Build Coastguard Worker                                         "http://www.example.com/foo", ""));
195*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain",
196*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("From: Fred\nTo: Bob\n\nHi\n.\n"),
197*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo", ""));
198*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/xml",
199*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString(
200*6777b538SAndroid Build Coastguard Worker                               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"),
201*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo", ""));
202*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
203*6777b538SAndroid Build Coastguard Worker       "application/octet-stream",
204*6777b538SAndroid Build Coastguard Worker       SniffMimeType(
205*6777b538SAndroid Build Coastguard Worker           MakeConstantString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"),
206*6777b538SAndroid Build Coastguard Worker           "http://www.example.com/foo", "application/octet-stream"));
207*6777b538SAndroid Build Coastguard Worker }
208*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,DontAllowPrivilegeEscalationTest)209*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, DontAllowPrivilegeEscalationTest) {
210*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
211*6777b538SAndroid Build Coastguard Worker       "image/gif",
212*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("GIF87a\n<html>\n<body>"
213*6777b538SAndroid Build Coastguard Worker                                        "<script>alert('haxorzed');\n</script>"
214*6777b538SAndroid Build Coastguard Worker                                        "</body></html>\n"),
215*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo", ""));
216*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
217*6777b538SAndroid Build Coastguard Worker       "image/gif",
218*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("GIF87a\n<html>\n<body>"
219*6777b538SAndroid Build Coastguard Worker                                        "<script>alert('haxorzed');\n</script>"
220*6777b538SAndroid Build Coastguard Worker                                        "</body></html>\n"),
221*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo?q=ttt.html", ""));
222*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
223*6777b538SAndroid Build Coastguard Worker       "image/gif",
224*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("GIF87a\n<html>\n<body>"
225*6777b538SAndroid Build Coastguard Worker                                        "<script>alert('haxorzed');\n</script>"
226*6777b538SAndroid Build Coastguard Worker                                        "</body></html>\n"),
227*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo#ttt.html", ""));
228*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
229*6777b538SAndroid Build Coastguard Worker       "text/plain",
230*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("a\n<html>\n<body>"
231*6777b538SAndroid Build Coastguard Worker                                        "<script>alert('haxorzed');\n</script>"
232*6777b538SAndroid Build Coastguard Worker                                        "</body></html>\n"),
233*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo", ""));
234*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
235*6777b538SAndroid Build Coastguard Worker       "text/plain",
236*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("a\n<html>\n<body>"
237*6777b538SAndroid Build Coastguard Worker                                        "<script>alert('haxorzed');\n</script>"
238*6777b538SAndroid Build Coastguard Worker                                        "</body></html>\n"),
239*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo?q=ttt.html", ""));
240*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
241*6777b538SAndroid Build Coastguard Worker       "text/plain",
242*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("a\n<html>\n<body>"
243*6777b538SAndroid Build Coastguard Worker                                        "<script>alert('haxorzed');\n</script>"
244*6777b538SAndroid Build Coastguard Worker                                        "</body></html>\n"),
245*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo#ttt.html", ""));
246*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
247*6777b538SAndroid Build Coastguard Worker       "text/plain",
248*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("a\n<html>\n<body>"
249*6777b538SAndroid Build Coastguard Worker                                        "<script>alert('haxorzed');\n</script>"
250*6777b538SAndroid Build Coastguard Worker                                        "</body></html>\n"),
251*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo.html", ""));
252*6777b538SAndroid Build Coastguard Worker }
253*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,SniffFilesAsHtml)254*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, SniffFilesAsHtml) {
255*6777b538SAndroid Build Coastguard Worker   const std::string kContent = "<html><body>text</body></html>";
256*6777b538SAndroid Build Coastguard Worker   const GURL kUrl("file:///C/test.unusualextension");
257*6777b538SAndroid Build Coastguard Worker 
258*6777b538SAndroid Build Coastguard Worker   std::string mime_type;
259*6777b538SAndroid Build Coastguard Worker   SniffMimeType(kContent, kUrl, "" /* type_hint */,
260*6777b538SAndroid Build Coastguard Worker                 ForceSniffFileUrlsForHtml::kDisabled, &mime_type);
261*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", mime_type);
262*6777b538SAndroid Build Coastguard Worker 
263*6777b538SAndroid Build Coastguard Worker   SniffMimeType(kContent, kUrl, "" /* type_hint */,
264*6777b538SAndroid Build Coastguard Worker                 ForceSniffFileUrlsForHtml::kEnabled, &mime_type);
265*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/html", mime_type);
266*6777b538SAndroid Build Coastguard Worker }
267*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,UnicodeTest)268*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, UnicodeTest) {
269*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", SniffMimeType(MakeConstantString("\xEF\xBB\xBF"
270*6777b538SAndroid Build Coastguard Worker                                                            "Hi there"),
271*6777b538SAndroid Build Coastguard Worker                                         "http://www.example.com/foo", ""));
272*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
273*6777b538SAndroid Build Coastguard Worker       "text/plain",
274*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString("\xEF\xBB\xBF\xED\x7A\xAD\x7A\x0D\x79"),
275*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo", ""));
276*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
277*6777b538SAndroid Build Coastguard Worker       "text/plain",
278*6777b538SAndroid Build Coastguard Worker       SniffMimeType(MakeConstantString(
279*6777b538SAndroid Build Coastguard Worker                         "\xFE\xFF\xD0\xA5\xD0\xBE\xD0\xBB\xD1\x83\xD0\xB9"),
280*6777b538SAndroid Build Coastguard Worker                     "http://www.example.com/foo", ""));
281*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain",
282*6777b538SAndroid Build Coastguard Worker             SniffMimeType(
283*6777b538SAndroid Build Coastguard Worker                 MakeConstantString(
284*6777b538SAndroid Build Coastguard Worker                     "\xFE\xFF\x00\x41\x00\x20\xD8\x00\xDC\x00\xD8\x00\xDC\x01"),
285*6777b538SAndroid Build Coastguard Worker                 "http://www.example.com/foo", ""));
286*6777b538SAndroid Build Coastguard Worker }
287*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,FlashTest)288*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, FlashTest) {
289*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
290*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("CWSdd\x00\xB3"),
291*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo", ""));
292*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
293*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("FLVjdkl*(#)0sdj\x00"),
294*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo?q=ttt.swf", ""));
295*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
296*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("FWS3$9\r\b\x00"),
297*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo#ttt.swf", ""));
298*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", SniffMimeType(MakeConstantString("FLVjdkl*(#)0sdj"),
299*6777b538SAndroid Build Coastguard Worker                                         "http://www.example.com/foo.swf", ""));
300*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
301*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("FLVjdkl*(#)0s\x01dj"),
302*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo/bar.swf", ""));
303*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
304*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("FWS3$9\r\b\x1A"),
305*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.swf?clickTAG=http://"
306*6777b538SAndroid Build Coastguard Worker                           "www.adnetwork.com/bar",
307*6777b538SAndroid Build Coastguard Worker                           ""));
308*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream",
309*6777b538SAndroid Build Coastguard Worker             SniffMimeType(MakeConstantString("FWS3$9\r\x1C\b"),
310*6777b538SAndroid Build Coastguard Worker                           "http://www.example.com/foo.swf?clickTAG=http://"
311*6777b538SAndroid Build Coastguard Worker                           "www.adnetwork.com/bar",
312*6777b538SAndroid Build Coastguard Worker                           "text/plain"));
313*6777b538SAndroid Build Coastguard Worker }
314*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,XMLTest)315*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, XMLTest) {
316*6777b538SAndroid Build Coastguard Worker   // An easy feed to identify.
317*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/atom+xml",
318*6777b538SAndroid Build Coastguard Worker             SniffMimeType("<?xml?><feed", "", "text/xml"));
319*6777b538SAndroid Build Coastguard Worker   // Don't sniff out of plain text.
320*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", SniffMimeType("<?xml?><feed", "", "text/plain"));
321*6777b538SAndroid Build Coastguard Worker   // Simple RSS.
322*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/rss+xml",
323*6777b538SAndroid Build Coastguard Worker             SniffMimeType("<?xml version='1.0'?>\r\n<rss", "", "text/xml"));
324*6777b538SAndroid Build Coastguard Worker 
325*6777b538SAndroid Build Coastguard Worker   // The top of CNN's RSS feed, which we'd like to recognize as RSS.
326*6777b538SAndroid Build Coastguard Worker   static const char kCNNRSS[] =
327*6777b538SAndroid Build Coastguard Worker       "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
328*6777b538SAndroid Build Coastguard Worker       "<?xml-stylesheet href=\"http://rss.cnn.com/~d/styles/rss2full.xsl\" "
329*6777b538SAndroid Build Coastguard Worker       "type=\"text/xsl\" media=\"screen\"?>"
330*6777b538SAndroid Build Coastguard Worker       "<?xml-stylesheet href=\"http://rss.cnn.com/~d/styles/itemcontent.css\" "
331*6777b538SAndroid Build Coastguard Worker       "type=\"text/css\" media=\"screen\"?>"
332*6777b538SAndroid Build Coastguard Worker       "<rss xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\" "
333*6777b538SAndroid Build Coastguard Worker       "version=\"2.0\">";
334*6777b538SAndroid Build Coastguard Worker   // CNN's RSS
335*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/rss+xml", SniffMimeType(kCNNRSS, "", "text/xml"));
336*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", SniffMimeType(kCNNRSS, "", "text/plain"));
337*6777b538SAndroid Build Coastguard Worker 
338*6777b538SAndroid Build Coastguard Worker   // Don't sniff random XML as something different.
339*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/xml", SniffMimeType("<?xml?><notafeed", "", "text/xml"));
340*6777b538SAndroid Build Coastguard Worker   // Don't sniff random plain-text as something different.
341*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain", SniffMimeType("<?xml?><notafeed", "", "text/plain"));
342*6777b538SAndroid Build Coastguard Worker 
343*6777b538SAndroid Build Coastguard Worker   // We never upgrade to application/xhtml+xml.
344*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/xml",
345*6777b538SAndroid Build Coastguard Worker             SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", "",
346*6777b538SAndroid Build Coastguard Worker                           "text/xml"));
347*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/xml",
348*6777b538SAndroid Build Coastguard Worker             SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", "",
349*6777b538SAndroid Build Coastguard Worker                           "application/xml"));
350*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/plain",
351*6777b538SAndroid Build Coastguard Worker             SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", "",
352*6777b538SAndroid Build Coastguard Worker                           "text/plain"));
353*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/rss+xml",
354*6777b538SAndroid Build Coastguard Worker             SniffMimeType("<html xmlns=\"http://www.w3.org/1999/xhtml\">", "",
355*6777b538SAndroid Build Coastguard Worker                           "application/rss+xml"));
356*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/xml", SniffMimeType("<html><head>", "", "text/xml"));
357*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/xml",
358*6777b538SAndroid Build Coastguard Worker             SniffMimeType("<foo><rss "
359*6777b538SAndroid Build Coastguard Worker                           "xmlns:feedburner=\"http://rssnamespace.org/"
360*6777b538SAndroid Build Coastguard Worker                           "feedburner/ext/1.0\" version=\"2.0\">",
361*6777b538SAndroid Build Coastguard Worker                           "", "text/xml"));
362*6777b538SAndroid Build Coastguard Worker }
363*6777b538SAndroid Build Coastguard Worker 
364*6777b538SAndroid Build Coastguard Worker // Test content which is >= 1024 bytes, and includes no open angle bracket.
365*6777b538SAndroid Build Coastguard Worker // http://code.google.com/p/chromium/issues/detail?id=3521
TEST(MimeSnifferTest,XMLTestLargeNoAngledBracket)366*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, XMLTestLargeNoAngledBracket) {
367*6777b538SAndroid Build Coastguard Worker   // Make a large input, with 1024 bytes of "x".
368*6777b538SAndroid Build Coastguard Worker   std::string content;
369*6777b538SAndroid Build Coastguard Worker   content.resize(1024);
370*6777b538SAndroid Build Coastguard Worker   std::fill(content.begin(), content.end(), 'x');
371*6777b538SAndroid Build Coastguard Worker 
372*6777b538SAndroid Build Coastguard Worker   // content.size() >= 1024 so the sniff is unambiguous.
373*6777b538SAndroid Build Coastguard Worker   std::string mime_type;
374*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeType(content, GURL(), "text/xml",
375*6777b538SAndroid Build Coastguard Worker                             ForceSniffFileUrlsForHtml::kDisabled, &mime_type));
376*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("text/xml", mime_type);
377*6777b538SAndroid Build Coastguard Worker }
378*6777b538SAndroid Build Coastguard Worker 
379*6777b538SAndroid Build Coastguard Worker // Test content which is >= 1024 bytes, and includes a binary looking byte.
380*6777b538SAndroid Build Coastguard Worker // http://code.google.com/p/chromium/issues/detail?id=15314
TEST(MimeSnifferTest,LooksBinary)381*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, LooksBinary) {
382*6777b538SAndroid Build Coastguard Worker   // Make a large input, with 1024 bytes of "x" and 1 byte of 0x01.
383*6777b538SAndroid Build Coastguard Worker   std::string content;
384*6777b538SAndroid Build Coastguard Worker   content.resize(1024);
385*6777b538SAndroid Build Coastguard Worker   std::fill(content.begin(), content.end(), 'x');
386*6777b538SAndroid Build Coastguard Worker   content[1000] = 0x01;
387*6777b538SAndroid Build Coastguard Worker 
388*6777b538SAndroid Build Coastguard Worker   // content.size() >= 1024 so the sniff is unambiguous.
389*6777b538SAndroid Build Coastguard Worker   std::string mime_type;
390*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeType(content, GURL(), "text/plain",
391*6777b538SAndroid Build Coastguard Worker                             ForceSniffFileUrlsForHtml::kDisabled, &mime_type));
392*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("application/octet-stream", mime_type);
393*6777b538SAndroid Build Coastguard Worker }
394*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,OfficeTest)395*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, OfficeTest) {
396*6777b538SAndroid Build Coastguard Worker     // Check for URLs incorrectly reported as Microsoft Office files.
397*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
398*6777b538SAndroid Build Coastguard Worker         "application/octet-stream",
399*6777b538SAndroid Build Coastguard Worker         SniffMimeType(MakeConstantString("Hi there"),
400*6777b538SAndroid Build Coastguard Worker                       "http://www.example.com/foo.doc", "application/msword"));
401*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("application/octet-stream",
402*6777b538SAndroid Build Coastguard Worker               SniffMimeType(MakeConstantString("Hi there"),
403*6777b538SAndroid Build Coastguard Worker                             "http://www.example.com/foo.xls",
404*6777b538SAndroid Build Coastguard Worker                             "application/vnd.ms-excel"));
405*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("application/octet-stream",
406*6777b538SAndroid Build Coastguard Worker               SniffMimeType(MakeConstantString("Hi there"),
407*6777b538SAndroid Build Coastguard Worker                             "http://www.example.com/foo.ppt",
408*6777b538SAndroid Build Coastguard Worker                             "application/vnd.ms-powerpoint"));
409*6777b538SAndroid Build Coastguard Worker     // Check for Microsoft Office files incorrectly reported as text.
410*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
411*6777b538SAndroid Build Coastguard Worker         "application/msword",
412*6777b538SAndroid Build Coastguard Worker         SniffMimeType(MakeConstantString("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1"
413*6777b538SAndroid Build Coastguard Worker                                          "Hi there"),
414*6777b538SAndroid Build Coastguard Worker                       "http://www.example.com/foo.doc", "text/plain"));
415*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
416*6777b538SAndroid Build Coastguard Worker         "application/vnd.openxmlformats-officedocument."
417*6777b538SAndroid Build Coastguard Worker         "wordprocessingml.document",
418*6777b538SAndroid Build Coastguard Worker         SniffMimeType(MakeConstantString(
419*6777b538SAndroid Build Coastguard Worker 
420*6777b538SAndroid Build Coastguard Worker                           "PK\x03\x04"
421*6777b538SAndroid Build Coastguard Worker                           "Hi there"),
422*6777b538SAndroid Build Coastguard Worker                       "http://www.example.com/foo.doc", "text/plain"));
423*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
424*6777b538SAndroid Build Coastguard Worker         "application/vnd.ms-excel",
425*6777b538SAndroid Build Coastguard Worker         SniffMimeType(MakeConstantString("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1"
426*6777b538SAndroid Build Coastguard Worker                                          "Hi there"),
427*6777b538SAndroid Build Coastguard Worker                       "http://www.example.com/foo.xls", "text/plain"));
428*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
429*6777b538SAndroid Build Coastguard Worker         "application/vnd.openxmlformats-officedocument."
430*6777b538SAndroid Build Coastguard Worker         "spreadsheetml.sheet",
431*6777b538SAndroid Build Coastguard Worker         SniffMimeType(MakeConstantString("PK\x03\x04"
432*6777b538SAndroid Build Coastguard Worker                                          "Hi there"),
433*6777b538SAndroid Build Coastguard Worker                       "http://www.example.com/foo.xls", "text/plain"));
434*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
435*6777b538SAndroid Build Coastguard Worker         "application/vnd.ms-powerpoint",
436*6777b538SAndroid Build Coastguard Worker         SniffMimeType(MakeConstantString("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1"
437*6777b538SAndroid Build Coastguard Worker                                          "Hi there"),
438*6777b538SAndroid Build Coastguard Worker                       "http://www.example.com/foo.ppt", "text/plain"));
439*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
440*6777b538SAndroid Build Coastguard Worker         "application/vnd.openxmlformats-officedocument."
441*6777b538SAndroid Build Coastguard Worker         "presentationml.presentation",
442*6777b538SAndroid Build Coastguard Worker         SniffMimeType(MakeConstantString("PK\x03\x04"
443*6777b538SAndroid Build Coastguard Worker                                          "Hi there"),
444*6777b538SAndroid Build Coastguard Worker                       "http://www.example.com/foo.ppt", "text/plain"));
445*6777b538SAndroid Build Coastguard Worker }
446*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,AudioVideoTest)447*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, AudioVideoTest) {
448*6777b538SAndroid Build Coastguard Worker   std::string mime_type;
449*6777b538SAndroid Build Coastguard Worker   const char kOggTestData[] = "OggS\x00";
450*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
451*6777b538SAndroid Build Coastguard Worker       std::string_view(kOggTestData, sizeof(kOggTestData) - 1), &mime_type));
452*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("audio/ogg", mime_type);
453*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
454*6777b538SAndroid Build Coastguard Worker   // Check ogg header requires the terminal '\0' to be sniffed.
455*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(SniffMimeTypeFromLocalData(
456*6777b538SAndroid Build Coastguard Worker       std::string_view(kOggTestData, sizeof(kOggTestData) - 2), &mime_type));
457*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("", mime_type);
458*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
459*6777b538SAndroid Build Coastguard Worker 
460*6777b538SAndroid Build Coastguard Worker   const char kFlacTestData[] =
461*6777b538SAndroid Build Coastguard Worker       "fLaC\x00\x00\x00\x22\x12\x00\x12\x00\x00\x00\x00\x00";
462*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
463*6777b538SAndroid Build Coastguard Worker       std::string_view(kFlacTestData, sizeof(kFlacTestData) - 1), &mime_type));
464*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("audio/x-flac", mime_type);
465*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
466*6777b538SAndroid Build Coastguard Worker 
467*6777b538SAndroid Build Coastguard Worker   const char kWMATestData[] =
468*6777b538SAndroid Build Coastguard Worker       "\x30\x26\xb2\x75\x8e\x66\xcf\x11\xa6\xd9\x00\xaa\x00\x62\xce\x6c";
469*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
470*6777b538SAndroid Build Coastguard Worker       std::string_view(kWMATestData, sizeof(kWMATestData) - 1), &mime_type));
471*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("video/x-ms-asf", mime_type);
472*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker   // mp4a, m4b, m4p, and alac extension files which share the same container
475*6777b538SAndroid Build Coastguard Worker   // format.
476*6777b538SAndroid Build Coastguard Worker   const char kMP4TestData[] =
477*6777b538SAndroid Build Coastguard Worker       "\x00\x00\x00\x20\x66\x74\x79\x70\x4d\x34\x41\x20\x00\x00\x00\x00";
478*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
479*6777b538SAndroid Build Coastguard Worker       std::string_view(kMP4TestData, sizeof(kMP4TestData) - 1), &mime_type));
480*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("video/mp4", mime_type);
481*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
482*6777b538SAndroid Build Coastguard Worker 
483*6777b538SAndroid Build Coastguard Worker   const char kAACTestData[] =
484*6777b538SAndroid Build Coastguard Worker       "\xff\xf1\x50\x80\x02\x20\xb0\x23\x0a\x83\x20\x7d\x61\x90\x3e\xb1";
485*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
486*6777b538SAndroid Build Coastguard Worker       std::string_view(kAACTestData, sizeof(kAACTestData) - 1), &mime_type));
487*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("audio/mpeg", mime_type);
488*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
489*6777b538SAndroid Build Coastguard Worker 
490*6777b538SAndroid Build Coastguard Worker   const char kAMRTestData[] =
491*6777b538SAndroid Build Coastguard Worker       "\x23\x21\x41\x4d\x52\x0a\x3c\x53\x0a\x7c\xe8\xb8\x41\xa5\x80\xca";
492*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
493*6777b538SAndroid Build Coastguard Worker       std::string_view(kAMRTestData, sizeof(kAMRTestData) - 1), &mime_type));
494*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("audio/amr", mime_type);
495*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
496*6777b538SAndroid Build Coastguard Worker }
497*6777b538SAndroid Build Coastguard Worker 
TEST(MimeSnifferTest,ImageTest)498*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, ImageTest) {
499*6777b538SAndroid Build Coastguard Worker   std::string mime_type;
500*6777b538SAndroid Build Coastguard Worker   const char kWebPSimpleFormat[] = "RIFF\xee\x81\x00\x00WEBPVP8 ";
501*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
502*6777b538SAndroid Build Coastguard Worker       std::string_view(kWebPSimpleFormat, sizeof(kWebPSimpleFormat) - 1),
503*6777b538SAndroid Build Coastguard Worker       &mime_type));
504*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("image/webp", mime_type);
505*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
506*6777b538SAndroid Build Coastguard Worker 
507*6777b538SAndroid Build Coastguard Worker   const char kWebPLosslessFormat[] = "RIFF\xee\x81\x00\x00WEBPVP8L";
508*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
509*6777b538SAndroid Build Coastguard Worker       std::string_view(kWebPLosslessFormat, sizeof(kWebPLosslessFormat) - 1),
510*6777b538SAndroid Build Coastguard Worker       &mime_type));
511*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("image/webp", mime_type);
512*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
513*6777b538SAndroid Build Coastguard Worker 
514*6777b538SAndroid Build Coastguard Worker   const char kWebPExtendedFormat[] = "RIFF\xee\x81\x00\x00WEBPVP8X";
515*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(SniffMimeTypeFromLocalData(
516*6777b538SAndroid Build Coastguard Worker       std::string_view(kWebPExtendedFormat, sizeof(kWebPExtendedFormat) - 1),
517*6777b538SAndroid Build Coastguard Worker       &mime_type));
518*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("image/webp", mime_type);
519*6777b538SAndroid Build Coastguard Worker   mime_type.clear();
520*6777b538SAndroid Build Coastguard Worker }
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker // The tests need char parameters, but the ranges to test include 0xFF, and some
523*6777b538SAndroid Build Coastguard Worker // platforms have signed chars and are noisy about it. Using an int parameter
524*6777b538SAndroid Build Coastguard Worker // and casting it to char inside the test case solves both these problems.
525*6777b538SAndroid Build Coastguard Worker class MimeSnifferBinaryTest : public ::testing::TestWithParam<int> {};
526*6777b538SAndroid Build Coastguard Worker 
527*6777b538SAndroid Build Coastguard Worker // From https://mimesniff.spec.whatwg.org/#binary-data-byte :
528*6777b538SAndroid Build Coastguard Worker // A binary data byte is a byte in the range 0x00 to 0x08 (NUL to BS), the byte
529*6777b538SAndroid Build Coastguard Worker // 0x0B (VT), a byte in the range 0x0E to 0x1A (SO to SUB), or a byte in the
530*6777b538SAndroid Build Coastguard Worker // range 0x1C to 0x1F (FS to US).
TEST_P(MimeSnifferBinaryTest,IsBinaryControlCode)531*6777b538SAndroid Build Coastguard Worker TEST_P(MimeSnifferBinaryTest, IsBinaryControlCode) {
532*6777b538SAndroid Build Coastguard Worker   std::string param(1, static_cast<char>(GetParam()));
533*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(LooksLikeBinary(param));
534*6777b538SAndroid Build Coastguard Worker }
535*6777b538SAndroid Build Coastguard Worker 
536*6777b538SAndroid Build Coastguard Worker // ::testing::Range(a, b) tests an open-ended range, ie. "b" is not included.
537*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MimeSnifferBinaryTestRange1,
538*6777b538SAndroid Build Coastguard Worker                          MimeSnifferBinaryTest,
539*6777b538SAndroid Build Coastguard Worker                          Range(0x00, 0x09));
540*6777b538SAndroid Build Coastguard Worker 
541*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MimeSnifferBinaryTestByte0x0B,
542*6777b538SAndroid Build Coastguard Worker                          MimeSnifferBinaryTest,
543*6777b538SAndroid Build Coastguard Worker                          Values(0x0B));
544*6777b538SAndroid Build Coastguard Worker 
545*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MimeSnifferBinaryTestRange2,
546*6777b538SAndroid Build Coastguard Worker                          MimeSnifferBinaryTest,
547*6777b538SAndroid Build Coastguard Worker                          Range(0x0E, 0x1B));
548*6777b538SAndroid Build Coastguard Worker 
549*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MimeSnifferBinaryTestRange3,
550*6777b538SAndroid Build Coastguard Worker                          MimeSnifferBinaryTest,
551*6777b538SAndroid Build Coastguard Worker                          Range(0x1C, 0x20));
552*6777b538SAndroid Build Coastguard Worker 
553*6777b538SAndroid Build Coastguard Worker class MimeSnifferPlainTextTest : public ::testing::TestWithParam<int> {};
554*6777b538SAndroid Build Coastguard Worker 
TEST_P(MimeSnifferPlainTextTest,NotBinaryControlCode)555*6777b538SAndroid Build Coastguard Worker TEST_P(MimeSnifferPlainTextTest, NotBinaryControlCode) {
556*6777b538SAndroid Build Coastguard Worker   std::string param(1, static_cast<char>(GetParam()));
557*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(LooksLikeBinary(param));
558*6777b538SAndroid Build Coastguard Worker }
559*6777b538SAndroid Build Coastguard Worker 
560*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MimeSnifferPlainTextTestPlainTextControlCodes,
561*6777b538SAndroid Build Coastguard Worker                          MimeSnifferPlainTextTest,
562*6777b538SAndroid Build Coastguard Worker                          Values(0x09, 0x0A, 0x0C, 0x0D, 0x1B));
563*6777b538SAndroid Build Coastguard Worker 
564*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MimeSnifferPlainTextTestNotControlCodeRange,
565*6777b538SAndroid Build Coastguard Worker                          MimeSnifferPlainTextTest,
566*6777b538SAndroid Build Coastguard Worker                          Range(0x20, 0x100));
567*6777b538SAndroid Build Coastguard Worker 
568*6777b538SAndroid Build Coastguard Worker class MimeSnifferControlCodesEdgeCaseTest
569*6777b538SAndroid Build Coastguard Worker     : public ::testing::TestWithParam<const char*> {};
570*6777b538SAndroid Build Coastguard Worker 
TEST_P(MimeSnifferControlCodesEdgeCaseTest,EdgeCase)571*6777b538SAndroid Build Coastguard Worker TEST_P(MimeSnifferControlCodesEdgeCaseTest, EdgeCase) {
572*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(LooksLikeBinary(GetParam()));
573*6777b538SAndroid Build Coastguard Worker }
574*6777b538SAndroid Build Coastguard Worker 
575*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MimeSnifferControlCodesEdgeCaseTest,
576*6777b538SAndroid Build Coastguard Worker                          MimeSnifferControlCodesEdgeCaseTest,
577*6777b538SAndroid Build Coastguard Worker                          Values("\x01__",  // first byte is binary
578*6777b538SAndroid Build Coastguard Worker                                 "__\x03",  // last byte is binary
579*6777b538SAndroid Build Coastguard Worker                                 "_\x02_"   // a byte in the middle is binary
580*6777b538SAndroid Build Coastguard Worker                                 ));
581*6777b538SAndroid Build Coastguard Worker 
582*6777b538SAndroid Build Coastguard Worker }  // namespace
583*6777b538SAndroid Build Coastguard Worker }  // namespace net
584