From f32baf91b54eb996a161f12834fca1877e19ba49 Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Fri, 6 Dec 2013 11:45:43 -0800 Subject: [PATCH] Address unit test failures A number of failures were observed, * GPlay dev license server is being worked on. This causes random failures when running unit tests. Switching to the staging server for now. * Occasionally, the license server times out. Introducing a retry mechanism do deal with HTTP responses (merge from master #45e8ddd5f) * Release license tests are now disabled. Tests were previously passing, even though they were not in fact supported by the GPlay license server. The response included just enough information to be a valid license and passed minimal verification that was taking place. Additional verification was not necessary because session is torndown and resources released as soon as the response has been received. A change at the GPlay server now causes the release license request to be flagged as an error and the tests to fail. Work is in progress to support release of licenses at the GPlay server. * The wrong message test (from request license tests) fails. This is because GPlay behaviour changed from returning a HTTP 500, when processing an invalid PSSH, to returning a HTTP 200 without any included license. * Security level path backward compatibility tests on L3 which failed and caused the succeeding license request tests to fail. b/12000457 Change-Id: I8e6adc490504475d1039793ea555a17799cb78c4 --- .../cdm/core/test/cdm_engine_test.cpp | 23 ++++++------------- .../cdm/core/test/config_test_env.cpp | 2 +- .../cdm/core/test/device_files_unittest.cpp | 2 +- .../cdm/core/test/policy_engine_unittest.cpp | 2 +- libwvdrmengine/cdm/core/test/url_request.cpp | 10 ++++++-- .../cdm/test/request_license_test.cpp | 16 ++++++++++--- .../com/widevine/test/MediaDrmAPITest.java | 2 +- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp b/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp index 778334e4..8343363c 100644 --- a/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp @@ -19,6 +19,7 @@ #include "wv_cdm_types.h" namespace { +const int kHttpOk = 200; // Default license server, can be configured using --server command line option // Default key id (pssh), can be configured using --keyid command line option std::string g_client_auth; @@ -128,8 +129,7 @@ class WvCdmEngineTest : public testing::Test { // posts a request and extracts the drm message from the response std::string GetKeyRequestResponse(const std::string& server_url, - const std::string& client_auth, - int expected_response) { + const std::string& client_auth) { // Use secure connection and chunk transfer coding. UrlRequest url_request(server_url + client_auth, g_port, true, true); if (!url_request.is_connected()) { @@ -142,15 +142,8 @@ class WvCdmEngineTest : public testing::Test { LOGD("response:\r\n%s", response.c_str()); LOGD("end %d bytes response dump", resp_bytes); - // Youtube server returns 400 for invalid message while play server returns - // 500, so just test inequity here for invalid message int status_code = url_request.GetStatusCode(response); - int kHttpOk = 200; - if (expected_response == kHttpOk) { - EXPECT_EQ(kHttpOk, status_code); - } else { - EXPECT_NE(kHttpOk, status_code); - } + EXPECT_EQ(kHttpOk, status_code); if (status_code != kHttpOk) { return ""; @@ -169,8 +162,7 @@ class WvCdmEngineTest : public testing::Test { const std::string& client_auth, std::string& init_data){ std::string resp = GetKeyRequestResponse(server_url, - client_auth, - 200); + client_auth); CdmKeySetId key_set_id; EXPECT_EQ(cdm_engine_->AddKey(session_id_, resp, &key_set_id), KEY_ADDED); } @@ -179,8 +171,7 @@ class WvCdmEngineTest : public testing::Test { const std::string& client_auth, std::string& init_data){ std::string resp = GetKeyRequestResponse(server_url, - client_auth, - 200); + client_auth); EXPECT_EQ(cdm_engine_->RenewKey(session_id_, resp), wvcdm::KEY_ADDED); } @@ -201,13 +192,13 @@ TEST(WvCdmProvisioningTest, ProvisioningTest) { TEST_F(WvCdmEngineTest, BaseMessageTest) { GenerateKeyRequest(g_key_system, g_key_id); - GetKeyRequestResponse(g_license_server, g_client_auth, 200); + GetKeyRequestResponse(g_license_server, g_client_auth); } TEST_F(WvCdmEngineTest, WrongMessageTest) { std::string wrong_message = a2bs_hex(g_wrong_key_id); GenerateKeyRequest(g_key_system, wrong_message); - GetKeyRequestResponse(g_license_server, g_client_auth, 500); + GetKeyRequestResponse(g_license_server, g_client_auth); } TEST_F(WvCdmEngineTest, NormalDecryption) { diff --git a/libwvdrmengine/cdm/core/test/config_test_env.cpp b/libwvdrmengine/cdm/core/test/config_test_env.cpp index f3f2b148..25c7e8b6 100644 --- a/libwvdrmengine/cdm/core/test/config_test_env.cpp +++ b/libwvdrmengine/cdm/core/test/config_test_env.cpp @@ -24,7 +24,7 @@ const std::string kYtKeyId = // Google Play license server data const std::string kGpLicenseServer = - "https://jmt17.google.com/video-dev/license/GetCencLicense"; + "https://jmt17.google.com/video/license/GetCencLicense"; // NOTE: Append a userdata attribute to place a unique marker that the // server team can use to track down specific requests during debugging diff --git a/libwvdrmengine/cdm/core/test/device_files_unittest.cpp b/libwvdrmengine/cdm/core/test/device_files_unittest.cpp index 196519f9..4c979230 100644 --- a/libwvdrmengine/cdm/core/test/device_files_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/device_files_unittest.cpp @@ -209,7 +209,7 @@ LicenseInfo license_test_data[] = { "0112001A16200342120A106B63746C0000000000ECDCBE0000000020DBDF" "A68F051A20182F029E35047A3841FA176C74E5B387350E8D58DEA6878FF0" "BEA6CABACA1C2C"), - "https://jmt17.google.com/video-dev/license/GetCencLicense", + "https://jmt17.google.com/video/license/GetCencLicense", wvcdm::a2bs_hex( "0AAF150802100122A8150801121408011210303132333435363738394142" "434445461A9D0E080112950C0AD70B080112EF090AB002080212103E560E" diff --git a/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp b/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp index e76e5cd1..7171b193 100644 --- a/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp @@ -57,7 +57,7 @@ class PolicyEngineTest : public ::testing::Test { policy->set_renewal_recovery_duration_seconds(license_duration_ - license_renewal_delay_); // 10 minutes policy->set_renewal_server_url( - "https://jmt17.google.com/video-dev/license/GetCencLicense"); + "https://jmt17.google.com/video/license/GetCencLicense"); policy->set_renewal_delay_seconds(license_renewal_delay_); policy->set_renewal_retry_interval_seconds( license_renewal_retry_interval_); diff --git a/libwvdrmengine/cdm/core/test/url_request.cpp b/libwvdrmengine/cdm/core/test/url_request.cpp index 5408cab4..7c8641ae 100644 --- a/libwvdrmengine/cdm/core/test/url_request.cpp +++ b/libwvdrmengine/cdm/core/test/url_request.cpp @@ -9,6 +9,11 @@ #include "log.h" #include "string_conversions.h" +namespace { +const int kMaxReadAttempts = 4; +const int kSingleReadAttempt = 1; +} // namespace + namespace wvcdm { UrlRequest::UrlRequest(const std::string& url, const std::string& port, @@ -104,16 +109,17 @@ int UrlRequest::GetResponse(std::string* message) { std::string response; const int kTimeoutInMs = 3000; int bytes = 0; - do { + for (int attempts = kMaxReadAttempts; attempts > 0; --attempts) { memset(buffer_, 0, kHttpBufferSize); bytes = socket_.Read(buffer_, kHttpBufferSize, kTimeoutInMs); if (bytes > 0) { response.append(buffer_, bytes); + attempts = kSingleReadAttempt; } else { if (bytes < 0) LOGE("read error = ", errno); // bytes == 0 indicates nothing to read } - } while (bytes > 0); + }; ConcatenateChunkedResponse(response, message); LOGD("HTTP response: (%d): %s", message->size(), b2a_hex(*message).c_str()); diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index d5a4cc73..3c1dfb1c 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -20,6 +20,7 @@ #include "wv_content_decryption_module.h" namespace { +const char kPathDelimiter = '/'; // Default license server, can be configured using --server command line option // Default key id (pssh), can be configured using --keyid command line option std::string g_client_auth; @@ -637,7 +638,7 @@ TEST_F(WvCdmRequestLicenseTest, RestoreOfflineKeyTest) { decryptor_.CloseSession(session_id_); } -TEST_F(WvCdmRequestLicenseTest, ReleaseOfflineKeyTest) { +TEST_F(WvCdmRequestLicenseTest, DISABLED_ReleaseOfflineKeyTest) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); @@ -659,7 +660,7 @@ TEST_F(WvCdmRequestLicenseTest, ReleaseOfflineKeyTest) { VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); } -TEST_F(WvCdmRequestLicenseTest, ExpiryOnReleaseOfflineKeyTest) { +TEST_F(WvCdmRequestLicenseTest, DISABLED_ExpiryOnReleaseOfflineKeyTest) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); @@ -868,8 +869,15 @@ TEST_F(WvCdmRequestLicenseTest, SecurityLevelPathBackwardCompatibility) { EXPECT_NE(std::string::npos, pos); std::string old_base_path(base_path, 0, pos); + std::string path(old_base_path); + path += kPathDelimiter; + size_t path_len = path.size(); File file; - file.Remove(old_base_path); + for (size_t i = 0; i < security_dirs.size(); i++) { + path.append(security_dirs[i]); + file.Remove(path); + path.resize(path_len); + } decryptor_.OpenSession(g_key_system, NULL, &session_id_); std::string provisioning_server_url; @@ -914,6 +922,8 @@ TEST_F(WvCdmRequestLicenseTest, SecurityLevelPathBackwardCompatibility) { VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); decryptor_.CloseSession(session_id_); + if (security_level != kSecurityLevelL1) return; + TestWvCdmClientPropertySet property_set; property_set.set_security_level(QUERY_VALUE_SECURITY_LEVEL_L3); diff --git a/libwvdrmengine/test/java/src/com/widevine/test/MediaDrmAPITest.java b/libwvdrmengine/test/java/src/com/widevine/test/MediaDrmAPITest.java index 31ca1551..387039ff 100644 --- a/libwvdrmengine/test/java/src/com/widevine/test/MediaDrmAPITest.java +++ b/libwvdrmengine/test/java/src/com/widevine/test/MediaDrmAPITest.java @@ -73,7 +73,7 @@ class SurfacePanel extends SurfaceView implements SurfaceHolder.Callback public class MediaDrmAPITest extends Activity { private final String TAG = "MediaDrmAPITest"; - static final String kKeyServerUrl = "https://jmt17.google.com/video-dev/license/GetCencLicense"; + static final String kKeyServerUrl = "https://jmt17.google.com/video/license/GetCencLicense"; static final String kOperatorSessionKeyServerUrl = "http://kir03wwwg185.widevine.net/drm"; static final UUID kWidevineScheme = new UUID(0xEDEF8BA979D64ACEL, 0xA3C827DCD51D21EDL);