diff --git a/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp b/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp index 3ee128b6..12997709 100644 --- a/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp @@ -1,4 +1,8 @@ // Copyright 2013 Google Inc. All Rights Reserved. +// These tests are for the cdm engine, and code below it in the stack. In +// particular, we assume that the OEMCrypo layer works, and has a valid keybox. +// This is because we need a valid RSA certificate, and will attempt to connect +// to the provisioning server to request one if we don't. #include #include @@ -18,6 +22,7 @@ #include "properties.h" #include "scoped_ptr.h" #include "string_conversions.h" +#include "test_printers.h" #include "url_request.h" #include "wv_cdm_constants.h" #include "wv_cdm_types.h" @@ -35,60 +40,6 @@ wvcdm::CdmKeySystem g_key_system; std::string g_license_server; wvcdm::KeyId g_wrong_key_id; -// This is an RSA certificate message from the provisioning server. -// The client sends this certificate to a license server for device -// authentication by the license server. -// This certificate is used to test the CDM engine's provisioning -// response handling. -static wvcdm::CdmProvisioningResponse kValidJsonProvisioningResponse = - "{\"signedResponse\": {" - "\"message\": \"CrAJYTyIdLPiA2jBzMskbE_gFQj69wv23VlJ2e3MBKtK4nJwKyNYGyyluqKo" - "TP751tvoADf86iLrf73mEzF58eSlaOjCpJRf2R3dojbNeSTy3JICmCc8vKtMjZRX9QWTvJbq_cg" - "yMB8FQC8enuYhOaw1yJDYyCFHgik34NrUVUfmvaKKdSKQimqAZmjXi6P0znAn-XdPtz2xJVRxZp" - "NH3QCD1bGcH_O1ercBW2JwF9KNalKFsxQrBhIwvyx-q-Ah4vf4r3M2HzY6JTHvcYGGc7dJNA3Xe" - "WfCrYIvg0SGCP_z7Y2wICIA36VMwR3gnwNZlKkx6WGCCgsaU6IbLm4HpRBZfajuiOlasoYN4z1R" - "lQ14Z32fdaFy8xOqLl-ZukxjWa7wv9zOSveH6JcHap1FS3R-RZ7E5WhfjxSTS0nWWZgmAjS2PkP" - "9g4GPNsnpsrVymI39j6R6jPoc3__2EGN6qAvmp4pFKR7lQyslgNn2vYLuE0Ps5mIXVkxNiZOO3T" - "jxgZyHaHOm1KmAZKI0EfddMATJCTt-UeLG3haqS_pYaBWcQ_xzWhoEHWU7_6ZaWrWemV8CVCg6s" - "OB1SRI5MrkRBBSV0r8UKddLJGthZVjuTG75KK72KE9yhe86mCadvfVYe5keJ5GOC-t1EiFzBo4c" - "4oqwkOCkkmYX_BEuZ3pOWztFp1_Br2Tl_fziw4O2vNIPCXB9yEewV6PkYPziTue3x4vRqD_mYjm" - "1ia8fxISQnEC0vrqvrFFs9fLAHPlsvaRFnhv_XKpRwFoBdfqWTakb3k6uRz0Oh2SJ8euzFIyQNB" - "efesMWk45DSrQjnlwlKXwZSiDKjAss0W2WwIb9F_x5LdB1Aa-CBudLVdxf62ggYaNZ57qx3YeHA" - "jkqMGIF7Fq09D4OxM0jRsnrmXbJWKleUpJi7nHJgQGZk2ifN95gjuTNcRaGfYXMOsDoWdkrNAq0" - "LScsPB06xEUR0DcO9vWx0zAEK7gsxxHziR7ZaYiIIkPysRR92r2NoLFPOUXf8j8ait-51jZmPKn" - "bD6adieLy6ujSl907QsUgyGvokLs1OCsYHZr-X6vnyMjdk4G3QfmWwRepD_CMyXGvtLbTNCto7E" - "L_M2yPZveAwYWwNlBtWK21gwIU2dgY298z7_S6jaQBc29f25sREjvN793ttYsPaeyom08qHYDnb" - "jae3XX-2qqde6AGXlv__jO8WDZ5od6DWu2ThqV10ijVGFfGniRsSruzq0iq8zuAqTOGhmA9Dw7b" - "rNlI95P4LpJA5pbjmNdnX7CQa2oHUuojmwlXRYuOA28PNEf-sc7ZPmMyFzedJi4EpkqzeQspEdH" - "yNMf23iEjK6GOff7dgAaxg9vYHyprhkEml4BdmFVYwCYQy8o6KRcA0NgJb8c3tg4d3aRXWp6L-F" - "sVhwqvq6FLOunSTNRIqhr2mOjRpU5w4mx-9GJRtk4XEcKT9YgUHGOUjGwfhQ5gBQDyZZVTddIUb" - "MOThsSg7zr38oUCfgXeZaai3X2foKo1Bt94Q_q18dw5xNAN5e7rSwfilltHL23zbZduuhWkvp8S" - "dag_NbO2C4IRMkzbjQBmiO9ixjXRhdqHlRRWcfR0wbQvEhD47egRVfnhKZ0W9G2-FGhyGuwJCq4" - "CCAISEAfZ_94TqpXBImeAUzYhNr0Y48SbiwUijgIwggEKAoIBAQDRigR9nFm4mfBUh1Y3SGyOcF" - "E-yK2NtfDiQe9l70KtkOeH4sB6MMB8g1QKPbUE8SBjPvXVJC_2DAWKjALzk4Aw-K-VmYe_Ag9CH" - "JiS-XcfUYEGgK4jVMxadEq3LufEEREKUZnzjgQlR39dzgjFqIrC1bwfy3_99RsjPt6QpWPg36PI" - "O4UKlmwBDTFzSOJB-4IV8Opy5Zv84BqPuyO9P5e3bXj_shRfy_XAGG2HGP_PpOCZWEfxuce0Iyu" - "vpTPLQpTOgNw-VvUBGCWMZFoERopmqp_pQwWZ2a-EwlT_vvYY4SkuNjflBskR70xz4QzEo9665g" - "k6I-HbHrTv29KEiAllAgMBAAEomSASgAIkKz1CSdFJVKcpO56jW0vsjKp92_cdqXBSEY3nuhzug" - "_LFluMJx_IqATUcCOY-w6w0yKn2ezfZGE0MDIaCngEgQFI_DRoaSOBNNeirF59uYM0sK3P2eGS9" - "G6F0l-OUXJdSO0b_LO8AbAK9LA3j7UHaajupJI1mdc4VtJfPRTsml2vIeKhDWXWaSvmeHgfF_tp" - "-OV7oPuk6Ub26xpCp2He2rEAblCYEl25Zlz97K4DhyTOV5_xuSdSt-KbTLY9cWM5i9ncND1RzCc" - "4qOixKarnMM5DdpZhs3B5xVj3yBAM1mVxPD2sZnqHSEN2EK7BMlHEnnyxhX0MGE36TQZR7P-I-G" - "rUFCq8CCAESEDAxMjM0NTY3ODlBQkNERUYYspIEIo4CMIIBCgKCAQEApwA2YGXcvVRaKkC04RWU" - "WBFPlFjd3qcfPCzgiAkpYVdnXlZ-7iePWTSaKqqdtE76p2rUyXpTwU6f4zT3PbfJEEdPKNo_zjF" - "7_QYQ6_e-kvmv-z5o2u4aZEzzKfJznjnY9m_YsoCCcY61pPLCPs0KyrYEzZoTi1RzVCVUjL6Yem" - "et2rNOs_qCqEpnmFZXVHHNEn_towHAaoskA5aIvpdmKrxTyYMGUVqIZRMY5Drta_FhW0zIHvTCr" - "gheLV_4En-i_LshGDDa_kD7AcouNw7O3XaHgkYLOnePwHIHLH-dHoZb7Scp3wOXYu9E01s925xe" - "G3s5tAttBGu7uyxfz7N6BQIDAQABKNKF2MwEEoADe9NAqNAxHpU13bMgz8LPySZJU8hY1RLwcfT" - "UM47Xb3m-F-s2cfI7w08668f79kD45uRRzkVc8GbRIlVyzVC0WgIvtxEkYRKfgF_J7snUe2J2NN" - "1FrkK7H3oYhcfPyYZH_SPZJr5HPoBFQTmS5A4l24U1dzQ6Z7_q-oS6uT0DiagTnzWhEg6AEnIkT" - "sJtK3cZuKGYq3NDefZ7nslPuLXxdXl6SAEOtrk-RvCY6EBqYOuPUXgxXOEPbyM289R6aHQyPPYw" - "qs9Pt9_E4BuMqCsbf5H5mLms9FA-wRx6mK2IaOboT4tf9_YObp3hVeL3WyxzXncETzJdE1GPGlO" - "t_x5S_MylgJKbiWQYSdmqs3fzYExunw3wvI4tPHT_O8A_xKjyTEAvE5cBuCkfjwT716qUOzFUzF" - "gZYLHnFiQLZekZUbUUlWY_CwU9Cv0UtxqQ6Oa835_Ug8_n1BwX6BPbmbcWe2Y19laSnDWg4JBNl" - "F2CyP9N75jPtW9rVfjUSqKEPOwaIgwzNDkyMjM3NDcAAAA=\"," - "\"signature\": \"r-LpoZcbbr2KtoPaFnuWTVBh4Gup1k8vn0ClW2qm32A=\"}}"; - const std::string kCencMimeType = "video/mp4"; const std::string kWebmMimeType = "video/webm"; @@ -99,14 +50,39 @@ namespace wvcdm { class WvCdmEngineTest : public testing::Test { public: virtual void SetUp() { - cdm_engine_.OpenSession(g_key_system, NULL, &session_id_); + CdmResponseType status = cdm_engine_.OpenSession(g_key_system, NULL, &session_id_); + if (status == NEED_PROVISIONING) { + Provision(); + status = cdm_engine_.OpenSession(g_key_system, NULL, &session_id_); + } + ASSERT_EQ(NO_ERROR, status); + ASSERT_NE("", session_id_) << "Could not open CDM session."; } - virtual void TearDown() { - cdm_engine_.CloseSession(session_id_); - } + virtual void TearDown() { cdm_engine_.CloseSession(session_id_); } protected: + void Provision() { + CdmProvisioningRequest prov_request; + std::string provisioning_server_url; + CdmCertificateType cert_type = kCertificateWidevine; + std::string cert_authority; + std::string cert, wrapped_key; + ASSERT_EQ(NO_ERROR, + cdm_engine_.GetProvisioningRequest(cert_type, + cert_authority, + &prov_request, + &provisioning_server_url)); + UrlRequest url_request(provisioning_server_url); + url_request.PostCertRequestInQueryString(prov_request); + std::string message; + bool ok = url_request.GetResponse(&message); + EXPECT_TRUE(ok); + ASSERT_EQ(NO_ERROR, + cdm_engine_.HandleProvisioningResponse(message, + &cert, &wrapped_key)); + } + void GenerateKeyRequest(const std::string& key_id, const std::string& init_data_type_string) { CdmAppParameterMap app_parameters; @@ -132,9 +108,19 @@ class WvCdmEngineTest : public testing::Test { &server_url_)); } - // posts a request and extracts the drm message from the response std::string GetKeyRequestResponse(const std::string& server_url, const std::string& client_auth) { + return GetKeyRequestResponse(server_url, client_auth, true); + } + std::string FailToGetKeyRequestResponse(const std::string& server_url, + const std::string& client_auth) { + return GetKeyRequestResponse(server_url, client_auth, false); + } + + // posts a request and extracts the drm message from the response + std::string GetKeyRequestResponse(const std::string& server_url, + const std::string& client_auth, + bool expect_success) { // Use secure connection and chunk transfer coding. UrlRequest url_request(server_url + client_auth); if (!url_request.is_connected()) { @@ -148,7 +134,7 @@ class WvCdmEngineTest : public testing::Test { EXPECT_TRUE(ok); int status_code = url_request.GetStatusCode(response); - EXPECT_EQ(kHttpOk, status_code); + if (expect_success) EXPECT_EQ(kHttpOk, status_code); if (status_code != kHttpOk) { return ""; @@ -173,8 +159,7 @@ class WvCdmEngineTest : public testing::Test { void VerifyRenewalKeyResponse(const std::string& server_url, const std::string& client_auth) { - std::string resp = GetKeyRequestResponse(server_url, - client_auth); + std::string resp = GetKeyRequestResponse(server_url, client_auth); EXPECT_EQ(wvcdm::KEY_ADDED, cdm_engine_.RenewKey(session_id_, resp)); } @@ -184,18 +169,9 @@ class WvCdmEngineTest : public testing::Test { std::string server_url_; }; -TEST(WvCdmProvisioningTest, ProvisioningTest) { - CdmEngine cdm_engine; - CdmProvisioningRequest prov_request; - std::string provisioning_server_url; - CdmCertificateType cert_type = kCertificateWidevine; - std::string cert_authority; - std::string cert, wrapped_key; - - cdm_engine.GetProvisioningRequest(cert_type, cert_authority, - &prov_request, &provisioning_server_url); - cdm_engine.HandleProvisioningResponse(kValidJsonProvisioningResponse, - &cert, &wrapped_key); +// Test that provisioning works, even if device is already provisioned. +TEST_F(WvCdmEngineTest, ProvisioningTest) { + Provision(); } TEST_F(WvCdmEngineTest, BaseIsoBmffMessageTest) { @@ -215,7 +191,7 @@ TEST_F(WvCdmEngineTest, WrongMessageTest) { // We should receive a response with no license, i.e. the extracted license // response message should be empty. - ASSERT_EQ("", GetKeyRequestResponse(g_license_server, g_client_auth)); + ASSERT_EQ("", FailToGetKeyRequestResponse(g_license_server, g_client_auth)); } TEST_F(WvCdmEngineTest, NormalDecryptionIsoBmff) { @@ -244,7 +220,7 @@ int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); wvcdm::InitLogging(argc, argv); - wvcdm::ConfigTestEnv config(wvcdm::kGooglePlayServer); + wvcdm::ConfigTestEnv config(wvcdm::kContentProtectionServer); g_client_auth.assign(config.client_auth()); g_key_system.assign(config.key_system()); g_wrong_key_id.assign(config.wrong_key_id()); diff --git a/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp b/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp index 5bc8bf89..58304e22 100644 --- a/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp @@ -6,6 +6,7 @@ #include "gtest/gtest.h" #include "properties.h" #include "string_conversions.h" +#include "test_printers.h" namespace { const std::string kToken = wvcdm::a2bs_hex( diff --git a/libwvdrmengine/cdm/core/test/license_request.cpp b/libwvdrmengine/cdm/core/test/license_request.cpp index f6bbd3de..ad066901 100644 --- a/libwvdrmengine/cdm/core/test/license_request.cpp +++ b/libwvdrmengine/cdm/core/test/license_request.cpp @@ -30,20 +30,22 @@ void LicenseRequest::GetDrmMessage(const std::string& response, header_end_pos += kTwoBlankLines.size(); // points to response body drm_msg.clear(); - size_t drm_msg_pos = response.find(kTwoBlankLines, header_end_pos); - if (drm_msg_pos != std::string::npos) { - drm_msg_pos += kTwoBlankLines.size(); // points to drm message - } else { - // For backward compatibility, no blank line after error code - drm_msg_pos = response.find("\r\n", header_end_pos); + // Messages from Google Play server add a GLS wrapper. These start + // with "GLS/1.0 ". + if (response.find("GLS/1.", header_end_pos) == header_end_pos) { + // For GLS messages, we should skip past the next blank line, and use + // what's left of the message. + size_t drm_msg_pos = response.find(kTwoBlankLines, header_end_pos); if (drm_msg_pos != std::string::npos) { - drm_msg_pos += 2; // points to drm message + drm_msg_pos += kTwoBlankLines.size(); // points to drm message + drm_msg = response.substr(drm_msg_pos); + } else { + LOGE("Message had GLS marker, but did not have extra blank line."); + drm_msg = response.substr(header_end_pos); } - } - - if (drm_msg_pos != std::string::npos) { - drm_msg = response.substr(drm_msg_pos); } else { + // For servers that do not use the GLS wrapper, we should just strip of + // the headers, and use the rest of the message. drm_msg = response.substr(header_end_pos); } } else { diff --git a/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp b/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp index cc332b6d..b8c63790 100644 --- a/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/policy_engine_unittest.cpp @@ -10,6 +10,7 @@ #include "license.h" #include "mock_clock.h" #include "policy_engine.h" +#include "test_printers.h" #include "wv_cdm_constants.h" namespace { diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp new file mode 100644 index 00000000..05f08aa1 --- /dev/null +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -0,0 +1,93 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// This file adds some print methods so that when unit tests fail, the +// will print the name of an enumeration instead of the numeric value. + +#include "test_printers.h" + +namespace wvcdm { + +void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { + switch(value) { + case NO_ERROR: *os << "NO_ERROR"; + break; + case UNKNOWN_ERROR: *os << "UNKNOWN_ERROR"; + break; + case KEY_ADDED: *os << "KEY_ADDED"; + break; + case KEY_ERROR: *os << "KEY_ERROR"; + break; + case KEY_MESSAGE: *os << "KEY_MESSAGE"; + break; + case NEED_KEY: *os << "NEED_KEY"; + break; + case KEY_CANCELED: *os << "KEY_CANCELED"; + break; + case NEED_PROVISIONING: *os << "NEED_PROVISIONING"; + break; + case DEVICE_REVOKED: *os << "DEVICE_REVOKED"; + break; + case INSUFFICIENT_CRYPTO_RESOURCES: *os << "INSUFFICIENT_CRYPTO_RESOURCES"; + break; + default: + *os << "Unknown CdmResponseType"; + break; + } +} + +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"; + break; + case kLicenseTypeStreaming: *os << "kLicenseTypeStreaming"; + break; + case kLicenseTypeRelease: *os << "kLicenseTypeRelease"; + break; + default: + *os << "Unknown CdmLicenseType"; + break; + } +}; + +void PrintTo(const enum CdmSecurityLevel& value, ::std::ostream* os) { + switch(value) { + case kSecurityLevelUninitialized: *os << "kSecurityLevelUninitialized"; + break; + case kSecurityLevelL1: *os << "kSecurityLevelL1"; + break; + case kSecurityLevelL2: *os << "kSecurityLevelL2"; + break; + case kSecurityLevelL3: *os << "kSecurityLevelL3"; + break; + case kSecurityLevelUnknown: *os << "kSecurityLevelUnknown"; + break; + default: + *os << "Unknown CdmSecurityLevel"; + break; + } +}; + +void PrintTo(const enum CdmCertificateType& value, ::std::ostream* os) { + switch(value) { + case kCertificateWidevine: *os << "kCertificateWidevine"; + break; + case kCertificateX509: *os << "kCertificateX509"; + break; + default: + *os << "Unknown CdmCertificateType"; + break; + } +}; + +}; // namespace wvcdm diff --git a/libwvdrmengine/cdm/core/test/test_printers.h b/libwvdrmengine/cdm/core/test/test_printers.h new file mode 100644 index 00000000..a50c4cc8 --- /dev/null +++ b/libwvdrmengine/cdm/core/test/test_printers.h @@ -0,0 +1,19 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// This file adds some print methods so that when unit tests fail, the +// will print the name of an enumeration instead of the numeric value. + +#ifndef CDM_TEST_PRINTERS_H_ +#define CDM_TEST_PRINTERS_H_ + +#include +#include "wv_cdm_types.h" + +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); +}; // namespace wvcdm + +#endif // CDM_TEST_PRINTERS_H_ diff --git a/libwvdrmengine/cdm/core/test/url_request.cpp b/libwvdrmengine/cdm/core/test/url_request.cpp index e15fb357..92f8df7e 100644 --- a/libwvdrmengine/cdm/core/test/url_request.cpp +++ b/libwvdrmengine/cdm/core/test/url_request.cpp @@ -12,9 +12,9 @@ namespace { const int kReadBufferSize = 1024; -const int kConnectTimeoutMs = 5000; -const int kWriteTimeoutMs = 3000; -const int kReadTimeoutMs = 3000; +const int kConnectTimeoutMs = 15000; +const int kWriteTimeoutMs = 12000; +const int kReadTimeoutMs = 12000; // Concatenate all chunks into one blob and returns the response with // header information. diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index 6322b99b..f931a1b9 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -15,6 +15,7 @@ #include "properties.h" #include "string_conversions.h" #include "url_request.h" +#include "test_printers.h" #include "wv_cdm_constants.h" #include "wv_cdm_event_listener.h" #include "wv_content_decryption_module.h" @@ -372,15 +373,18 @@ struct UsageInfoSubSampleInfo { SubSampleInfo* sub_sample; uint32_t usage_info; wvcdm::SecurityLevel security_level; + std::string app_id; }; UsageInfoSubSampleInfo usage_info_sub_sample_info[] = { - {&usage_info_sub_samples_icp[0], 1, wvcdm::kLevelDefault}, - {&usage_info_sub_samples_icp[0], 3, wvcdm::kLevelDefault}, - {&usage_info_sub_samples_icp[0], 5, wvcdm::kLevelDefault}, - {&usage_info_sub_samples_icp[0], 1, wvcdm::kLevel3}, - {&usage_info_sub_samples_icp[0], 3, wvcdm::kLevel3}, - {&usage_info_sub_samples_icp[0], 5, wvcdm::kLevel3}}; + {&usage_info_sub_samples_icp[0], 1, wvcdm::kLevelDefault, ""}, + {&usage_info_sub_samples_icp[0], 3, wvcdm::kLevelDefault, ""}, + {&usage_info_sub_samples_icp[0], 5, wvcdm::kLevelDefault, ""}, + {&usage_info_sub_samples_icp[0], 3, wvcdm::kLevelDefault, "other app id"}, + {&usage_info_sub_samples_icp[0], 1, wvcdm::kLevel3, ""}, + {&usage_info_sub_samples_icp[0], 3, wvcdm::kLevel3, ""}, + {&usage_info_sub_samples_icp[0], 5, wvcdm::kLevel3, ""}, + {&usage_info_sub_samples_icp[0], 3, wvcdm::kLevel3, "other app id"}}; } // namespace @@ -665,7 +669,11 @@ class WvCdmRequestLicenseTest : public testing::Test { query_info.find(wvcdm::QUERY_KEY_SECURITY_LEVEL); EXPECT_TRUE(itr != query_info.end()); decryptor_.CloseSession(session_id_); - return itr->second; + if (itr != query_info.end()) { + return itr->second; + } else { + return "ERROR"; + } } @@ -677,7 +685,7 @@ class WvCdmRequestLicenseTest : public testing::Test { } else if (level.compare(wvcdm::QUERY_VALUE_SECURITY_LEVEL_L3) == 0) { security_level = kSecurityLevelL3; } else { - EXPECT_TRUE(false); + EXPECT_TRUE(false) << "Default Security level is undefined: " << level; } return security_level; } @@ -1198,7 +1206,6 @@ class WvCdmUsageInfoTest TEST_P(WvCdmUsageInfoTest, UsageInfo) { Unprovision(); - Provision(kLevelDefault); UsageInfoSubSampleInfo* usage_info_data = GetParam(); TestWvCdmClientPropertySet client_property_set; @@ -1206,6 +1213,10 @@ TEST_P(WvCdmUsageInfoTest, UsageInfo) { if (kLevel3 == usage_info_data->security_level) { client_property_set.set_security_level(QUERY_VALUE_SECURITY_LEVEL_L3); property_set = &client_property_set; + Provision(kLevel3); + Provision(kLevelDefault); + } else { + Provision(kLevelDefault); } CdmSecurityLevel security_level = GetDefaultSecurityLevel(); @@ -1213,7 +1224,7 @@ TEST_P(WvCdmUsageInfoTest, UsageInfo) { EXPECT_TRUE(handle.Init(security_level)); File file; handle.SetTestFile(&file); - EXPECT_TRUE(handle.DeleteAllUsageInfoForApp("")); // default app_id. + EXPECT_TRUE(handle.DeleteAllUsageInfoForApp(usage_info_data->app_id)); for (size_t i = 0; i < usage_info_data->usage_info; ++i) { SubSampleInfo* data = usage_info_data->sub_sample + i; @@ -1248,7 +1259,7 @@ TEST_P(WvCdmUsageInfoTest, UsageInfo) { CdmUsageInfo usage_info; CdmUsageInfoReleaseMessage release_msg; CdmResponseType status = - decryptor_.GetUsageInfo(property_set->app_id(), &usage_info); + decryptor_.GetUsageInfo(usage_info_data->app_id, &usage_info); EXPECT_EQ(usage_info.empty() ? NO_ERROR : KEY_MESSAGE, status); while (usage_info.size() > 0) { for (size_t i = 0; i < usage_info.size(); ++i) { @@ -1256,7 +1267,7 @@ TEST_P(WvCdmUsageInfoTest, UsageInfo) { GetUsageInfoResponse(g_license_server, g_client_auth, usage_info[i]); EXPECT_EQ(NO_ERROR, decryptor_.ReleaseUsageInfo(release_msg)); } - status = decryptor_.GetUsageInfo(property_set->app_id(), &usage_info); + status = decryptor_.GetUsageInfo(usage_info_data->app_id, &usage_info); switch (status) { case KEY_MESSAGE: EXPECT_FALSE(usage_info.empty()); break; case NO_ERROR: EXPECT_TRUE(usage_info.empty()); break; @@ -1269,7 +1280,12 @@ TEST_P(WvCdmUsageInfoTest, UsageInfo) { INSTANTIATE_TEST_CASE_P(Cdm, WvCdmUsageInfoTest, ::testing::Values(&usage_info_sub_sample_info[0], &usage_info_sub_sample_info[1], - &usage_info_sub_sample_info[2])); + &usage_info_sub_sample_info[2], + &usage_info_sub_sample_info[3], + &usage_info_sub_sample_info[4], + &usage_info_sub_sample_info[5], + &usage_info_sub_sample_info[6], + &usage_info_sub_sample_info[7])); TEST_F(WvCdmRequestLicenseTest, QueryUnmodifiedSessionStatus) { // Test that the global value is returned when no properties are modifying it. diff --git a/libwvdrmengine/cdm/test/unit-test.mk b/libwvdrmengine/cdm/test/unit-test.mk index 2543dda9..204f18db 100644 --- a/libwvdrmengine/cdm/test/unit-test.mk +++ b/libwvdrmengine/cdm/test/unit-test.mk @@ -14,6 +14,7 @@ LOCAL_SRC_FILES := \ ../core/test/config_test_env.cpp \ ../core/test/http_socket.cpp \ ../core/test/license_request.cpp \ + ../core/test/test_printers.cpp \ ../core/test/url_request.cpp LOCAL_C_INCLUDES := \