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 3 // found in the LICENSE file. 4 5 #include "base/bind.h" 6 #include "base/memory/scoped_ptr.h" 7 #include "base/test/simple_test_tick_clock.h" 8 #include "base/time/tick_clock.h" 9 #include "media/cast/cast_config.h" 10 #include "media/cast/cast_defines.h" 11 #include "media/cast/cast_environment.h" 12 #include "media/cast/cast_receiver.h" 13 #include "media/cast/test/fake_task_runner.h" 14 #include "media/cast/video_receiver/video_decoder.h" 15 #include "testing/gmock/include/gmock/gmock.h" 16 17 namespace media { 18 namespace cast { 19 20 using testing::_; 21 22 // Random frame size for testing. 23 const int kFrameSize = 2345; 24 static const int64 kStartMillisecond = GG_INT64_C(1245); 25 26 namespace { 27 class DecodeTestFrameCallback : 28 public base::RefCountedThreadSafe<DecodeTestFrameCallback> { 29 public: 30 DecodeTestFrameCallback() {} 31 32 void DecodeComplete(const scoped_refptr<media::VideoFrame>& decoded_frame, 33 const base::TimeTicks& render_time) {} 34 protected: 35 virtual ~DecodeTestFrameCallback() {} 36 private: 37 friend class base::RefCountedThreadSafe<DecodeTestFrameCallback>; 38 }; 39 } // namespace 40 41 class VideoDecoderTest : public ::testing::Test { 42 protected: 43 VideoDecoderTest() 44 : task_runner_(new test::FakeTaskRunner(&testing_clock_)), 45 cast_environment_(new CastEnvironment(&testing_clock_, task_runner_, 46 task_runner_, task_runner_, task_runner_, task_runner_, 47 GetDefaultCastLoggingConfig())), 48 test_callback_(new DecodeTestFrameCallback()) { 49 // Configure to vp8. 50 config_.codec = kVp8; 51 config_.use_external_decoder = false; 52 decoder_.reset(new VideoDecoder(config_, cast_environment_)); 53 testing_clock_.Advance( 54 base::TimeDelta::FromMilliseconds(kStartMillisecond)); 55 } 56 57 virtual ~VideoDecoderTest() {} 58 59 scoped_ptr<VideoDecoder> decoder_; 60 VideoReceiverConfig config_; 61 base::SimpleTestTickClock testing_clock_; 62 scoped_refptr<test::FakeTaskRunner> task_runner_; 63 scoped_refptr<CastEnvironment> cast_environment_; 64 scoped_refptr<DecodeTestFrameCallback> test_callback_; 65 }; 66 67 // TODO(pwestin): EXPECT_DEATH tests can not pass valgrind. 68 TEST_F(VideoDecoderTest, DISABLED_SizeZero) { 69 EncodedVideoFrame encoded_frame; 70 base::TimeTicks render_time; 71 encoded_frame.codec = kVp8; 72 EXPECT_DEATH( 73 decoder_->DecodeVideoFrame( 74 &encoded_frame, render_time, 75 base::Bind(&DecodeTestFrameCallback::DecodeComplete, test_callback_)), 76 "Empty frame"); 77 } 78 79 // TODO(pwestin): EXPECT_DEATH tests can not pass valgrind. 80 TEST_F(VideoDecoderTest, DISABLED_InvalidCodec) { 81 EncodedVideoFrame encoded_frame; 82 base::TimeTicks render_time; 83 encoded_frame.data.assign(kFrameSize, 0); 84 encoded_frame.codec = kExternalVideo; 85 EXPECT_DEATH( 86 decoder_->DecodeVideoFrame(&encoded_frame, render_time, base::Bind( 87 &DecodeTestFrameCallback::DecodeComplete, test_callback_)), 88 "Invalid codec"); 89 } 90 91 // TODO(pwestin): Test decoding a real frame. 92 93 } // namespace cast 94 } // namespace media 95