From 4db7780cb5e4026b2c13f288d1e331a9e3744100 Mon Sep 17 00:00:00 2001 From: "John \"Juce\" Bruce" Date: Mon, 4 Aug 2014 13:07:20 -0700 Subject: [PATCH] Support Device Unprovisioning Merge of https://widevine-internal-review.googlesource.com/#/c/10845/ from the widevine cdm repo. Bug: 12247651 Change-Id: Ice6ec95865640fa2f736c7a9f09956395d648337 --- libwvdrmengine/mediadrm/include/WVDrmPlugin.h | 2 + libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp | 13 ++++++ .../mediadrm/test/WVDrmPlugin_test.cpp | 40 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/libwvdrmengine/mediadrm/include/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include/WVDrmPlugin.h index 7e626aac..3054d339 100644 --- a/libwvdrmengine/mediadrm/include/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include/WVDrmPlugin.h @@ -81,6 +81,8 @@ class WVDrmPlugin : public android::DrmPlugin, Vector& certificate, Vector& wrapped_key); + virtual status_t unprovisionDevice(); + virtual status_t getSecureStops(List >& secureStops); virtual status_t releaseSecureStops(const Vector& ssRelease); diff --git a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp index eec6a4d6..a205a87b 100644 --- a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp @@ -375,6 +375,19 @@ status_t WVDrmPlugin::provideProvisionResponse( return mapCdmResponseType(res); } +status_t WVDrmPlugin::unprovisionDevice() { + CdmResponseType res1 = mCDM->Unprovision(kSecurityLevelL1); + CdmResponseType res3 = mCDM->Unprovision(kSecurityLevelL3); + if (!isCdmResponseTypeSuccess(res1)) + { + return mapCdmResponseType(res1); + } + else + { + return mapCdmResponseType(res3); + } +} + status_t WVDrmPlugin::getSecureStops(List >& secureStops) { CdmUsageInfo cdmUsageInfo; CdmResponseType res = mCDM->GetUsageInfo(&cdmUsageInfo); diff --git a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp index 08bfe47a..e0a10dfe 100644 --- a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp @@ -66,6 +66,8 @@ class MockCDM : public WvContentDecryptionModule { MOCK_METHOD1(GetUsageInfo, CdmResponseType(CdmUsageInfo*)); + MOCK_METHOD1(Unprovision, CdmResponseType(CdmSecurityLevel)); + MOCK_METHOD1(ReleaseUsageInfo, CdmResponseType(const CdmUsageInfoReleaseMessage&)); @@ -554,6 +556,44 @@ TEST_F(WVDrmPluginTest, HandlesProvisioningResponses) { ASSERT_EQ(OK, res); } +TEST_F(WVDrmPluginTest, UnprovisionsDevice) { + StrictMock cdm; + StrictMock crypto; + WVDrmPlugin plugin(&cdm, &crypto); + + EXPECT_CALL(cdm, Unprovision(kSecurityLevelL1)) + .Times(1); + EXPECT_CALL(cdm, Unprovision(kSecurityLevelL3)) + .Times(1); + + status_t res = plugin.unprovisionDevice(); + ASSERT_EQ(OK, res); +} + +TEST_F(WVDrmPluginTest, MuxesUnprovisioningErrors) { + StrictMock cdm; + StrictMock crypto; + WVDrmPlugin plugin(&cdm, &crypto); + + // Tests that both Unprovisions are called even if one fails. Also tests that + // no matter which fails, the function always propagates the error. + EXPECT_CALL(cdm, Unprovision(kSecurityLevelL1)) + .WillOnce(Return(wvcdm::UNKNOWN_ERROR)) + .WillOnce(Return(wvcdm::NO_ERROR)) + .WillOnce(Return(wvcdm::UNKNOWN_ERROR)); + EXPECT_CALL(cdm, Unprovision(kSecurityLevelL3)) + .WillOnce(Return(wvcdm::NO_ERROR)) + .WillOnce(Return(wvcdm::UNKNOWN_ERROR)) + .WillOnce(Return(wvcdm::UNKNOWN_ERROR)); + + status_t res = plugin.unprovisionDevice(); + ASSERT_NE(OK, res); + res = plugin.unprovisionDevice(); + ASSERT_NE(OK, res); + res = plugin.unprovisionDevice(); + ASSERT_NE(OK, res); +} + TEST_F(WVDrmPluginTest, GetsSecureStops) { StrictMock cdm; StrictMock crypto;