From 184e0d0559403aeecb021d4bd542c5d49c94d517 Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Wed, 9 May 2018 15:30:23 -0700 Subject: [PATCH] Address Cdm Extended Duration Test failures [ Merge of http://go/wvgerrit/49980 ] This CL * corrects some of the test expectations * switches test content used to test streaming with provider session tokens. The policy of the earlier test content had changed. * adds some more information to log messages Bug: 63819720 Test: WV unit, integration tests, WvCdmExtendedDuraionTest, GtsMediaDrmTest Change-Id: I8fdbc9c38d6018cc6e884e1b95b2e9d26e7aa536 --- libwvdrmengine/cdm/core/src/cdm_engine.cpp | 5 ++- .../cdm/src/wv_content_decryption_module.cpp | 6 ++- .../cdm/test/cdm_extended_duration_test.cpp | 39 ++++++++++++------- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index cd1f4b8d..8de6167c 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -139,6 +139,7 @@ CdmResponseType CdmEngine::OpenSession( return sts; } CdmSessionId id = new_session->session_id(); + LOGI("CdmEngine::OpenSession: %s", id.c_str()); session_map_.Add(id, new_session.release()); if (session_id) *session_id = id; @@ -1669,7 +1670,9 @@ void CdmEngine::OnTimerEvent() { (*iter)->reset_usage_flags(); switch ((*iter)->get_usage_support_type()) { case kUsageEntrySupport: - (*iter)->UpdateUsageEntryInformation(); + if ((*iter)->has_provider_session_token()) { + (*iter)->UpdateUsageEntryInformation(); + } break; case kUsageTableSupport: if (!has_usage_been_updated) { diff --git a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp index f7098e98..80d5bbd3 100644 --- a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp +++ b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp @@ -299,7 +299,8 @@ CdmResponseType WvContentDecryptionModule::Decrypt( // key sharing, the shared session will still be in the same CdmEngine. CdmEngine* cdm_engine = GetCdmForSessionId(session_id); if (!cdm_engine) { - LOGE("WvContentDecryptionModule::Decrypt: not found"); + LOGE("WvContentDecryptionModule::Decrypt: session not found: %s", + session_id.c_str()); return SESSION_NOT_FOUND_18; } @@ -310,7 +311,8 @@ CdmResponseType WvContentDecryptionModule::Decrypt( cdm_engine->GetMetrics()->cdm_engine_find_session_for_key_.Increment( status); if (!status && parameters.is_encrypted) { - LOGE("WvContentDecryptionModule::Decrypt: unable to find session"); + LOGE("WvContentDecryptionModule::Decrypt: unable to find session: %s", + session_id.c_str()); return KEY_NOT_FOUND_IN_SESSION; } } diff --git a/libwvdrmengine/cdm/test/cdm_extended_duration_test.cpp b/libwvdrmengine/cdm/test/cdm_extended_duration_test.cpp index 92023e12..b65e471c 100644 --- a/libwvdrmengine/cdm/test/cdm_extended_duration_test.cpp +++ b/libwvdrmengine/cdm/test/cdm_extended_duration_test.cpp @@ -92,7 +92,7 @@ SubSampleInfo kEncryptedStreamingNoPstSubSample = { "08a899cd760ff0899a1170c2f224b9c52997a0785b7fe170805fd3e8b1127659"), wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, 3}; -SubSampleInfo kEncryptedStreamingClip1SubSample = { +SubSampleInfo kEncryptedStreamingClip8SubSample = { true, 1, true, true, false, wvcdm::a2bs_hex("E82DDD1D07CBB31CDD31EBAAE0894609"), wvcdm::a2b_hex( @@ -161,11 +161,11 @@ SubSampleInfo kEncryptedOfflineClip2SubSample = { "944B5080B998BB0FE6E566AAFAE2328B37FD189F1920A964434ECF18E11AC81E"), wvcdm::a2b_hex("7362b5140c4ce0cd5f863858668d3f1a"), 0, 3}; -std::string kStreamingClip1PstInitData = wvcdm::a2bs_hex( +std::string kStreamingClip8PstInitData = wvcdm::a2bs_hex( "000000427073736800000000" // blob size and pssh "EDEF8BA979D64ACEA3C827DCD51D21ED00000022" // Widevine system id "08011a0d7769646576696e655f74657374220f73" // pssh data - "747265616d696e675f636c697033"); + "747265616d696e675f636c697038"); std::string kOfflineClip2PstInitData = wvcdm::a2bs_hex( "000000427073736800000000" // blob size and pssh @@ -529,6 +529,7 @@ class WvCdmExtendedDurationTest : public WvCdmTestBase { } void ValidateReleaseRequest(std::string& usage_msg, + bool license_used, int64_t expected_seconds_since_license_received, int64_t expected_seconds_since_first_playback, int64_t expected_seconds_since_last_playback) { @@ -572,7 +573,8 @@ class WvCdmExtendedDurationTest : public WvCdmTestBase { Unpacked_PST_Report usage_report(buffer); EXPECT_EQ(usage_report.report_size(), existing_license.session_usage_table_entry().size()); - EXPECT_EQ(kInactiveUsed, usage_report.status()); + EXPECT_EQ(license_used ? kInactiveUsed : kInactiveUnused, + usage_report.status()); EXPECT_EQ(id.provider_session_token().size(), usage_report.pst_length()); std::string pst(reinterpret_cast(usage_report.pst()), @@ -595,10 +597,12 @@ class WvCdmExtendedDurationTest : public WvCdmTestBase { EXPECT_NEAR(seconds_since_license_received, expected_seconds_since_license_received, kClockTolerance); - EXPECT_NEAR(seconds_since_first_decrypt, - expected_seconds_since_first_playback, kClockTolerance); - EXPECT_NEAR(seconds_since_last_decrypt, - expected_seconds_since_last_playback, kClockTolerance); + if (license_used) { + EXPECT_NEAR(seconds_since_first_decrypt, + expected_seconds_since_first_playback, kClockTolerance); + EXPECT_NEAR(seconds_since_last_decrypt, + expected_seconds_since_last_playback, kClockTolerance); + } EXPECT_EQ(::video_widevine::LicenseRequest_RequestType_RELEASE, license_renewal.type()); @@ -937,12 +941,15 @@ TEST_F(WvCdmExtendedDurationTest, DecryptionCloseSessionConcurrencyTest) { switch (status) { case SESSION_NOT_FOUND_FOR_DECRYPT: + case SESSION_NOT_FOUND_18: + // Session was closed before decrypt was called. This is expected + // occasionally as we are testing resilience to concurrency. break; case NO_ERROR: EXPECT_EQ((data + i)->decrypt_data, decrypt_buffer); break; default: - EXPECT_TRUE(false); + EXPECT_TRUE(false) << " Unexpected decrypt result: " << status; } } } @@ -1115,7 +1122,7 @@ TEST_F(WvCdmExtendedDurationTest, AutomatedOfflineSessionReleaseOnOpenSession) { sleep(kMinute + kClockTolerance); - EXPECT_GT( + EXPECT_EQ( QueryStatus(kLevelDefault, wvcdm::QUERY_KEY_NUMBER_OF_OPEN_SESSIONS), initial_open_sessions); @@ -1297,7 +1304,7 @@ TEST_P(WvCdmStreamingPstTest, UsageTest) { decryptor_.OpenSession(g_key_system, NULL, kDefaultCdmIdentifier, NULL, &session_id_); - GenerateKeyRequest(kStreamingClip1PstInitData, kLicenseTypeStreaming); + GenerateKeyRequest(kStreamingClip8PstInitData, kLicenseTypeStreaming); VerifyKeyRequestResponse(g_license_server, g_client_auth, false); ValidateResponse(video_widevine::STREAMING, true); @@ -1314,7 +1321,7 @@ TEST_P(WvCdmStreamingPstTest, UsageTest) { for (size_t i = 0; i < GetParam(); ++i) { // Decrypt data - SubSampleInfo* data = &kEncryptedStreamingClip1SubSample; + SubSampleInfo* data = &kEncryptedStreamingClip8SubSample; for (size_t i = 0; i < data->num_of_subsamples; i++) { std::vector decrypt_buffer((data + i)->encrypt_data.size()); CdmDecryptionParameters decryption_parameters( @@ -1363,7 +1370,7 @@ TEST_P(WvCdmStreamingUsageReportTest, UsageTest) { decryptor_.OpenSession(g_key_system, NULL, kDefaultCdmIdentifier, NULL, &session_id_); - GenerateKeyRequest(kStreamingClip1PstInitData, kLicenseTypeStreaming); + GenerateKeyRequest(kStreamingClip8PstInitData, kLicenseTypeStreaming); VerifyKeyRequestResponse(g_license_server, g_client_auth, false); ValidateResponse(video_widevine::STREAMING, true); @@ -1380,7 +1387,7 @@ TEST_P(WvCdmStreamingUsageReportTest, UsageTest) { for (size_t i = 0; i < GetParam(); ++i) { // Decrypt data - SubSampleInfo* data = &kEncryptedStreamingClip1SubSample; + SubSampleInfo* data = &kEncryptedStreamingClip8SubSample; for (size_t i = 0; i < data->num_of_subsamples; i++) { std::vector decrypt_buffer((data + i)->encrypt_data.size()); CdmDecryptionParameters decryption_parameters( @@ -1426,6 +1433,7 @@ TEST_P(WvCdmStreamingUsageReportTest, UsageTest) { while (usage_info.size() > 0) { for (size_t i = 0; i < usage_info.size(); ++i) { ValidateReleaseRequest(usage_info[i], + expected_seconds_since_initial_playback != 0, expected_seconds_since_license_received, expected_seconds_since_initial_playback, expected_seconds_since_last_playback); @@ -1556,7 +1564,8 @@ TEST_P(WvCdmOfflineUsageReportTest, UsageTest) { session_id_.clear(); key_set_id_.clear(); GenerateKeyRelease(key_set_id); - ValidateReleaseRequest(key_msg_, expected_seconds_since_license_received, + ValidateReleaseRequest(key_msg_, expected_seconds_since_initial_playback != 0, + expected_seconds_since_license_received, expected_seconds_since_initial_playback, expected_seconds_since_last_playback); key_set_id_ = key_set_id;