decrypting_renderer_unittest.cc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "media/renderers/decrypting_renderer.h"
  5. #include "base/bind.h"
  6. #include "base/callback_helpers.h"
  7. #include "base/memory/raw_ptr.h"
  8. #include "base/task/single_thread_task_runner.h"
  9. #include "base/test/gmock_callback_support.h"
  10. #include "base/test/mock_callback.h"
  11. #include "base/test/task_environment.h"
  12. #include "media/base/demuxer_stream.h"
  13. #include "media/base/media_util.h"
  14. #include "media/base/mock_filters.h"
  15. #include "media/base/test_helpers.h"
  16. #include "media/filters/decrypting_media_resource.h"
  17. #include "testing/gmock/include/gmock/gmock.h"
  18. using ::base::test::RunCallback;
  19. using ::base::test::RunOnceCallback;
  20. using ::testing::_;
  21. using ::testing::AnyNumber;
  22. using ::testing::Invoke;
  23. using ::testing::Return;
  24. using ::testing::ReturnPointee;
  25. using ::testing::StrictMock;
  26. namespace media {
  27. class CdmContext;
  28. class DemuxerStream;
  29. class MediaLog;
  30. class DecryptingRendererTest : public testing::Test {
  31. public:
  32. DecryptingRendererTest() {
  33. auto renderer = std::make_unique<StrictMock<MockRenderer>>();
  34. renderer_ = renderer.get();
  35. decrypting_renderer_ = std::make_unique<DecryptingRenderer>(
  36. std::move(renderer), &null_media_log_,
  37. task_environment_.GetMainThreadTaskRunner());
  38. EXPECT_CALL(cdm_context_, RegisterEventCB(_)).Times(AnyNumber());
  39. EXPECT_CALL(cdm_context_, GetDecryptor())
  40. .WillRepeatedly(Return(&decryptor_));
  41. EXPECT_CALL(decryptor_, CanAlwaysDecrypt())
  42. .WillRepeatedly(ReturnPointee(&use_aes_decryptor_));
  43. EXPECT_CALL(decryptor_, CancelDecrypt(_)).Times(AnyNumber());
  44. EXPECT_CALL(media_resource_, GetAllStreams())
  45. .WillRepeatedly(Invoke(this, &DecryptingRendererTest::GetAllStreams));
  46. EXPECT_CALL(media_resource_, GetType())
  47. .WillRepeatedly(Return(MediaResource::STREAM));
  48. }
  49. ~DecryptingRendererTest() override {
  50. // Ensure that the DecryptingRenderer is destructed before other objects
  51. // that it internally references but does not own.
  52. decrypting_renderer_.reset();
  53. }
  54. void AddStream(DemuxerStream::Type type, bool encrypted) {
  55. streams_.push_back(CreateMockDemuxerStream(type, encrypted));
  56. }
  57. void UseAesDecryptor(bool use_aes_decryptor) {
  58. use_aes_decryptor_ = use_aes_decryptor;
  59. }
  60. std::vector<DemuxerStream*> GetAllStreams() {
  61. std::vector<DemuxerStream*> streams;
  62. for (auto& stream : streams_) {
  63. streams.push_back(stream.get());
  64. }
  65. return streams;
  66. }
  67. protected:
  68. // Invoking InitializeRenderer(false) will cause the initialization of the
  69. // DecryptingRenderer to halt and an error will be propagated to the media
  70. // pipeline.
  71. void InitializeDecryptingRendererWithFalse() {
  72. decrypting_renderer_->InitializeRenderer(false);
  73. }
  74. bool use_aes_decryptor_ = false;
  75. base::test::TaskEnvironment task_environment_;
  76. base::MockCallback<Renderer::CdmAttachedCB> set_cdm_cb_;
  77. base::MockOnceCallback<void(PipelineStatus)> renderer_init_cb_;
  78. NullMediaLog null_media_log_;
  79. StrictMock<MockCdmContext> cdm_context_;
  80. StrictMock<MockDecryptor> decryptor_;
  81. StrictMock<MockMediaResource> media_resource_;
  82. StrictMock<MockRendererClient> renderer_client_;
  83. raw_ptr<StrictMock<MockRenderer>> renderer_;
  84. std::unique_ptr<DecryptingRenderer> decrypting_renderer_;
  85. std::vector<std::unique_ptr<StrictMock<MockDemuxerStream>>> streams_;
  86. };
  87. TEST_F(DecryptingRendererTest, ClearStreams_NoCdm) {
  88. AddStream(DemuxerStream::AUDIO, /* encrypted = */ false);
  89. AddStream(DemuxerStream::VIDEO, /* encrypted = */ false);
  90. EXPECT_CALL(*renderer_, OnInitialize(_, _, _))
  91. .WillOnce(RunOnceCallback<2>(PIPELINE_OK));
  92. EXPECT_CALL(renderer_init_cb_, Run(HasStatusCode(PIPELINE_OK)));
  93. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  94. renderer_init_cb_.Get());
  95. task_environment_.RunUntilIdle();
  96. EXPECT_FALSE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  97. }
  98. TEST_F(DecryptingRendererTest, ClearStreams_AesDecryptor) {
  99. AddStream(DemuxerStream::AUDIO, /* encrypted = */ false);
  100. AddStream(DemuxerStream::VIDEO, /* encrypted = */ false);
  101. UseAesDecryptor(true);
  102. EXPECT_CALL(*renderer_, OnInitialize(_, _, _))
  103. .WillOnce(RunOnceCallback<2>(PIPELINE_OK));
  104. EXPECT_CALL(set_cdm_cb_, Run(true));
  105. EXPECT_CALL(renderer_init_cb_, Run(HasStatusCode(PIPELINE_OK)));
  106. decrypting_renderer_->SetCdm(&cdm_context_, set_cdm_cb_.Get());
  107. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  108. renderer_init_cb_.Get());
  109. task_environment_.RunUntilIdle();
  110. EXPECT_TRUE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  111. }
  112. TEST_F(DecryptingRendererTest, ClearStreams_OtherCdm) {
  113. AddStream(DemuxerStream::AUDIO, /* encrypted = */ false);
  114. AddStream(DemuxerStream::VIDEO, /* encrypted = */ false);
  115. EXPECT_CALL(*renderer_, OnInitialize(_, _, _))
  116. .WillOnce(RunOnceCallback<2>(PIPELINE_OK));
  117. EXPECT_CALL(*renderer_, OnSetCdm(_, _)).WillOnce(RunOnceCallback<1>(true));
  118. EXPECT_CALL(renderer_init_cb_, Run(HasStatusCode(PIPELINE_OK)));
  119. EXPECT_CALL(set_cdm_cb_, Run(true));
  120. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  121. renderer_init_cb_.Get());
  122. decrypting_renderer_->SetCdm(&cdm_context_, set_cdm_cb_.Get());
  123. task_environment_.RunUntilIdle();
  124. EXPECT_FALSE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  125. }
  126. TEST_F(DecryptingRendererTest, EncryptedStreams_NoCdm) {
  127. AddStream(DemuxerStream::AUDIO, /* encrypted = */ true);
  128. AddStream(DemuxerStream::VIDEO, /* encrypted = */ true);
  129. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  130. renderer_init_cb_.Get());
  131. task_environment_.RunUntilIdle();
  132. EXPECT_FALSE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  133. }
  134. TEST_F(DecryptingRendererTest, EncryptedStreams_AesDecryptor) {
  135. AddStream(DemuxerStream::AUDIO, /* encrypted = */ true);
  136. AddStream(DemuxerStream::VIDEO, /* encrypted = */ true);
  137. UseAesDecryptor(true);
  138. EXPECT_CALL(*renderer_, OnInitialize(_, _, _))
  139. .WillOnce(RunOnceCallback<2>(PIPELINE_OK));
  140. EXPECT_CALL(renderer_init_cb_, Run(HasStatusCode(PIPELINE_OK)));
  141. EXPECT_CALL(set_cdm_cb_, Run(true));
  142. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  143. renderer_init_cb_.Get());
  144. decrypting_renderer_->SetCdm(&cdm_context_, set_cdm_cb_.Get());
  145. task_environment_.RunUntilIdle();
  146. EXPECT_TRUE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  147. }
  148. TEST_F(DecryptingRendererTest, EncryptedStreams_OtherCdm) {
  149. AddStream(DemuxerStream::AUDIO, /* encrypted = */ true);
  150. AddStream(DemuxerStream::VIDEO, /* encrypted = */ true);
  151. EXPECT_CALL(*renderer_, OnInitialize(_, _, _))
  152. .WillOnce(RunOnceCallback<2>(PIPELINE_OK));
  153. EXPECT_CALL(*renderer_, OnSetCdm(_, _)).WillOnce(RunOnceCallback<1>(true));
  154. EXPECT_CALL(renderer_init_cb_, Run(HasStatusCode(PIPELINE_OK)));
  155. EXPECT_CALL(set_cdm_cb_, Run(true));
  156. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  157. renderer_init_cb_.Get());
  158. decrypting_renderer_->SetCdm(&cdm_context_, set_cdm_cb_.Get());
  159. task_environment_.RunUntilIdle();
  160. EXPECT_FALSE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  161. }
  162. TEST_F(DecryptingRendererTest, EncryptedStreams_AesDecryptor_CdmSetBeforeInit) {
  163. AddStream(DemuxerStream::AUDIO, /* encrypted = */ true);
  164. AddStream(DemuxerStream::VIDEO, /* encrypted = */ true);
  165. UseAesDecryptor(true);
  166. EXPECT_CALL(*renderer_, OnInitialize(_, _, _))
  167. .WillOnce(RunOnceCallback<2>(PIPELINE_OK));
  168. EXPECT_CALL(renderer_init_cb_, Run(HasStatusCode(PIPELINE_OK)));
  169. EXPECT_CALL(set_cdm_cb_, Run(true));
  170. decrypting_renderer_->SetCdm(&cdm_context_, set_cdm_cb_.Get());
  171. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  172. renderer_init_cb_.Get());
  173. task_environment_.RunUntilIdle();
  174. EXPECT_TRUE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  175. }
  176. TEST_F(DecryptingRendererTest, EncryptedStreams_OtherCdm_CdmSetBeforeInit) {
  177. AddStream(DemuxerStream::AUDIO, /* encrypted = */ true);
  178. AddStream(DemuxerStream::VIDEO, /* encrypted = */ true);
  179. EXPECT_CALL(*renderer_, OnInitialize(_, _, _))
  180. .WillOnce(RunOnceCallback<2>(PIPELINE_OK));
  181. EXPECT_CALL(*renderer_, OnSetCdm(_, _)).WillOnce(RunOnceCallback<1>(true));
  182. EXPECT_CALL(renderer_init_cb_, Run(HasStatusCode(PIPELINE_OK)));
  183. EXPECT_CALL(set_cdm_cb_, Run(true));
  184. decrypting_renderer_->SetCdm(&cdm_context_, set_cdm_cb_.Get());
  185. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  186. renderer_init_cb_.Get());
  187. task_environment_.RunUntilIdle();
  188. EXPECT_FALSE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  189. }
  190. TEST_F(DecryptingRendererTest, EncryptedAndClearStream_OtherCdm) {
  191. AddStream(DemuxerStream::AUDIO, /* encrypted = */ false);
  192. AddStream(DemuxerStream::VIDEO, /* encrypted = */ true);
  193. EXPECT_CALL(*renderer_, OnInitialize(_, _, _))
  194. .WillOnce(RunOnceCallback<2>(PIPELINE_OK));
  195. EXPECT_CALL(*renderer_, OnSetCdm(_, _)).WillOnce(RunOnceCallback<1>(true));
  196. EXPECT_CALL(renderer_init_cb_, Run(HasStatusCode(PIPELINE_OK)));
  197. EXPECT_CALL(set_cdm_cb_, Run(true));
  198. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  199. renderer_init_cb_.Get());
  200. decrypting_renderer_->SetCdm(&cdm_context_, set_cdm_cb_.Get());
  201. task_environment_.RunUntilIdle();
  202. EXPECT_FALSE(decrypting_renderer_->HasDecryptingMediaResourceForTesting());
  203. }
  204. TEST_F(DecryptingRendererTest, DecryptingMediaResourceInitFails) {
  205. AddStream(DemuxerStream::AUDIO, /* encrypted = */ false);
  206. AddStream(DemuxerStream::VIDEO, /* encrypted = */ true);
  207. UseAesDecryptor(true);
  208. EXPECT_CALL(renderer_init_cb_,
  209. Run(HasStatusCode(PIPELINE_ERROR_INITIALIZATION_FAILED)));
  210. decrypting_renderer_->Initialize(&media_resource_, &renderer_client_,
  211. renderer_init_cb_.Get());
  212. task_environment_.RunUntilIdle();
  213. // Cause a PIPELINE_ERROR_INITIALIZATION_FAILED error to be passed as a
  214. // parameter to the initialization callback.
  215. InitializeDecryptingRendererWithFalse();
  216. }
  217. } // namespace media