Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(534)

Side by Side Diff: media/base/pipeline_unittest.cc

Issue 10834266: Fold Pipeline initialization failure tests added in r150636 into PipelineTeardownTest. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <vector> 5 #include <vector>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/threading/simple_thread.h" 10 #include "base/threading/simple_thread.h"
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 871 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time);
872 872
873 // Now that the seek is complete, verify that time updates advance the current 873 // Now that the seek is complete, verify that time updates advance the current
874 // time. 874 // time.
875 base::TimeDelta new_time = seek_time + base::TimeDelta::FromMilliseconds(100); 875 base::TimeDelta new_time = seek_time + base::TimeDelta::FromMilliseconds(100);
876 audio_time_cb_.Run(new_time, new_time); 876 audio_time_cb_.Run(new_time, new_time);
877 877
878 EXPECT_EQ(pipeline_->GetMediaTime(), new_time); 878 EXPECT_EQ(pipeline_->GetMediaTime(), new_time);
879 } 879 }
880 880
881 TEST_F(PipelineTest, InitFailure_Demuxer) {
882 PipelineStatus expected_status = DEMUXER_ERROR_COULD_NOT_OPEN;
883 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
884 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
885 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
886 .WillOnce(RunClosure());
887 InitializePipeline(expected_status);
888 }
889
890 TEST_F(PipelineTest, InitFailure_AudioDecoder) {
891 CreateAudioStream();
892 MockDemuxerStreamVector streams;
893 streams.push_back(audio_stream());
894
895 InitializeDemuxer(&streams);
896
897 PipelineStatus expected_status = PIPELINE_ERROR_DECODE;
898 scoped_refptr<DemuxerStream> stream = streams[0];
899 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(stream, _, _))
900 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
901
902 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
903 .WillOnce(RunClosure());
904
905 InitializePipeline(expected_status);
906 EXPECT_FALSE(pipeline_->HasAudio());
907 }
908
909 TEST_F(PipelineTest, InitFailure_AudioRenderer) {
910 CreateAudioStream();
911 MockDemuxerStreamVector streams;
912 streams.push_back(audio_stream());
913
914 InitializeDemuxer(&streams);
915 InitializeAudioDecoder(audio_stream());
916
917 PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED;
918 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(
919 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()),
920 _, _, _, _, _, _))
921 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
922
923 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
924 .WillOnce(RunClosure());
925 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
926 .WillOnce(RunClosure());
927
928 InitializePipeline(expected_status);
929 EXPECT_TRUE(pipeline_->HasAudio());
930 }
931
932 TEST_F(PipelineTest, InitFailure_VideoDecoder) {
933 CreateAudioStream();
934 CreateVideoStream();
935 MockDemuxerStreamVector streams;
936 streams.push_back(audio_stream());
937 streams.push_back(video_stream());
938
939 InitializeDemuxer(&streams);
940 InitializeAudioDecoder(audio_stream());
941 InitializeAudioRenderer();
942
943 PipelineStatus expected_status = PIPELINE_ERROR_DECODE;
944 scoped_refptr<DemuxerStream> stream = streams[1];
945 EXPECT_CALL(*mocks_->video_decoder(),
946 Initialize(stream, _, _))
947 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
948
949 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
950 .WillOnce(RunClosure());
951 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
952 .WillOnce(RunClosure());
953
954 InitializePipeline(expected_status);
955 EXPECT_TRUE(pipeline_->HasAudio());
956 EXPECT_FALSE(pipeline_->HasVideo());
957 }
958
959 TEST_F(PipelineTest, InitFailure_VideoRenderer) {
960 CreateAudioStream();
961 CreateVideoStream();
962 MockDemuxerStreamVector streams;
963 streams.push_back(audio_stream());
964 streams.push_back(video_stream());
965
966 InitializeDemuxer(&streams);
967 InitializeAudioDecoder(audio_stream());
968 InitializeAudioRenderer();
969 InitializeVideoDecoder(video_stream());
970
971 PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED;
972 EXPECT_CALL(*mocks_->video_renderer(), Initialize(
973 scoped_refptr<VideoDecoder>(mocks_->video_decoder()),
974 _, _, _, _, _, _, _, _))
975 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
976
977 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
978 .WillOnce(RunClosure());
979 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
980 .WillOnce(RunClosure());
981 EXPECT_CALL(*mocks_->video_renderer(), Stop(_))
982 .WillOnce(RunClosure());
983
984 InitializePipeline(expected_status);
985 EXPECT_TRUE(pipeline_->HasAudio());
986 EXPECT_TRUE(pipeline_->HasVideo());
987 }
988
989 class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate { 881 class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate {
990 public: 882 public:
991 FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status, 883 FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status,
992 const PipelineStatusCB& status_cb) 884 const PipelineStatusCB& status_cb)
993 : delay_(delay), 885 : delay_(delay),
994 status_(status), 886 status_(status),
995 status_cb_(status_cb) { 887 status_cb_(status_cb) {
996 if (delay_ < base::TimeDelta()) { 888 if (delay_ < base::TimeDelta()) {
997 status_cb_.Run(status_); 889 status_cb_.Run(status_);
998 return; 890 return;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 927
1036 // Test that different-thread, some-delay callback (the expected common case) 928 // Test that different-thread, some-delay callback (the expected common case)
1037 // works correctly. 929 // works correctly.
1038 TEST(PipelineStatusNotificationTest, DelayedCallback) { 930 TEST(PipelineStatusNotificationTest, DelayedCallback) {
1039 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20)); 931 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20));
1040 } 932 }
1041 933
1042 class PipelineTeardownTest : public PipelineTest { 934 class PipelineTeardownTest : public PipelineTest {
1043 public: 935 public:
1044 enum TeardownState { 936 enum TeardownState {
937 kInitDemuxer,
938 kInitAudioDecoder,
939 kInitAudioRenderer,
940 kInitVideoDecoder,
941 kInitVideoRenderer,
1045 kPausing, 942 kPausing,
1046 kFlushing, 943 kFlushing,
1047 kSeeking, 944 kSeeking,
1048 kPrerolling, 945 kPrerolling,
1049 kStarting, 946 kStarting,
1050 kPlaying, 947 kPlaying,
1051 }; 948 };
1052 949
1053 enum StopOrError { 950 enum StopOrError {
1054 kStop, 951 kStop,
1055 kError, 952 kError,
1056 }; 953 };
1057 954
1058 PipelineTeardownTest() { 955 PipelineTeardownTest() {}
1059 CreateAudioStream(); 956 virtual ~PipelineTeardownTest() {}
1060 MockDemuxerStreamVector streams;
1061 streams.push_back(audio_stream());
1062
1063 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000));
1064 InitializeAudioDecoder(audio_stream());
1065 InitializeAudioRenderer();
1066 InitializePipeline(PIPELINE_OK);
1067 }
1068 957
1069 void RunTest(TeardownState state, StopOrError stop_or_error) { 958 void RunTest(TeardownState state, StopOrError stop_or_error) {
1070 InSequence s;
1071 switch (state) { 959 switch (state) {
960 case kInitDemuxer:
961 case kInitAudioDecoder:
962 case kInitAudioRenderer:
963 case kInitVideoDecoder:
964 case kInitVideoRenderer:
965 ExpectInitializeTeardown(state, stop_or_error);
966 break;
967
1072 case kPausing: 968 case kPausing:
1073 case kFlushing: 969 case kFlushing:
1074 case kSeeking: 970 case kSeeking:
1075 case kPrerolling: 971 case kPrerolling:
1076 case kStarting: 972 case kStarting: {
973 DoInitialize();
974
975 InSequence s;
acolwell GONE FROM CHROMIUM 2012/08/10 17:13:08 Why did this need to move to here ane below?
scherkus (not reviewing) 2012/08/10 17:35:55 DoInitialize() / ExpectInitializeTeardown() aren't
1077 if (stop_or_error == kStop) { 976 if (stop_or_error == kStop) {
1078 ExpectSeekStop(state); 977 ExpectSeekStop(state);
1079 } else { 978 } else {
1080 ExpectSeekError(state); 979 ExpectSeekError(state);
1081 } 980 }
1082 DoSeek(); 981 DoSeek();
1083 break; 982 break;
983 }
1084 984
1085 case kPlaying: 985 case kPlaying: {
986 DoInitialize();
987
988 InSequence s;
1086 if (stop_or_error == kStop) { 989 if (stop_or_error == kStop) {
1087 ExpectStop(); 990 ExpectStop();
1088 DoStop(); 991 DoStop();
1089 } else { 992 } else {
1090 ExpectPlaybackError(); 993 ExpectPlaybackError();
1091 DoPlaybackError(); 994 DoPlaybackError();
1092 } 995 }
1093 break; 996 break;
997 }
1094 } 998 }
1095 } 999 }
1096 1000
1097 private: 1001 private:
1002 void DoInitialize() {
1003 CreateAudioStream();
1004 MockDemuxerStreamVector streams;
1005 streams.push_back(audio_stream());
1006
1007 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000));
1008 InitializeAudioDecoder(audio_stream());
1009 InitializeAudioRenderer();
1010 InitializePipeline(PIPELINE_OK);
1011 }
1012
1098 // TODO(scherkus): We do radically different things whether teardown is 1013 // TODO(scherkus): We do radically different things whether teardown is
1099 // invoked via stop vs error. The teardown path should be the same, 1014 // invoked via stop vs error. The teardown path should be the same,
1100 // see http://crbug.com/110228 1015 // see http://crbug.com/110228
1016 void ExpectInitializeTeardown(TeardownState state,
1017 StopOrError stop_or_error) {
1018 PipelineStatus expected_status =
1019 SetInitializeExpectations(state, stop_or_error);
1020
1021 EXPECT_CALL(callbacks_, OnStart(expected_status));
1022 pipeline_->Start(
1023 mocks_->Create().Pass(),
1024 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
1025 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
1026 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)));
1027 message_loop_.RunAllPending();
1028 }
1029
1030 PipelineStatus SetInitializeExpectations(TeardownState state,
1031 StopOrError stop_or_error) {
1032 PipelineStatus status = PIPELINE_OK;
1033 base::Closure stop_cb = base::Bind(
1034 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
1035
1036 if (state == kInitDemuxer) {
1037 if (stop_or_error == kStop) {
1038 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
1039 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1040 EXPECT_CALL(callbacks_, OnStop());
1041 } else {
1042 status = DEMUXER_ERROR_COULD_NOT_OPEN;
1043 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
1044 .WillOnce(RunPipelineStatusCBWithStatus(status));
1045 }
1046
1047 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1048 return status;
1049 }
1050
1051 CreateAudioStream();
1052 CreateVideoStream();
1053 MockDemuxerStreamVector streams;
1054 streams.push_back(audio_stream());
1055 streams.push_back(video_stream());
1056 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000));
1057
1058 if (state == kInitAudioDecoder) {
1059 if (stop_or_error == kStop) {
1060 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(_, _, _))
1061 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1062 EXPECT_CALL(callbacks_, OnStop());
1063 } else {
1064 status = PIPELINE_ERROR_DECODE;
1065 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(_, _, _))
1066 .WillOnce(RunPipelineStatusCBWithStatus(status));
1067 }
1068
1069 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1070 return status;
1071 }
1072
1073 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(_, _, _))
1074 .WillOnce(RunPipelineStatusCB());
1075
1076 if (state == kInitAudioRenderer) {
1077 if (stop_or_error == kStop) {
1078 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(_, _, _, _, _, _, _))
1079 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1080 EXPECT_CALL(callbacks_, OnStop());
1081 } else {
1082 status = PIPELINE_ERROR_INITIALIZATION_FAILED;
1083 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(_, _, _, _, _, _, _))
1084 .WillOnce(RunPipelineStatusCBWithStatus(status));
1085 }
1086
1087 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1088 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1089 return status;
1090 }
1091
1092 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(_, _, _, _, _, _, _))
1093 .WillOnce(RunPipelineStatusCB());
1094
1095 if (state == kInitVideoDecoder) {
1096 if (stop_or_error == kStop) {
1097 EXPECT_CALL(*mocks_->video_decoder(), Initialize(_, _, _))
1098 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1099 EXPECT_CALL(callbacks_, OnStop());
1100 } else {
1101 status = PIPELINE_ERROR_DECODE;
1102 EXPECT_CALL(*mocks_->video_decoder(), Initialize(_, _, _))
1103 .WillOnce(RunPipelineStatusCBWithStatus(status));
1104 }
1105
1106 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1107 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1108 return status;
1109 }
1110
1111 EXPECT_CALL(*mocks_->video_decoder(), Initialize(_, _, _))
1112 .WillOnce(RunPipelineStatusCB());
1113
1114 if (state == kInitVideoRenderer) {
acolwell GONE FROM CHROMIUM 2012/08/10 17:13:08 nit: remove if and DCHECK_EQ(state, kInitVideoRend
scherkus (not reviewing) 2012/08/10 17:35:55 True! My initial plan for this function was to use
1115 if (stop_or_error == kStop) {
1116 EXPECT_CALL(*mocks_->video_renderer(),
1117 Initialize(_, _, _, _, _, _, _, _, _))
1118 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1119 EXPECT_CALL(callbacks_, OnStop());
1120 } else {
1121 status = PIPELINE_ERROR_INITIALIZATION_FAILED;
1122 EXPECT_CALL(*mocks_->video_renderer(),
1123 Initialize(_, _, _, _, _, _, _, _, _))
1124 .WillOnce(RunPipelineStatusCBWithStatus(status));
1125 }
1126
1127 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1128 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1129 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure());
1130 return status;
1131 }
1132
1133 EXPECT_CALL(*mocks_->video_renderer(),
1134 Initialize(_, _, _, _, _, _, _, _, _))
1135 .WillOnce(RunPipelineStatusCB());
1136
1137 // If we get here it's a successful initialization.
1138 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
1139 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
1140 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
1141 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _))
1142 .WillOnce(RunPipelineStatusCB());
1143 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1144 .WillOnce(RunClosure());
1145
1146 return status;
1147 }
1148
1101 void ExpectSeekStop(TeardownState state) { 1149 void ExpectSeekStop(TeardownState state) {
1102 base::Closure stop_cb = base::Bind( 1150 base::Closure stop_cb = base::Bind(
1103 &CallbackHelper::OnStop, base::Unretained(&callbacks_)); 1151 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
1104 1152
1105 if (state == kPausing) { 1153 if (state == kPausing) {
1106 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 1154 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
1107 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure())); 1155 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1108 } else { 1156 } else {
1109 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); 1157 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
1110 } 1158 }
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 } 1285 }
1238 1286
1239 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); 1287 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest);
1240 }; 1288 };
1241 1289
1242 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \ 1290 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \
1243 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \ 1291 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \
1244 RunTest(k##state, k##stop_or_error); \ 1292 RunTest(k##state, k##stop_or_error); \
1245 } 1293 }
1246 1294
1295 INSTANTIATE_TEARDOWN_TEST(Stop, InitDemuxer);
1296 INSTANTIATE_TEARDOWN_TEST(Stop, InitAudioDecoder);
1297 INSTANTIATE_TEARDOWN_TEST(Stop, InitAudioRenderer);
1298 INSTANTIATE_TEARDOWN_TEST(Stop, InitVideoDecoder);
1299 INSTANTIATE_TEARDOWN_TEST(Stop, InitVideoRenderer);
1247 INSTANTIATE_TEARDOWN_TEST(Stop, Pausing); 1300 INSTANTIATE_TEARDOWN_TEST(Stop, Pausing);
1248 INSTANTIATE_TEARDOWN_TEST(Stop, Flushing); 1301 INSTANTIATE_TEARDOWN_TEST(Stop, Flushing);
1249 INSTANTIATE_TEARDOWN_TEST(Stop, Seeking); 1302 INSTANTIATE_TEARDOWN_TEST(Stop, Seeking);
1250 INSTANTIATE_TEARDOWN_TEST(Stop, Prerolling); 1303 INSTANTIATE_TEARDOWN_TEST(Stop, Prerolling);
1251 INSTANTIATE_TEARDOWN_TEST(Stop, Starting); 1304 INSTANTIATE_TEARDOWN_TEST(Stop, Starting);
1252 INSTANTIATE_TEARDOWN_TEST(Stop, Playing); 1305 INSTANTIATE_TEARDOWN_TEST(Stop, Playing);
1253 1306
1307 INSTANTIATE_TEARDOWN_TEST(Error, InitDemuxer);
1308 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioDecoder);
1309 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer);
1310 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoDecoder);
1311 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer);
1254 INSTANTIATE_TEARDOWN_TEST(Error, Pausing); 1312 INSTANTIATE_TEARDOWN_TEST(Error, Pausing);
1255 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); 1313 INSTANTIATE_TEARDOWN_TEST(Error, Flushing);
1256 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1314 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1257 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling); 1315 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling);
1258 INSTANTIATE_TEARDOWN_TEST(Error, Starting); 1316 INSTANTIATE_TEARDOWN_TEST(Error, Starting);
1259 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1317 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1260 1318
1261 } // namespace media 1319 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698