| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "media/base/cdm_promise.h" | 10 #include "media/base/cdm_promise.h" |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 kSubsampleEncryptedData, | 213 kSubsampleEncryptedData, |
| 214 kSubsampleEncryptedData + arraysize(kSubsampleEncryptedData)), | 214 kSubsampleEncryptedData + arraysize(kSubsampleEncryptedData)), |
| 215 key_id_(kKeyId, kKeyId + arraysize(kKeyId)), | 215 key_id_(kKeyId, kKeyId + arraysize(kKeyId)), |
| 216 iv_(kIv, kIv + arraysize(kIv)), | 216 iv_(kIv, kIv + arraysize(kIv)), |
| 217 normal_subsample_entries_( | 217 normal_subsample_entries_( |
| 218 kSubsampleEntriesNormal, | 218 kSubsampleEntriesNormal, |
| 219 kSubsampleEntriesNormal + arraysize(kSubsampleEntriesNormal)) { | 219 kSubsampleEntriesNormal + arraysize(kSubsampleEntriesNormal)) { |
| 220 } | 220 } |
| 221 | 221 |
| 222 protected: | 222 protected: |
| 223 void OnResolveWithSession(PromiseResult expected, | 223 void OnResolveWithSession(PromiseResult expected_result, |
| 224 const std::string& web_session_id) { | 224 const std::string& web_session_id) { |
| 225 EXPECT_EQ(expected, RESOLVED); | 225 EXPECT_EQ(expected_result, RESOLVED) << "Unexpectedly resolved."; |
| 226 EXPECT_GT(web_session_id.length(), 0ul); | 226 EXPECT_GT(web_session_id.length(), 0ul); |
| 227 web_session_id_ = web_session_id; | 227 web_session_id_ = web_session_id; |
| 228 } | 228 } |
| 229 | 229 |
| 230 void OnResolve(PromiseResult expected) { | 230 void OnResolve(PromiseResult expected_result) { |
| 231 EXPECT_EQ(expected, RESOLVED); | 231 EXPECT_EQ(expected_result, RESOLVED) << "Unexpectedly resolved."; |
| 232 } | 232 } |
| 233 | 233 |
| 234 void OnReject(PromiseResult expected, | 234 void OnResolveWithUsableKeyIds(PromiseResult expected_result, |
| 235 uint32 expected_count, |
| 236 const KeyIdsVector& useable_key_ids) { |
| 237 EXPECT_EQ(expected_result, RESOLVED) << "Unexpectedly resolved."; |
| 238 EXPECT_EQ(expected_count, useable_key_ids.size()); |
| 239 useable_key_ids_ = useable_key_ids; |
| 240 } |
| 241 |
| 242 void OnReject(PromiseResult expected_result, |
| 235 MediaKeys::Exception exception_code, | 243 MediaKeys::Exception exception_code, |
| 236 uint32 system_code, | 244 uint32 system_code, |
| 237 const std::string& error_message) { | 245 const std::string& error_message) { |
| 238 EXPECT_EQ(expected, REJECTED); | 246 EXPECT_EQ(expected_result, REJECTED) << "Unexpectedly rejected."; |
| 239 } | 247 } |
| 240 | 248 |
| 241 scoped_ptr<SimpleCdmPromise> CreatePromise(PromiseResult expected) { | 249 scoped_ptr<SimpleCdmPromise> CreatePromise(PromiseResult expected_result) { |
| 242 scoped_ptr<SimpleCdmPromise> promise(new SimpleCdmPromise( | 250 scoped_ptr<SimpleCdmPromise> promise( |
| 243 base::Bind( | 251 new SimpleCdmPromise(base::Bind(&AesDecryptorTest::OnResolve, |
| 244 &AesDecryptorTest::OnResolve, base::Unretained(this), expected), | 252 base::Unretained(this), |
| 245 base::Bind( | 253 expected_result), |
| 246 &AesDecryptorTest::OnReject, base::Unretained(this), expected))); | 254 base::Bind(&AesDecryptorTest::OnReject, |
| 255 base::Unretained(this), |
| 256 expected_result))); |
| 247 return promise.Pass(); | 257 return promise.Pass(); |
| 248 } | 258 } |
| 249 | 259 |
| 250 scoped_ptr<NewSessionCdmPromise> CreateSessionPromise( | 260 scoped_ptr<NewSessionCdmPromise> CreateSessionPromise( |
| 251 PromiseResult expected) { | 261 PromiseResult expected_result) { |
| 252 scoped_ptr<NewSessionCdmPromise> promise(new NewSessionCdmPromise( | 262 scoped_ptr<NewSessionCdmPromise> promise(new NewSessionCdmPromise( |
| 253 base::Bind(&AesDecryptorTest::OnResolveWithSession, | 263 base::Bind(&AesDecryptorTest::OnResolveWithSession, |
| 254 base::Unretained(this), | 264 base::Unretained(this), |
| 255 expected), | 265 expected_result), |
| 256 base::Bind( | 266 base::Bind(&AesDecryptorTest::OnReject, |
| 257 &AesDecryptorTest::OnReject, base::Unretained(this), expected))); | 267 base::Unretained(this), |
| 268 expected_result))); |
| 258 return promise.Pass(); | 269 return promise.Pass(); |
| 259 } | 270 } |
| 260 | 271 |
| 272 scoped_ptr<KeyIdsPromise> CreateUsableKeyIdsPromise( |
| 273 PromiseResult expected_result, |
| 274 uint32 expected_count) { |
| 275 scoped_ptr<KeyIdsPromise> promise(new KeyIdsPromise( |
| 276 base::Bind(&AesDecryptorTest::OnResolveWithUsableKeyIds, |
| 277 base::Unretained(this), |
| 278 expected_result, |
| 279 expected_count), |
| 280 base::Bind(&AesDecryptorTest::OnReject, |
| 281 base::Unretained(this), |
| 282 expected_result))); |
| 283 return promise.Pass(); |
| 284 } |
| 285 |
| 261 // Creates a new session using |key_id|. Returns the session ID. | 286 // Creates a new session using |key_id|. Returns the session ID. |
| 262 std::string CreateSession(const std::vector<uint8>& key_id) { | 287 std::string CreateSession(const std::vector<uint8>& key_id) { |
| 263 DCHECK(!key_id.empty()); | 288 DCHECK(!key_id.empty()); |
| 264 EXPECT_CALL(*this, | 289 EXPECT_CALL(*this, |
| 265 OnSessionMessage(IsNotEmpty(), key_id, GURL::EmptyGURL())); | 290 OnSessionMessage(IsNotEmpty(), key_id, GURL::EmptyGURL())); |
| 266 decryptor_.CreateSession(std::string(), | 291 decryptor_.CreateSession(std::string(), |
| 267 &key_id[0], | 292 &key_id[0], |
| 268 key_id.size(), | 293 key_id.size(), |
| 269 MediaKeys::TEMPORARY_SESSION, | 294 MediaKeys::TEMPORARY_SESSION, |
| 270 CreateSessionPromise(RESOLVED)); | 295 CreateSessionPromise(RESOLVED)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 285 const std::string& key, | 310 const std::string& key, |
| 286 PromiseResult result) { | 311 PromiseResult result) { |
| 287 DCHECK(!key.empty()); | 312 DCHECK(!key.empty()); |
| 288 | 313 |
| 289 decryptor_.UpdateSession(session_id, | 314 decryptor_.UpdateSession(session_id, |
| 290 reinterpret_cast<const uint8*>(key.c_str()), | 315 reinterpret_cast<const uint8*>(key.c_str()), |
| 291 key.length(), | 316 key.length(), |
| 292 CreatePromise(result)); | 317 CreatePromise(result)); |
| 293 } | 318 } |
| 294 | 319 |
| 320 void GetUsableKeyIdsAndExpect(const std::string& session_id, |
| 321 PromiseResult expected_result, |
| 322 uint32 expected_count) { |
| 323 decryptor_.GetUsableKeyIds( |
| 324 session_id, CreateUsableKeyIdsPromise(expected_result, expected_count)); |
| 325 } |
| 326 |
| 327 bool UsableKeyIdsContains(std::vector<uint8> expected) { |
| 328 for (KeyIdsVector::iterator it = useable_key_ids_.begin(); |
| 329 it != useable_key_ids_.end(); |
| 330 ++it) { |
| 331 if (*it == expected) |
| 332 return true; |
| 333 } |
| 334 return false; |
| 335 } |
| 336 |
| 295 MOCK_METHOD2(BufferDecrypted, void(Decryptor::Status, | 337 MOCK_METHOD2(BufferDecrypted, void(Decryptor::Status, |
| 296 const scoped_refptr<DecoderBuffer>&)); | 338 const scoped_refptr<DecoderBuffer>&)); |
| 297 | 339 |
| 298 enum DecryptExpectation { | 340 enum DecryptExpectation { |
| 299 SUCCESS, | 341 SUCCESS, |
| 300 DATA_MISMATCH, | 342 DATA_MISMATCH, |
| 301 DATA_AND_SIZE_MISMATCH, | 343 DATA_AND_SIZE_MISMATCH, |
| 302 DECRYPT_ERROR, | 344 DECRYPT_ERROR, |
| 303 NO_KEY | 345 NO_KEY |
| 304 }; | 346 }; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 MOCK_METHOD3(OnSessionMessage, | 396 MOCK_METHOD3(OnSessionMessage, |
| 355 void(const std::string& web_session_id, | 397 void(const std::string& web_session_id, |
| 356 const std::vector<uint8>& message, | 398 const std::vector<uint8>& message, |
| 357 const GURL& destination_url)); | 399 const GURL& destination_url)); |
| 358 MOCK_METHOD1(OnSessionClosed, void(const std::string& web_session_id)); | 400 MOCK_METHOD1(OnSessionClosed, void(const std::string& web_session_id)); |
| 359 | 401 |
| 360 AesDecryptor decryptor_; | 402 AesDecryptor decryptor_; |
| 361 AesDecryptor::DecryptCB decrypt_cb_; | 403 AesDecryptor::DecryptCB decrypt_cb_; |
| 362 std::string web_session_id_; | 404 std::string web_session_id_; |
| 363 | 405 |
| 406 // Copy of the vector from the last successful call to |
| 407 // OnResolveWithUsableKeyIds(). |
| 408 KeyIdsVector useable_key_ids_; |
| 409 |
| 364 // Constants for testing. | 410 // Constants for testing. |
| 365 const std::vector<uint8> original_data_; | 411 const std::vector<uint8> original_data_; |
| 366 const std::vector<uint8> encrypted_data_; | 412 const std::vector<uint8> encrypted_data_; |
| 367 const std::vector<uint8> subsample_encrypted_data_; | 413 const std::vector<uint8> subsample_encrypted_data_; |
| 368 const std::vector<uint8> key_id_; | 414 const std::vector<uint8> key_id_; |
| 369 const std::vector<uint8> iv_; | 415 const std::vector<uint8> iv_; |
| 370 const std::vector<SubsampleEntry> normal_subsample_entries_; | 416 const std::vector<SubsampleEntry> normal_subsample_entries_; |
| 371 const std::vector<SubsampleEntry> no_subsample_entries_; | 417 const std::vector<SubsampleEntry> no_subsample_entries_; |
| 372 }; | 418 }; |
| 373 | 419 |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 782 " \"kty\": \"oct\"," | 828 " \"kty\": \"oct\"," |
| 783 " \"kid\": \"\"," | 829 " \"kid\": \"\"," |
| 784 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 830 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
| 785 " }" | 831 " }" |
| 786 " ]" | 832 " ]" |
| 787 "}"; | 833 "}"; |
| 788 UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, REJECTED); | 834 UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, REJECTED); |
| 789 ReleaseSession(session_id); | 835 ReleaseSession(session_id); |
| 790 } | 836 } |
| 791 | 837 |
| 838 TEST_F(AesDecryptorTest, GetKeyIds) { |
| 839 std::vector<uint8> key_id1(kKeyId, kKeyId + arraysize(kKeyId)); |
| 840 std::vector<uint8> key_id2(kKeyId2, kKeyId2 + arraysize(kKeyId2)); |
| 841 |
| 842 std::string session_id = CreateSession(key_id_); |
| 843 GetUsableKeyIdsAndExpect(session_id, RESOLVED, 0); |
| 844 EXPECT_FALSE(UsableKeyIdsContains(key_id1)); |
| 845 EXPECT_FALSE(UsableKeyIdsContains(key_id2)); |
| 846 |
| 847 // Add 1 key, verify ID is returned. |
| 848 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); |
| 849 GetUsableKeyIdsAndExpect(session_id, RESOLVED, 1); |
| 850 EXPECT_TRUE(UsableKeyIdsContains(key_id1)); |
| 851 EXPECT_FALSE(UsableKeyIdsContains(key_id2)); |
| 852 |
| 853 // Add second key, verify both IDs returned. |
| 854 UpdateSessionAndExpect(session_id, kKey2AsJWK, RESOLVED); |
| 855 GetUsableKeyIdsAndExpect(session_id, RESOLVED, 2); |
| 856 EXPECT_TRUE(UsableKeyIdsContains(key_id1)); |
| 857 EXPECT_TRUE(UsableKeyIdsContains(key_id2)); |
| 858 } |
| 859 |
| 792 } // namespace media | 860 } // namespace media |
| OLD | NEW |