/* * Copyright 2012 Google Inc. All Rights Reserved. */ #include "utils/UniquePtr.h" #include "WVDrmPluginFactory.h" #include "media/drm/DrmClientAPI.h" #include "OEMCryptoDASH.h" #include "gtest/gtest.h" using namespace wvclearkey; const uint8_t kWidevineUUID[16] = { 0xED,0xEF,0x8B,0xA9,0x79,0xD6,0x4A,0xCE, 0xA3,0xC8,0x27,0xDC,0xD5,0x1D,0x21,0xED }; const uint8_t kOldNetflixWidevineUUID[16] = { 0x29,0x70,0x1F,0xE4,0x3C,0xC7,0x4A,0x34, 0x8C,0x5B,0xAE,0x90,0xC7,0x43,0x9A,0x47 }; const uint8_t kUnknownUUID[16] = { 0x6A,0x7F,0xAA,0xB0,0x83,0xC7,0x9E,0x20, 0x08,0xBC,0xEF,0x32,0x34,0x1A,0x9A,0x26 }; TEST(WVDrmPluginFactoryTest, SupportsSupportedCryptoSchemes) { UniquePtr factory(new WVDrmPluginFactory()); EXPECT_TRUE(factory->isCryptoSchemeSupported(kWidevineUUID)) << "WVDrmPluginFactory does not support Widevine's UUID"; EXPECT_TRUE(factory->isCryptoSchemeSupported(kOldNetflixWidevineUUID)) << "WVDrmPluginFactory does not support the old Netflix Widevine UUID"; } TEST(WVDrmPluginFactoryTest, DoesNotSupportUnsupportedCryptoSchemes) { UniquePtr factory(new WVDrmPluginFactory()); EXPECT_FALSE(factory->isCryptoSchemeSupported(kUnknownUUID)) << "WVDrmPluginFactory incorrectly claims to support an unknown UUID"; } TEST(WVDrmPluginFactoryTest, CreatesCryptoPlugins) { UniquePtr factory(new WVDrmPluginFactory()); android::CryptoPlugin *plugin; status_t result = factory->createCryptoPlugin(kWidevineUUID, NULL, 0, &plugin); EXPECT_EQ(android::OK, result) << "WVDrmPluginFactory returned error from createCryptoPlugin()"; EXPECT_NE((android::CryptoPlugin *)NULL, plugin) << "WVDrmPluginFactory's createCryptoPlugin() did not create a plugin"; delete plugin; } TEST(WVDrmPluginFactoryTest, DoesNotCreateDrmClientPlugins) { UniquePtr factory(new WVDrmPluginFactory()); android::DrmClientPlugin *plugin; status_t result = factory->createDrmClientPlugin(kWidevineUUID, NULL, 0, &plugin); EXPECT_EQ(-EPERM, result) << "WVDrmPluginFactory did not indicate that createDrmClientPlugin() is not implemented"; EXPECT_EQ((android::DrmClientPlugin *)NULL, plugin) << "WVDrmPluginFactory's createDrmClientPlugin() created a plugin (?!?)"; delete plugin; } TEST(WVDrmPluginFactoryTest, RefusesToCreateWithUnsupportedCryptoScheme) { UniquePtr factory(new WVDrmPluginFactory()); android::CryptoPlugin *cryptoPlugin; android::DrmClientPlugin *drmClientPlugin; status_t result; result = factory->createCryptoPlugin(kUnknownUUID, NULL, 0, &cryptoPlugin); EXPECT_EQ(android::BAD_VALUE, result) << "WVDrmPluginFactory did not reject unknown UUID when creating a CryptoPlugin"; EXPECT_EQ((android::CryptoPlugin *)NULL, cryptoPlugin) << "WVDrmPluginFactory created a CryptoPlugin despite having an unknown UUID"; result = factory->createDrmClientPlugin(kUnknownUUID, NULL, 0, &drmClientPlugin); EXPECT_EQ(android::BAD_VALUE, result) << "WVDrmPluginFactory did not reject unknown UUID when creating a DrmClientPlugin"; EXPECT_EQ((android::DrmClientPlugin *)NULL, drmClientPlugin) << "WVDrmPluginFactory created a DrmClientPlugin despite having an unknown UUID"; delete cryptoPlugin; delete drmClientPlugin; } bool oemCryptoInitialized; bool oemCryptoTerminated; extern "C" { OEMCryptoResult OEMCrypto_Initialize(void) { oemCryptoInitialized = true; return OEMCrypto_SUCCESS; } OEMCryptoResult OEMCrypto_Terminate(void) { oemCryptoTerminated = true; return OEMCrypto_SUCCESS; } } TEST(WVDrmPluginFactoryTest, CallsOemCrypto) { oemCryptoInitialized = false; oemCryptoTerminated = false; WVDrmPluginFactory *factory = new WVDrmPluginFactory(); EXPECT_EQ(true, oemCryptoInitialized) << "WVDrmPluginFactory did not call OEMCrypto_Initialize()"; delete factory; EXPECT_EQ(true, oemCryptoTerminated) << "WVDrmPluginFactory did not call OEMCrypto_Terminate()"; }