Home | History | Annotate | Download | only in crypto
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <string>
      6 #include <vector>
      7 
      8 #include "content/public/common/content_client.h"
      9 #include "content/public/renderer/content_renderer_client.h"
     10 #include "content/public/renderer/key_system_info.h"
     11 #include "content/renderer/media/crypto/key_systems.h"
     12 #include "content/test/test_content_client.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "third_party/WebKit/public/platform/WebString.h"
     15 
     16 #include "widevine_cdm_version.h"  // In SHARED_INTERMEDIATE_DIR.
     17 
     18 // Death tests are not always available, including on Android.
     19 // EXPECT_DEBUG_DEATH_PORTABLE executes tests correctly except in the case that
     20 // death tests are not available and NDEBUG is not defined.
     21 #if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
     22 #define EXPECT_DEBUG_DEATH_PORTABLE(statement, regex) \
     23   EXPECT_DEBUG_DEATH(statement, regex)
     24 #else
     25 #if defined(NDEBUG)
     26 #define EXPECT_DEBUG_DEATH_PORTABLE(statement, regex) \
     27   do { statement; } while (false)
     28 #else
     29 #include "base/logging.h"
     30 #define EXPECT_DEBUG_DEATH_PORTABLE(statement, regex) \
     31   LOG(WARNING) << "Death tests are not supported on this platform.\n" \
     32                << "Statement '" #statement "' cannot be verified.";
     33 #endif  // defined(NDEBUG)
     34 #endif  // defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
     35 
     36 namespace content {
     37 
     38 using blink::WebString;
     39 
     40 // These are the (fake) key systems that are registered for these tests.
     41 // kUsesAes uses the AesDecryptor like Clear Key.
     42 // kExternal uses an external CDM, such as Pepper-based or Android platform CDM.
     43 const char kUsesAes[] = "org.example.clear";
     44 const char kUsesAesParent[] = "org.example";  // Not registered.
     45 const char kExternal[] = "com.example.test";
     46 const char kExternalParent[] = "com.example";
     47 
     48 const char kClearKey[] = "org.w3.clearkey";
     49 const char kPrefixedClearKey[] = "webkit-org.w3.clearkey";
     50 const char kExternalClearKey[] = "org.chromium.externalclearkey";
     51 
     52 const char kAudioWebM[] = "audio/webm";
     53 const char kVideoWebM[] = "video/webm";
     54 const char kAudioFoo[] = "audio/foo";
     55 const char kVideoFoo[] = "video/foo";
     56 
     57 // Pick some arbitrary bit fields as long as they are not in conflict with the
     58 // real ones.
     59 enum TestCodec {
     60   TEST_CODEC_FOO_AUDIO = 1 << 10,  // An audio codec for foo container.
     61   TEST_CODEC_FOO_AUDIO_ALL = TEST_CODEC_FOO_AUDIO,
     62   TEST_CODEC_FOO_VIDEO = 1 << 11,  // A video codec for foo container.
     63   TEST_CODEC_FOO_VIDEO_ALL = TEST_CODEC_FOO_VIDEO,
     64   TEST_CODEC_FOO_ALL = TEST_CODEC_FOO_AUDIO_ALL | TEST_CODEC_FOO_VIDEO_ALL
     65 };
     66 
     67 COMPILE_ASSERT((TEST_CODEC_FOO_ALL & EME_CODEC_ALL) == EME_CODEC_NONE,
     68                 test_codec_masks_should_only_use_invalid_codec_masks);
     69 
     70 // Adds test container and codec masks.
     71 // This function must be called after SetContentClient() is called.
     72 // More details: AddXxxMask() will create KeySystems if it hasn't been created.
     73 // During KeySystems's construction GetContentClient() will be used to add key
     74 // systems. In test code, the content client is set by SetContentClient().
     75 // Therefore, SetContentClient() must be called before this function to avoid
     76 // access violation.
     77 static void AddContainerAndCodecMasksForTest() {
     78   // Since KeySystems is a singleton. Make sure we only add test container and
     79   // codec masks once per process.
     80   static bool is_test_masks_added = false;
     81 
     82   if (is_test_masks_added)
     83     return;
     84 
     85   AddContainerMask("audio/foo", TEST_CODEC_FOO_AUDIO_ALL);
     86   AddContainerMask("video/foo", TEST_CODEC_FOO_ALL);
     87   AddCodecMask("fooaudio", TEST_CODEC_FOO_AUDIO);
     88   AddCodecMask("foovideo", TEST_CODEC_FOO_VIDEO);
     89 
     90   is_test_masks_added = true;
     91 }
     92 
     93 class TestContentRendererClient : public ContentRendererClient {
     94   virtual void AddKeySystems(
     95       std::vector<content::KeySystemInfo>* key_systems) OVERRIDE;
     96 };
     97 
     98 void TestContentRendererClient::AddKeySystems(
     99     std::vector<content::KeySystemInfo>* key_systems) {
    100   KeySystemInfo aes(kUsesAes);
    101   aes.supported_codecs = EME_CODEC_WEBM_ALL;
    102   aes.supported_codecs |= TEST_CODEC_FOO_ALL;
    103   aes.use_aes_decryptor = true;
    104   key_systems->push_back(aes);
    105 
    106   KeySystemInfo ext(kExternal);
    107   ext.supported_codecs = EME_CODEC_WEBM_ALL;
    108   ext.supported_codecs |= TEST_CODEC_FOO_ALL;
    109   ext.parent_key_system = kExternalParent;
    110 #if defined(ENABLE_PEPPER_CDMS)
    111   ext.pepper_type = "application/x-ppapi-external-cdm";
    112 #endif  // defined(ENABLE_PEPPER_CDMS)
    113   key_systems->push_back(ext);
    114 }
    115 
    116 class KeySystemsTest : public testing::Test {
    117  protected:
    118   KeySystemsTest() {
    119     vp8_codec_.push_back("vp8");
    120 
    121     vp80_codec_.push_back("vp8.0");
    122 
    123     vp9_codec_.push_back("vp9");
    124 
    125     vp90_codec_.push_back("vp9.0");
    126 
    127     vorbis_codec_.push_back("vorbis");
    128 
    129     vp8_and_vorbis_codecs_.push_back("vp8");
    130     vp8_and_vorbis_codecs_.push_back("vorbis");
    131 
    132     vp9_and_vorbis_codecs_.push_back("vp9");
    133     vp9_and_vorbis_codecs_.push_back("vorbis");
    134 
    135     foovideo_codec_.push_back("foovideo");
    136 
    137     foovideo_extended_codec_.push_back("foovideo.4D400C");
    138 
    139     foovideo_dot_codec_.push_back("foovideo.");
    140 
    141     fooaudio_codec_.push_back("fooaudio");
    142 
    143     foovideo_and_fooaudio_codecs_.push_back("foovideo");
    144     foovideo_and_fooaudio_codecs_.push_back("fooaudio");
    145 
    146     unknown_codec_.push_back("unknown");
    147 
    148     mixed_codecs_.push_back("vorbis");
    149     mixed_codecs_.push_back("foovideo");
    150 
    151     // KeySystems requires a valid ContentRendererClient and thus ContentClient.
    152     // The TestContentClient is not available inside Death Tests on some
    153     // platforms (see below). Therefore, always provide a TestContentClient.
    154     // Explanation: When Death Tests fork, there is a valid ContentClient.
    155     // However, when they launch a new process instead of forking, the global
    156     // variable is not copied and for some reason TestContentClientInitializer
    157     // does not get created to set the global variable in the new process.
    158     SetContentClient(&test_content_client_);
    159     SetRendererClientForTesting(&content_renderer_client_);
    160   }
    161 
    162   virtual void SetUp() OVERRIDE {
    163     AddContainerAndCodecMasksForTest();
    164   }
    165 
    166   virtual ~KeySystemsTest() {
    167     // Clear the use of content_client_, which was set in SetUp().
    168     SetContentClient(NULL);
    169   }
    170 
    171   typedef std::vector<std::string> CodecVector;
    172 
    173   const CodecVector& no_codecs() const { return no_codecs_; }
    174 
    175   const CodecVector& vp8_codec() const { return vp8_codec_; }
    176   const CodecVector& vp80_codec() const { return vp80_codec_; }
    177   const CodecVector& vp9_codec() const { return vp9_codec_; }
    178   const CodecVector& vp90_codec() const { return vp90_codec_; }
    179 
    180   const CodecVector& vorbis_codec() const { return vorbis_codec_; }
    181 
    182   const CodecVector& vp8_and_vorbis_codecs() const {
    183     return vp8_and_vorbis_codecs_;
    184   }
    185   const CodecVector& vp9_and_vorbis_codecs() const {
    186     return vp9_and_vorbis_codecs_;
    187   }
    188 
    189   const CodecVector& foovideo_codec() const { return foovideo_codec_; }
    190   const CodecVector& foovideo_extended_codec() const {
    191     return foovideo_extended_codec_;
    192   }
    193   const CodecVector& foovideo_dot_codec() const { return foovideo_dot_codec_; }
    194   const CodecVector& fooaudio_codec() const { return fooaudio_codec_; }
    195   const CodecVector& foovideo_and_fooaudio_codecs() const {
    196     return foovideo_and_fooaudio_codecs_;
    197   }
    198 
    199   const CodecVector& unknown_codec() const { return unknown_codec_; }
    200 
    201   const CodecVector& mixed_codecs() const { return mixed_codecs_; }
    202 
    203  private:
    204   const CodecVector no_codecs_;
    205   CodecVector vp8_codec_;
    206   CodecVector vp80_codec_;
    207   CodecVector vp9_codec_;
    208   CodecVector vp90_codec_;
    209   CodecVector vorbis_codec_;
    210   CodecVector vp8_and_vorbis_codecs_;
    211   CodecVector vp9_and_vorbis_codecs_;
    212 
    213   CodecVector foovideo_codec_;
    214   CodecVector foovideo_extended_codec_;
    215   CodecVector foovideo_dot_codec_;
    216   CodecVector fooaudio_codec_;
    217   CodecVector foovideo_and_fooaudio_codecs_;
    218 
    219   CodecVector unknown_codec_;
    220 
    221   CodecVector mixed_codecs_;
    222 
    223   TestContentClient test_content_client_;
    224   TestContentRendererClient content_renderer_client_;
    225 };
    226 
    227 // TODO(ddorwin): Consider moving GetPepperType() calls out to their own test.
    228 
    229 TEST_F(KeySystemsTest, EmptyKeySystem) {
    230   EXPECT_FALSE(IsConcreteSupportedKeySystem(std::string()));
    231   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    232       kVideoWebM, no_codecs(), std::string()));
    233   EXPECT_EQ("Unknown", KeySystemNameForUMA(std::string()));
    234 }
    235 
    236 // Clear Key is the only key system registered in content.
    237 TEST_F(KeySystemsTest, ClearKey) {
    238   EXPECT_TRUE(IsConcreteSupportedKeySystem(kClearKey));
    239   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    240       kVideoWebM, no_codecs(), kClearKey));
    241 
    242   EXPECT_EQ("ClearKey", KeySystemNameForUMA(kClearKey));
    243 
    244   // Prefixed Clear Key is not supported internally.
    245   EXPECT_FALSE(IsConcreteSupportedKeySystem(kPrefixedClearKey));
    246   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    247       kVideoWebM, no_codecs(), kPrefixedClearKey));
    248   EXPECT_EQ("Unknown", KeySystemNameForUMA(kPrefixedClearKey));
    249 }
    250 
    251 // The key system is not registered and therefore is unrecognized.
    252 TEST_F(KeySystemsTest, Basic_UnrecognizedKeySystem) {
    253   static const char* const kUnrecognized = "org.example.unrecognized";
    254 
    255   EXPECT_FALSE(IsConcreteSupportedKeySystem(kUnrecognized));
    256   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    257       kVideoWebM, no_codecs(), kUnrecognized));
    258 
    259   EXPECT_EQ("Unknown", KeySystemNameForUMA(kUnrecognized));
    260 
    261   bool can_use = false;
    262   EXPECT_DEBUG_DEATH_PORTABLE(
    263       can_use = CanUseAesDecryptor(kUnrecognized),
    264       "org.example.unrecognized is not a known concrete system");
    265   EXPECT_FALSE(can_use);
    266 
    267 #if defined(ENABLE_PEPPER_CDMS)
    268   std::string type;
    269   EXPECT_DEBUG_DEATH(type = GetPepperType(kUnrecognized),
    270                      "org.example.unrecognized is not a known concrete system");
    271   EXPECT_TRUE(type.empty());
    272 #endif
    273 }
    274 
    275 TEST_F(KeySystemsTest, Basic_UsesAesDecryptor) {
    276   EXPECT_TRUE(IsConcreteSupportedKeySystem(kUsesAes));
    277   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    278       kVideoWebM, no_codecs(), kUsesAes));
    279 
    280   // No UMA value for this test key system.
    281   EXPECT_EQ("Unknown", KeySystemNameForUMA(kUsesAes));
    282 
    283   EXPECT_TRUE(CanUseAesDecryptor(kUsesAes));
    284 #if defined(ENABLE_PEPPER_CDMS)
    285   std::string type;
    286   EXPECT_DEBUG_DEATH(type = GetPepperType(kUsesAes),
    287                      "org.example.clear is not Pepper-based");
    288   EXPECT_TRUE(type.empty());
    289 #endif
    290 }
    291 
    292 TEST_F(KeySystemsTest,
    293        IsSupportedKeySystemWithMediaMimeType_UsesAesDecryptor_TypesContainer1) {
    294   // Valid video types.
    295   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    296       kVideoWebM, vp8_codec(), kUsesAes));
    297   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    298       kVideoWebM, vp80_codec(), kUsesAes));
    299   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    300       kVideoWebM, vp8_and_vorbis_codecs(), kUsesAes));
    301   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    302       kVideoWebM, vp9_codec(), kUsesAes));
    303   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    304       kVideoWebM, vp90_codec(), kUsesAes));
    305   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    306       kVideoWebM, vp9_and_vorbis_codecs(), kUsesAes));
    307   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    308       kVideoWebM, vorbis_codec(), kUsesAes));
    309 
    310   // Non-Webm codecs.
    311   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    312       kVideoWebM, foovideo_codec(), kUsesAes));
    313   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    314       kVideoWebM, unknown_codec(), kUsesAes));
    315   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    316       kVideoWebM, mixed_codecs(), kUsesAes));
    317 
    318   // Valid audio types.
    319   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    320       kAudioWebM, no_codecs(), kUsesAes));
    321   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    322       kAudioWebM, vorbis_codec(), kUsesAes));
    323 
    324   // Non-audio codecs.
    325   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    326       kAudioWebM, vp8_codec(), kUsesAes));
    327   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    328       kAudioWebM, vp8_and_vorbis_codecs(), kUsesAes));
    329   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    330       kAudioWebM, vp9_codec(), kUsesAes));
    331   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    332       kAudioWebM, vp9_and_vorbis_codecs(), kUsesAes));
    333 
    334   // Non-Webm codec.
    335   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    336       kAudioWebM, fooaudio_codec(), kUsesAes));
    337 }
    338 
    339 // No parent is registered for UsesAes.
    340 TEST_F(KeySystemsTest, Parent_NoParentRegistered) {
    341   EXPECT_FALSE(IsConcreteSupportedKeySystem(kUsesAesParent));
    342   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    343       kVideoWebM, no_codecs(), kUsesAesParent));
    344 
    345   // The parent is not supported for most things.
    346   EXPECT_EQ("Unknown", KeySystemNameForUMA(kUsesAesParent));
    347   bool result = false;
    348   EXPECT_DEBUG_DEATH_PORTABLE(result = CanUseAesDecryptor(kUsesAesParent),
    349                               "org.example is not a known concrete system");
    350   EXPECT_FALSE(result);
    351 #if defined(ENABLE_PEPPER_CDMS)
    352   std::string type;
    353   EXPECT_DEBUG_DEATH(type = GetPepperType(kUsesAesParent),
    354                      "org.example is not a known concrete system");
    355   EXPECT_TRUE(type.empty());
    356 #endif
    357 }
    358 
    359 TEST_F(KeySystemsTest, IsSupportedKeySystem_InvalidVariants) {
    360   // Case sensitive.
    361   EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.ClEaR"));
    362   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    363       kVideoWebM, no_codecs(), "org.example.ClEaR"));
    364 
    365   // TLDs are not allowed.
    366   EXPECT_FALSE(IsConcreteSupportedKeySystem("org."));
    367   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    368       kVideoWebM, no_codecs(), "org."));
    369   EXPECT_FALSE(IsConcreteSupportedKeySystem("com"));
    370   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    371       kVideoWebM, no_codecs(), "com"));
    372 
    373   // Extra period.
    374   EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example."));
    375   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    376       kVideoWebM, no_codecs(), "org.example."));
    377 
    378   // Incomplete.
    379   EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.clea"));
    380   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    381       kVideoWebM, no_codecs(), "org.example.clea"));
    382 
    383   // Extra character.
    384   EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.clearz"));
    385   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    386       kVideoWebM, no_codecs(), "org.example.clearz"));
    387 
    388   // There are no child key systems for UsesAes.
    389   EXPECT_FALSE(IsConcreteSupportedKeySystem("org.example.clear.foo"));
    390   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    391       kVideoWebM, no_codecs(), "org.example.clear.foo"));
    392 }
    393 
    394 TEST_F(KeySystemsTest, IsSupportedKeySystemWithMediaMimeType_NoType) {
    395   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    396       std::string(), no_codecs(), kUsesAes));
    397   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    398       std::string(), no_codecs(), kUsesAesParent));
    399 
    400   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    401       std::string(), no_codecs(), "org.example.foo"));
    402   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    403       std::string(), no_codecs(), "org.example.clear.foo"));
    404 }
    405 
    406 // Tests the second registered container type.
    407 // TODO(ddorwin): Combined with TypesContainer1 in a future CL.
    408 TEST_F(KeySystemsTest,
    409        IsSupportedKeySystemWithMediaMimeType_UsesAesDecryptor_TypesContainer2) {
    410   // Valid video types.
    411   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    412       kVideoFoo, no_codecs(), kUsesAes));
    413   // The parent should be supported but is not. See http://crbug.com/164303.
    414   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    415       kVideoFoo, no_codecs(), kUsesAesParent));
    416   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    417       kVideoFoo, foovideo_codec(), kUsesAes));
    418   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    419       kVideoFoo, foovideo_and_fooaudio_codecs(), kUsesAes));
    420   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    421       kVideoFoo, fooaudio_codec(), kUsesAes));
    422 
    423   // Extended codecs fail because this is handled by SimpleWebMimeRegistryImpl.
    424   // They should really pass canPlayType().
    425   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    426       kVideoFoo, foovideo_extended_codec(), kUsesAes));
    427 
    428   // Invalid codec format.
    429   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    430       kVideoFoo, foovideo_dot_codec(), kUsesAes));
    431 
    432   // Non-container2 codec.
    433   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    434       kVideoFoo, vp8_codec(), kUsesAes));
    435   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    436       kVideoFoo, unknown_codec(), kUsesAes));
    437   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    438       kVideoFoo, mixed_codecs(), kUsesAes));
    439 
    440   // Valid audio types.
    441   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    442       kAudioFoo, no_codecs(), kUsesAes));
    443   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    444       kAudioFoo, fooaudio_codec(), kUsesAes));
    445 
    446   // Non-audio codecs.
    447   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    448       kAudioFoo, foovideo_codec(), kUsesAes));
    449   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    450       kAudioFoo, foovideo_and_fooaudio_codecs(), kUsesAes));
    451 
    452   // Non-container2 codec.
    453   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    454       kAudioFoo, vorbis_codec(), kUsesAes));
    455 }
    456 
    457 //
    458 // Non-AesDecryptor-based key system.
    459 //
    460 
    461 TEST_F(KeySystemsTest, Basic_ExternalDecryptor) {
    462   EXPECT_TRUE(IsConcreteSupportedKeySystem(kExternal));
    463   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    464       kVideoWebM, no_codecs(), kExternal));
    465 
    466   EXPECT_FALSE(CanUseAesDecryptor(kExternal));
    467 #if defined(ENABLE_PEPPER_CDMS)
    468   EXPECT_EQ("application/x-ppapi-external-cdm", GetPepperType(kExternal));
    469 #endif  // defined(ENABLE_PEPPER_CDMS)
    470 
    471 }
    472 
    473 TEST_F(KeySystemsTest, Parent_ParentRegistered) {
    474   // The parent system is not a concrete system but is supported.
    475   EXPECT_FALSE(IsConcreteSupportedKeySystem(kExternalParent));
    476   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    477       kVideoWebM, no_codecs(), kExternalParent));
    478 
    479   // The parent is not supported for most things.
    480   EXPECT_EQ("Unknown", KeySystemNameForUMA(kExternalParent));
    481   bool result = false;
    482   EXPECT_DEBUG_DEATH_PORTABLE(result = CanUseAesDecryptor(kExternalParent),
    483                               "com.example is not a known concrete system");
    484   EXPECT_FALSE(result);
    485 #if defined(ENABLE_PEPPER_CDMS)
    486   std::string type;
    487   EXPECT_DEBUG_DEATH(type = GetPepperType(kExternalParent),
    488                      "com.example is not a known concrete system");
    489   EXPECT_TRUE(type.empty());
    490 #endif
    491 }
    492 
    493 TEST_F(
    494     KeySystemsTest,
    495     IsSupportedKeySystemWithMediaMimeType_ExternalDecryptor_TypesContainer1) {
    496   // Valid video types.
    497   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    498       kVideoWebM, no_codecs(), kExternal));
    499   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    500       kVideoWebM, vp8_codec(), kExternal));
    501   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    502       kVideoWebM, vp80_codec(), kExternal));
    503   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    504       kVideoWebM, vp8_and_vorbis_codecs(), kExternal));
    505   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    506       kVideoWebM, vp9_codec(), kExternal));
    507   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    508       kVideoWebM, vp90_codec(), kExternal));
    509   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    510       kVideoWebM, vp9_and_vorbis_codecs(), kExternal));
    511   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    512       kVideoWebM, vorbis_codec(), kExternal));
    513 
    514   // Valid video types - parent key system.
    515   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    516       kVideoWebM, no_codecs(), kExternalParent));
    517   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    518       kVideoWebM, vp8_codec(), kExternalParent));
    519   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    520       kVideoWebM, vp80_codec(), kExternalParent));
    521   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    522       kVideoWebM, vp8_and_vorbis_codecs(), kExternalParent));
    523   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    524       kVideoWebM, vp9_codec(), kExternalParent));
    525   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    526       kVideoWebM, vp90_codec(), kExternalParent));
    527   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    528       kVideoWebM, vp9_and_vorbis_codecs(), kExternalParent));
    529   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    530       kVideoWebM, vorbis_codec(), kExternalParent));
    531 
    532   // Non-Webm codecs.
    533   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    534       kVideoWebM, foovideo_codec(), kExternal));
    535   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    536       kVideoWebM, unknown_codec(), kExternal));
    537   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    538       kVideoWebM, mixed_codecs(), kExternal));
    539 
    540   // Valid audio types.
    541   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    542       kAudioWebM, no_codecs(), kExternal));
    543   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    544       kAudioWebM, vorbis_codec(), kExternal));
    545 
    546   // Valid audio types - parent key system.
    547   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    548       kAudioWebM, no_codecs(), kExternalParent));
    549   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    550       kAudioWebM, vorbis_codec(), kExternalParent));
    551 
    552   // Non-audio codecs.
    553   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    554       kAudioWebM, vp8_codec(), kExternal));
    555   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    556       kAudioWebM, vp8_and_vorbis_codecs(), kExternal));
    557   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    558       kAudioWebM, vp9_codec(), kExternal));
    559   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    560       kAudioWebM, vp9_and_vorbis_codecs(), kExternal));
    561 
    562   // Non-Webm codec.
    563   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    564       kAudioWebM, fooaudio_codec(), kExternal));
    565 }
    566 
    567 TEST_F(
    568     KeySystemsTest,
    569     IsSupportedKeySystemWithMediaMimeType_ExternalDecryptor_TypesContainer2) {
    570   // Valid video types.
    571   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    572       kVideoFoo, no_codecs(), kExternal));
    573   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    574       kVideoFoo, foovideo_codec(), kExternal));
    575   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    576       kVideoFoo, foovideo_and_fooaudio_codecs(), kExternal));
    577   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    578       kVideoFoo, fooaudio_codec(), kExternal));
    579 
    580   // Valid video types - parent key system.
    581   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    582       kVideoFoo, no_codecs(), kExternalParent));
    583   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    584       kVideoFoo, foovideo_codec(), kExternalParent));
    585   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    586       kVideoFoo, foovideo_and_fooaudio_codecs(), kExternalParent));
    587   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    588       kVideoFoo, fooaudio_codec(), kExternalParent));
    589 
    590   // Extended codecs fail because this is handled by SimpleWebMimeRegistryImpl.
    591   // They should really pass canPlayType().
    592   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    593       kVideoFoo, foovideo_extended_codec(), kExternal));
    594 
    595   // Invalid codec format.
    596   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    597       kVideoFoo, foovideo_dot_codec(), kExternal));
    598 
    599   // Non-container2 codecs.
    600   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    601       kVideoFoo, vp8_codec(), kExternal));
    602   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    603       kVideoFoo, unknown_codec(), kExternal));
    604   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    605       kVideoFoo, mixed_codecs(), kExternal));
    606 
    607   // Valid audio types.
    608   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    609       kAudioFoo, no_codecs(), kExternal));
    610   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    611       kAudioFoo, fooaudio_codec(), kExternal));
    612 
    613   // Valid audio types - parent key system.
    614   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    615       kAudioFoo, no_codecs(), kExternalParent));
    616   EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(
    617       kAudioFoo, fooaudio_codec(), kExternalParent));
    618 
    619   // Non-audio codecs.
    620   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    621       kAudioFoo, foovideo_codec(), kExternal));
    622   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    623       kAudioFoo, foovideo_and_fooaudio_codecs(), kExternal));
    624 
    625   // Non-container2 codec.
    626   EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
    627       kAudioFoo, vorbis_codec(), kExternal));
    628 }
    629 
    630 TEST_F(KeySystemsTest, KeySystemNameForUMA) {
    631   EXPECT_EQ("ClearKey", KeySystemNameForUMA(kClearKey));
    632   // Prefixed is not supported internally.
    633   EXPECT_EQ("Unknown", KeySystemNameForUMA(kPrefixedClearKey));
    634 
    635   // External Clear Key never has a UMA name.
    636   EXPECT_EQ("Unknown", KeySystemNameForUMA(kExternalClearKey));
    637 
    638 #if defined(WIDEVINE_CDM_AVAILABLE)
    639   const char* const kTestWidevineUmaName = "Widevine";
    640 #else
    641   const char* const kTestWidevineUmaName = "Unknown";
    642 #endif
    643   EXPECT_EQ(kTestWidevineUmaName, KeySystemNameForUMA("com.widevine.alpha"));
    644 }
    645 
    646 }  // namespace content
    647