From 85e838b9572b6f3515556171c683afb3e4e797ed Mon Sep 17 00:00:00 2001 From: KongQun Yang Date: Mon, 23 Mar 2015 16:49:59 -0700 Subject: [PATCH] Replace generic OnEvent with actual event callbacks Also pass session_id and event_listener to PolicyEngine to make it easier to dispatch events from PolicyEngine. Bug: 19771437 Merged from Widevine CDM repo: https://widevine-internal-review.googlesource.com/#/c/13816/ Change-Id: I5723cb371cb3c43c945051af3402b09069ba5859 --- .../cdm/core/include/policy_engine.h | 16 +- .../cdm/core/include/wv_cdm_event_listener.h | 4 +- .../cdm/core/include/wv_cdm_types.h | 5 - libwvdrmengine/cdm/core/src/cdm_session.cpp | 15 +- libwvdrmengine/cdm/core/src/policy_engine.cpp | 16 +- .../cdm/core/test/cdm_session_unittest.cpp | 2 +- .../cdm/core/test/license_unittest.cpp | 3 +- .../cdm/core/test/policy_engine_unittest.cpp | 690 ++++++++---------- .../cdm/core/test/test_printers.cpp | 12 - libwvdrmengine/cdm/core/test/test_printers.h | 1 - .../cdm/test/cdm_extended_duration_test.cpp | 15 - .../cdm/test/request_license_test.cpp | 22 +- libwvdrmengine/mediadrm/include/WVDrmPlugin.h | 6 +- libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp | 23 +- .../mediadrm/test/WVDrmPlugin_test.cpp | 4 +- 15 files changed, 371 insertions(+), 463 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/policy_engine.h b/libwvdrmengine/cdm/core/include/policy_engine.h index 6ee93e91..df0c8cc7 100644 --- a/libwvdrmengine/cdm/core/include/policy_engine.h +++ b/libwvdrmengine/cdm/core/include/policy_engine.h @@ -16,12 +16,14 @@ using video_widevine_server::sdk::LicenseIdentification; class Clock; class CryptoSession; +class WvCdmEventListener; // This acts as an oracle that basically says "Yes(true) you may still decrypt // or no(false) you may not decrypt this data anymore." class PolicyEngine { public: - explicit PolicyEngine(CryptoSession* crypto_session); + PolicyEngine(CdmSessionId session_id, WvCdmEventListener* event_listener, + CryptoSession* crypto_session); virtual ~PolicyEngine(); // The value returned should be taken as a hint rather than an absolute @@ -32,11 +34,9 @@ class PolicyEngine { virtual bool CanDecrypt(const KeyId& key_id); // OnTimerEvent is called when a timer fires. It notifies the Policy Engine - // that the timer has fired and that it should check whether any events have - // occurred since the last timer event. If so, it sets event_occurred to true - // and sets event to point to the event that occurred. If not, it sets - // event_occurred to false. - virtual void OnTimerEvent(bool* event_occurred, CdmEventType* event); + // that the timer has fired and dispatches the relevant events through + // |event_listener_|. + virtual void OnTimerEvent(); // SetLicense is used in handling the initial license response. It stores // an exact copy of the policy information stored in the license. @@ -126,6 +126,10 @@ class PolicyEngine { int64_t next_renewal_time_; int64_t policy_max_duration_seconds_; + // Used to dispatch CDM events. + CdmSessionId session_id_; + WvCdmEventListener* event_listener_; + MaxResEngine max_res_engine_; scoped_ptr clock_; diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_event_listener.h b/libwvdrmengine/cdm/core/include/wv_cdm_event_listener.h index d01231fd..be4c26b6 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_event_listener.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_event_listener.h @@ -13,8 +13,8 @@ class WvCdmEventListener { WvCdmEventListener() {} virtual ~WvCdmEventListener() {} - virtual void OnEvent(const CdmSessionId& session_id, - CdmEventType cdm_event) = 0; + virtual void OnSessionRenewalNeeded(const CdmSessionId& session_id) = 0; + virtual void OnSessionExpiration(const CdmSessionId& session_id) = 0; private: CORE_DISALLOW_COPY_AND_ASSIGN(WvCdmEventListener); diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index c254e025..09569e55 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -53,11 +53,6 @@ enum CdmResponseType { TypeName(const TypeName&); \ void operator=(const TypeName&) -enum CdmEventType { - LICENSE_EXPIRED_EVENT, - LICENSE_RENEWAL_NEEDED_EVENT -}; - enum CdmLicenseType { kLicenseTypeOffline, kLicenseTypeStreaming, diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index 835b378b..e5f625db 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -30,7 +30,8 @@ CdmSession::CdmSession(const CdmClientPropertySet* cdm_client_property_set, event_listener_(event_listener), license_parser_(new CdmLicense), crypto_session_(new CryptoSession), - policy_engine_(new PolicyEngine(crypto_session_.get())), + policy_engine_(new PolicyEngine(session_id_, event_listener_, + crypto_session_.get())), file_handle_(new DeviceFiles), license_received_(false), is_offline_(false), @@ -519,9 +520,6 @@ void CdmSession::NotifyResolution(uint32_t width, uint32_t height) { } void CdmSession::OnTimerEvent(bool update_usage) { - bool event_occurred = false; - CdmEventType event; - if (update_usage && has_decrypted_since_last_report_) { policy_engine_->DecryptionEvent(); has_decrypted_since_last_report_ = false; @@ -529,17 +527,12 @@ void CdmSession::OnTimerEvent(bool update_usage) { StoreLicense(DeviceFiles::kLicenseStateActive); } } - policy_engine_->OnTimerEvent(&event_occurred, &event); - - if (event_occurred) { - if (event_listener_) event_listener_->OnEvent(session_id_, event); - } + policy_engine_->OnTimerEvent(); } void CdmSession::OnKeyReleaseEvent(const CdmKeySetId& key_set_id) { if (key_set_id_ == key_set_id) { - if (event_listener_) - event_listener_->OnEvent(session_id_, LICENSE_EXPIRED_EVENT); + if (event_listener_) event_listener_->OnSessionExpiration(session_id_); } } diff --git a/libwvdrmengine/cdm/core/src/policy_engine.cpp b/libwvdrmengine/cdm/core/src/policy_engine.cpp index 0916d559..6489e433 100644 --- a/libwvdrmengine/cdm/core/src/policy_engine.cpp +++ b/libwvdrmengine/cdm/core/src/policy_engine.cpp @@ -13,10 +13,13 @@ #include "properties.h" #include "string_conversions.h" #include "wv_cdm_constants.h" +#include "wv_cdm_event_listener.h" namespace wvcdm { -PolicyEngine::PolicyEngine(CryptoSession* crypto_session) +PolicyEngine::PolicyEngine(CdmSessionId session_id, + WvCdmEventListener* event_listener, + CryptoSession* crypto_session) : license_state_(kLicenseStateInitial), can_decrypt_(false), license_start_time_(0), @@ -24,6 +27,8 @@ PolicyEngine::PolicyEngine(CryptoSession* crypto_session) last_playback_time_(0), next_renewal_time_(0), policy_max_duration_seconds_(0), + session_id_(session_id), + event_listener_(event_listener), max_res_engine_(crypto_session), clock_(new Clock) {} @@ -33,8 +38,7 @@ bool PolicyEngine::CanDecrypt(const KeyId& key_id) { return can_decrypt_ && max_res_engine_.CanDecrypt(key_id); } -void PolicyEngine::OnTimerEvent(bool* event_occurred, CdmEventType* event) { - *event_occurred = false; +void PolicyEngine::OnTimerEvent() { int64_t current_time = clock_->GetCurrentTime(); // License expiration trumps all. @@ -43,8 +47,7 @@ void PolicyEngine::OnTimerEvent(bool* event_occurred, CdmEventType* event) { license_state_ != kLicenseStateExpired) { license_state_ = kLicenseStateExpired; can_decrypt_ = false; - *event = LICENSE_EXPIRED_EVENT; - *event_occurred = true; + if (event_listener_) event_listener_->OnSessionExpiration(session_id_); return; } @@ -89,8 +92,7 @@ void PolicyEngine::OnTimerEvent(bool* event_occurred, CdmEventType* event) { if (renewal_needed) { UpdateRenewalRequest(current_time); - *event = LICENSE_RENEWAL_NEEDED_EVENT; - *event_occurred = true; + if (event_listener_) event_listener_->OnSessionRenewalNeeded(session_id_); } max_res_engine_.OnTimerEvent(); diff --git a/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp b/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp index e74e6363..9fc6449c 100644 --- a/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp @@ -114,7 +114,7 @@ class MockCryptoSession : public CryptoSession { class MockPolicyEngine : public PolicyEngine { public: - MockPolicyEngine() : PolicyEngine(NULL) {} + MockPolicyEngine() : PolicyEngine("mock_session_id", NULL, NULL) {} // Leaving a place-holder for when PolicyEngine methods need to be mocked }; diff --git a/libwvdrmengine/cdm/core/test/license_unittest.cpp b/libwvdrmengine/cdm/core/test/license_unittest.cpp index 43c5cbbf..cf044ab4 100644 --- a/libwvdrmengine/cdm/core/test/license_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/license_unittest.cpp @@ -106,7 +106,8 @@ class MockCryptoSession : public CryptoSession { class MockPolicyEngine : public PolicyEngine { public: - MockPolicyEngine(CryptoSession* crypto) : PolicyEngine(crypto) {} + MockPolicyEngine(CryptoSession* crypto) + : PolicyEngine("mock_session_id", NULL, crypto) {} }; class MockClock : public Clock { diff --git a/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp b/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp index 799527ee..f73fa5da 100644 --- a/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp @@ -13,6 +13,7 @@ #include "policy_engine.h" #include "scoped_ptr.h" #include "test_printers.h" +#include "wv_cdm_event_listener.h" #include "wv_cdm_constants.h" namespace { @@ -36,6 +37,7 @@ const int64_t kHighDuration = const char* kRenewalServerUrl = "https://test.google.com/license/GetCencLicense"; const wvcdm::KeyId kKeyId = "357adc89f1673433c36c621f1b5c41ee"; +const wvcdm::CdmSessionId kSessionId = "mock_session_id"; int64_t GetLicenseRenewalDelay(int64_t license_duration) { return license_duration > kLicenseRenewalPeriod @@ -54,13 +56,24 @@ using video_widevine_server::sdk::STREAMING; using video_widevine_server::sdk::OFFLINE; // gmock methods -using ::testing::Return; +using ::testing::_; using ::testing::AtLeast; +using ::testing::InSequence; +using ::testing::MockFunction; +using ::testing::Return; +using ::testing::StrictMock; + +class MockCdmEventListener : public WvCdmEventListener { + public: + MOCK_METHOD1(OnSessionRenewalNeeded, void(const CdmSessionId& session_id)); + MOCK_METHOD1(OnSessionExpiration, void(const CdmSessionId& session_id)); +}; class PolicyEngineTest : public ::testing::Test { protected: virtual void SetUp() { - policy_engine_.reset(new PolicyEngine(NULL)); + policy_engine_.reset( + new PolicyEngine(kSessionId, &mock_event_listener_, NULL)); // Inject testing clock. mock_clock_ = new MockClock(); policy_engine_->set_clock(mock_clock_); @@ -101,9 +114,11 @@ class PolicyEngineTest : public ::testing::Test { license_duration); } + StrictMock mock_event_listener_; MockClock* mock_clock_; scoped_ptr policy_engine_; License license_; + MockFunction check_; }; TEST_F(PolicyEngineTest, NoLicense) { @@ -118,10 +133,7 @@ TEST_F(PolicyEngineTest, PlaybackSuccess) { policy_engine_->SetLicense(license_); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); @@ -138,10 +150,7 @@ TEST_F(PolicyEngineTest, PlaybackFailed_CanPlayFalse) { policy_engine_->SetLicense(license_); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); policy_engine_->BeginDecryption(); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); @@ -160,19 +169,20 @@ TEST_F(PolicyEngineTest, PlaybackFails_RentalDurationExpired) { .WillOnce(Return(kLicenseStartTime + min_duration - 1)) .WillOnce(Return(kLicenseStartTime + min_duration)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(kSessionId)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -189,19 +199,20 @@ TEST_F(PolicyEngineTest, PlaybackFails_PlaybackDurationExpired) { .WillOnce(Return(playback_start_time + kPlaybackDuration - 2)) .WillOnce(Return(playback_start_time + kPlaybackDuration + 2)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -217,19 +228,20 @@ TEST_F(PolicyEngineTest, PlaybackFails_LicenseDurationExpired) { .WillOnce(Return(kLicenseStartTime + min_duration - 1)) .WillOnce(Return(kLicenseStartTime + min_duration)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -245,19 +257,20 @@ TEST_F(PolicyEngineTest, PlaybackFails_ExpiryBeforeRenewalDelay) { .WillOnce(Return(kLicenseStartTime + min_duration - 1)) .WillOnce(Return(kLicenseStartTime + min_duration)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -276,27 +289,24 @@ TEST_F(PolicyEngineTest, PlaybackOk_RentalDuration0) { .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration - 1)) .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(4)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 4; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -316,27 +326,24 @@ TEST_F(PolicyEngineTest, PlaybackOk_PlaybackDuration0) { .WillOnce(Return(kLicenseStartTime + kHighDuration - 2)) .WillOnce(Return(kLicenseStartTime + kHighDuration + 2)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(4)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 4; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -354,19 +361,20 @@ TEST_F(PolicyEngineTest, PlaybackOk_LicenseDuration0) { .WillOnce(Return(kLicenseStartTime + min_duration - 1)) .WillOnce(Return(kLicenseStartTime + min_duration)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -389,13 +397,8 @@ TEST_F(PolicyEngineTest, PlaybackOk_Durations0) { policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); } @@ -409,14 +412,10 @@ TEST_F(PolicyEngineTest, PlaybackOk_LicenseWithFutureStartTime) { policy_engine_->SetLicense(license_); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); policy_engine_->BeginDecryption(); @@ -436,22 +435,21 @@ TEST_F(PolicyEngineTest, PlaybackFailed_CanRenewFalse) { .WillOnce(Return(kLicenseStartTime + license_renewal_delay + 10)) .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration + 10)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(3)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 3; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -469,19 +467,21 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess) { .WillOnce(Return(kLicenseStartTime + license_renewal_delay + kLicenseRenewalRetryInterval + 10)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(check_, Call(3)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); @@ -491,8 +491,8 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess) { id->set_version(2); policy_engine_->UpdateLicense(license_); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + check_.Call(3); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); } @@ -510,19 +510,22 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess_WithFutureStartTime) { .WillOnce(Return(kLicenseStartTime + license_renewal_delay + 30)) .WillOnce(Return(kLicenseStartTime + license_renewal_delay + 60)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(check_, Call(4)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); license_.set_license_start_time(kLicenseStartTime + license_renewal_delay + @@ -531,12 +534,12 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccess_WithFutureStartTime) { id->set_version(2); policy_engine_->UpdateLicense(license_); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + check_.Call(3); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + check_.Call(4); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); } @@ -552,19 +555,24 @@ TEST_F(PolicyEngineTest, PlaybackFailed_RenewFailedVersionNotUpdated) { .WillOnce(Return(kLicenseStartTime + license_renewal_delay + 40)) .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration + 10)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(4)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); @@ -572,15 +580,13 @@ TEST_F(PolicyEngineTest, PlaybackFailed_RenewFailedVersionNotUpdated) { 15); policy_engine_->UpdateLicense(license_); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); + policy_engine_->OnTimerEvent(); + check_.Call(3); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + policy_engine_->OnTimerEvent(); + check_.Call(4); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -601,47 +607,29 @@ TEST_F(PolicyEngineTest, PlaybackFailed_RepeatedRenewFailures) { .WillOnce(Return(kLicenseStartTime + license_renewal_delay + 80)) .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration + 15)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(4)); + EXPECT_CALL(check_, Call(5)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(6)); + EXPECT_CALL(check_, Call(7)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(8)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 8; ++i) { + EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); } @@ -663,47 +651,30 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccessAfterExpiry) { .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration + 30)) .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration + 40)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(4)); + EXPECT_CALL(check_, Call(5)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(6)); + EXPECT_CALL(check_, Call(7)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(8)); + EXPECT_CALL(check_, Call(9)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 8; ++i) { + EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); license_.set_license_start_time(kLicenseStartTime + @@ -717,8 +688,8 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccessAfterExpiry) { policy_engine_->UpdateLicense(license_); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + check_.Call(9); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); } @@ -739,33 +710,26 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccessAfterFailures) { .WillOnce(Return(kLicenseStartTime + license_renewal_delay + 67)) .WillOnce(Return(kLicenseStartTime + license_renewal_delay + 200)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(4)); + EXPECT_CALL(check_, Call(5)); + EXPECT_CALL(check_, Call(6)); + EXPECT_CALL(check_, Call(7)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + for (int i = 1; i <= 5; ++i) { + EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); + policy_engine_->OnTimerEvent(); + check_.Call(i); + } license_.set_license_start_time(kLicenseStartTime + license_renewal_delay + 55); @@ -773,15 +737,11 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewSuccessAfterFailures) { id->set_version(2); policy_engine_->UpdateLicense(license_); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); + for (int i = 6; i <= 7; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); + } } TEST_F(PolicyEngineTest, PlaybackOk_RenewedWithUsage) { @@ -796,20 +756,22 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewedWithUsage) { .WillOnce(Return(kLicenseStartTime + 40)) .WillOnce(Return(kLicenseStartTime + 50)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(check_, Call(3)); + policy_engine_->SetLicense(license_); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); + policy_engine_->OnTimerEvent(); + check_.Call(1); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); + policy_engine_->OnTimerEvent(); + check_.Call(2); license_.set_license_start_time(kLicenseStartTime + 30); policy->set_renew_with_usage(false); @@ -817,8 +779,8 @@ TEST_F(PolicyEngineTest, PlaybackOk_RenewedWithUsage) { id->set_version(2); policy_engine_->UpdateLicense(license_); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + check_.Call(3); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); } @@ -945,10 +907,7 @@ TEST_F(PolicyEngineTest, QuerySuccess_PlaybackBegun) { policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]); @@ -986,10 +945,7 @@ TEST_F(PolicyEngineTest, QuerySuccess_Offline) { policy_engine_->SetLicense(license_); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); @@ -1092,10 +1048,7 @@ TEST_F(PolicyEngineTest, QuerySuccess_CanPlayFalse) { policy_engine_->SetLicense(license_); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); policy_engine_->BeginDecryption(); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); @@ -1133,19 +1086,20 @@ TEST_F(PolicyEngineTest, QuerySuccess_RentalDurationExpired) { .WillOnce(Return(kLicenseStartTime + min_duration)) .WillOnce(Return(kLicenseStartTime + min_duration + 5)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); @@ -1183,19 +1137,20 @@ TEST_F(PolicyEngineTest, QuerySuccess_PlaybackDurationExpired) { .WillOnce(Return(playback_start_time + 2 + min_duration)) .WillOnce(Return(playback_start_time + 5 + min_duration)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); @@ -1230,19 +1185,20 @@ TEST_F(PolicyEngineTest, QuerySuccess_LicenseDurationExpired) { .WillOnce(Return(kLicenseStartTime + min_duration)) .WillOnce(Return(kLicenseStartTime + min_duration + 5)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); @@ -1280,27 +1236,24 @@ TEST_F(PolicyEngineTest, QuerySuccess_RentalDuration0) { .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration)) .WillOnce(Return(kLicenseStartTime + kStreamingLicenseDuration + 5)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(4)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 4; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); @@ -1340,19 +1293,24 @@ TEST_F(PolicyEngineTest, QuerySuccess_PlaybackDuration0) { .WillOnce(Return(kLicenseStartTime + kHighDuration + 2)) .WillOnce(Return(kLicenseStartTime + kHighDuration + 5)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(4)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } CdmQueryMap query_info; EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); @@ -1372,13 +1330,10 @@ TEST_F(PolicyEngineTest, QuerySuccess_PlaybackDuration0) { EXPECT_EQ(LLONG_MAX, remaining_time); EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 3; i <= 4; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); @@ -1413,19 +1368,20 @@ TEST_F(PolicyEngineTest, QuerySuccess_LicenseDuration0) { .WillOnce(Return(kLicenseStartTime + min_duration)) .WillOnce(Return(kLicenseStartTime + min_duration + 5)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionExpiration(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_EXPIRED_EVENT, event); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); @@ -1467,13 +1423,8 @@ TEST_F(PolicyEngineTest, QuerySuccess_Durations0) { policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); - - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); @@ -1507,10 +1458,7 @@ TEST_F(PolicyEngineTest, QuerySuccess_LicenseWithFutureStartTime) { policy_engine_->SetLicense(license_); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); CdmQueryMap query_info; @@ -1533,8 +1481,7 @@ TEST_F(PolicyEngineTest, QuerySuccess_LicenseWithFutureStartTime) { EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); policy_engine_->BeginDecryption(); @@ -1570,19 +1517,22 @@ TEST_F(PolicyEngineTest, QuerySuccess_Renew) { .WillOnce(Return(kLicenseStartTime + license_renewal_delay + kLicenseRenewalRetryInterval + 15)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(check_, Call(3)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); license_.set_license_start_time(kLicenseStartTime + license_renewal_delay + @@ -1591,8 +1541,8 @@ TEST_F(PolicyEngineTest, QuerySuccess_Renew) { id->set_version(2); policy_engine_->UpdateLicense(license_); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + check_.Call(3); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); CdmQueryMap query_info; @@ -1636,19 +1586,23 @@ TEST_F(PolicyEngineTest, QuerySuccess_RenewWithFutureStartTime) { .WillOnce(Return(kLicenseStartTime + license_renewal_delay + kLicenseRenewalRetryInterval + 40)); + InSequence s; + EXPECT_CALL(check_, Call(1)); + EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)).Times(1); + EXPECT_CALL(check_, Call(2)); + EXPECT_CALL(check_, Call(3)); + EXPECT_CALL(check_, Call(4)); + policy_engine_->SetLicense(license_); policy_engine_->BeginDecryption(); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); - bool event_occurred; - CdmEventType event; - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + for (int i = 1; i <= 2; ++i) { + policy_engine_->OnTimerEvent(); + check_.Call(i); + } - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_TRUE(event_occurred); - EXPECT_EQ(LICENSE_RENEWAL_NEEDED_EVENT, event); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); license_.set_license_start_time(kLicenseStartTime + license_renewal_delay + @@ -1657,8 +1611,8 @@ TEST_F(PolicyEngineTest, QuerySuccess_RenewWithFutureStartTime) { id->set_version(2); policy_engine_->UpdateLicense(license_); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + check_.Call(3); EXPECT_FALSE(policy_engine_->CanDecrypt(kKeyId)); CdmQueryMap query_info; @@ -1681,8 +1635,8 @@ TEST_F(PolicyEngineTest, QuerySuccess_RenewWithFutureStartTime) { remaining_time); EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]); - policy_engine_->OnTimerEvent(&event_occurred, &event); - EXPECT_FALSE(event_occurred); + policy_engine_->OnTimerEvent(); + check_.Call(4); EXPECT_TRUE(policy_engine_->CanDecrypt(kKeyId)); EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info)); diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index b912832d..b65deb11 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -34,18 +34,6 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { } } -void PrintTo(const enum CdmEventType& value, ::std::ostream* os) { - switch (value) { - case LICENSE_EXPIRED_EVENT: *os << "LICENSE_EXPIRED_EVENT"; - break; - case LICENSE_RENEWAL_NEEDED_EVENT: *os << "LICENSE_RENEWAL_NEEDED_EVENT"; - break; - default: - *os << "Unknown CdmEventType"; - break; - } -}; - void PrintTo(const enum CdmLicenseType& value, ::std::ostream* os) { switch (value) { case kLicenseTypeOffline: *os << "kLicenseTypeOffline"; diff --git a/libwvdrmengine/cdm/core/test/test_printers.h b/libwvdrmengine/cdm/core/test/test_printers.h index f639b4ca..e3e5655c 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.h +++ b/libwvdrmengine/cdm/core/test/test_printers.h @@ -10,7 +10,6 @@ namespace wvcdm { void PrintTo(const enum CdmResponseType& value, ::std::ostream* os); -void PrintTo(const enum CdmEventType& value, ::std::ostream* os); void PrintTo(const enum CdmLicenseType& value, ::std::ostream* os); void PrintTo(const enum CdmSecurityLevel& value, ::std::ostream* os); void PrintTo(const enum CdmCertificateType& value, ::std::ostream* os); diff --git a/libwvdrmengine/cdm/test/cdm_extended_duration_test.cpp b/libwvdrmengine/cdm/test/cdm_extended_duration_test.cpp index d91cea08..4950cc79 100644 --- a/libwvdrmengine/cdm/test/cdm_extended_duration_test.cpp +++ b/libwvdrmengine/cdm/test/cdm_extended_duration_test.cpp @@ -243,21 +243,6 @@ class TestWvCdmClientPropertySet : public CdmClientPropertySet { uint32_t session_sharing_id_; }; -class TestWvCdmEventListener : public WvCdmEventListener { - public: - TestWvCdmEventListener() : WvCdmEventListener() {} - virtual void OnEvent(const CdmSessionId& id, CdmEventType event) { - session_id_ = id; - event_type_ = event; - } - CdmSessionId session_id() { return session_id_; } - CdmEventType event_type() { return event_type_; } - - private: - CdmSessionId session_id_; - CdmEventType event_type_; -}; - class WvCdmExtendedDurationTest : public WvCdmTestBase { public: WvCdmExtendedDurationTest() {} diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index 583050fd..17024e42 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include "config_test_env.h" @@ -440,16 +441,9 @@ class TestWvCdmClientPropertySet : public CdmClientPropertySet { class TestWvCdmEventListener : public WvCdmEventListener { public: TestWvCdmEventListener() : WvCdmEventListener() {} - virtual void OnEvent(const CdmSessionId& id, CdmEventType event) { - session_id_ = id; - event_type_ = event; - } - CdmSessionId session_id() { return session_id_; } - CdmEventType event_type() { return event_type_; } - private: - CdmSessionId session_id_; - CdmEventType event_type_; + MOCK_METHOD1(OnSessionRenewalNeeded, void(const CdmSessionId& session_id)); + MOCK_METHOD1(OnSessionExpiration, void(const CdmSessionId& session_id)); }; class WvCdmRequestLicenseTest : public WvCdmTestBase { @@ -1160,7 +1154,7 @@ TEST_F(WvCdmRequestLicenseTest, ExpiryOnReleaseOfflineKeyTest) { session_id_.clear(); key_set_id_.clear(); - TestWvCdmEventListener listener; + ::testing::StrictMock listener; decryptor_.OpenSession(g_key_system, NULL, &listener, &session_id_); CdmSessionId restore_session_id = session_id_; EXPECT_EQ(wvcdm::KEY_ADDED, @@ -1168,12 +1162,12 @@ TEST_F(WvCdmRequestLicenseTest, ExpiryOnReleaseOfflineKeyTest) { session_id_.clear(); key_set_id_.clear(); - EXPECT_TRUE(listener.session_id().size() == 0); + // Maybe called since VerifyKeyRequestResponse could take some time. + EXPECT_CALL(listener, OnSessionRenewalNeeded(restore_session_id)) + .Times(::testing::AtLeast(0)); + EXPECT_CALL(listener, OnSessionExpiration(restore_session_id)).Times(1); GenerateKeyRelease(key_set_id); key_set_id_ = key_set_id; - EXPECT_TRUE(listener.session_id().size() != 0); - EXPECT_TRUE(listener.session_id().compare(restore_session_id) == 0); - EXPECT_TRUE(listener.event_type() == LICENSE_EXPIRED_EVENT); VerifyKeyRequestResponse(g_license_server, client_auth, false); decryptor_.CloseSession(restore_session_id); } diff --git a/libwvdrmengine/mediadrm/include/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include/WVDrmPlugin.h index d744986c..1b05a2d0 100644 --- a/libwvdrmengine/mediadrm/include/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include/WVDrmPlugin.h @@ -32,7 +32,6 @@ using android::status_t; using android::String8; using android::Vector; using std::map; -using wvcdm::CdmEventType; using wvcdm::CdmSessionId; using wvcdm::CdmResponseType; using wvcdm::WvContentDecryptionModule; @@ -140,8 +139,9 @@ class WVDrmPlugin : public android::DrmPlugin, const Vector& wrappedKey, Vector& signature); - virtual void OnEvent(const CdmSessionId& cdmSessionId, - CdmEventType cdmEventType); + virtual void OnSessionRenewalNeeded(const CdmSessionId& cdmSessionId); + + virtual void OnSessionExpiration(const CdmSessionId& cdmSessionId); private: DISALLOW_EVIL_CONSTRUCTORS(WVDrmPlugin); diff --git a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp index e33dffe4..07da79d6 100644 --- a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp @@ -940,25 +940,18 @@ status_t WVDrmPlugin::signRSA(const Vector& /* sessionId */, return android::OK; } -void WVDrmPlugin::OnEvent(const CdmSessionId& cdmSessionId, - CdmEventType cdmEventType) { +void WVDrmPlugin::OnSessionRenewalNeeded(const CdmSessionId& cdmSessionId) { Vector sessionId; - EventType eventType = kDrmPluginEventVendorDefined; - - switch (cdmEventType) { - case LICENSE_EXPIRED_EVENT: - eventType = kDrmPluginEventKeyExpired; - break; - case LICENSE_RENEWAL_NEEDED_EVENT: - eventType = kDrmPluginEventKeyNeeded; - break; - } - sessionId.appendArray(reinterpret_cast(cdmSessionId.data()), cdmSessionId.size()); + sendEvent(kDrmPluginEventKeyNeeded, 0, &sessionId, NULL); +} - // Call base-class method with translated event. - sendEvent(eventType, 0, &sessionId, NULL); +void WVDrmPlugin::OnSessionExpiration(const CdmSessionId& cdmSessionId) { + Vector sessionId; + sessionId.appendArray(reinterpret_cast(cdmSessionId.data()), + cdmSessionId.size()); + sendEvent(kDrmPluginEventKeyExpired, 0, &sessionId, NULL); } status_t WVDrmPlugin::mapAndNotifyOfCdmResponseType( diff --git a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp index 1c4be2ec..57146c77 100644 --- a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp @@ -1200,8 +1200,8 @@ TEST_F(WVDrmPluginTest, MarshalsEvents) { status_t res = plugin.setListener(listener); ASSERT_EQ(OK, res); - plugin.OnEvent(cdmSessionId, LICENSE_EXPIRED_EVENT); - plugin.OnEvent(cdmSessionId, LICENSE_RENEWAL_NEEDED_EVENT); + plugin.OnSessionExpiration(cdmSessionId); + plugin.OnSessionRenewalNeeded(cdmSessionId); } TEST_F(WVDrmPluginTest, GeneratesProvisioningNeededEvent) {