blob: 8898a79be5a2c68aa233395ece9b757cc11a4e85 [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: jmarantz@google.com (Joshua Marantz)
#include "pagespeed/kernel/http/content_type.h"
#include "pagespeed/kernel/base/gtest.h"
namespace net_instaweb {
class ContentTypeTest : public testing::Test {
protected:
ContentType::Type ExtToType(const char* ext) {
return NameExtensionToContentType(ext)->type();
}
ContentType::Type MimeToType(const char* mime_type) {
return MimeTypeToContentType(mime_type)->type();
}
};
TEST_F(ContentTypeTest, TestUnknown) {
EXPECT_EQ(NULL, NameExtensionToContentType(".unknown"));
EXPECT_EQ(NULL, MimeTypeToContentType("unknown/unknown"));
}
TEST_F(ContentTypeTest, TestExtensions) {
EXPECT_EQ(ContentType::kHtml, ExtToType(".html"));
EXPECT_EQ(ContentType::kHtml, ExtToType(".htm"));
EXPECT_EQ(ContentType::kXhtml, ExtToType(".xhtml"));
EXPECT_EQ(ContentType::kJavascript, ExtToType(".js"));
EXPECT_EQ(ContentType::kCss, ExtToType(".css"));
EXPECT_EQ(ContentType::kText, ExtToType(".txt"));
EXPECT_EQ(ContentType::kXml, ExtToType(".xml"));
EXPECT_EQ(ContentType::kPng, ExtToType(".png"));
EXPECT_EQ(ContentType::kGif, ExtToType(".gif"));
EXPECT_EQ(ContentType::kJpeg, ExtToType(".jpg"));
EXPECT_EQ(ContentType::kJpeg, ExtToType(".jpeg"));
EXPECT_EQ(ContentType::kSwf, ExtToType(".swf"));
EXPECT_EQ(ContentType::kWebp, ExtToType(".webp"));
EXPECT_EQ(ContentType::kIco, ExtToType(".ico"));
EXPECT_EQ(ContentType::kJson, ExtToType(".json"));
EXPECT_EQ(ContentType::kSourceMap, ExtToType(".map"));
EXPECT_EQ(ContentType::kPdf, ExtToType(".pdf"));
EXPECT_EQ(ContentType::kOctetStream, ExtToType(".bin"));
EXPECT_EQ(ContentType::kVideo, ExtToType(".mpg"));
EXPECT_EQ(ContentType::kVideo, ExtToType(".mp4"));
EXPECT_EQ(ContentType::kVideo, ExtToType(".3gp"));
EXPECT_EQ(ContentType::kVideo, ExtToType(".flv"));
EXPECT_EQ(ContentType::kVideo, ExtToType(".ogg"));
EXPECT_EQ(ContentType::kAudio, ExtToType(".mp3"));
EXPECT_EQ(ContentType::kAudio, ExtToType(".wav"));
}
TEST_F(ContentTypeTest, TestMimeType) {
EXPECT_EQ(ContentType::kHtml, MimeToType("text/html"));
EXPECT_EQ(ContentType::kHtml, MimeToType("text/html; charset=UTF-8"));
EXPECT_EQ(ContentType::kXhtml, MimeToType("application/xhtml+xml"));
EXPECT_EQ(ContentType::kXhtml, MimeToType("application/xhtml+xml; "
"charset=utf-8"));
EXPECT_EQ(ContentType::kCeHtml, MimeToType("application/ce-html+xml"));
EXPECT_EQ(ContentType::kJavascript, MimeToType("text/javascript"));
EXPECT_EQ(ContentType::kJavascript, MimeToType("application/x-javascript"));
EXPECT_EQ(ContentType::kJavascript, MimeToType("application/javascript"));
EXPECT_EQ(ContentType::kJavascript, MimeToType("text/ecmascript"));
EXPECT_EQ(ContentType::kJavascript, MimeToType("application/ecmascript"));
EXPECT_EQ(ContentType::kJson, MimeToType("application/json"));
EXPECT_EQ(ContentType::kJson, MimeToType("application/x-json"));
EXPECT_EQ(ContentType::kCss, MimeToType("text/css"));
EXPECT_EQ(ContentType::kText, MimeToType("text/plain"));
EXPECT_EQ(ContentType::kXml, MimeToType("application/xml"));
EXPECT_EQ(ContentType::kXml, MimeToType("text/xml"));
EXPECT_EQ(ContentType::kPng, MimeToType("image/png"));
EXPECT_EQ(ContentType::kGif, MimeToType("image/gif"));
EXPECT_EQ(ContentType::kJpeg, MimeToType("image/jpeg"));
EXPECT_EQ(ContentType::kJpeg, MimeToType("image/jpg"));
EXPECT_EQ(ContentType::kSwf, MimeToType("application/x-shockwave-flash"));
EXPECT_EQ(ContentType::kWebp, MimeToType("image/webp"));
EXPECT_EQ(ContentType::kIco, MimeToType("image/x-icon"));
EXPECT_EQ(ContentType::kIco, MimeToType("image/vnd.microsoft.icon"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/3gp"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/mpeg"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/x-flv"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/ogg"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/mpeg4"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/webm"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/x-ms-asf"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/x-ms-wmv"));
EXPECT_EQ(ContentType::kVideo, MimeToType("video/quicktime"));
EXPECT_EQ(ContentType::kAudio, MimeToType("audio/ogg"));
EXPECT_EQ(ContentType::kAudio, MimeToType("audio/mpeg"));
EXPECT_EQ(ContentType::kAudio, MimeToType("audio/webm"));
EXPECT_EQ(ContentType::kAudio, MimeToType("audio/mp3"));
EXPECT_EQ(ContentType::kAudio, MimeToType("audio/x-mpeg"));
EXPECT_EQ(ContentType::kAudio, MimeToType("audio/x-wav"));
EXPECT_EQ(ContentType::kAudio, MimeToType("audio/mp4"));
EXPECT_EQ(ContentType::kAudio, MimeToType("audio/wav"));
EXPECT_EQ(ContentType::kOctetStream, MimeToType("application/octet-stream"));
EXPECT_EQ(ContentType::kOctetStream, MimeToType("binary/octet-stream"));
}
TEST_F(ContentTypeTest, ConstantSanityCheck) {
EXPECT_EQ(ContentType::kHtml, kContentTypeHtml.type());
EXPECT_EQ(ContentType::kXhtml, kContentTypeXhtml.type());
EXPECT_EQ(ContentType::kCeHtml, kContentTypeCeHtml.type());
EXPECT_EQ(ContentType::kJavascript, kContentTypeJavascript.type());
EXPECT_EQ(ContentType::kCss, kContentTypeCss.type());
EXPECT_EQ(ContentType::kText, kContentTypeText.type());
EXPECT_EQ(ContentType::kXml, kContentTypeXml.type());
EXPECT_EQ(ContentType::kJson, kContentTypeJson.type());
EXPECT_EQ(ContentType::kSourceMap, kContentTypeSourceMap.type());
EXPECT_EQ(ContentType::kPng, kContentTypePng.type());
EXPECT_EQ(ContentType::kGif, kContentTypeGif.type());
EXPECT_EQ(ContentType::kJpeg, kContentTypeJpeg.type());
EXPECT_EQ(ContentType::kSwf, kContentTypeSwf.type());
EXPECT_EQ(ContentType::kWebp, kContentTypeWebp.type());
EXPECT_EQ(ContentType::kIco, kContentTypeIco.type());
EXPECT_EQ(ContentType::kPdf, kContentTypePdf.type());
EXPECT_EQ(ContentType::kOctetStream, kContentTypeBinaryOctetStream.type());
}
// Checks that empty string is parsed correctly and results in empty set and
// nothing is crashing.
TEST(MimeTypeListToContentTypeSetTest, EmptyTest) {
GoogleString s;
std::set<const ContentType*> out;
out.insert(&kContentTypeXml);
MimeTypeListToContentTypeSet(s, &out);
EXPECT_TRUE(out.empty());
}
// Next two tests check the good cases, where string is correctly formed and set
// should be correctly populated.
// Single entry.
TEST(MimeTypeListToContentTypeSetTest, OkTestSingle) {
GoogleString s = "image/gif";
std::set<const ContentType*> out;
out.insert(&kContentTypeXml);
MimeTypeListToContentTypeSet(s, &out);
EXPECT_EQ(1, out.size());
EXPECT_EQ(1, out.count(&kContentTypeGif));
}
// Multiple entries.
TEST(MimeTypeListToContentTypeSetTest, OkTestMultiple) {
GoogleString s = "image/gif,image/jpeg,application/octet-stream,image/jpeg";
std::set<const ContentType*> out;
out.insert(&kContentTypeXml);
MimeTypeListToContentTypeSet(s, &out);
EXPECT_EQ(3, out.size());
EXPECT_EQ(1, out.count(&kContentTypeBinaryOctetStream));
EXPECT_EQ(1, out.count(&kContentTypeJpeg));
EXPECT_EQ(1, out.count(&kContentTypeGif));
}
// Tests malformed string and string with bad mime-types.
TEST(MimeTypeListToContentTypeSetTest, TestBadString) {
GoogleString s = "image/gif,,,,,";
std::set<const ContentType*> out;
out.insert(&kContentTypeXml);
MimeTypeListToContentTypeSet(s, &out);
EXPECT_EQ(1, out.size());
EXPECT_EQ(1, out.count(&kContentTypeGif));
s = "apple,orange,turnip,,,,image/jpeg,";
MimeTypeListToContentTypeSet(s, &out);
EXPECT_EQ(1, out.size());
EXPECT_EQ(1, out.count(&kContentTypeJpeg));
}
} // namespace net_instaweb