| // Copyright (c) 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_BASE_MOCK_FILTERS_H_ |
| #define MEDIA_BASE_MOCK_FILTERS_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/callback.h" |
| #include "base/macros.h" |
| #include "build/build_config.h" |
| #include "build/chromeos_buildflags.h" |
| #include "media/base/audio_decoder.h" |
| #include "media/base/audio_decoder_config.h" |
| #include "media/base/audio_encoder.h" |
| #include "media/base/audio_parameters.h" |
| #include "media/base/audio_renderer.h" |
| #include "media/base/callback_registry.h" |
| #include "media/base/cdm_config.h" |
| #include "media/base/cdm_context.h" |
| #include "media/base/cdm_factory.h" |
| #include "media/base/cdm_key_information.h" |
| #include "media/base/cdm_promise.h" |
| #include "media/base/cdm_promise_adapter.h" |
| #include "media/base/content_decryption_module.h" |
| #include "media/base/decoder_buffer.h" |
| #include "media/base/decryptor.h" |
| #include "media/base/demuxer.h" |
| #include "media/base/media_client.h" |
| #include "media/base/media_track.h" |
| #include "media/base/pipeline.h" |
| #include "media/base/pipeline_status.h" |
| #include "media/base/renderer.h" |
| #include "media/base/renderer_client.h" |
| #include "media/base/renderer_factory.h" |
| #include "media/base/stream_parser.h" |
| #include "media/base/text_track.h" |
| #include "media/base/text_track_config.h" |
| #include "media/base/time_source.h" |
| #include "media/base/video_decoder.h" |
| #include "media/base/video_decoder_config.h" |
| #include "media/base/video_encoder.h" |
| #include "media/base/video_frame.h" |
| #include "media/base/video_renderer.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "url/origin.h" |
| |
| namespace media { |
| |
| class MockPipelineClient : public Pipeline::Client { |
| public: |
| MockPipelineClient(); |
| ~MockPipelineClient(); |
| |
| MOCK_METHOD1(OnError, void(PipelineStatus)); |
| MOCK_METHOD0(OnEnded, void()); |
| MOCK_METHOD1(OnMetadata, void(const PipelineMetadata&)); |
| MOCK_METHOD2(OnBufferingStateChange, |
| void(BufferingState, BufferingStateChangeReason)); |
| MOCK_METHOD0(OnDurationChange, void()); |
| MOCK_METHOD2(OnAddTextTrack, |
| void(const TextTrackConfig&, AddTextTrackDoneCB)); |
| MOCK_METHOD1(OnWaiting, void(WaitingReason)); |
| MOCK_METHOD1(OnAudioConfigChange, void(const AudioDecoderConfig&)); |
| MOCK_METHOD1(OnVideoConfigChange, void(const VideoDecoderConfig&)); |
| MOCK_METHOD1(OnVideoNaturalSizeChange, void(const gfx::Size&)); |
| MOCK_METHOD1(OnVideoOpacityChange, void(bool)); |
| MOCK_METHOD1(OnVideoFrameRateChange, void(absl::optional<int>)); |
| MOCK_METHOD0(OnVideoAverageKeyframeDistanceUpdate, void()); |
| MOCK_METHOD1(OnAudioPipelineInfoChange, void(const AudioPipelineInfo&)); |
| MOCK_METHOD1(OnVideoPipelineInfoChange, void(const VideoPipelineInfo&)); |
| MOCK_METHOD1(OnRemotePlayStateChange, void(MediaStatus::State state)); |
| }; |
| |
| class MockPipeline : public Pipeline { |
| public: |
| MockPipeline(); |
| |
| MockPipeline(const MockPipeline&) = delete; |
| MockPipeline& operator=(const MockPipeline&) = delete; |
| |
| ~MockPipeline() override; |
| |
| void Start(StartType start_type, |
| Demuxer* demuxer, |
| Client* client, |
| PipelineStatusCallback seek_cb) { |
| OnStart(start_type, demuxer, client, seek_cb); |
| } |
| MOCK_METHOD4(OnStart, |
| void(StartType, Demuxer*, Client*, PipelineStatusCallback&)); |
| MOCK_METHOD0(Stop, void()); |
| void Seek(base::TimeDelta time, PipelineStatusCallback seek_cb) { |
| OnSeek(time, seek_cb); |
| } |
| MOCK_METHOD2(OnSeek, void(base::TimeDelta, PipelineStatusCallback&)); |
| void Suspend(PipelineStatusCallback cb) { OnSuspend(cb); } |
| MOCK_METHOD1(OnSuspend, void(PipelineStatusCallback&)); |
| void Resume(base::TimeDelta time, PipelineStatusCallback seek_cb) { |
| OnResume(time, seek_cb); |
| } |
| MOCK_METHOD2(OnResume, void(base::TimeDelta, PipelineStatusCallback&)); |
| MOCK_METHOD2(OnEnabledAudioTracksChanged, |
| void(const std::vector<MediaTrack::Id>&, base::OnceClosure)); |
| MOCK_METHOD2(OnSelectedVideoTrackChanged, |
| void(absl::optional<MediaTrack::Id>, base::OnceClosure)); |
| |
| // TODO(sandersd): This should automatically return true between Start() and |
| // Stop(). (Or better, remove it from the interface entirely.) |
| MOCK_CONST_METHOD0(IsRunning, bool()); |
| |
| MOCK_CONST_METHOD0(IsSuspended, bool()); |
| |
| // TODO(sandersd): These should be regular getters/setters. |
| MOCK_CONST_METHOD0(GetPlaybackRate, double()); |
| MOCK_METHOD1(SetPlaybackRate, void(double)); |
| MOCK_CONST_METHOD0(GetVolume, float()); |
| MOCK_METHOD1(SetVolume, void(float)); |
| MOCK_METHOD1(SetLatencyHint, void(absl::optional<base::TimeDelta>)); |
| MOCK_METHOD1(SetPreservesPitch, void(bool)); |
| MOCK_METHOD1(SetAutoplayInitiated, void(bool)); |
| |
| // TODO(sandersd): These should probably have setters too. |
| MOCK_CONST_METHOD0(GetMediaTime, base::TimeDelta()); |
| MOCK_CONST_METHOD0(GetBufferedTimeRanges, Ranges<base::TimeDelta>()); |
| MOCK_CONST_METHOD0(GetMediaDuration, base::TimeDelta()); |
| MOCK_METHOD0(DidLoadingProgress, bool()); |
| MOCK_CONST_METHOD0(GetStatistics, PipelineStatistics()); |
| |
| void SetCdm(CdmContext* cdm_context, CdmAttachedCB cdm_attached_cb) override { |
| OnSetCdm(cdm_context, cdm_attached_cb); |
| } |
| MOCK_METHOD2(OnSetCdm, |
| void(CdmContext* cdm_context, CdmAttachedCB& cdm_attached_cb)); |
| }; |
| |
| class MockMediaResource : public MediaResource { |
| public: |
| MockMediaResource(); |
| ~MockMediaResource() override; |
| |
| // MediaResource implementation. |
| MOCK_CONST_METHOD0(GetType, MediaResource::Type()); |
| MOCK_METHOD0(GetAllStreams, std::vector<DemuxerStream*>()); |
| MOCK_METHOD1(GetFirstStream, DemuxerStream*(DemuxerStream::Type type)); |
| MOCK_CONST_METHOD0(GetMediaUrlParams, const MediaUrlParams&()); |
| }; |
| |
| class MockDemuxer : public Demuxer { |
| public: |
| MockDemuxer(); |
| |
| MockDemuxer(const MockDemuxer&) = delete; |
| MockDemuxer& operator=(const MockDemuxer&) = delete; |
| |
| ~MockDemuxer() override; |
| |
| // Demuxer implementation. |
| std::string GetDisplayName() const override; |
| void Initialize(DemuxerHost* host, PipelineStatusCallback cb) { |
| OnInitialize(host, cb); |
| } |
| MOCK_METHOD2(OnInitialize, |
| void(DemuxerHost* host, PipelineStatusCallback& cb)); |
| MOCK_METHOD1(StartWaitingForSeek, void(base::TimeDelta)); |
| MOCK_METHOD1(CancelPendingSeek, void(base::TimeDelta)); |
| void Seek(base::TimeDelta time, PipelineStatusCallback cb) { |
| OnSeek(time, cb); |
| } |
| MOCK_METHOD2(OnSeek, void(base::TimeDelta time, PipelineStatusCallback& cb)); |
| MOCK_METHOD0(Stop, void()); |
| MOCK_METHOD0(AbortPendingReads, void()); |
| MOCK_METHOD0(GetAllStreams, std::vector<DemuxerStream*>()); |
| |
| MOCK_CONST_METHOD0(GetStartTime, base::TimeDelta()); |
| MOCK_CONST_METHOD0(GetTimelineOffset, base::Time()); |
| MOCK_CONST_METHOD0(GetMemoryUsage, int64_t()); |
| MOCK_CONST_METHOD0(GetContainerForMetrics, |
| absl::optional<container_names::MediaContainerName>()); |
| MOCK_METHOD3(OnEnabledAudioTracksChanged, |
| void(const std::vector<MediaTrack::Id>&, |
| base::TimeDelta, |
| TrackChangeCB)); |
| MOCK_METHOD3(OnSelectedVideoTrackChanged, |
| void(const std::vector<MediaTrack::Id>&, |
| base::TimeDelta, |
| TrackChangeCB)); |
| }; |
| |
| class MockDemuxerStream : public DemuxerStream { |
| public: |
| explicit MockDemuxerStream(DemuxerStream::Type type); |
| |
| MockDemuxerStream(const MockDemuxerStream&) = delete; |
| MockDemuxerStream& operator=(const MockDemuxerStream&) = delete; |
| |
| ~MockDemuxerStream() override; |
| |
| // DemuxerStream implementation. |
| Type type() const override; |
| Liveness liveness() const override; |
| void Read(ReadCB read_cb) { OnRead(read_cb); } |
| MOCK_METHOD1(OnRead, void(ReadCB& read_cb)); |
| AudioDecoderConfig audio_decoder_config() override; |
| VideoDecoderConfig video_decoder_config() override; |
| MOCK_METHOD0(EnableBitstreamConverter, void()); |
| MOCK_METHOD0(SupportsConfigChanges, bool()); |
| |
| void set_audio_decoder_config(const AudioDecoderConfig& config); |
| void set_video_decoder_config(const VideoDecoderConfig& config); |
| void set_liveness(Liveness liveness); |
| |
| private: |
| Type type_; |
| Liveness liveness_; |
| AudioDecoderConfig audio_decoder_config_; |
| VideoDecoderConfig video_decoder_config_; |
| }; |
| |
| class MockVideoDecoder : public VideoDecoder { |
| public: |
| MockVideoDecoder(); |
| // Give a decoder a specific ID, like 42, so that different decoders in unit |
| // tests can be differentiated from one another. All of these decoders have |
| // a decoder type of kTesting, so that can't be used to differentiate them. |
| explicit MockVideoDecoder(int decoder_id); |
| MockVideoDecoder(bool is_platform_decoder, |
| bool supports_decryption, |
| int decoder_id); |
| |
| MockVideoDecoder(const MockVideoDecoder&) = delete; |
| MockVideoDecoder& operator=(const MockVideoDecoder&) = delete; |
| |
| ~MockVideoDecoder() override; |
| |
| // Decoder implementation |
| bool IsPlatformDecoder() const override; |
| bool SupportsDecryption() const override; |
| VideoDecoderType GetDecoderType() const override { |
| return VideoDecoderType::kTesting; |
| } |
| |
| // Allows getting the unique ID from a mock decoder so that they can be |
| // identified during tests without having to add unique VideoDecoderTypes. |
| int GetDecoderId() const { return decoder_id_; } |
| |
| // VideoDecoder implementation. |
| void Initialize(const VideoDecoderConfig& config, |
| bool low_delay, |
| CdmContext* cdm_context, |
| InitCB init_cb, |
| const OutputCB& output_cb, |
| const WaitingCB& waiting_cb) override { |
| Initialize_(config, low_delay, cdm_context, init_cb, output_cb, waiting_cb); |
| } |
| MOCK_METHOD6(Initialize_, |
| void(const VideoDecoderConfig& config, |
| bool low_delay, |
| CdmContext* cdm_context, |
| InitCB& init_cb, |
| const OutputCB& output_cb, |
| const WaitingCB& waiting_cb)); |
| void Decode(scoped_refptr<DecoderBuffer> buffer, DecodeCB cb) override { |
| Decode_(std::move(buffer), cb); |
| } |
| MOCK_METHOD2(Decode_, void(scoped_refptr<DecoderBuffer> buffer, DecodeCB&)); |
| void Reset(base::OnceClosure cb) override { Reset_(cb); } |
| MOCK_METHOD1(Reset_, void(base::OnceClosure&)); |
| MOCK_CONST_METHOD0(GetMaxDecodeRequests, int()); |
| MOCK_CONST_METHOD0(CanReadWithoutStalling, bool()); |
| MOCK_CONST_METHOD0(NeedsBitstreamConversion, bool()); |
| MOCK_CONST_METHOD0(IsOptimizedForRTC, bool()); |
| |
| private: |
| const bool is_platform_decoder_; |
| const bool supports_decryption_; |
| const int decoder_id_ = 0; |
| }; |
| |
| class MockAudioEncoder : public AudioEncoder { |
| public: |
| MockAudioEncoder(); |
| |
| MockAudioEncoder(const MockAudioEncoder&) = delete; |
| MockAudioEncoder& operator=(const MockAudioEncoder&) = delete; |
| |
| ~MockAudioEncoder() override; |
| |
| // AudioEncoder implementation. |
| MOCK_METHOD(void, |
| Initialize, |
| (const AudioEncoder::Options& options, |
| AudioEncoder::OutputCB output_cb, |
| AudioEncoder::StatusCB done_cb), |
| (override)); |
| |
| MOCK_METHOD(void, |
| Encode, |
| (std::unique_ptr<AudioBus> audio_bus, |
| base::TimeTicks capture_time, |
| AudioEncoder::StatusCB done_cb), |
| (override)); |
| |
| MOCK_METHOD(void, Flush, (AudioEncoder::StatusCB done_cb), (override)); |
| |
| // A function for mocking destructor calls |
| MOCK_METHOD(void, OnDestruct, ()); |
| }; |
| |
| class MockVideoEncoder : public VideoEncoder { |
| public: |
| MockVideoEncoder(); |
| |
| MockVideoEncoder(const MockVideoEncoder&) = delete; |
| MockVideoEncoder& operator=(const MockVideoEncoder&) = delete; |
| |
| ~MockVideoEncoder() override; |
| |
| // VideoEncoder implementation. |
| MOCK_METHOD(void, |
| Initialize, |
| (VideoCodecProfile profile, |
| const VideoEncoder::Options& options, |
| VideoEncoder::OutputCB output_cb, |
| VideoEncoder::StatusCB done_cb), |
| (override)); |
| |
| MOCK_METHOD(void, |
| Encode, |
| (scoped_refptr<VideoFrame> frame, |
| bool key_frame, |
| VideoEncoder::StatusCB done_cb), |
| (override)); |
| |
| MOCK_METHOD(void, |
| ChangeOptions, |
| (const VideoEncoder::Options& options, |
| VideoEncoder::OutputCB output_cb, |
| VideoEncoder::StatusCB done_cb), |
| (override)); |
| |
| MOCK_METHOD(void, Flush, (VideoEncoder::StatusCB done_cb), (override)); |
| |
| // A function for mocking destructor calls |
| MOCK_METHOD(void, Dtor, ()); |
| }; |
| |
| class MockAudioDecoder : public AudioDecoder { |
| public: |
| MockAudioDecoder(); |
| explicit MockAudioDecoder(int decoder_id); |
| explicit MockAudioDecoder(bool is_platform_decoder, |
| bool supports_decryption, |
| int decoder_id); |
| |
| MockAudioDecoder(const MockAudioDecoder&) = delete; |
| MockAudioDecoder& operator=(const MockAudioDecoder&) = delete; |
| |
| ~MockAudioDecoder() override; |
| |
| // Decoder implementation |
| bool IsPlatformDecoder() const override; |
| bool SupportsDecryption() const override; |
| AudioDecoderType GetDecoderType() const override { |
| return AudioDecoderType::kTesting; |
| } |
| |
| // Allows getting the unique ID from a mock decoder so that they can be |
| // identified during tests without having to add unique VideoDecoderTypes. |
| int GetDecoderId() const { return decoder_id_; } |
| |
| // AudioDecoder implementation. |
| void Initialize(const AudioDecoderConfig& config, |
| CdmContext* cdm_context, |
| InitCB init_cb, |
| const OutputCB& output_cb, |
| const WaitingCB& waiting_cb) override { |
| Initialize_(config, cdm_context, init_cb, output_cb, waiting_cb); |
| } |
| MOCK_METHOD5(Initialize_, |
| void(const AudioDecoderConfig& config, |
| CdmContext* cdm_context, |
| InitCB& init_cb, |
| const OutputCB& output_cb, |
| const WaitingCB& waiting_cb)); |
| MOCK_METHOD2(Decode, void(scoped_refptr<DecoderBuffer> buffer, DecodeCB)); |
| void Reset(base::OnceClosure cb) override { Reset_(cb); } |
| MOCK_METHOD1(Reset_, void(base::OnceClosure&)); |
| |
| private: |
| const bool is_platform_decoder_; |
| const bool supports_decryption_; |
| const int decoder_id_ = 0; |
| }; |
| |
| class MockRendererClient : public RendererClient { |
| public: |
| MockRendererClient(); |
| ~MockRendererClient(); |
| |
| // RendererClient implementation. |
| MOCK_METHOD1(OnError, void(PipelineStatus)); |
| MOCK_METHOD0(OnEnded, void()); |
| MOCK_METHOD1(OnStatisticsUpdate, void(const PipelineStatistics&)); |
| MOCK_METHOD2(OnBufferingStateChange, |
| void(BufferingState, BufferingStateChangeReason)); |
| MOCK_METHOD1(OnWaiting, void(WaitingReason)); |
| MOCK_METHOD1(OnAudioConfigChange, void(const AudioDecoderConfig&)); |
| MOCK_METHOD1(OnVideoConfigChange, void(const VideoDecoderConfig&)); |
| MOCK_METHOD1(OnVideoNaturalSizeChange, void(const gfx::Size&)); |
| MOCK_METHOD1(OnVideoOpacityChange, void(bool)); |
| MOCK_METHOD1(OnVideoFrameRateChange, void(absl::optional<int>)); |
| MOCK_METHOD1(OnDurationChange, void(base::TimeDelta)); |
| MOCK_METHOD1(OnRemotePlayStateChange, void(MediaStatus::State state)); |
| MOCK_METHOD0(IsVideoStreamAvailable, bool()); |
| }; |
| |
| class MockVideoRenderer : public VideoRenderer { |
| public: |
| MockVideoRenderer(); |
| |
| MockVideoRenderer(const MockVideoRenderer&) = delete; |
| MockVideoRenderer& operator=(const MockVideoRenderer&) = delete; |
| |
| ~MockVideoRenderer() override; |
| |
| // VideoRenderer implementation. |
| void Initialize(DemuxerStream* stream, |
| CdmContext* cdm_context, |
| RendererClient* client, |
| const TimeSource::WallClockTimeCB& wall_clock_time_cb, |
| PipelineStatusCallback init_cb) { |
| OnInitialize(stream, cdm_context, client, wall_clock_time_cb, init_cb); |
| } |
| MOCK_METHOD5(OnInitialize, |
| void(DemuxerStream* stream, |
| CdmContext* cdm_context, |
| RendererClient* client, |
| const TimeSource::WallClockTimeCB& wall_clock_time_cb, |
| PipelineStatusCallback& init_cb)); |
| MOCK_METHOD1(Flush, void(base::OnceClosure flush_cb)); |
| MOCK_METHOD1(StartPlayingFrom, void(base::TimeDelta)); |
| MOCK_METHOD0(OnTimeProgressing, void()); |
| MOCK_METHOD0(OnTimeStopped, void()); |
| MOCK_METHOD1(SetLatencyHint, |
| void(absl::optional<base::TimeDelta> latency_hint)); |
| }; |
| |
| class MockAudioRenderer : public AudioRenderer { |
| public: |
| MockAudioRenderer(); |
| |
| MockAudioRenderer(const MockAudioRenderer&) = delete; |
| MockAudioRenderer& operator=(const MockAudioRenderer&) = delete; |
| |
| ~MockAudioRenderer() override; |
| |
| // AudioRenderer implementation. |
| void Initialize(DemuxerStream* stream, |
| CdmContext* cdm_context, |
| RendererClient* client, |
| PipelineStatusCallback init_cb) { |
| OnInitialize(stream, cdm_context, client, init_cb); |
| } |
| MOCK_METHOD4(OnInitialize, |
| void(DemuxerStream* stream, |
| CdmContext* cdm_context, |
| RendererClient* client, |
| PipelineStatusCallback& init_cb)); |
| MOCK_METHOD0(GetTimeSource, TimeSource*()); |
| MOCK_METHOD1(Flush, void(base::OnceClosure flush_cb)); |
| MOCK_METHOD0(StartPlaying, void()); |
| MOCK_METHOD1(SetVolume, void(float volume)); |
| MOCK_METHOD1(SetLatencyHint, |
| void(absl::optional<base::TimeDelta> latency_hint)); |
| MOCK_METHOD1(SetPreservesPitch, void(bool)); |
| MOCK_METHOD1(SetAutoplayInitiated, void(bool)); |
| }; |
| |
| class MockRenderer : public Renderer { |
| public: |
| MockRenderer(); |
| |
| MockRenderer(const MockRenderer&) = delete; |
| MockRenderer& operator=(const MockRenderer&) = delete; |
| |
| ~MockRenderer() override; |
| |
| // Renderer implementation. |
| void Initialize(MediaResource* media_resource, |
| RendererClient* client, |
| PipelineStatusCallback init_cb) override { |
| OnInitialize(media_resource, client, init_cb); |
| } |
| MOCK_METHOD3(OnInitialize, |
| void(MediaResource* media_resource, |
| RendererClient* client, |
| PipelineStatusCallback& init_cb)); |
| MOCK_METHOD1(SetLatencyHint, void(absl::optional<base::TimeDelta>)); |
| MOCK_METHOD1(SetPreservesPitch, void(bool)); |
| MOCK_METHOD1(SetAutoplayInitiated, void(bool)); |
| void Flush(base::OnceClosure flush_cb) override { OnFlush(flush_cb); } |
| MOCK_METHOD1(OnFlush, void(base::OnceClosure& flush_cb)); |
| MOCK_METHOD1(StartPlayingFrom, void(base::TimeDelta timestamp)); |
| MOCK_METHOD1(SetPlaybackRate, void(double playback_rate)); |
| MOCK_METHOD1(SetVolume, void(float volume)); |
| MOCK_METHOD0(GetMediaTime, base::TimeDelta()); |
| MOCK_METHOD0(HasAudio, bool()); |
| MOCK_METHOD0(HasVideo, bool()); |
| void SetCdm(CdmContext* cdm_context, CdmAttachedCB cdm_attached_cb) override { |
| OnSetCdm(cdm_context, cdm_attached_cb); |
| } |
| MOCK_METHOD2(OnSetCdm, |
| void(CdmContext* cdm_context, CdmAttachedCB& cdm_attached_cb)); |
| MOCK_METHOD2(OnSelectedVideoTrackChanged, |
| void(std::vector<DemuxerStream*>, base::OnceClosure)); |
| MOCK_METHOD2(OnSelectedAudioTracksChanged, |
| void(std::vector<DemuxerStream*>, base::OnceClosure)); |
| }; |
| |
| class MockRendererFactory : public RendererFactory { |
| public: |
| MockRendererFactory(); |
| |
| MockRendererFactory(const MockRendererFactory&) = delete; |
| MockRendererFactory& operator=(const MockRendererFactory&) = delete; |
| |
| ~MockRendererFactory() override; |
| |
| // Renderer implementation. |
| MOCK_METHOD6(CreateRenderer, |
| std::unique_ptr<Renderer>( |
| const scoped_refptr<base::SingleThreadTaskRunner>&, |
| const scoped_refptr<base::TaskRunner>&, |
| AudioRendererSink*, |
| VideoRendererSink*, |
| RequestOverlayInfoCB, |
| const gfx::ColorSpace&)); |
| }; |
| |
| class MockTimeSource : public TimeSource { |
| public: |
| MockTimeSource(); |
| |
| MockTimeSource(const MockTimeSource&) = delete; |
| MockTimeSource& operator=(const MockTimeSource&) = delete; |
| |
| ~MockTimeSource() override; |
| |
| // TimeSource implementation. |
| MOCK_METHOD0(StartTicking, void()); |
| MOCK_METHOD0(StopTicking, void()); |
| MOCK_METHOD1(SetPlaybackRate, void(double)); |
| MOCK_METHOD1(SetMediaTime, void(base::TimeDelta)); |
| MOCK_METHOD0(CurrentMediaTime, base::TimeDelta()); |
| MOCK_METHOD2(GetWallClockTimes, |
| bool(const std::vector<base::TimeDelta>&, |
| std::vector<base::TimeTicks>*)); |
| }; |
| |
| class MockTextTrack : public TextTrack { |
| public: |
| MockTextTrack(); |
| |
| MockTextTrack(const MockTextTrack&) = delete; |
| MockTextTrack& operator=(const MockTextTrack&) = delete; |
| |
| ~MockTextTrack() override; |
| |
| MOCK_METHOD5(addWebVTTCue, |
| void(base::TimeDelta start, |
| base::TimeDelta end, |
| const std::string& id, |
| const std::string& content, |
| const std::string& settings)); |
| }; |
| |
| // Mock CDM callbacks. |
| // TODO(xhwang): This could be a subclass of CdmClient if we plan to add one. |
| // See http://crbug.com/657940 |
| class MockCdmClient { |
| public: |
| MockCdmClient(); |
| virtual ~MockCdmClient(); |
| |
| MOCK_METHOD3(OnSessionMessage, |
| void(const std::string& session_id, |
| CdmMessageType message_type, |
| const std::vector<uint8_t>& message)); |
| MOCK_METHOD2(OnSessionClosed, |
| void(const std::string& session_id, |
| CdmSessionClosedReason reason)); |
| |
| // Add OnSessionKeysChangeCalled() function so we can store |keys_info|. |
| MOCK_METHOD2(OnSessionKeysChangeCalled, |
| void(const std::string& session_id, |
| bool has_additional_usable_key)); |
| void OnSessionKeysChange(const std::string& session_id, |
| bool has_additional_usable_key, |
| CdmKeysInfo keys_info) { |
| keys_info_.swap(keys_info); |
| OnSessionKeysChangeCalled(session_id, has_additional_usable_key); |
| } |
| |
| MOCK_METHOD2(OnSessionExpirationUpdate, |
| void(const std::string& session_id, base::Time new_expiry_time)); |
| |
| const CdmKeysInfo& keys_info() const { return keys_info_; } |
| |
| private: |
| CdmKeysInfo keys_info_; |
| }; |
| |
| class MockDecryptor : public Decryptor { |
| public: |
| MockDecryptor(); |
| |
| MockDecryptor(const MockDecryptor&) = delete; |
| MockDecryptor& operator=(const MockDecryptor&) = delete; |
| |
| ~MockDecryptor() override; |
| |
| MOCK_METHOD3(Decrypt, |
| void(StreamType stream_type, |
| scoped_refptr<DecoderBuffer> encrypted, |
| DecryptCB decrypt_cb)); |
| MOCK_METHOD1(CancelDecrypt, void(StreamType stream_type)); |
| MOCK_METHOD2(InitializeAudioDecoder, |
| void(const AudioDecoderConfig& config, DecoderInitCB init_cb)); |
| MOCK_METHOD2(InitializeVideoDecoder, |
| void(const VideoDecoderConfig& config, DecoderInitCB init_cb)); |
| MOCK_METHOD2(DecryptAndDecodeAudio, |
| void(scoped_refptr<DecoderBuffer> encrypted, |
| AudioDecodeCB audio_decode_cb)); |
| MOCK_METHOD2(DecryptAndDecodeVideo, |
| void(scoped_refptr<DecoderBuffer> encrypted, |
| VideoDecodeCB video_decode_cb)); |
| MOCK_METHOD1(ResetDecoder, void(StreamType stream_type)); |
| MOCK_METHOD1(DeinitializeDecoder, void(StreamType stream_type)); |
| MOCK_METHOD0(CanAlwaysDecrypt, bool()); |
| }; |
| |
| class MockCdmContext : public CdmContext { |
| public: |
| MockCdmContext(); |
| |
| MockCdmContext(const MockCdmContext&) = delete; |
| MockCdmContext& operator=(const MockCdmContext&) = delete; |
| |
| ~MockCdmContext() override; |
| |
| MOCK_METHOD1(RegisterEventCB, |
| std::unique_ptr<CallbackRegistration>(EventCB event_cb)); |
| MOCK_METHOD0(GetDecryptor, Decryptor*()); |
| |
| #if defined(OS_WIN) |
| MOCK_METHOD0(RequiresMediaFoundationRenderer, bool()); |
| MOCK_METHOD1(GetMediaFoundationCdmProxy, |
| bool(GetMediaFoundationCdmProxyCB get_mf_cdm_proxy_cb)); |
| #endif |
| #if BUILDFLAG(IS_CHROMEOS_ASH) |
| MOCK_METHOD0(GetChromeOsCdmContext, chromeos::ChromeOsCdmContext*()); |
| #endif // BUILDFLAG(IS_CHROMEOS_ASH) |
| absl::optional<base::UnguessableToken> GetCdmId() const override; |
| |
| void set_cdm_id(const base::UnguessableToken& cdm_id); |
| |
| private: |
| absl::optional<base::UnguessableToken> cdm_id_; |
| }; |
| |
| class MockCdmPromise : public SimpleCdmPromise { |
| public: |
| // |expect_success| is true if resolve() should be called, false if reject() |
| // is expected. |
| explicit MockCdmPromise(bool expect_success); |
| |
| MockCdmPromise(const MockCdmPromise&) = delete; |
| MockCdmPromise& operator=(const MockCdmPromise&) = delete; |
| |
| ~MockCdmPromise() override; |
| |
| MOCK_METHOD0(resolve, void()); |
| MOCK_METHOD3(reject, |
| void(CdmPromise::Exception, uint32_t, const std::string&)); |
| }; |
| |
| class MockCdmSessionPromise : public NewSessionCdmPromise { |
| public: |
| // |expect_success| is true if resolve() should be called, false if reject() |
| // is expected. |new_session_id| is updated with the new session's ID on |
| // resolve(). |
| MockCdmSessionPromise(bool expect_success, std::string* new_session_id); |
| |
| MockCdmSessionPromise(const MockCdmSessionPromise&) = delete; |
| MockCdmSessionPromise& operator=(const MockCdmSessionPromise&) = delete; |
| |
| ~MockCdmSessionPromise() override; |
| |
| MOCK_METHOD1(resolve, void(const std::string&)); |
| MOCK_METHOD3(reject, |
| void(CdmPromise::Exception, uint32_t, const std::string&)); |
| }; |
| |
| class MockCdmKeyStatusPromise : public KeyStatusCdmPromise { |
| public: |
| // |expect_success| is true if resolve() should be called, false if reject() |
| // is expected. |key_status| is updated with the key status on resolve(). |
| MockCdmKeyStatusPromise(bool expect_success, |
| CdmKeyInformation::KeyStatus* key_status); |
| |
| MockCdmKeyStatusPromise(const MockCdmKeyStatusPromise&) = delete; |
| MockCdmKeyStatusPromise& operator=(const MockCdmKeyStatusPromise&) = delete; |
| |
| ~MockCdmKeyStatusPromise() override; |
| |
| MOCK_METHOD1(resolve, void(const CdmKeyInformation::KeyStatus&)); |
| MOCK_METHOD3(reject, |
| void(CdmPromise::Exception, uint32_t, const std::string&)); |
| }; |
| |
| class MockCdm : public ContentDecryptionModule { |
| public: |
| MockCdm(); |
| MockCdm(const std::string& key_system, |
| const SessionMessageCB& session_message_cb, |
| const SessionClosedCB& session_closed_cb, |
| const SessionKeysChangeCB& session_keys_change_cb, |
| const SessionExpirationUpdateCB& session_expiration_update_cb); |
| |
| void Initialize( |
| const std::string& key_system, |
| const SessionMessageCB& session_message_cb, |
| const SessionClosedCB& session_closed_cb, |
| const SessionKeysChangeCB& session_keys_change_cb, |
| const SessionExpirationUpdateCB& session_expiration_update_cb); |
| |
| // ContentDecryptionModule implementation. |
| MOCK_METHOD2(SetServerCertificate, |
| void(const std::vector<uint8_t>& certificate, |
| std::unique_ptr<SimpleCdmPromise> promise)); |
| MOCK_METHOD4(CreateSessionAndGenerateRequest, |
| void(CdmSessionType session_type, |
| EmeInitDataType init_data_type, |
| const std::vector<uint8_t>& init_data, |
| std::unique_ptr<NewSessionCdmPromise> promise)); |
| MOCK_METHOD3(LoadSession, |
| void(CdmSessionType session_type, |
| const std::string& session_id, |
| std::unique_ptr<NewSessionCdmPromise> promise)); |
| MOCK_METHOD3(UpdateSession, |
| void(const std::string& session_id, |
| const std::vector<uint8_t>& response, |
| std::unique_ptr<SimpleCdmPromise> promise)); |
| MOCK_METHOD2(CloseSession, |
| void(const std::string& session_id, |
| std::unique_ptr<SimpleCdmPromise> promise)); |
| MOCK_METHOD2(RemoveSession, |
| void(const std::string& session_id, |
| std::unique_ptr<SimpleCdmPromise> promise)); |
| |
| MOCK_METHOD0(GetCdmContext, CdmContext*()); |
| |
| void CallSessionMessageCB(const std::string& session_id, |
| CdmMessageType message_type, |
| const std::vector<uint8_t>& message); |
| void CallSessionClosedCB(const std::string& session_id, |
| CdmSessionClosedReason reason); |
| void CallSessionKeysChangeCB(const std::string& session_id, |
| bool has_additional_usable_key, |
| CdmKeysInfo keys_info); |
| void CallSessionExpirationUpdateCB(const std::string& session_id, |
| base::Time new_expiry_time); |
| |
| const std::string& GetKeySystem() const { return key_system_; } |
| |
| protected: |
| ~MockCdm() override; |
| |
| private: |
| std::string key_system_; |
| SessionMessageCB session_message_cb_; |
| SessionClosedCB session_closed_cb_; |
| SessionKeysChangeCB session_keys_change_cb_; |
| SessionExpirationUpdateCB session_expiration_update_cb_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MockCdm); |
| }; |
| |
| class MockCdmFactory : public CdmFactory { |
| public: |
| explicit MockCdmFactory(scoped_refptr<MockCdm> cdm); |
| |
| MockCdmFactory(const MockCdmFactory&) = delete; |
| MockCdmFactory& operator=(const MockCdmFactory&) = delete; |
| |
| ~MockCdmFactory() override; |
| |
| // CdmFactory implementation. |
| // This creates a StrictMock<MockCdm> when called. Although ownership of the |
| // created CDM is passed to |cdm_created_cb|, a copy is kept (and available |
| // using Cdm()). If |key_system| is empty, no CDM will be created. |
| void Create(const std::string& key_system, |
| const CdmConfig& cdm_config, |
| const SessionMessageCB& session_message_cb, |
| const SessionClosedCB& session_closed_cb, |
| const SessionKeysChangeCB& session_keys_change_cb, |
| const SessionExpirationUpdateCB& session_expiration_update_cb, |
| CdmCreatedCB cdm_created_cb) override; |
| |
| // Provide a callback to be called before the CDM is created and returned. |
| void SetBeforeCreationCB(base::RepeatingClosure before_creation_cb); |
| |
| private: |
| // Reference to the created CDM. |
| scoped_refptr<MockCdm> mock_cdm_; |
| |
| // Callback to be used before Create() successfully calls |cdm_created_cb|. |
| base::RepeatingClosure before_creation_cb_; |
| }; |
| |
| class MockStreamParser : public StreamParser { |
| public: |
| MockStreamParser(); |
| |
| MockStreamParser(const MockStreamParser&) = delete; |
| MockStreamParser& operator=(const MockStreamParser&) = delete; |
| |
| ~MockStreamParser() override; |
| |
| // StreamParser interface |
| MOCK_METHOD8( |
| Init, |
| void(InitCB init_cb, |
| const NewConfigCB& config_cb, |
| const NewBuffersCB& new_buffers_cb, |
| bool ignore_text_track, |
| const EncryptedMediaInitDataCB& encrypted_media_init_data_cb, |
| const NewMediaSegmentCB& new_segment_cb, |
| const EndMediaSegmentCB& end_of_segment_cb, |
| MediaLog* media_log)); |
| MOCK_METHOD0(Flush, void()); |
| MOCK_CONST_METHOD0(GetGenerateTimestampsFlag, bool()); |
| MOCK_METHOD2(Parse, bool(const uint8_t*, int)); |
| }; |
| |
| class MockMediaClient : public media::MediaClient { |
| public: |
| MockMediaClient(); |
| |
| MockMediaClient(const MockMediaClient&) = delete; |
| MockMediaClient& operator=(const MockMediaClient&) = delete; |
| |
| ~MockMediaClient() override; |
| |
| // MediaClient implementation. |
| MOCK_METHOD1(AddSupportedKeySystems, |
| void(std::vector<std::unique_ptr<media::KeySystemProperties>>* |
| key_systems)); |
| MOCK_METHOD0(IsKeySystemsUpdateNeeded, bool()); |
| MOCK_METHOD1(IsSupportedAudioType, bool(const media::AudioType& type)); |
| MOCK_METHOD1(IsSupportedVideoType, bool(const media::VideoType& type)); |
| MOCK_METHOD1(IsSupportedBitstreamAudioCodec, bool(media::AudioCodec codec)); |
| MOCK_METHOD1(GetAudioRendererAlgorithmParameters, |
| absl::optional<::media::AudioRendererAlgorithmParameters>( |
| media::AudioParameters audio_parameters)); |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_BASE_MOCK_FILTERS_H_ |