| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <string> |
| #include <vector> |
| |
| #include "content/public/common/content_client.h" |
| #include "content/public/renderer/content_renderer_client.h" |
| #include "content/renderer/media/crypto/key_systems.h" |
| #include "content/test/test_content_client.h" |
| #include "media/base/eme_constants.h" |
| #include "media/base/key_system_info.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/WebKit/public/platform/WebString.h" |
| |
| #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
| |
| // Death tests are not always available, including on Android. |
| // EXPECT_DEBUG_DEATH_PORTABLE executes tests correctly except in the case that |
| // death tests are not available and NDEBUG is not defined. |
| #if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID) |
| #define EXPECT_DEBUG_DEATH_PORTABLE(statement, regex) \ |
| EXPECT_DEBUG_DEATH(statement, regex) |
| #else |
| #if defined(NDEBUG) |
| #define EXPECT_DEBUG_DEATH_PORTABLE(statement, regex) \ |
| do { statement; } while (false) |
| #else |
| #include "base/logging.h" |
| #define EXPECT_DEBUG_DEATH_PORTABLE(statement, regex) \ |
| LOG(WARNING) << "Death tests are not supported on this platform.\n" \ |
| << "Statement '" #statement "' cannot be verified."; |
| #endif // defined(NDEBUG) |
| #endif // defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID) |
| |
| namespace content { |
| |
| using blink::WebString; |
| using media::KeySystemInfo; |
| |
| // These are the (fake) key systems that are registered for these tests. |
| // kUsesAes uses the AesDecryptor like Clear Key. |
| // kExternal uses an external CDM, such as Pepper-based or Android platform CDM. |
| const char kUsesAes[] = "org.example.clear"; |
| const char kUsesAesParent[] = "org.example"; // Not registered. |
| const char kExternal[] = "com.example.test"; |
| const char kExternalParent[] = "com.example"; |
| |
| const char kClearKey[] = "org.w3.clearkey"; |
| const char kPrefixedClearKey[] = "webkit-org.w3.clearkey"; |
| const char kExternalClearKey[] = "org.chromium.externalclearkey"; |
| |
| const char kAudioWebM[] = "audio/webm"; |
| const char kVideoWebM[] = "video/webm"; |
| const char kAudioFoo[] = "audio/foo"; |
| const char kVideoFoo[] = "video/foo"; |
| |
| // Pick some arbitrary bit fields as long as they are not in conflict with the |
| // real ones. |
| enum TestCodec { |
| TEST_CODEC_FOO_AUDIO = 1 << 10, // An audio codec for foo container. |
| TEST_CODEC_FOO_AUDIO_ALL = TEST_CODEC_FOO_AUDIO, |
| TEST_CODEC_FOO_VIDEO = 1 << 11, // A video codec for foo container. |
| TEST_CODEC_FOO_VIDEO_ALL = TEST_CODEC_FOO_VIDEO, |
| TEST_CODEC_FOO_ALL = TEST_CODEC_FOO_AUDIO_ALL | TEST_CODEC_FOO_VIDEO_ALL |
| }; |
| |
| COMPILE_ASSERT((TEST_CODEC_FOO_ALL & media::EME_CODEC_ALL) == |
| media::EME_CODEC_NONE, |
| test_codec_masks_should_only_use_invalid_codec_masks); |
| |
| // Adds test container and codec masks. |
| // This function must be called after SetContentClient() is called. |
| // More details: AddXxxMask() will create KeySystems if it hasn't been created. |
| // During KeySystems's construction GetContentClient() will be used to add key |
| // systems. In test code, the content client is set by SetContentClient(). |
| // Therefore, SetContentClient() must be called before this function to avoid |
| // access violation. |
| static void AddContainerAndCodecMasksForTest() { |
| // Since KeySystems is a singleton. Make sure we only add test container and |
| // codec masks once per process. |
| static bool is_test_masks_added = false; |
| |
| if (is_test_masks_added) |
| return; |
| |
| AddContainerMask("audio/foo", TEST_CODEC_FOO_AUDIO_ALL); |
| AddContainerMask("video/foo", TEST_CODEC_FOO_ALL); |
| AddCodecMask("fooaudio", TEST_CODEC_FOO_AUDIO); |
| AddCodecMask("foovideo", TEST_CODEC_FOO_VIDEO); |
| |
| is_test_masks_added = true; |
| } |
| |
| class TestContentRendererClient : public ContentRendererClient { |
| void AddKeySystems(std::vector<media::KeySystemInfo>* key_systems) override; |
| }; |
| |
| void TestContentRendererClient::AddKeySystems( |
| std::vector<media::KeySystemInfo>* key_systems) { |
| KeySystemInfo aes(kUsesAes); |
| aes.supported_codecs = media::EME_CODEC_WEBM_ALL; |
| aes.supported_codecs |= TEST_CODEC_FOO_ALL; |
| aes.supported_init_data_types = media::EME_INIT_DATA_TYPE_WEBM; |
| aes.use_aes_decryptor = true; |
| key_systems->push_back(aes); |
| |
| KeySystemInfo ext(kExternal); |
| ext.supported_codecs = media::EME_CODEC_WEBM_ALL; |
| ext.supported_codecs |= TEST_CODEC_FOO_ALL; |
| ext.supported_init_data_types = media::EME_INIT_DATA_TYPE_WEBM; |
| ext.parent_key_system = kExternalParent; |
| #if defined(ENABLE_PEPPER_CDMS) |
| ext.pepper_type = "application/x-ppapi-external-cdm"; |
| #endif // defined(ENABLE_PEPPER_CDMS) |
| key_systems->push_back(ext); |
| } |
| |
| // TODO(sandersd): Refactor. http://crbug.com/417444 |
| class KeySystemsTest : public testing::Test { |
| protected: |
| KeySystemsTest() { |
| vp8_codec_.push_back("vp8"); |
| |
| vp80_codec_.push_back("vp8.0"); |
| |
| vp9_codec_.push_back("vp9"); |
| |
| vp90_codec_.push_back("vp9.0"); |
| |
| vorbis_codec_.push_back("vorbis"); |
| |
| vp8_and_vorbis_codecs_.push_back("vp8"); |
| vp8_and_vorbis_codecs_.push_back("vorbis"); |
| |
| vp9_and_vorbis_codecs_.push_back("vp9"); |
| vp9_and_vorbis_codecs_.push_back("vorbis"); |
| |
| foovideo_codec_.push_back("foovideo"); |
| |
| foovideo_extended_codec_.push_back("foovideo.4D400C"); |
| |
| foovideo_dot_codec_.push_back("foovideo."); |
| |
| fooaudio_codec_.push_back("fooaudio"); |
| |
| foovideo_and_fooaudio_codecs_.push_back("foovideo"); |
| foovideo_and_fooaudio_codecs_.push_back("fooaudio"); |
| |
| unknown_codec_.push_back("unknown"); |
| |
| mixed_codecs_.push_back("vorbis"); |
| mixed_codecs_.push_back("foovideo"); |
| |
| // KeySystems requires a valid ContentRendererClient and thus ContentClient. |
| // The TestContentClient is not available inside Death Tests on some |
| // platforms (see below). Therefore, always provide a TestContentClient. |
| // Explanation: When Death Tests fork, there is a valid ContentClient. |
| // However, when they launch a new process instead of forking, the global |
| // variable is not copied and for some reason TestContentClientInitializer |
| // does not get created to set the global variable in the new process. |
| SetContentClient(&test_content_client_); |
| SetRendererClientForTesting(&content_renderer_client_); |
| } |
| |
| virtual void SetUp() override { |
| AddContainerAndCodecMasksForTest(); |
| } |
| |
| virtual ~KeySystemsTest() { |
| // Clear the use of content_client_, which was set in SetUp(). |
| SetContentClient(NULL); |
| } |
| |
| typedef std::vector<std::string> CodecVector; |
| |
| const CodecVector& no_codecs() const { return no_codecs_; } |
| |
| const CodecVector& vp8_codec() const { return vp8_codec_; } |
| const CodecVector& vp80_codec() const { return vp80_codec_; } |
| const CodecVector& vp9_codec() const { return vp9_codec_; } |
| const CodecVector& vp90_codec() const { return vp90_codec_; } |
| |
| const CodecVector& vorbis_codec() const { return vorbis_codec_; } |
| |
| const CodecVector& vp8_and_vorbis_codecs() const { |
| return vp8_and_vorbis_codecs_; |
| } |
| const CodecVector& vp9_and_vorbis_codecs() const { |
| return vp9_and_vorbis_codecs_; |
| } |
| |
| const CodecVector& foovideo_codec() const { return foovideo_codec_; } |
| const CodecVector& foovideo_extended_codec() const { |
| return foovideo_extended_codec_; |
| } |
| const CodecVector& foovideo_dot_codec() const { return foovideo_dot_codec_; } |
| const CodecVector& fooaudio_codec() const { return fooaudio_codec_; } |
| const CodecVector& foovideo_and_fooaudio_codecs() const { |
| return foovideo_and_fooaudio_codecs_; |
| } |
| |
| const CodecVector& unknown_codec() const { return unknown_codec_; } |
| |
| const CodecVector& mixed_codecs() const { return mixed_codecs_; } |
| |
| private: |
| const CodecVector no_codecs_; |
| CodecVector vp8_codec_; |
| CodecVector vp80_codec_; |
| CodecVector vp9_codec_; |
| CodecVector vp90_codec_; |
| CodecVector vorbis_codec_; |
| CodecVector vp8_and_vorbis_codecs_; |
| CodecVector vp9_and_vorbis_codecs_; |
| |
| CodecVector foovideo_codec_; |
| CodecVector foovideo_extended_codec_; |
| CodecVector foovideo_dot_codec_; |
| CodecVector fooaudio_codec_; |
| CodecVector foovideo_and_fooaudio_codecs_; |
| |
| CodecVector unknown_codec_; |
| |
| CodecVector mixed_codecs_; |
| |
| TestContentClient test_content_client_; |
| TestContentRendererClient content_renderer_client_; |
| }; |
| |
| // TODO(ddorwin): Consider moving GetPepperType() calls out to their own test. |
| |
| TEST_F(KeySystemsTest, EmptyKeySystem) { |
| EXPECT_FALSE(IsConcreteSupportedKeySystem(std::string())); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), std::string())); |
| EXPECT_EQ("Unknown", KeySystemNameForUMA(std::string())); |
| } |
| |
| // Clear Key is the only key system registered in content. |
| TEST_F(KeySystemsTest, ClearKey) { |
| EXPECT_TRUE(IsConcreteSupportedKeySystem(kClearKey)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kClearKey)); |
| |
| EXPECT_EQ("ClearKey", KeySystemNameForUMA(kClearKey)); |
| |
| // Prefixed Clear Key is not supported internally. |
| EXPECT_FALSE(IsConcreteSupportedKeySystem(kPrefixedClearKey)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kPrefixedClearKey)); |
| EXPECT_EQ("Unknown", KeySystemNameForUMA(kPrefixedClearKey)); |
| } |
| |
| // The key system is not registered and therefore is unrecognized. |
| TEST_F(KeySystemsTest, Basic_UnrecognizedKeySystem) { |
| static const char* const kUnrecognized = "org.example.unrecognized"; |
| |
| EXPECT_FALSE(IsConcreteSupportedKeySystem(kUnrecognized)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kUnrecognized)); |
| |
| EXPECT_EQ("Unknown", KeySystemNameForUMA(kUnrecognized)); |
| |
| bool can_use = false; |
| EXPECT_DEBUG_DEATH_PORTABLE( |
| can_use = CanUseAesDecryptor(kUnrecognized), |
| "org.example.unrecognized is not a known concrete system"); |
| EXPECT_FALSE(can_use); |
| |
| #if defined(ENABLE_PEPPER_CDMS) |
| std::string type; |
| EXPECT_DEBUG_DEATH(type = GetPepperType(kUnrecognized), |
| "org.example.unrecognized is not a known concrete system"); |
| EXPECT_TRUE(type.empty()); |
| #endif |
| } |
| |
| TEST_F(KeySystemsTest, Basic_UsesAesDecryptor) { |
| EXPECT_TRUE(IsConcreteSupportedKeySystem(kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kUsesAes)); |
| |
| // No UMA value for this test key system. |
| EXPECT_EQ("Unknown", KeySystemNameForUMA(kUsesAes)); |
| |
| EXPECT_TRUE(CanUseAesDecryptor(kUsesAes)); |
| #if defined(ENABLE_PEPPER_CDMS) |
| std::string type; |
| EXPECT_DEBUG_DEATH(type = GetPepperType(kUsesAes), |
| "org.example.clear is not Pepper-based"); |
| EXPECT_TRUE(type.empty()); |
| #endif |
| } |
| |
| TEST_F(KeySystemsTest, |
| IsSupportedKeySystemWithMediaMimeType_UsesAesDecryptor_TypesContainer1) { |
| // Valid video types. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp8_codec(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp80_codec(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp8_and_vorbis_codecs(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp9_codec(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp90_codec(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp9_and_vorbis_codecs(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vorbis_codec(), kUsesAes)); |
| |
| // Non-Webm codecs. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, foovideo_codec(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, unknown_codec(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, mixed_codecs(), kUsesAes)); |
| |
| // Valid audio types. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, no_codecs(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vorbis_codec(), kUsesAes)); |
| |
| // Non-audio codecs. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vp8_codec(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vp8_and_vorbis_codecs(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vp9_codec(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vp9_and_vorbis_codecs(), kUsesAes)); |
| |
| // Non-Webm codec. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, fooaudio_codec(), kUsesAes)); |
| } |
| |
| // No parent is registered for UsesAes. |
| TEST_F(KeySystemsTest, Parent_NoParentRegistered) { |
| EXPECT_FALSE(IsConcreteSupportedKeySystem(kUsesAesParent)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kUsesAesParent)); |
| |
| // The parent is not supported for most things. |
| EXPECT_EQ("Unknown", KeySystemNameForUMA(kUsesAesParent)); |
| bool result = false; |
| EXPECT_DEBUG_DEATH_PORTABLE(result = CanUseAesDecryptor(kUsesAesParent), |
| "org.example is not a known concrete system"); |
| EXPECT_FALSE(result); |
| #if defined(ENABLE_PEPPER_CDMS) |
| std::string type; |
| EXPECT_DEBUG_DEATH(type = GetPepperType(kUsesAesParent), |
| "org.example is not a known concrete system"); |
| EXPECT_TRUE(type.empty()); |
| #endif |
| } |
| |
| TEST_F(KeySystemsTest, IsSupportedKeySystem_InvalidVariants) { |
| // Case sensitive. |
| EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.ClEaR")); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), "org.example.ClEaR")); |
| |
| // TLDs are not allowed. |
| EXPECT_FALSE(IsConcreteSupportedKeySystem("org.")); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), "org.")); |
| EXPECT_FALSE(IsConcreteSupportedKeySystem("com")); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), "com")); |
| |
| // Extra period. |
| EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.")); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), "org.example.")); |
| |
| // Incomplete. |
| EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.clea")); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), "org.example.clea")); |
| |
| // Extra character. |
| EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.clearz")); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), "org.example.clearz")); |
| |
| // There are no child key systems for UsesAes. |
| EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.clear.foo")); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), "org.example.clear.foo")); |
| } |
| |
| TEST_F(KeySystemsTest, IsSupportedKeySystemWithMediaMimeType_NoType) { |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| std::string(), no_codecs(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| std::string(), no_codecs(), kUsesAesParent)); |
| |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| std::string(), no_codecs(), "org.example.foo")); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| std::string(), no_codecs(), "org.example.clear.foo")); |
| } |
| |
| // Tests the second registered container type. |
| // TODO(ddorwin): Combined with TypesContainer1 in a future CL. |
| TEST_F(KeySystemsTest, |
| IsSupportedKeySystemWithMediaMimeType_UsesAesDecryptor_TypesContainer2) { |
| // Valid video types. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, no_codecs(), kUsesAes)); |
| // The parent should be supported but is not. See http://crbug.com/164303. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, no_codecs(), kUsesAesParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_codec(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_and_fooaudio_codecs(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, fooaudio_codec(), kUsesAes)); |
| |
| // Extended codecs fail because this is handled by SimpleWebMimeRegistryImpl. |
| // They should really pass canPlayType(). |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_extended_codec(), kUsesAes)); |
| |
| // Invalid codec format. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_dot_codec(), kUsesAes)); |
| |
| // Non-container2 codec. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, vp8_codec(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, unknown_codec(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, mixed_codecs(), kUsesAes)); |
| |
| // Valid audio types. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, no_codecs(), kUsesAes)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, fooaudio_codec(), kUsesAes)); |
| |
| // Non-audio codecs. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, foovideo_codec(), kUsesAes)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, foovideo_and_fooaudio_codecs(), kUsesAes)); |
| |
| // Non-container2 codec. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, vorbis_codec(), kUsesAes)); |
| } |
| |
| // |
| // Non-AesDecryptor-based key system. |
| // |
| |
| TEST_F(KeySystemsTest, Basic_ExternalDecryptor) { |
| EXPECT_TRUE(IsConcreteSupportedKeySystem(kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kExternal)); |
| |
| EXPECT_FALSE(CanUseAesDecryptor(kExternal)); |
| #if defined(ENABLE_PEPPER_CDMS) |
| EXPECT_EQ("application/x-ppapi-external-cdm", GetPepperType(kExternal)); |
| #endif // defined(ENABLE_PEPPER_CDMS) |
| |
| } |
| |
| TEST_F(KeySystemsTest, Parent_ParentRegistered) { |
| // The parent system is not a concrete system but is supported. |
| EXPECT_FALSE(IsConcreteSupportedKeySystem(kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kExternalParent)); |
| |
| // The parent is not supported for most things. |
| EXPECT_EQ("Unknown", KeySystemNameForUMA(kExternalParent)); |
| bool result = false; |
| EXPECT_DEBUG_DEATH_PORTABLE(result = CanUseAesDecryptor(kExternalParent), |
| "com.example is not a known concrete system"); |
| EXPECT_FALSE(result); |
| #if defined(ENABLE_PEPPER_CDMS) |
| std::string type; |
| EXPECT_DEBUG_DEATH(type = GetPepperType(kExternalParent), |
| "com.example is not a known concrete system"); |
| EXPECT_TRUE(type.empty()); |
| #endif |
| } |
| |
| TEST_F( |
| KeySystemsTest, |
| IsSupportedKeySystemWithMediaMimeType_ExternalDecryptor_TypesContainer1) { |
| // Valid video types. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp8_codec(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp80_codec(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp8_and_vorbis_codecs(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp9_codec(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp90_codec(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp9_and_vorbis_codecs(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vorbis_codec(), kExternal)); |
| |
| // Valid video types - parent key system. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, no_codecs(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp8_codec(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp80_codec(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp8_and_vorbis_codecs(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp9_codec(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp90_codec(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vp9_and_vorbis_codecs(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, vorbis_codec(), kExternalParent)); |
| |
| // Non-Webm codecs. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, foovideo_codec(), kExternal)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, unknown_codec(), kExternal)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoWebM, mixed_codecs(), kExternal)); |
| |
| // Valid audio types. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, no_codecs(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vorbis_codec(), kExternal)); |
| |
| // Valid audio types - parent key system. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, no_codecs(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vorbis_codec(), kExternalParent)); |
| |
| // Non-audio codecs. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vp8_codec(), kExternal)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vp8_and_vorbis_codecs(), kExternal)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vp9_codec(), kExternal)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, vp9_and_vorbis_codecs(), kExternal)); |
| |
| // Non-Webm codec. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioWebM, fooaudio_codec(), kExternal)); |
| } |
| |
| TEST_F( |
| KeySystemsTest, |
| IsSupportedKeySystemWithMediaMimeType_ExternalDecryptor_TypesContainer2) { |
| // Valid video types. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, no_codecs(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_codec(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_and_fooaudio_codecs(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, fooaudio_codec(), kExternal)); |
| |
| // Valid video types - parent key system. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, no_codecs(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_codec(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_and_fooaudio_codecs(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, fooaudio_codec(), kExternalParent)); |
| |
| // Extended codecs fail because this is handled by SimpleWebMimeRegistryImpl. |
| // They should really pass canPlayType(). |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_extended_codec(), kExternal)); |
| |
| // Invalid codec format. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, foovideo_dot_codec(), kExternal)); |
| |
| // Non-container2 codecs. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, vp8_codec(), kExternal)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, unknown_codec(), kExternal)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kVideoFoo, mixed_codecs(), kExternal)); |
| |
| // Valid audio types. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, no_codecs(), kExternal)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, fooaudio_codec(), kExternal)); |
| |
| // Valid audio types - parent key system. |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, no_codecs(), kExternalParent)); |
| EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, fooaudio_codec(), kExternalParent)); |
| |
| // Non-audio codecs. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, foovideo_codec(), kExternal)); |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, foovideo_and_fooaudio_codecs(), kExternal)); |
| |
| // Non-container2 codec. |
| EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( |
| kAudioFoo, vorbis_codec(), kExternal)); |
| } |
| |
| TEST_F(KeySystemsTest, KeySystemNameForUMA) { |
| EXPECT_EQ("ClearKey", KeySystemNameForUMA(kClearKey)); |
| // Prefixed is not supported internally. |
| EXPECT_EQ("Unknown", KeySystemNameForUMA(kPrefixedClearKey)); |
| |
| // External Clear Key never has a UMA name. |
| EXPECT_EQ("Unknown", KeySystemNameForUMA(kExternalClearKey)); |
| |
| #if defined(WIDEVINE_CDM_AVAILABLE) |
| const char* const kTestWidevineUmaName = "Widevine"; |
| #else |
| const char* const kTestWidevineUmaName = "Unknown"; |
| #endif |
| EXPECT_EQ(kTestWidevineUmaName, KeySystemNameForUMA("com.widevine.alpha")); |
| } |
| |
| } // namespace content |