diff --git a/libwvdrmengine/cdm/core/include/license.h b/libwvdrmengine/cdm/core/include/license.h index e8120fb5..98a139d9 100644 --- a/libwvdrmengine/cdm/core/include/license.h +++ b/libwvdrmengine/cdm/core/include/license.h @@ -58,9 +58,9 @@ class CdmLicense { CdmSession* cdm_session, CdmKeyMessage* signed_request, std::string* server_url); virtual CdmResponseType HandleKeyResponse( - const CdmKeyResponse& license_response); + bool is_restore, const CdmKeyResponse& license_response); virtual CdmResponseType HandleKeyUpdateResponse( - bool is_renewal, const CdmKeyResponse& license_response); + bool is_renewal, bool is_restore, const CdmKeyResponse& license_response); virtual CdmResponseType HandleEmbeddedKeyData( const InitializationData& init_data); @@ -109,7 +109,7 @@ class CdmLicense { video_widevine::LicenseRequest* license_request); CdmResponseType HandleContentKeyResponse( - const std::string& msg, const std::string& core_message, + bool is_restore, const std::string& msg, const std::string& core_message, const std::string& signature, const std::string& mac_key_iv, const std::string& mac_key, const std::vector& key_array, const video_widevine::License& license); @@ -118,7 +118,7 @@ class CdmLicense { // the crypto session. In addition, it also extracts content keys from // |wrapped_keys_| and loads them for use. CdmResponseType HandleEntitlementKeyResponse( - const std::string& msg, const std::string& core_message, + bool is_restore, const std::string& msg, const std::string& core_message, const std::string& signature, const std::string& mac_key_iv, const std::string& mac_key, const std::vector& key_array, const video_widevine::License& license); diff --git a/libwvdrmengine/cdm/core/include/policy_engine.h b/libwvdrmengine/cdm/core/include/policy_engine.h index 0e89df64..d71c2387 100644 --- a/libwvdrmengine/cdm/core/include/policy_engine.h +++ b/libwvdrmengine/cdm/core/include/policy_engine.h @@ -56,10 +56,13 @@ class PolicyEngine { // SetLicense is used in handling the initial license response. It stores // an exact copy of the policy information stored in the license. - // The license state transitions to kLicenseStateCanPlay if the license - // permits playback. + // License state transitions and notifications may occur if + // |defer_license_state_update| is not set. If set, the license is likely + // being restored and transitions and notifications will be deferred until + // stored playback times are restored. virtual void SetLicense(const video_widevine::License& license, - bool supports_core_messages); + bool supports_core_messages, + bool defer_license_state_update); // Used to update the currently loaded entitled content keys. virtual void SetEntitledLicenseKeys( @@ -78,9 +81,17 @@ class PolicyEngine { // UpdateLicense is used in handling a license response for a renewal request. // The response may only contain any policy fields that have changed. In this // case an exact copy is not what we want to happen. We also will receive an - // updated license_start_time from the server. The license will transition to - // kLicenseStateCanPlay if the license permits playback. - virtual void UpdateLicense(const video_widevine::License& license); + // updated license_start_time from the server. + // License state transitions and notifications may occur if + // |defer_license_state_update| is not set. If set, the license is likely + // being restored and transitions and notifications will be deferred until + // stored playback times are restored. + virtual void UpdateLicense(const video_widevine::License& license, + bool defer_license_state_update); + + // This method updates license state and sends appropriate notifications + // to event listeners. + virtual void UpdateLicenseState(int64_t current_time); // Used for notifying the Policy Engine of resolution changes virtual void NotifyResolution(uint32_t width, uint32_t height); @@ -101,6 +112,9 @@ class PolicyEngine { int64_t GetPlaybackStartTime(); int64_t GetLastPlaybackTime(); int64_t GetGracePeriodEndTime(); + + // This method will also update license state and sends appropriate + // notifications to event listeners. void RestorePlaybackTimes(int64_t playback_start_time, int64_t last_playback_time, int64_t grace_period_end_time); @@ -153,6 +167,7 @@ class PolicyEngine { void SetSecurityLevelForTest(CdmSecurityLevel security_level); LicenseState license_state_; + int64_t license_state_update_deadline_; // This is the license id field from server response. This data gets passed // back to the server in each renewal request. When we get a renewal response diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index 8d06e6ee..8b391fb1 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -593,7 +593,8 @@ CdmResponseType CdmSession::AddKeyInternal(const CdmKeyResponse& key_response) { if (sts != NO_ERROR) return sts; } } - sts = license_parser_->HandleKeyResponse(key_response); + sts = license_parser_->HandleKeyResponse(/* is restore */ false, + key_response); // Update the license sdk and service versions. const VersionInfo& version_info = license_parser_->GetServiceVersion(); @@ -790,8 +791,9 @@ CdmResponseType CdmSession::RenewKey(const CdmKeyResponse& key_response) { LOGE("CDM session not initialized"); return NOT_INITIALIZED_ERROR; } - CdmResponseType sts = - license_parser_->HandleKeyUpdateResponse(true, key_response); + CdmResponseType sts = license_parser_->HandleKeyUpdateResponse( + /* is renewal */ true, + /* is restore */ false, key_response); // Record the timing on success. UpdateRequestLatencyTiming(sts); @@ -855,8 +857,9 @@ CdmResponseType CdmSession::ReleaseKey(const CdmKeyResponse& key_response) { LOGE("CDM session not initialized"); return NOT_INITIALIZED_ERROR; } - CdmResponseType sts = - license_parser_->HandleKeyUpdateResponse(false, key_response); + CdmResponseType sts = license_parser_->HandleKeyUpdateResponse( + /* is renewal */ false, + /* is restore */ false, key_response); // Record the timing on success. UpdateRequestLatencyTiming(sts); diff --git a/libwvdrmengine/cdm/core/src/license.cpp b/libwvdrmengine/cdm/core/src/license.cpp index 94880704..f4a9b773 100644 --- a/libwvdrmengine/cdm/core/src/license.cpp +++ b/libwvdrmengine/cdm/core/src/license.cpp @@ -530,7 +530,7 @@ CdmResponseType CdmLicense::PrepareKeyUpdateRequest( } CdmResponseType CdmLicense::HandleKeyResponse( - const CdmKeyResponse& license_response) { + bool is_restore, const CdmKeyResponse& license_response) { if (!initialized_) { LOGE("CdmLicense not initialized"); return LICENSE_PARSER_NOT_INITIALIZED_2; @@ -683,18 +683,19 @@ CdmResponseType CdmLicense::HandleKeyResponse( CdmResponseType resp = NO_CONTENT_KEY; if (kLicenseKeyTypeEntitlement == key_type) { - resp = - HandleEntitlementKeyResponse(signed_message, core_message, signature, - mac_key_iv, mac_keys, key_array, license); + resp = HandleEntitlementKeyResponse(is_restore, signed_message, + core_message, signature, mac_key_iv, + mac_keys, key_array, license); } else if (kLicenseKeyTypeContent == key_type) { - resp = HandleContentKeyResponse(signed_message, core_message, signature, - mac_key_iv, mac_keys, key_array, license); + resp = HandleContentKeyResponse(is_restore, signed_message, core_message, + signature, mac_key_iv, mac_keys, key_array, + license); } return resp; } CdmResponseType CdmLicense::HandleKeyUpdateResponse( - bool is_renewal, const CdmKeyResponse& license_response) { + bool is_renewal, bool is_restore, const CdmKeyResponse& license_response) { if (!initialized_) { LOGE("CdmLicense not initialized"); return LICENSE_PARSER_NOT_INITIALIZED_3; @@ -781,7 +782,7 @@ CdmResponseType CdmLicense::HandleKeyUpdateResponse( } if (status == KEY_ADDED) { - policy_engine_->UpdateLicense(license); + policy_engine_->UpdateLicense(license, is_restore); } return status; @@ -836,14 +837,14 @@ CdmResponseType CdmLicense::RestoreOfflineLicense( license_nonce_ = original_license_request.key_control_nonce(); } - CdmResponseType sts = HandleKeyResponse(license_response); + CdmResponseType sts = HandleKeyResponse(true, license_response); if (sts != KEY_ADDED) return sts; if (!license_renewal_response.empty()) { sts = PrepareKeyUpdateReload(cdm_session); - if (sts != KEY_MESSAGE) return sts; - sts = HandleKeyUpdateResponse(true, license_renewal_response); + if (sts != KEY_MESSAGE && sts != NO_ERROR) return sts; + sts = HandleKeyUpdateResponse(true, true, license_renewal_response); if (sts != KEY_ADDED) return sts; } @@ -968,7 +969,7 @@ CdmResponseType CdmLicense::RestoreLicenseForRelease( } if (!license.id().has_provider_session_token()) { - CdmResponseType result = HandleKeyResponse(license_response); + CdmResponseType result = HandleKeyResponse(false, license_response); return result == KEY_ADDED ? NO_ERROR : result; } @@ -1116,7 +1117,7 @@ CdmResponseType CdmLicense::PrepareContentId( } CdmResponseType CdmLicense::HandleContentKeyResponse( - const std::string& msg, const std::string& core_message, + bool is_restore, const std::string& msg, const std::string& core_message, const std::string& signature, const std::string& mac_key_iv, const std::string& mac_key, const std::vector& key_array, const video_widevine::License& license) { @@ -1140,13 +1141,13 @@ CdmResponseType CdmLicense::HandleContentKeyResponse( it != key_array.end(); ++it) { loaded_keys_.insert(it->key_id()); } - policy_engine_->SetLicense(license, supports_core_messages()); + policy_engine_->SetLicense(license, supports_core_messages(), is_restore); } return resp; } CdmResponseType CdmLicense::HandleEntitlementKeyResponse( - const std::string& msg, const std::string& core_message, + bool is_restore, const std::string& msg, const std::string& core_message, const std::string& signature, const std::string& mac_key_iv, const std::string& mac_key, const std::vector& key_array, const video_widevine::License& license) { @@ -1170,7 +1171,7 @@ CdmResponseType CdmLicense::HandleEntitlementKeyResponse( // Save the entitlement keys for future use to handle key changes. entitlement_keys_.CopyFrom(license.key()); - policy_engine_->SetLicense(license, supports_core_messages()); + policy_engine_->SetLicense(license, supports_core_messages(), is_restore); return HandleNewEntitledKeys(wrapped_keys_); } diff --git a/libwvdrmengine/cdm/core/src/policy_engine.cpp b/libwvdrmengine/cdm/core/src/policy_engine.cpp index db06d1af..b244c675 100644 --- a/libwvdrmengine/cdm/core/src/policy_engine.cpp +++ b/libwvdrmengine/cdm/core/src/policy_engine.cpp @@ -20,7 +20,8 @@ using video_widevine::License; namespace { const int kCdmPolicyTimerDurationSeconds = 1; -const int kClockSkewDelta = 5; // seconds +const int kClockSkewDelta = 5; // seconds +const int64_t kLicenseStateUpdateDelay = 20; // seconds } // namespace @@ -30,6 +31,7 @@ PolicyEngine::PolicyEngine(CdmSessionId session_id, WvCdmEventListener* event_listener, CryptoSession* crypto_session) : license_state_(kLicenseStateInitial), + license_state_update_deadline_(0), last_recorded_current_time_(0), session_id_(session_id), event_listener_(event_listener), @@ -90,6 +92,17 @@ void PolicyEngine::OnTimerEvent() { last_recorded_current_time_ += kCdmPolicyTimerDurationSeconds; const int64_t current_time = GetCurrentTime(); + // This conditional should not succeed but being cautious in case license + // state was not updated after the license was processed. Licenses and + // renewals from the license service should update state on + // |Set/UpdateLicense|. Offline licenses, when restored, should update license + // state when |RestorePlaybackTimes| is called. + if (license_state_update_deadline_ != 0 && + license_state_update_deadline_ < current_time) { + LOGW("License state was not updated after a license was loaded/renewed"); + UpdateLicenseState(current_time); + } + // If we have passed the grace period, the expiration will update. if (policy_timers_->HasPassedGracePeriod(current_time)) { NotifyExpirationUpdate(current_time); @@ -159,12 +172,13 @@ void PolicyEngine::OnTimerEvent() { } void PolicyEngine::SetLicense(const License& license, - bool supports_core_messages) { + bool supports_core_messages, + bool defer_license_state_update) { if (supports_core_messages) policy_timers_.reset(new PolicyTimersV16()); license_id_.CopyFrom(license.id()); license_keys_->SetFromLicense(license); policy_timers_->SetLicense(license); - UpdateLicense(license); + UpdateLicense(license, defer_license_state_update); } void PolicyEngine::SetEntitledLicenseKeys( @@ -180,10 +194,11 @@ void PolicyEngine::SetLicenseForRelease(const License& license, // Expire any old keys. NotifyKeysChange(kKeyStatusExpired); policy_timers_->SetLicense(license); - UpdateLicense(license); + UpdateLicense(license, false); } -void PolicyEngine::UpdateLicense(const License& license) { +void PolicyEngine::UpdateLicense(const License& license, + bool defer_license_state_update) { if (!license.has_policy()) return; if (kLicenseStateExpired == license_state_) { @@ -204,8 +219,15 @@ void PolicyEngine::UpdateLicense(const License& license) { const int64_t current_time = GetCurrentTime(); policy_timers_->UpdateLicense(current_time, license); + if (defer_license_state_update) + license_state_update_deadline_ = current_time + kLicenseStateUpdateDelay; + else + UpdateLicenseState(current_time); +} +void PolicyEngine::UpdateLicenseState(int64_t current_time) { // Update time information + license_state_update_deadline_ = 0; if (!policy_timers_->get_policy().can_play() || policy_timers_->HasLicenseOrRentalOrPlaybackDurationExpired( current_time)) { @@ -349,7 +371,7 @@ void PolicyEngine::RestorePlaybackTimes(int64_t playback_start_time, last_playback_time, grace_period_end_time); - NotifyExpirationUpdate(current_time); + UpdateLicenseState(current_time); } void PolicyEngine::UpdateRenewalRequest(int64_t current_time) { diff --git a/libwvdrmengine/cdm/core/test/policy_engine_constraints_unittest.cpp b/libwvdrmengine/cdm/core/test/policy_engine_constraints_unittest.cpp index eb65d4c3..dce74ef0 100644 --- a/libwvdrmengine/cdm/core/test/policy_engine_constraints_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/policy_engine_constraints_unittest.cpp @@ -238,7 +238,7 @@ TEST_F(PolicyEngineConstraintsTest, IsPermissiveWithoutAResolution) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId1)); @@ -270,7 +270,7 @@ TEST_F(PolicyEngineConstraintsTest, HandlesResolutionsBasedOnConstraints) { .WillRepeatedly( DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(NO_ERROR))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->NotifyResolution(1, kTargetRes1); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId1)); @@ -334,7 +334,7 @@ TEST_F(PolicyEngineConstraintsTest, } policy_engine_->NotifyResolution(1, kTargetRes1); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); policy_engine_->OnTimerEvent(); policy_engine_->OnTimerEvent(); @@ -367,7 +367,7 @@ TEST_F(PolicyEngineConstraintsTest, HandlesConstraintOverridingHdcp) { EXPECT_CALL(crypto_session_, GetHdcpCapabilities(_, _)) .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_V2), Return(NO_ERROR))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->NotifyResolution(1, kTargetRes1); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId1)); @@ -409,7 +409,7 @@ TEST_F(PolicyEngineConstraintsTest, HandlesNoHdcp) { EXPECT_CALL(crypto_session_, GetHdcpCapabilities(_, _)) .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NONE), Return(NO_ERROR))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->NotifyResolution(1, kTargetRes1); policy_engine_->OnTimerEvent(); @@ -453,7 +453,7 @@ TEST_F(PolicyEngineConstraintsTest, UsesDefaultHdcpWhenResolutionNotSet) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId1)); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId2)); diff --git a/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp b/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp index 2e1ef80c..b4063f73 100644 --- a/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp @@ -206,7 +206,7 @@ TEST_F(PolicyEngineTest, PlaybackSuccess_OfflineLicense_V15) { .WillRepeatedly( DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(NO_ERROR))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -234,7 +234,7 @@ TEST_F(PolicyEngineTest, PlaybackSuccess_EntitlementLicense_V15) { key->set_type(License::KeyContainer::ENTITLEMENT); key->set_id(kEntitlementKeyId); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -266,7 +266,7 @@ TEST_F(PolicyEngineTest, PlaybackSuccess_EntitlementLicenseExpiration_V15) { key->set_type(License::KeyContainer::ENTITLEMENT); key->set_id(kEntitlementKeyId); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -297,7 +297,7 @@ TEST_F(PolicyEngineTest, PlaybackSuccess_StreamingLicense_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -320,7 +320,7 @@ TEST_F(PolicyEngineTest, PlaybackFailed_CanPlayFalse_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); policy_engine_->OnTimerEvent(); @@ -354,7 +354,7 @@ TEST_F(PolicyEngineTest, ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); for (int i = 1; i <= 3; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -388,7 +388,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RentalDurationPassedWithPlayback_V15) { EXPECT_CALL(check_, Call(1)); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -423,7 +423,7 @@ TEST_F(PolicyEngineTest, PlaybackFails_PlaybackDurationExpired_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -459,7 +459,7 @@ TEST_F(PolicyEngineTest, ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); for (int i = 1; i <= 3; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -495,7 +495,7 @@ TEST_F(PolicyEngineTest, PlaybackFails_ExpiryBeforeRenewalDelay_Offline_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -532,7 +532,7 @@ TEST_F(PolicyEngineTest, PlaybackFails_ExpiryBeforeRenewalDelay_Streaming_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -567,7 +567,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RentalDuration0_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); for (int i = 1; i <= 3; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -606,7 +606,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_PlaybackDuration0_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 4; ++i) { @@ -642,7 +642,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_LicenseDuration0_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -673,7 +673,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_PlaybackAndRental0_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -698,7 +698,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_PlaybackAndLicense0_WithoutPlayback_V15) { EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -732,7 +732,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_PlaybackAndLicense0_WithPlayback_V15) { EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -759,7 +759,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RentalAndLicense0_WithoutPlayback_V15) { ExpectSessionKeysChange(kKeyStatusUsable, true); EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, 0)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -789,7 +789,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RentalAndLicense0_WithPlayback_V15) { EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kPlaybackStartTime + kPlaybackDuration)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -823,7 +823,7 @@ TEST_F(PolicyEngineTest, EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kPlaybackStartTime + kPlaybackDuration)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -859,7 +859,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_Durations0_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -889,7 +889,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_LicenseWithFutureStartTime_V15) { EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kPlaybackStartTime + kPlaybackDuration)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -930,7 +930,7 @@ TEST_F(PolicyEngineTest, PlaybackFailed_CanRenewFalse_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 3; ++i) { @@ -975,7 +975,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess_V15) { OnExpirationUpdate(_, new_license_start_time + kLowDuration)); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -990,7 +990,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess_V15) { policy->set_playback_duration_seconds(2 * kPlaybackDuration); LicenseIdentification* id = license_.mutable_id(); id->set_version(2); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); check_.Call(3); @@ -1034,7 +1034,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess_WithFutureStartTime_V15) { ExpectSessionKeysChange(kKeyStatusUsable, true); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -1047,7 +1047,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess_WithFutureStartTime_V15) { license_.set_license_start_time(new_license_start_time); LicenseIdentification* id = license_.mutable_id(); id->set_version(2); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); check_.Call(3); @@ -1088,7 +1088,7 @@ TEST_F(PolicyEngineTest, LicenseExpired_RenewFailedVersionNotUpdated_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); for (int i = 1; i <= 2; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -1100,7 +1100,7 @@ TEST_F(PolicyEngineTest, LicenseExpired_RenewFailedVersionNotUpdated_V15) { license_.set_license_start_time(kLicenseStartTime + license_renewal_delay + 30); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); check_.Call(3); @@ -1156,7 +1156,7 @@ TEST_F(PolicyEngineTest, PlaybackFailed_RepeatedRenewFailures_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(8)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 8; ++i) { @@ -1222,7 +1222,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccessAfterExpiry_V15) { OnExpirationUpdate(_, kPlaybackStartTime + new_playback_duration)); EXPECT_CALL(check_, Call(10)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 9; ++i) { @@ -1238,7 +1238,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccessAfterExpiry_V15) { policy->set_playback_duration_seconds(new_playback_duration); policy->set_license_duration_seconds(new_license_duration); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); check_.Call(10); @@ -1288,7 +1288,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccessAfterFailures_V15) { EXPECT_CALL(check_, Call(6)); EXPECT_CALL(check_, Call(7)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 5; ++i) { @@ -1300,7 +1300,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccessAfterFailures_V15) { license_.set_license_start_time(new_license_start_time); LicenseIdentification* id = license_.mutable_id(); id->set_version(2); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); for (int i = 6; i <= 7; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -1344,7 +1344,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewedWithUsage_V15) { OnExpirationUpdate(_, kPlaybackStartTime + new_playback_duration)); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); check_.Call(1); @@ -1361,7 +1361,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewedWithUsage_V15) { policy->set_renew_with_usage(false); LicenseIdentification* id = license_.mutable_id(); id->set_version(2); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); check_.Call(3); @@ -1395,7 +1395,7 @@ TEST_F(PolicyEngineTest, MultipleKeysInLicense) { ExpectSessionKeysChange(kKeyStatusUsable, kKeyStatusUsable, true); EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, _)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); EXPECT_TRUE(policy_engine_->CanDecryptContent(kAnotherKeyId)); EXPECT_FALSE(policy_engine_->CanDecryptContent(kSigningKeyId)); @@ -1430,7 +1430,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_SoftEnforcePlaybackDuration_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 4; ++i) { @@ -1457,12 +1457,10 @@ TEST_F(PolicyEngineTest, LicenseExpired_SoftEnforceLoadBeforeExpire_V15) { InSequence seq; ExpectSessionKeysChange(kKeyStatusUsable, true); - EXPECT_CALL(mock_event_listener_, - OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration)); EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kLicenseStartTime + kLicenseDuration)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, true); policy_engine_->RestorePlaybackTimes(kPlaybackStartTime, kPlaybackStartTime, kPlaybackStartTime); policy_engine_->OnTimerEvent(); @@ -1484,14 +1482,9 @@ TEST_F(PolicyEngineTest, LicenseExpired_SoftEnforceLoadAfterExpire_V15) { Return(GET_HDCP_CAPABILITY_FAILED))); InSequence seq; - ExpectSessionKeysChange(kKeyStatusUsable, true); - EXPECT_CALL(mock_event_listener_, - OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration)); - EXPECT_CALL(mock_event_listener_, - OnExpirationUpdate(_, kPlaybackStartTime + kPlaybackDuration)); ExpectSessionKeysChange(kKeyStatusExpired, false); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, true); policy_engine_->RestorePlaybackTimes(kPlaybackStartTime, kPlaybackStartTime, kPlaybackStartTime); policy_engine_->OnTimerEvent(); @@ -1528,7 +1521,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_GracePeriod_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 4; ++i) { @@ -1571,7 +1564,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_GracePeriodWithLoad_V15) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, true); policy_engine_->RestorePlaybackTimes(kPlaybackStartTime, kPlaybackStartTime, 0); policy_engine_->BeginDecryption(); @@ -1602,14 +1595,9 @@ TEST_F(PolicyEngineTest, PlaybackOk_GracePeriodWithExpiredLoad_V15) { Return(GET_HDCP_CAPABILITY_FAILED))); InSequence seq; - ExpectSessionKeysChange(kKeyStatusUsable, true); - EXPECT_CALL(mock_event_listener_, - OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration)); - EXPECT_CALL(mock_event_listener_, - OnExpirationUpdate(_, kPlaybackStartTime + kPlaybackDuration)); ExpectSessionKeysChange(kKeyStatusExpired, false); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, true); policy_engine_->RestorePlaybackTimes(kPlaybackStartTime, kPlaybackStartTime, kPlaybackStartTime); @@ -1639,7 +1627,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_CanStoreGracePeriod_V15) { EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kPlaybackStartTime + kPlaybackDuration)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -1649,6 +1637,28 @@ TEST_F(PolicyEngineTest, PlaybackOk_CanStoreGracePeriod_V15) { EXPECT_EQ(kPlaybackStartTime, policy_engine_->GetGracePeriodEndTime()); } +TEST_F(PolicyEngineTest, PlaybackOk_RestoreWithoutPlaybackTimes_V15) { + EXPECT_CALL(*mock_clock_, GetCurrentTime()) + .WillOnce(Return(kLicenseStartTime + 1)) + .WillOnce(Return(kLicenseStartTime + 15)) + .WillOnce(Return(kLicenseStartTime + 30)); + + EXPECT_CALL(crypto_session_, GetHdcpCapabilities(_, _)) + .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), + Return(GET_HDCP_CAPABILITY_FAILED))); + + InSequence seq; + ExpectSessionKeysChange(kKeyStatusUsable, true); + EXPECT_CALL(mock_event_listener_, + OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration)); + + policy_engine_->SetLicense(license_, false, true); + policy_engine_->OnTimerEvent(); + policy_engine_->OnTimerEvent(); + + EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); +} + struct KeySecurityLevelParams { bool is_security_level_set; License::KeyContainer::SecurityLevel security_level; @@ -1689,25 +1699,25 @@ TEST_P(PolicyEngineKeySecurityLevelTest, CanUseKeyForSecurityLevel) { EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, _)); SetCdmSecurityLevel(kSecurityLevelL1); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_EQ(param->expect_can_L1_use_key, policy_engine_->CanUseKeyForSecurityLevel(kKeyId)); SetCdmSecurityLevel(kSecurityLevelL2); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_EQ(param->expect_can_L2_use_key, policy_engine_->CanUseKeyForSecurityLevel(kKeyId)); SetCdmSecurityLevel(kSecurityLevelL3); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_EQ(param->expect_can_L3_use_key, policy_engine_->CanUseKeyForSecurityLevel(kKeyId)); SetCdmSecurityLevel(kSecurityLevelUnknown); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_EQ(param->expect_can_level_unknown_use_key, policy_engine_->CanUseKeyForSecurityLevel(kKeyId)); @@ -1848,7 +1858,7 @@ TEST_F(PolicyEngineKeyAllowedUsageTest, AllowedUsageBasic) { ExpectSessionKeysChange(kKeyStatusUsable, kKeyStatusUsable, true); EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, _)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); ExpectSecureContentKey(kKeyId, kHardwareSecureAll); ExpectLessSecureContentKey(kAnotherKeyId, kKeySecurityLevelUnset); @@ -1908,7 +1918,7 @@ TEST_F(PolicyEngineKeyAllowedUsageTest, AllowedUsageGeneric) { ExpectSessionKeysChange(kKeyStatusUsable, kKeyStatusUsable, true); EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, _)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); ExpectSecureContentKey(kKeyId, kHardwareSecureDecode); ExpectLessSecureContentKey(kAnotherKeyId, kHardwareSecureCrypto); @@ -1957,7 +1967,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_LicenseStartTimeNotSet_V15) { EXPECT_CALL(*mock_clock_, GetCurrentTime()) .WillOnce(Return(kLicenseStartTime + 1)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -1973,7 +1983,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -1999,7 +2009,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackNotBegun_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -2039,7 +2049,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackBegun_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -2092,7 +2102,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_Offline_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); @@ -2122,7 +2132,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_InitialRentalDurationExpired_V15) { .WillOnce(Return(kLicenseStartTime + kLowDuration + 1)) .WillOnce(Return(kLicenseStartTime + kLowDuration + 5)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2144,7 +2154,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_InitialLicenseDurationExpired_V15) { .WillOnce(Return(kLicenseStartTime + kLowDuration + 1)) .WillOnce(Return(kLicenseStartTime + kLowDuration + 5)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2179,7 +2189,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_CanPlayFalse_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); policy_engine_->OnTimerEvent(); @@ -2218,7 +2228,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_RentalDurationExpired_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2260,7 +2270,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackDurationExpired_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2298,7 +2308,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_LicenseDurationExpired_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2340,7 +2350,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_RentalDuration0_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2385,7 +2395,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackDuration0_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2439,7 +2449,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_LicenseDuration0_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2477,7 +2487,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackAndRental0_V15) { .WillOnce(Return(kLicenseStartTime + kLowDuration + 10)) .WillOnce(Return(kLicenseStartTime + kLowDuration + 10)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -2526,7 +2536,7 @@ TEST_F(PolicyEngineQueryTest, .WillOnce(Return(kLicenseStartTime + kRentalDuration + 10)) .WillOnce(Return(kLicenseStartTime + kRentalDuration + 10)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2584,7 +2594,7 @@ TEST_F(PolicyEngineQueryTest, .WillOnce(Return(kLicenseStartTime + kRentalDuration + 10)) .WillOnce(Return(kLicenseStartTime + kRentalDuration + 10)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -2653,7 +2663,7 @@ TEST_F(PolicyEngineQueryTest, .WillOnce(Return(kLicenseStartTime + kPlaybackDuration + 10)) .WillOnce(Return(kLicenseStartTime + kPlaybackDuration + 10)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2707,7 +2717,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_RentalAndLicense0_WithPlayback_V15) { .WillOnce(Return(kPlaybackStartTime + kPlaybackDuration + 10)) .WillOnce(Return(kPlaybackStartTime + kPlaybackDuration + 10)); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -2777,7 +2787,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_Durations0_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2814,7 +2824,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_LicenseWithFutureStartTime_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2869,7 +2879,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_Renew_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2884,7 +2894,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_Renew_V15) { 15); LicenseIdentification* id = license_.mutable_id(); id->set_version(2); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2926,7 +2936,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_RenewWithFutureStartTime_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -2941,7 +2951,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_RenewWithFutureStartTime_V15) { kLicenseRenewalRetryInterval + 20); LicenseIdentification* id = license_.mutable_id(); id->set_version(2); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3005,7 +3015,7 @@ TEST_F(PolicyEngineTest, SetLicenseForReleaseAfterSetLicense_V15) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, false); + policy_engine_->SetLicense(license_, false, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3038,7 +3048,7 @@ TEST_F(PolicyEngineTest, PlaybackSuccess_V16) { .WillRepeatedly( DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(NO_ERROR))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -3063,7 +3073,7 @@ TEST_F(PolicyEngineTest, PlaybackFailed_CanPlayFalse_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); policy_engine_->OnTimerEvent(); @@ -3098,7 +3108,7 @@ TEST_F(PolicyEngineTest, ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); for (int i = 1; i <= 3; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3136,7 +3146,7 @@ TEST_F( ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); for (int i = 1; i <= 3; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3171,7 +3181,7 @@ TEST_F(PolicyEngineTest, PlaybackFails_RentalDurationPassedWithPlayback_V16) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -3210,7 +3220,7 @@ TEST_F( EXPECT_CALL(check_, Call(1)); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -3248,7 +3258,7 @@ TEST_F(PolicyEngineTest, PlaybackFails_PlaybackDurationExpired_V16) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -3284,7 +3294,7 @@ TEST_F(PolicyEngineTest, EXPECT_CALL(check_, Call(1)); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -3324,7 +3334,7 @@ TEST_F(PolicyEngineTest, LicenseOk_LicenseDurationExpiredWithoutPlayback_V16) { EXPECT_CALL(check_, Call(2)); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); for (int i = 1; i <= 3; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3362,7 +3372,7 @@ TEST_F(PolicyEngineTest, LicenseOk_LicenseDurationExpiredWithPlayback_V16) { EXPECT_CALL(check_, Call(2)); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 3; ++i) { @@ -3401,7 +3411,7 @@ TEST_F(PolicyEngineTest, PlaybackFails_ExpiryBeforeRenewalDelay_V16) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(2)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -3436,7 +3446,7 @@ TEST_F(PolicyEngineTest, LicenseOk_RentalDuration0_V16) { EXPECT_CALL(check_, Call(2)); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); for (int i = 1; i <= 3; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3474,7 +3484,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RentalDuration0_V16) { OnExpirationUpdate(_, kLicenseStartTime + kLicenseDuration + 10 + kPlaybackDuration)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); for (int i = 1; i <= 3; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3515,7 +3525,7 @@ TEST_F(PolicyEngineTest, PlaybackFails_PlaybackDuration0_V16) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 4; ++i) { @@ -3556,7 +3566,7 @@ TEST_F(PolicyEngineTest, EXPECT_CALL(check_, Call(3)); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 4; ++i) { @@ -3596,7 +3606,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_PlaybackAndRental0_V16) { EXPECT_CALL(check_, Call(3)); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 4; ++i) { @@ -3631,7 +3641,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_LicenseWithFutureStartTime_V16) { EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kPlaybackStartTime + kPlaybackDuration)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3674,7 +3684,7 @@ TEST_F(PolicyEngineTest, PlaybackFailed_CanRenewFalse_V16) { ExpectSessionKeysChange(kKeyStatusExpired, false); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 3; ++i) { @@ -3721,7 +3731,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess_V16) { EXPECT_CALL(check_, Call(2)); EXPECT_CALL(check_, Call(3)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -3736,7 +3746,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess_V16) { policy->set_renewal_delay_seconds(new_license_start_time); LicenseIdentification* id = license_.mutable_id(); id->set_version(2); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); check_.Call(3); @@ -3785,7 +3795,7 @@ TEST_F(PolicyEngineTest, EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); for (int i = 1; i <= 2; ++i) { @@ -3798,7 +3808,7 @@ TEST_F(PolicyEngineTest, license_.set_license_start_time(new_license_start_time); LicenseIdentification* id = license_.mutable_id(); id->set_version(2); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); check_.Call(3); @@ -3840,7 +3850,7 @@ TEST_F(PolicyEngineTest, LicenseExpired_RenewFailedVersionNotUpdated_V16) { EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)); EXPECT_CALL(check_, Call(4)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); for (int i = 1; i <= 2; ++i) { EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3852,7 +3862,7 @@ TEST_F(PolicyEngineTest, LicenseExpired_RenewFailedVersionNotUpdated_V16) { license_.set_license_start_time(kLicenseStartTime + license_renewal_delay + 30); - policy_engine_->UpdateLicense(license_); + policy_engine_->UpdateLicense(license_, false); policy_engine_->OnTimerEvent(); check_.Call(3); @@ -3885,7 +3895,7 @@ TEST_F(PolicyEngineTest, PlaybackSuccess_EntitlementLicense_V16) { key->set_type(License::KeyContainer::ENTITLEMENT); key->set_id(kEntitlementKeyId); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -3914,7 +3924,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_LicenseStartTimeNotSet_V16) { EXPECT_CALL(*mock_clock_, GetCurrentTime()) .WillOnce(Return(kLicenseStartTime + 1)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -3934,7 +3944,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -3964,7 +3974,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackNotBegun_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -4008,7 +4018,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackBegun_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -4051,7 +4061,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_InitialRentalDurationExpired_V16) { .WillOnce(Return(kLicenseStartTime + kLowDuration + 1)) .WillOnce(Return(kLicenseStartTime + kLowDuration + 5)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4088,7 +4098,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_CanPlayFalse_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); policy_engine_->OnTimerEvent(); @@ -4129,7 +4139,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_RentalDurationExpired_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4173,7 +4183,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackDurationExpired_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4216,7 +4226,7 @@ TEST_F(PolicyEngineQueryTest, .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4262,7 +4272,7 @@ TEST_F(PolicyEngineQueryTest, .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4307,7 +4317,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_RentalDuration0_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4355,7 +4365,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackDuration0_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4411,7 +4421,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackAndRental0_V16) { .WillOnce(Return(kLicenseStartTime + kLowDuration + 10)) .WillOnce(Return(kLicenseStartTime + kLowDuration + 10)); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); @@ -4463,7 +4473,7 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_LicenseWithFutureStartTime_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4536,7 +4546,7 @@ TEST_F(PolicyEngineTest, SetLicenseForReleaseAfterSetLicense_V16) { .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), Return(GET_HDCP_CAPABILITY_FAILED))); - policy_engine_->SetLicense(license_, true); + policy_engine_->SetLicense(license_, true, false); policy_engine_->BeginDecryption(); policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); @@ -4550,4 +4560,30 @@ TEST_F(PolicyEngineTest, SetLicenseForReleaseAfterSetLicense_V16) { EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId)); } +TEST_F(PolicyEngineTest, PlaybackOk_RestoreWithoutPlaybackTimes_V16) { + License_Policy* policy = license_.mutable_policy(); + policy->set_soft_enforce_rental_duration(false); + policy->set_soft_enforce_playback_duration(false); + + EXPECT_CALL(*mock_clock_, GetCurrentTime()) + .WillOnce(Return(kLicenseStartTime + 1)) + .WillOnce(Return(kLicenseStartTime + 15)) + .WillOnce(Return(kLicenseStartTime + 30)); + + EXPECT_CALL(crypto_session_, GetHdcpCapabilities(_, _)) + .WillRepeatedly(DoAll(SetArgPointee<0>(HDCP_NO_DIGITAL_OUTPUT), + Return(GET_HDCP_CAPABILITY_FAILED))); + + InSequence seq; + ExpectSessionKeysChange(kKeyStatusUsable, true); + EXPECT_CALL(mock_event_listener_, + OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration)); + + policy_engine_->SetLicense(license_, false, true); + policy_engine_->OnTimerEvent(); + policy_engine_->OnTimerEvent(); + + EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId)); +} + } // namespace wvcdm