OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "webkit/media/crypto/proxy_decryptor.h" | 5 #include "webkit/media/crypto/proxy_decryptor.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 std::string(reinterpret_cast<const char*>(kFakeKeyId), | 46 std::string(reinterpret_cast<const char*>(kFakeKeyId), |
47 arraysize(kFakeKeyId)), | 47 arraysize(kFakeKeyId)), |
48 std::string(reinterpret_cast<const char*>(kFakeIv), | 48 std::string(reinterpret_cast<const char*>(kFakeIv), |
49 DecryptConfig::kDecryptionKeySize), | 49 DecryptConfig::kDecryptionKeySize), |
50 encrypted_frame_offset, | 50 encrypted_frame_offset, |
51 std::vector<media::SubsampleEntry>()))); | 51 std::vector<media::SubsampleEntry>()))); |
52 return encrypted_buffer; | 52 return encrypted_buffer; |
53 } | 53 } |
54 | 54 |
55 ACTION_P2(RunDecryptCB, status, buffer) { | 55 ACTION_P2(RunDecryptCB, status, buffer) { |
56 arg1.Run(status, buffer); | 56 arg2.Run(status, buffer); |
57 } | 57 } |
58 | 58 |
59 ACTION_P3(ResetAndRunDecryptCB, decrypt_cb, status, buffer) { | 59 ACTION_P3(ResetAndRunDecryptCB, decrypt_cb, status, buffer) { |
60 base::ResetAndReturn(decrypt_cb).Run(status, buffer); | 60 base::ResetAndReturn(decrypt_cb).Run(status, buffer); |
61 } | 61 } |
62 | 62 |
63 ACTION_P(ScheduleMessageLoopToStop, message_loop) { | 63 ACTION_P(ScheduleMessageLoopToStop, message_loop) { |
64 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 64 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
65 } | 65 } |
66 | 66 |
67 // Tests the interaction between external Decryptor calls and concrete Decryptor | 67 // Tests the interaction between external Decryptor calls and concrete Decryptor |
68 // implementations. This test is not interested in any specific Decryptor | 68 // implementations. This test is not interested in any specific Decryptor |
69 // implementation. A MockDecryptor is used here to serve this purpose. | 69 // implementation. A MockDecryptor is used here to serve this purpose. |
70 class ProxyDecryptorTest : public testing::Test { | 70 class ProxyDecryptorTest : public testing::Test { |
71 public: | 71 public: |
72 ProxyDecryptorTest() | 72 ProxyDecryptorTest() |
73 : proxy_decryptor_(message_loop_.message_loop_proxy(), | 73 : proxy_decryptor_(message_loop_.message_loop_proxy(), |
74 &client_, NULL, NULL), | 74 &client_, NULL, NULL), |
75 real_decryptor_(new media::MockDecryptor()), | 75 real_decryptor_(new media::MockDecryptor()), |
76 scoped_real_decryptor_(real_decryptor_), | 76 scoped_real_decryptor_(real_decryptor_), |
| 77 stream_type_(media::Decryptor::kVideo), |
77 decrypt_cb_(base::Bind(&ProxyDecryptorTest::DeliverBuffer, | 78 decrypt_cb_(base::Bind(&ProxyDecryptorTest::DeliverBuffer, |
78 base::Unretained(this))), | 79 base::Unretained(this))), |
79 encrypted_buffer_(CreateFakeEncryptedBuffer()), | 80 encrypted_buffer_(CreateFakeEncryptedBuffer()), |
80 decrypted_buffer_(DecoderBuffer::CopyFrom(kDecryptedData, | 81 decrypted_buffer_(DecoderBuffer::CopyFrom(kDecryptedData, |
81 arraysize(kDecryptedData))), | 82 arraysize(kDecryptedData))), |
82 null_buffer_(scoped_refptr<DecoderBuffer>()) { | 83 null_buffer_(scoped_refptr<DecoderBuffer>()) { |
83 } | 84 } |
84 | 85 |
85 // Instead of calling ProxyDecryptor::GenerateKeyRequest() here to create a | 86 // Instead of calling ProxyDecryptor::GenerateKeyRequest() here to create a |
86 // real Decryptor, inject a MockDecryptor for testing purpose. | 87 // real Decryptor, inject a MockDecryptor for testing purpose. |
(...skipping 28 matching lines...) Expand all Loading... |
115 // mock decryptor. | 116 // mock decryptor. |
116 media::MockDecryptor* real_decryptor_; | 117 media::MockDecryptor* real_decryptor_; |
117 | 118 |
118 // Scoped pointer that takes ownership of |real_decryptor_|. When | 119 // Scoped pointer that takes ownership of |real_decryptor_|. When |
119 // GenerateKeyRequest() is called, the ownership of |real_decryptor_| is | 120 // GenerateKeyRequest() is called, the ownership of |real_decryptor_| is |
120 // passed from |scoped_real_decryptor_| to |proxy_decryptor_|. We need this | 121 // passed from |scoped_real_decryptor_| to |proxy_decryptor_|. We need this |
121 // to manage life time of |real_decryptor_| because not all tests call | 122 // to manage life time of |real_decryptor_| because not all tests call |
122 // GenerateKeyRequest(). | 123 // GenerateKeyRequest(). |
123 scoped_ptr<Decryptor> scoped_real_decryptor_; | 124 scoped_ptr<Decryptor> scoped_real_decryptor_; |
124 | 125 |
| 126 media::Decryptor::StreamType stream_type_; |
| 127 |
125 Decryptor::DecryptCB decrypt_cb_; | 128 Decryptor::DecryptCB decrypt_cb_; |
126 | 129 |
127 scoped_refptr<DecoderBuffer> encrypted_buffer_; | 130 scoped_refptr<DecoderBuffer> encrypted_buffer_; |
128 scoped_refptr<DecoderBuffer> decrypted_buffer_; | 131 scoped_refptr<DecoderBuffer> decrypted_buffer_; |
129 scoped_refptr<DecoderBuffer> null_buffer_; | 132 scoped_refptr<DecoderBuffer> null_buffer_; |
130 | 133 |
131 private: | 134 private: |
132 DISALLOW_COPY_AND_ASSIGN(ProxyDecryptorTest); | 135 DISALLOW_COPY_AND_ASSIGN(ProxyDecryptorTest); |
133 }; | 136 }; |
134 | 137 |
135 // Tests a typical use case: GKR(), AddKey() and Decrypt() succeeds. | 138 // Tests a typical use case: GKR(), AddKey() and Decrypt() succeeds. |
136 TEST_F(ProxyDecryptorTest, NormalDecryption_Success) { | 139 TEST_F(ProxyDecryptorTest, NormalDecryption_Success) { |
137 GenerateKeyRequest(); | 140 GenerateKeyRequest(); |
138 AddKey(); | 141 AddKey(); |
139 | 142 |
140 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 143 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
141 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); | 144 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); |
142 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)); | 145 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)); |
143 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 146 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
144 } | 147 } |
145 | 148 |
146 // Tests the case where Decrypt() fails. | 149 // Tests the case where Decrypt() fails. |
147 TEST_F(ProxyDecryptorTest, NormalDecryption_Error) { | 150 TEST_F(ProxyDecryptorTest, NormalDecryption_Error) { |
148 GenerateKeyRequest(); | 151 GenerateKeyRequest(); |
149 AddKey(); | 152 AddKey(); |
150 | 153 |
151 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 154 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
152 .WillOnce(RunDecryptCB(Decryptor::kError, null_buffer_)); | 155 .WillOnce(RunDecryptCB(Decryptor::kError, null_buffer_)); |
153 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kError, IsNull())); | 156 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kError, IsNull())); |
154 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 157 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
155 } | 158 } |
156 | 159 |
157 // Tests the case where no key is available for decryption. | 160 // Tests the case where no key is available for decryption. |
158 TEST_F(ProxyDecryptorTest, NormalDecryption_NoKey) { | 161 TEST_F(ProxyDecryptorTest, NormalDecryption_NoKey) { |
159 GenerateKeyRequest(); | 162 GenerateKeyRequest(); |
160 | 163 |
161 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 164 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
162 .WillOnce(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); | 165 .WillOnce(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); |
163 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))); | 166 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))); |
164 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 167 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
165 | 168 |
166 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)); | 169 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)); |
167 proxy_decryptor_.CancelDecrypt(); | 170 proxy_decryptor_.CancelDecrypt(stream_type_); |
168 } | 171 } |
169 | 172 |
170 // Tests the case where Decrypt() is called after the right key is added. | 173 // Tests the case where Decrypt() is called after the right key is added. |
171 TEST_F(ProxyDecryptorTest, DecryptBeforeAddKey) { | 174 TEST_F(ProxyDecryptorTest, DecryptBeforeAddKey) { |
172 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))); | 175 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))); |
173 GenerateKeyRequest(); | 176 GenerateKeyRequest(); |
174 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 177 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
175 .WillOnce(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); | 178 .WillOnce(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); |
176 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 179 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
177 | 180 |
178 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 181 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
179 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); | 182 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); |
180 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) | 183 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) |
181 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); | 184 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); |
182 AddKey(); | 185 AddKey(); |
183 | 186 |
184 message_loop_.Run(); | 187 message_loop_.Run(); |
185 } | 188 } |
186 | 189 |
187 // Tests the case where Decrypt() is called before GKR() and the right key is | 190 // Tests the case where Decrypt() is called before GKR() and the right key is |
188 // added. | 191 // added. |
189 TEST_F(ProxyDecryptorTest, DecryptBeforeGenerateKeyRequest) { | 192 TEST_F(ProxyDecryptorTest, DecryptBeforeGenerateKeyRequest) { |
190 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))); | 193 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))); |
191 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 194 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
192 | 195 |
193 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 196 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
194 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); | 197 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); |
195 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) | 198 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) |
196 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); | 199 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); |
197 GenerateKeyRequest(); | 200 GenerateKeyRequest(); |
198 AddKey(); | 201 AddKey(); |
199 | 202 |
200 message_loop_.Run(); | 203 message_loop_.Run(); |
201 } | 204 } |
202 | 205 |
203 // Tests the case where multiple AddKey() is called to add some irrelevant keys | 206 // Tests the case where multiple AddKey() is called to add some irrelevant keys |
204 // before the real key that can decrypt |encrypted_buffer_| is added. | 207 // before the real key that can decrypt |encrypted_buffer_| is added. |
205 TEST_F(ProxyDecryptorTest, MultipleAddKeys) { | 208 TEST_F(ProxyDecryptorTest, MultipleAddKeys) { |
206 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))) | 209 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))) |
207 .Times(AtLeast(1)); | 210 .Times(AtLeast(1)); |
208 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 211 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
209 | 212 |
210 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 213 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
211 .WillRepeatedly(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); | 214 .WillRepeatedly(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); |
212 GenerateKeyRequest(); | 215 GenerateKeyRequest(); |
213 const int number_of_irrelevant_addkey = 5; | 216 const int number_of_irrelevant_addkey = 5; |
214 for (int i = 0; i < number_of_irrelevant_addkey; ++i) | 217 for (int i = 0; i < number_of_irrelevant_addkey; ++i) |
215 AddKey(); // Some irrelevant keys are added. | 218 AddKey(); // Some irrelevant keys are added. |
216 | 219 |
217 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 220 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
218 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); | 221 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); |
219 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) | 222 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) |
220 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); | 223 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); |
221 AddKey(); // Correct key added. | 224 AddKey(); // Correct key added. |
222 | 225 |
223 message_loop_.Run(); | 226 message_loop_.Run(); |
224 } | 227 } |
225 | 228 |
226 // Test the case where a new key is added before the |real_decryptor_| returns | 229 // Test the case where a new key is added before the |real_decryptor_| returns |
227 // kNoKey. The exact call sequence is: | 230 // kNoKey. The exact call sequence is: |
228 // 1, Decrypt an encrypted buffer. | 231 // 1, Decrypt an encrypted buffer. |
229 // 2, The correct key is added. | 232 // 2, The correct key is added. |
230 // 3, The previously decrypt call returned kNoKey. | 233 // 3, The previously decrypt call returned kNoKey. |
231 // In this case, the ProxyDecryptor is smart enough to try the decryption again | 234 // In this case, the ProxyDecryptor is smart enough to try the decryption again |
232 // and get the buffer decrypted! | 235 // and get the buffer decrypted! |
233 TEST_F(ProxyDecryptorTest, AddKeyAfterDecryptButBeforeNoKeyReturned) { | 236 TEST_F(ProxyDecryptorTest, AddKeyAfterDecryptButBeforeNoKeyReturned) { |
234 Decryptor::DecryptCB decrypt_cb; | 237 Decryptor::DecryptCB decrypt_cb; |
235 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 238 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
236 .WillOnce(SaveArg<1>(&decrypt_cb)); | 239 .WillOnce(SaveArg<2>(&decrypt_cb)); |
237 | 240 |
238 GenerateKeyRequest(); | 241 GenerateKeyRequest(); |
239 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 242 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
240 EXPECT_FALSE(decrypt_cb.is_null()); | 243 EXPECT_FALSE(decrypt_cb.is_null()); |
241 | 244 |
242 AddKey(); | 245 AddKey(); |
243 | 246 |
244 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 247 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
245 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); | 248 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); |
246 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) | 249 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) |
247 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); | 250 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); |
248 base::ResetAndReturn(&decrypt_cb).Run(Decryptor::kNoKey, null_buffer_); | 251 base::ResetAndReturn(&decrypt_cb).Run(Decryptor::kNoKey, null_buffer_); |
249 | 252 |
250 message_loop_.Run(); | 253 message_loop_.Run(); |
251 } | 254 } |
252 | 255 |
253 // Test the case where we cancel the pending decryption callback even before | 256 // Test the case where we cancel the pending decryption callback even before |
254 // GenerateKeyRequest is called. In this case, the decryptor was not even | 257 // GenerateKeyRequest is called. In this case, the decryptor was not even |
255 // created! | 258 // created! |
256 TEST_F(ProxyDecryptorTest, CancelDecryptWithoutGenerateKeyRequestCalled) { | 259 TEST_F(ProxyDecryptorTest, CancelDecryptWithoutGenerateKeyRequestCalled) { |
257 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))) | 260 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))) |
258 .Times(AtLeast(1)); | 261 .Times(AtLeast(1)); |
259 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 262 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
260 | 263 |
261 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)) | 264 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)) |
262 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); | 265 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); |
263 proxy_decryptor_.CancelDecrypt(); | 266 proxy_decryptor_.CancelDecrypt(stream_type_); |
264 | 267 |
265 message_loop_.Run(); | 268 message_loop_.Run(); |
266 } | 269 } |
267 | 270 |
268 // Test the case where we cancel the pending decryption callback when it's | 271 // Test the case where we cancel the pending decryption callback when it's |
269 // stored in the ProxyDecryptor. | 272 // stored in the ProxyDecryptor. |
270 TEST_F(ProxyDecryptorTest, CancelDecryptWhenDecryptPendingInProxyDecryptor) { | 273 TEST_F(ProxyDecryptorTest, CancelDecryptWhenDecryptPendingInProxyDecryptor) { |
271 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))) | 274 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))) |
272 .Times(AtLeast(1)); | 275 .Times(AtLeast(1)); |
273 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 276 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
274 .WillRepeatedly(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); | 277 .WillRepeatedly(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); |
275 GenerateKeyRequest(); | 278 GenerateKeyRequest(); |
276 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 279 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
277 | 280 |
278 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)) | 281 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)) |
279 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); | 282 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); |
280 proxy_decryptor_.CancelDecrypt(); | 283 proxy_decryptor_.CancelDecrypt(stream_type_); |
281 | 284 |
282 message_loop_.Run(); | 285 message_loop_.Run(); |
283 } | 286 } |
284 | 287 |
285 // Test the case where we cancel the pending decryption callback when it's | 288 // Test the case where we cancel the pending decryption callback when it's |
286 // pending at the |real_decryptor_|. | 289 // pending at the |real_decryptor_|. |
287 TEST_F(ProxyDecryptorTest, CancelDecryptWhenDecryptPendingInRealDecryptor) { | 290 TEST_F(ProxyDecryptorTest, CancelDecryptWhenDecryptPendingInRealDecryptor) { |
288 Decryptor::DecryptCB decrypt_cb; | 291 Decryptor::DecryptCB decrypt_cb; |
289 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 292 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
290 .WillOnce(SaveArg<1>(&decrypt_cb)); | 293 .WillOnce(SaveArg<2>(&decrypt_cb)); |
291 GenerateKeyRequest(); | 294 GenerateKeyRequest(); |
292 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 295 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
293 EXPECT_FALSE(decrypt_cb.is_null()); | 296 EXPECT_FALSE(decrypt_cb.is_null()); |
294 | 297 |
295 // Even though the real decryptor returns kError, DeliverBuffer() should | 298 // Even though the real decryptor returns kError, DeliverBuffer() should |
296 // still be called with kSuccess and NULL because we are canceling the | 299 // still be called with kSuccess and NULL because we are canceling the |
297 // decryption. | 300 // decryption. |
298 EXPECT_CALL(*real_decryptor_, CancelDecrypt()) | 301 EXPECT_CALL(*real_decryptor_, CancelDecrypt(stream_type_)) |
299 .WillOnce(ResetAndRunDecryptCB(&decrypt_cb, | 302 .WillOnce(ResetAndRunDecryptCB(&decrypt_cb, |
300 Decryptor::kError, null_buffer_)); | 303 Decryptor::kError, null_buffer_)); |
301 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)) | 304 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)) |
302 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); | 305 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); |
303 proxy_decryptor_.CancelDecrypt(); | 306 proxy_decryptor_.CancelDecrypt(stream_type_); |
304 | 307 |
305 message_loop_.Run(); | 308 message_loop_.Run(); |
306 } | 309 } |
307 | 310 |
308 // Test the case where we try to decrypt again after the previous decrypt was | 311 // Test the case where we try to decrypt again after the previous decrypt was |
309 // canceled. | 312 // canceled. |
310 TEST_F(ProxyDecryptorTest, DecryptAfterCancelDecrypt) { | 313 TEST_F(ProxyDecryptorTest, DecryptAfterCancelDecrypt) { |
311 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))) | 314 EXPECT_CALL(client_, NeedKeyMock("", "", NotNull(), arraysize(kFakeKeyId))) |
312 .Times(AtLeast(1)); | 315 .Times(AtLeast(1)); |
313 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 316 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
314 .WillRepeatedly(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); | 317 .WillRepeatedly(RunDecryptCB(Decryptor::kNoKey, null_buffer_)); |
315 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 318 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
316 GenerateKeyRequest(); | 319 GenerateKeyRequest(); |
317 | 320 |
318 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)); | 321 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, null_buffer_)); |
319 proxy_decryptor_.CancelDecrypt(); | 322 proxy_decryptor_.CancelDecrypt(stream_type_); |
320 | 323 |
321 AddKey(); | 324 AddKey(); |
322 | 325 |
323 EXPECT_CALL(*real_decryptor_, Decrypt(encrypted_buffer_, _)) | 326 EXPECT_CALL(*real_decryptor_, Decrypt(stream_type_, encrypted_buffer_, _)) |
324 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); | 327 .WillOnce(RunDecryptCB(Decryptor::kSuccess, decrypted_buffer_)); |
325 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) | 328 EXPECT_CALL(*this, DeliverBuffer(Decryptor::kSuccess, decrypted_buffer_)) |
326 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); | 329 .WillOnce(ScheduleMessageLoopToStop(&message_loop_)); |
327 proxy_decryptor_.Decrypt(encrypted_buffer_, decrypt_cb_); | 330 proxy_decryptor_.Decrypt(stream_type_, encrypted_buffer_, decrypt_cb_); |
328 | 331 |
329 message_loop_.Run(); | 332 message_loop_.Run(); |
330 } | 333 } |
331 | 334 |
332 } // namespace webkit_media | 335 } // namespace webkit_media |
OLD | NEW |