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;