1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "gtest/gtest.h"
8 
9 #include "Common.h"
10 #include "imgLoader.h"
11 #include "nsMimeTypes.h"
12 #include "nsString.h"
13 
14 using namespace mozilla;
15 using namespace mozilla::image;
16 
CheckMimeType(const char * aContents,size_t aLength,const char * aExpected)17 static void CheckMimeType(const char* aContents, size_t aLength,
18                           const char* aExpected) {
19   nsAutoCString detected;
20   nsresult rv = imgLoader::GetMimeTypeFromContent(aContents, aLength, detected);
21   if (aExpected) {
22     ASSERT_TRUE(NS_SUCCEEDED(rv));
23     EXPECT_TRUE(detected.EqualsASCII(aExpected));
24   } else {
25     ASSERT_TRUE(NS_FAILED(rv));
26     EXPECT_TRUE(detected.IsEmpty());
27   }
28 }
29 
30 class ImageLoader : public ::testing::Test {
31  protected:
32   AutoInitializeImageLib mInit;
33 };
34 
TEST_F(ImageLoader,DetectGIF)35 TEST_F(ImageLoader, DetectGIF) {
36   const char buffer[] = "GIF87a";
37   CheckMimeType(buffer, sizeof(buffer), IMAGE_GIF);
38 }
39 
TEST_F(ImageLoader,DetectPNG)40 TEST_F(ImageLoader, DetectPNG) {
41   const char buffer[] = "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A";
42   CheckMimeType(buffer, sizeof(buffer), IMAGE_PNG);
43 }
44 
TEST_F(ImageLoader,DetectJPEG)45 TEST_F(ImageLoader, DetectJPEG) {
46   const char buffer[] = "\xFF\xD8\xFF";
47   CheckMimeType(buffer, sizeof(buffer), IMAGE_JPEG);
48 }
49 
TEST_F(ImageLoader,DetectART)50 TEST_F(ImageLoader, DetectART) {
51   const char buffer[] = "\x4A\x47\xFF\xFF\x00";
52   CheckMimeType(buffer, sizeof(buffer), IMAGE_ART);
53 }
54 
TEST_F(ImageLoader,DetectBMP)55 TEST_F(ImageLoader, DetectBMP) {
56   const char buffer[] = "BM";
57   CheckMimeType(buffer, sizeof(buffer), IMAGE_BMP);
58 }
59 
TEST_F(ImageLoader,DetectICO)60 TEST_F(ImageLoader, DetectICO) {
61   const char buffer[] = "\x00\x00\x01\x00";
62   CheckMimeType(buffer, sizeof(buffer), IMAGE_ICO);
63 }
64 
TEST_F(ImageLoader,DetectWebP)65 TEST_F(ImageLoader, DetectWebP) {
66   const char buffer[] = "RIFF\xFF\xFF\xFF\xFFWEBPVP8L";
67   CheckMimeType(buffer, sizeof(buffer), IMAGE_WEBP);
68 }
69 
TEST_F(ImageLoader,DetectAVIFMajorBrand)70 TEST_F(ImageLoader, DetectAVIFMajorBrand) {
71   const char buffer[] =
72       "\x00\x00\x00\x20"   // box length
73       "ftyp"               // box type
74       "avif"               // major brand
75       "\x00\x00\x00\x00"   // minor version
76       "avifmif1miafMA1B";  // compatible brands
77   CheckMimeType(buffer, sizeof(buffer), IMAGE_AVIF);
78 }
79 
TEST_F(ImageLoader,DetectAVIFCompatibleBrand)80 TEST_F(ImageLoader, DetectAVIFCompatibleBrand) {
81   const char buffer[] =
82       "\x00\x00\x00\x20"   // box length
83       "ftyp"               // box type
84       "XXXX"               // major brand
85       "\x00\x00\x00\x00"   // minor version
86       "avifmif1miafMA1B";  // compatible brands
87   CheckMimeType(buffer, sizeof(buffer), IMAGE_AVIF);
88 }
89 
90 #ifdef MOZ_JXL
TEST_F(ImageLoader,DetectJXLCodestream)91 TEST_F(ImageLoader, DetectJXLCodestream) {
92   const char buffer[] = "\xff\x0a";
93   CheckMimeType(buffer, sizeof(buffer), IMAGE_JXL);
94 }
95 
TEST_F(ImageLoader,DetectJXLContainer)96 TEST_F(ImageLoader, DetectJXLContainer) {
97   const char buffer[] =
98       "\x00\x00\x00\x0c"
99       "JXL "
100       "\x0d\x0a\x87\x0a";
101   CheckMimeType(buffer, sizeof(buffer), IMAGE_JXL);
102 }
103 #endif
104 
TEST_F(ImageLoader,DetectNonImageMP4)105 TEST_F(ImageLoader, DetectNonImageMP4) {
106   const char buffer[] =
107       "\x00\x00\x00\x1c"  // box length
108       "ftyp"              // box type
109       "isom"              // major brand
110       "\x00\x00\x02\x00"  // minor version
111       "isomiso2mp41";     // compatible brands
112   CheckMimeType(buffer, sizeof(buffer), nullptr);
113 }
114 
TEST_F(ImageLoader,DetectNone)115 TEST_F(ImageLoader, DetectNone) {
116   const char buffer[] = "abcdefghijklmnop";
117   CheckMimeType(buffer, sizeof(buffer), nullptr);
118 }
119