blob: 52705f3c359f20c0c801cbd0f5f7b64fe3d4fc39 [file] [log] [blame]
// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// 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.
#include "starboard/shared/starboard/media/mime_type.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace starboard {
namespace shared {
namespace starboard {
namespace media {
namespace {
TEST(MimeTypeTest, EmptyString) {
MimeType mime_type("");
EXPECT_FALSE(mime_type.is_valid());
}
// Valid mime type must have a type/subtype without space in between.
TEST(MimeTypeTest, InvalidMimeType) {
{
MimeType mime_type("video");
EXPECT_FALSE(mime_type.is_valid());
}
{
MimeType mime_type("video/");
EXPECT_FALSE(mime_type.is_valid());
}
{
MimeType mime_type("/mp4");
EXPECT_FALSE(mime_type.is_valid());
}
{
MimeType mime_type("video /mp4");
EXPECT_FALSE(mime_type.is_valid());
}
{
MimeType mime_type("video/ mp4");
EXPECT_FALSE(mime_type.is_valid());
}
{
MimeType mime_type("video / mp4");
EXPECT_FALSE(mime_type.is_valid());
}
{ // "codecs" parameter isn't the first parameter.
MimeType mime_type("audio/mp4;param1=\" value1 \";codecs=\"abc, def\"");
EXPECT_FALSE(mime_type.is_valid());
}
{ // More than one "codecs" parameters.
MimeType mime_type(
"audio/mp4;codecs=\"abc, def\";"
"param1=\" value1 \";codecs=\"abc, def\"");
EXPECT_FALSE(mime_type.is_valid());
}
{
// Parameter name must not be empty.
MimeType mime_type("video/mp4; =value");
EXPECT_FALSE(mime_type.is_valid());
}
{
// Parameter value must not be empty.
MimeType mime_type("video/mp4; name=");
EXPECT_FALSE(mime_type.is_valid());
}
{
// No '|' allowed.
MimeType mime_type("video/mp4; name=ab|c");
EXPECT_FALSE(mime_type.is_valid());
}
}
TEST(MimeTypeTest, ValidContentTypeWithTypeAndSubtypeOnly) {
{
MimeType mime_type("video/mp4");
EXPECT_TRUE(mime_type.is_valid());
EXPECT_EQ("video", mime_type.type());
EXPECT_EQ("mp4", mime_type.subtype());
}
{
MimeType mime_type("audio/mp4");
EXPECT_TRUE(mime_type.is_valid());
}
{
MimeType mime_type("abc/xyz");
EXPECT_TRUE(mime_type.is_valid());
}
}
TEST(MimeTypeTest, TypeNotAtBeginning) {
MimeType mime_type("codecs=\"abc\"; audio/mp4");
EXPECT_FALSE(mime_type.is_valid());
}
TEST(MimeTypeTest, ValidContentTypeWithParams) {
{
MimeType mime_type("video/mp4; name=123");
EXPECT_TRUE(mime_type.is_valid());
}
{
MimeType mime_type("audio/mp4;codecs=\"abc\"");
EXPECT_TRUE(mime_type.is_valid());
}
{
MimeType mime_type(" audio/mp4 ; codecs = \"abc\" ");
EXPECT_TRUE(mime_type.is_valid());
}
}
TEST(MimeTypeTest, GetCodecs) {
{
MimeType mime_type("audio/mp4;codecs=\"abc\"");
EXPECT_EQ(1, mime_type.GetCodecs().size());
EXPECT_EQ("abc", mime_type.GetCodecs()[0]);
}
{
MimeType mime_type("audio/mp4;codecs=\"abc, def\"");
EXPECT_EQ(2, mime_type.GetCodecs().size());
EXPECT_EQ("abc", mime_type.GetCodecs()[0]);
EXPECT_EQ("def", mime_type.GetCodecs()[1]);
}
{
MimeType mime_type("audio/mp4;codecs=\"abc, def\";param1=\" value1 \"");
EXPECT_EQ(2, mime_type.GetCodecs().size());
}
}
TEST(MimeTypeTest, ParamCount) {
{
MimeType mime_type("video/mp4");
EXPECT_EQ(0, mime_type.GetParamCount());
}
{
MimeType mime_type("video/mp4; width=1920");
EXPECT_EQ(1, mime_type.GetParamCount());
}
{
MimeType mime_type("video/mp4; width=1920; height=1080");
EXPECT_EQ(2, mime_type.GetParamCount());
}
}
TEST(MimeTypeTest, GetParamType) {
{
MimeType mime_type(
"video/mp4; name0=123; name1=1.2; name2=xyz; name3=true; name4=false");
EXPECT_EQ(MimeType::kParamTypeInteger, mime_type.GetParamType(0));
EXPECT_EQ(MimeType::kParamTypeFloat, mime_type.GetParamType(1));
EXPECT_EQ(MimeType::kParamTypeString, mime_type.GetParamType(2));
EXPECT_EQ(MimeType::kParamTypeBoolean, mime_type.GetParamType(3));
EXPECT_EQ(MimeType::kParamTypeBoolean, mime_type.GetParamType(4));
}
{
MimeType mime_type("video/mp4; name0=\"123\"; name1=\"abc\"");
EXPECT_EQ(MimeType::kParamTypeString, mime_type.GetParamType(0));
EXPECT_EQ(MimeType::kParamTypeString, mime_type.GetParamType(1));
}
{
MimeType mime_type("video/mp4; name1=\" abc \"");
EXPECT_EQ(MimeType::kParamTypeString, mime_type.GetParamType(0));
}
}
TEST(MimeTypeTest, GetParamName) {
{
MimeType mime_type("video/mp4; name0=123; name1=1.2; name2=xyz");
EXPECT_EQ("name0", mime_type.GetParamName(0));
EXPECT_EQ("name1", mime_type.GetParamName(1));
EXPECT_EQ("name2", mime_type.GetParamName(2));
}
}
TEST(MimeTypeTest, GetParamIntValueWithIndex) {
{
MimeType mime_type("video/mp4; name=123");
EXPECT_EQ(123, mime_type.GetParamIntValue(0));
}
{
MimeType mime_type("video/mp4; width=1920; height=1080");
EXPECT_EQ(1920, mime_type.GetParamIntValue(0));
EXPECT_EQ(1080, mime_type.GetParamIntValue(1));
}
{
MimeType mime_type("audio/mp4; channels=6");
EXPECT_EQ(6, mime_type.GetParamIntValue(0));
}
}
TEST(MimeTypeTest, GetParamFloatValueWithIndex) {
MimeType mime_type("video/mp4; name0=123; name1=123.4");
EXPECT_FLOAT_EQ(123.f, mime_type.GetParamFloatValue(0));
EXPECT_FLOAT_EQ(123.4f, mime_type.GetParamFloatValue(1));
}
TEST(MimeTypeTest, GetParamStringValueWithIndex) {
{
MimeType mime_type("video/mp4; name0=123; name1=abc; name2=\"xyz\"");
EXPECT_EQ("123", mime_type.GetParamStringValue(0));
EXPECT_EQ("abc", mime_type.GetParamStringValue(1));
EXPECT_EQ("xyz", mime_type.GetParamStringValue(2));
}
{
MimeType mime_type("video/mp4; name=\" xyz \"");
EXPECT_EQ(" xyz ", mime_type.GetParamStringValue(0));
}
}
TEST(MimeTypeTest, GetParamBoolValueWithIndex) {
MimeType mime_type("video/mp4; name0=true; name1=false");
EXPECT_TRUE(mime_type.GetParamBoolValue(0));
EXPECT_FALSE(mime_type.GetParamBoolValue(1));
}
TEST(MimeTypeTest, GetParamValueInInvalidType) {
MimeType mime_type("video/mp4; name0=abc; name1=123.4");
EXPECT_FLOAT_EQ(0, mime_type.GetParamIntValue(0));
EXPECT_FLOAT_EQ(0.f, mime_type.GetParamFloatValue(0));
EXPECT_FLOAT_EQ(0, mime_type.GetParamIntValue(1));
}
TEST(MimeTypeTest, GetParamIntValueWithName) {
{
MimeType mime_type("video/mp4; name=123");
EXPECT_EQ(123, mime_type.GetParamIntValue("name", 0));
EXPECT_EQ(6, mime_type.GetParamIntValue("channels", 6));
}
{
MimeType mime_type("video/mp4; width=1920; height=1080");
EXPECT_EQ(1920, mime_type.GetParamIntValue("width", 0));
EXPECT_EQ(1080, mime_type.GetParamIntValue("height", 0));
}
{
MimeType mime_type("audio/mp4; channels=6");
EXPECT_EQ(6, mime_type.GetParamIntValue("channels", 0));
}
}
TEST(MimeTypeTest, GetParamFloatValueWithName) {
{
MimeType mime_type("video/mp4; name0=123; name1=123.4");
EXPECT_FLOAT_EQ(123.f, mime_type.GetParamFloatValue("name0", 0.f));
EXPECT_FLOAT_EQ(123.4f, mime_type.GetParamFloatValue("name1", 0.f));
EXPECT_FLOAT_EQ(59.96f, mime_type.GetParamFloatValue("framerate", 59.96f));
}
}
TEST(MimeTypeTest, GetParamStringValueWithName) {
{
MimeType mime_type("video/mp4; name0=123; name1=abc; name2=\"xyz\"");
EXPECT_EQ("123", mime_type.GetParamStringValue("name0", ""));
EXPECT_EQ("abc", mime_type.GetParamStringValue("name1", ""));
EXPECT_EQ("xyz", mime_type.GetParamStringValue("name2", ""));
EXPECT_EQ("h263", mime_type.GetParamStringValue("codecs", "h263"));
}
{
MimeType mime_type("video/mp4; name=\" xyz \"");
EXPECT_EQ(" xyz ", mime_type.GetParamStringValue("name", ""));
}
}
TEST(MimeTypeTest, GetParamBooleanValueWithName) {
MimeType mime_type("video/mp4; name0=true; name1=false; name2=trues");
EXPECT_TRUE(mime_type.GetParamBoolValue("name0", false));
EXPECT_FALSE(mime_type.GetParamBoolValue("name1", true));
// Default value
EXPECT_FALSE(mime_type.GetParamBoolValue("name2", false));
}
TEST(MimeTypeTest, ReadParamOfDifferentTypes) {
// Ensure that the parameter type is enforced correctly.
MimeType mime_type("video/mp4; string=value; int=1; float=1.0; bool=true");
ASSERT_TRUE(mime_type.is_valid());
// Read params as their original types.
EXPECT_EQ(mime_type.GetParamStringValue("string", ""), "value");
EXPECT_EQ(mime_type.GetParamIntValue("int", 0), 1);
EXPECT_EQ(mime_type.GetParamFloatValue("float", 0.0), 1.0);
EXPECT_EQ(mime_type.GetParamBoolValue("bool", false), true);
// All param types can be read as strings.
EXPECT_EQ(mime_type.GetParamStringValue("int", ""), "1");
EXPECT_EQ(mime_type.GetParamStringValue("float", ""), "1.0");
EXPECT_EQ(mime_type.GetParamStringValue("bool", ""), "true");
// Int can also be read as float.
EXPECT_EQ(mime_type.GetParamFloatValue("int", 0.0), 1.0);
// Test failing validation for ints,
EXPECT_EQ(mime_type.GetParamIntValue("string", 0), 0);
EXPECT_EQ(mime_type.GetParamIntValue("float", 0), 0);
EXPECT_EQ(mime_type.GetParamIntValue("bool", 0), 0);
// floats,
EXPECT_EQ(mime_type.GetParamFloatValue("string", 0.0), 0.0);
EXPECT_EQ(mime_type.GetParamFloatValue("bool", 0.0), 0.0);
// and bools.
EXPECT_FALSE(mime_type.GetParamBoolValue("string", false));
EXPECT_FALSE(mime_type.GetParamBoolValue("int", false));
EXPECT_FALSE(mime_type.GetParamBoolValue("float", false));
}
TEST(MimeTypeTest, ParseInvalidParamString) {
EXPECT_FALSE(MimeType::ParseParamString("", nullptr));
EXPECT_FALSE(MimeType::ParseParamString("invalid", nullptr));
EXPECT_FALSE(MimeType::ParseParamString("val=0;", nullptr));
EXPECT_FALSE(MimeType::ParseParamString("val=a|b", nullptr));
EXPECT_FALSE(MimeType::ParseParamString("val=", nullptr));
}
TEST(MimeTypeTest, ParseValidParamString) {
MimeType::Param result;
EXPECT_TRUE(MimeType::ParseParamString("val=0", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeInteger);
EXPECT_EQ(result.int_value, 0);
EXPECT_TRUE(MimeType::ParseParamString("val=1", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeInteger);
EXPECT_EQ(result.int_value, 1);
EXPECT_TRUE(MimeType::ParseParamString("val=-1", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeInteger);
EXPECT_EQ(result.int_value, -1);
EXPECT_TRUE(MimeType::ParseParamString("val=0.0", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeFloat);
EXPECT_EQ(result.float_value, 0.0f);
EXPECT_TRUE(MimeType::ParseParamString("val=1.0", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeFloat);
EXPECT_EQ(result.float_value, 1.0f);
EXPECT_TRUE(MimeType::ParseParamString("val=-1.0", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeFloat);
EXPECT_EQ(result.float_value, -1.0f);
EXPECT_TRUE(MimeType::ParseParamString("val=true", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeBoolean);
EXPECT_EQ(result.bool_value, true);
EXPECT_TRUE(MimeType::ParseParamString("val=false", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeBoolean);
EXPECT_EQ(result.bool_value, false);
EXPECT_TRUE(MimeType::ParseParamString("val=\"\"", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeString);
EXPECT_EQ(result.string_value, "");
EXPECT_TRUE(MimeType::ParseParamString("val=\"abc\"", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeString);
EXPECT_EQ(result.string_value, "abc");
EXPECT_TRUE(MimeType::ParseParamString("val=abc", &result));
EXPECT_EQ(result.name, "val");
EXPECT_EQ(result.type, MimeType::kParamTypeString);
EXPECT_EQ(result.string_value, "abc");
}
TEST(MimeTypeTest, ValidateParamsWithPatterns) {
MimeType mime_type("video/mp4; string=yes");
EXPECT_TRUE(mime_type.ValidateStringParameter("string", "yes"));
EXPECT_TRUE(mime_type.ValidateStringParameter("string", "yes|no"));
EXPECT_TRUE(mime_type.ValidateStringParameter("string", "no|yes|no"));
EXPECT_TRUE(mime_type.ValidateStringParameter("string", "no|no|yes"));
EXPECT_TRUE(mime_type.ValidateStringParameter("string", "noyes|yes"));
EXPECT_FALSE(mime_type.ValidateStringParameter("string", "no"));
}
TEST(MimeTypeTest, ValidateParamsWithShortPatterns) {
MimeType mime_type("video/mp4; string=y");
EXPECT_TRUE(mime_type.ValidateStringParameter("string", "y"));
EXPECT_TRUE(mime_type.ValidateStringParameter("string", "y|n"));
EXPECT_TRUE(mime_type.ValidateStringParameter("string", "n|y"));
EXPECT_FALSE(mime_type.ValidateStringParameter("string", "n"));
}
TEST(MimeTypeTest, ValidateParamsWithPartialMatches) {
MimeType mime_type("video/mp4; string=yes");
EXPECT_FALSE(mime_type.ValidateStringParameter("string", "yesno|no"));
EXPECT_FALSE(mime_type.ValidateStringParameter("string", "noyes|no"));
EXPECT_FALSE(mime_type.ValidateStringParameter("string", "no|yesno"));
EXPECT_FALSE(mime_type.ValidateStringParameter("string", "no|noyes"));
}
TEST(MimeTypeTest, ValidateMissingParam) {
MimeType mime_type("video/mp4");
EXPECT_TRUE(mime_type.ValidateStringParameter("string"));
EXPECT_EQ(mime_type.GetParamStringValue("string", "default"), "default");
}
TEST(MimeTypeTest, ValidateParamsWithEmptyishPattern) {
MimeType mime_type("video/mp4; string=yes");
EXPECT_TRUE(mime_type.ValidateStringParameter("string", ""));
EXPECT_FALSE(mime_type.ValidateStringParameter("string", "|"));
EXPECT_FALSE(mime_type.ValidateStringParameter("string", "||"));
}
TEST(MimeTypeTest, ValidateParamWithInvalidMimeType) {
MimeType mime_type("video/mp4; string=");
ASSERT_FALSE(mime_type.is_valid());
EXPECT_FALSE(mime_type.ValidateStringParameter("string"));
}
} // namespace
} // namespace media
} // namespace starboard
} // namespace shared
} // namespace starboard