| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
| 7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "media/base/media_log.h" | 8 #include "media/base/media_log.h" |
| 9 #include "media/base/mock_filters.h" | 9 #include "media/base/mock_filters.h" |
| 10 #include "media/base/test_helpers.h" | 10 #include "media/base/test_helpers.h" |
| 11 #include "media/blink/buffered_data_source.h" | 11 #include "media/blink/buffered_data_source.h" |
| 12 #include "media/blink/mock_webframeclient.h" | 12 #include "media/blink/mock_webframeclient.h" |
| 13 #include "media/blink/mock_weburlloader.h" | 13 #include "media/blink/mock_weburlloader.h" |
| 14 #include "media/blink/multibuffer_data_source.h" |
| 15 #include "media/blink/multibuffer_reader.h" |
| 16 #include "media/blink/resource_multibuffer_data_provider.h" |
| 14 #include "media/blink/test_response_generator.h" | 17 #include "media/blink/test_response_generator.h" |
| 15 #include "third_party/WebKit/public/platform/WebURLResponse.h" | 18 #include "third_party/WebKit/public/platform/WebURLResponse.h" |
| 16 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 19 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 17 #include "third_party/WebKit/public/web/WebView.h" | 20 #include "third_party/WebKit/public/web/WebView.h" |
| 18 | 21 |
| 19 using ::testing::_; | 22 using ::testing::_; |
| 20 using ::testing::Assign; | 23 using ::testing::Assign; |
| 21 using ::testing::DoAll; | 24 using ::testing::DoAll; |
| 22 using ::testing::Invoke; | 25 using ::testing::Invoke; |
| 23 using ::testing::InvokeWithoutArgs; | 26 using ::testing::InvokeWithoutArgs; |
| 24 using ::testing::InSequence; | 27 using ::testing::InSequence; |
| 25 using ::testing::NiceMock; | 28 using ::testing::NiceMock; |
| 26 using ::testing::StrictMock; | 29 using ::testing::StrictMock; |
| 27 | 30 |
| 28 using blink::WebLocalFrame; | 31 using blink::WebLocalFrame; |
| 29 using blink::WebString; | 32 using blink::WebString; |
| 30 using blink::WebURLLoader; | 33 using blink::WebURLLoader; |
| 31 using blink::WebURLResponse; | 34 using blink::WebURLResponse; |
| 32 using blink::WebView; | 35 using blink::WebView; |
| 33 | 36 |
| 34 namespace media { | 37 namespace media { |
| 35 | 38 |
| 39 class MockResourceMultiBuffer; |
| 40 |
| 41 class MockMultiBufferDataProvider : public ResourceMultiBufferDataProvider { |
| 42 public: |
| 43 MockMultiBufferDataProvider(MultiBuffer::BlockId pos, |
| 44 MockResourceMultiBuffer* multibuffer); |
| 45 ~MockMultiBufferDataProvider(); |
| 46 void ForgetMockMultiBuffer() { mock_multibuffer_ = nullptr; } |
| 47 void Start() override { |
| 48 // Create a mock active loader. |
| 49 // Keep track of active loading state via loadAsynchronously() and cancel(). |
| 50 NiceMock<MockWebURLLoader>* url_loader = new NiceMock<MockWebURLLoader>(); |
| 51 ON_CALL(*url_loader, cancel()).WillByDefault(Assign(&loading_, false)); |
| 52 loading_ = true; |
| 53 active_loader_.reset( |
| 54 new ActiveLoader(scoped_ptr<WebURLLoader>(url_loader))); |
| 55 if (!on_start_.is_null()) { |
| 56 on_start_.Run(); |
| 57 } |
| 58 } |
| 59 |
| 60 bool loading() const { return loading_; } |
| 61 void RunOnStart(base::Closure cb) { on_start_ = cb; } |
| 62 |
| 63 private: |
| 64 MockResourceMultiBuffer* mock_multibuffer_; |
| 65 bool loading_; |
| 66 base::Closure on_start_; |
| 67 }; |
| 68 |
| 69 class MockResourceMultiBuffer : public ResourceMultiBuffer { |
| 70 public: |
| 71 explicit MockResourceMultiBuffer(blink::WebFrame* frame) |
| 72 : ResourceMultiBuffer(frame) {} |
| 73 ~MockResourceMultiBuffer() override { |
| 74 for (auto i : data_providers_) |
| 75 i->ForgetMockMultiBuffer(); |
| 76 } |
| 77 MultiBuffer::DataProvider* CreateWriter(const BlockId& pos) override { |
| 78 MockMultiBufferDataProvider* ret = |
| 79 new MockMultiBufferDataProvider(pos, this); |
| 80 data_providers_.insert(ret); |
| 81 ret->Start(); |
| 82 return ret; |
| 83 } |
| 84 void Unregister(MockMultiBufferDataProvider* provider) { |
| 85 data_providers_.erase(provider); |
| 86 } |
| 87 |
| 88 MockMultiBufferDataProvider* GetProvider() { |
| 89 EXPECT_EQ(data_providers_.size(), 1U); |
| 90 if (data_providers_.size() != 1) |
| 91 return nullptr; |
| 92 return *data_providers_.begin(); |
| 93 } |
| 94 MockMultiBufferDataProvider* GetProvider_allownull() { |
| 95 EXPECT_LE(data_providers_.size(), 1U); |
| 96 if (data_providers_.size() != 1U) |
| 97 return nullptr; |
| 98 return *data_providers_.begin(); |
| 99 } |
| 100 bool HasProvider() const { return data_providers_.size() == 1U; } |
| 101 bool loading() { |
| 102 if (data_providers_.empty()) |
| 103 return false; |
| 104 return GetProvider()->loading(); |
| 105 } |
| 106 |
| 107 private: |
| 108 std::set<MockMultiBufferDataProvider*> data_providers_; |
| 109 }; |
| 110 |
| 111 MockMultiBufferDataProvider::MockMultiBufferDataProvider( |
| 112 MultiBuffer::BlockId pos, |
| 113 MockResourceMultiBuffer* multibuffer) |
| 114 : ResourceMultiBufferDataProvider(pos, multibuffer), |
| 115 mock_multibuffer_(multibuffer), |
| 116 loading_(false) {} |
| 117 |
| 118 MockMultiBufferDataProvider::~MockMultiBufferDataProvider() { |
| 119 if (mock_multibuffer_) |
| 120 mock_multibuffer_->Unregister(this); |
| 121 } |
| 122 |
| 36 class MockBufferedDataSourceHost : public BufferedDataSourceHost { | 123 class MockBufferedDataSourceHost : public BufferedDataSourceHost { |
| 37 public: | 124 public: |
| 38 MockBufferedDataSourceHost() {} | 125 MockBufferedDataSourceHost() {} |
| 39 virtual ~MockBufferedDataSourceHost() {} | 126 virtual ~MockBufferedDataSourceHost() {} |
| 40 | 127 |
| 41 MOCK_METHOD1(SetTotalBytes, void(int64 total_bytes)); | 128 MOCK_METHOD1(SetTotalBytes, void(int64 total_bytes)); |
| 42 MOCK_METHOD2(AddBufferedByteRange, void(int64 start, int64 end)); | 129 MOCK_METHOD2(AddBufferedByteRange, void(int64 start, int64 end)); |
| 43 | 130 |
| 44 private: | 131 private: |
| 45 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSourceHost); | 132 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSourceHost); |
| 46 }; | 133 }; |
| 47 | 134 |
| 48 // Overrides CreateResourceLoader() to permit injecting a MockWebURLLoader. | 135 class MockMultibufferDataSource : public MultibufferDataSource { |
| 49 // Also keeps track of whether said MockWebURLLoader is actively loading. | |
| 50 class MockBufferedDataSource : public BufferedDataSource { | |
| 51 public: | 136 public: |
| 52 MockBufferedDataSource( | 137 MockMultibufferDataSource( |
| 53 const GURL& url, | 138 const GURL& url, |
| 54 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 139 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 140 linked_ptr<ResourceMultiBuffer> multibuffer, |
| 55 WebLocalFrame* frame, | 141 WebLocalFrame* frame, |
| 56 BufferedDataSourceHost* host) | 142 BufferedDataSourceHost* host) |
| 57 : BufferedDataSource(url, | 143 : MultibufferDataSource( |
| 58 BufferedResourceLoader::kUnspecified, | 144 url, |
| 59 task_runner, | 145 UrlData::kUnspecified, |
| 60 frame, | 146 task_runner, |
| 61 new media::MediaLog(), | 147 multibuffer, |
| 62 host, | 148 frame, |
| 63 base::Bind(&MockBufferedDataSource::set_downloading, | 149 new media::MediaLog(), |
| 64 base::Unretained(this))), | 150 host, |
| 65 downloading_(false), | 151 base::Bind(&MockMultibufferDataSource::set_downloading, |
| 66 loading_(false) {} | 152 base::Unretained(this))), |
| 67 virtual ~MockBufferedDataSource() {} | 153 downloading_(false) {} |
| 68 | 154 |
| 69 MOCK_METHOD2(CreateResourceLoader, BufferedResourceLoader*(int64, int64)); | |
| 70 BufferedResourceLoader* CreateMockResourceLoader(int64 first_byte_position, | |
| 71 int64 last_byte_position) { | |
| 72 CHECK(!loading_) << "Previous resource load wasn't cancelled"; | |
| 73 | |
| 74 BufferedResourceLoader* loader = | |
| 75 BufferedDataSource::CreateResourceLoader(first_byte_position, | |
| 76 last_byte_position); | |
| 77 | |
| 78 // Keep track of active loading state via loadAsynchronously() and cancel(). | |
| 79 NiceMock<MockWebURLLoader>* url_loader = new NiceMock<MockWebURLLoader>(); | |
| 80 ON_CALL(*url_loader, loadAsynchronously(_, _)) | |
| 81 .WillByDefault(Assign(&loading_, true)); | |
| 82 ON_CALL(*url_loader, cancel()) | |
| 83 .WillByDefault(Assign(&loading_, false)); | |
| 84 | |
| 85 // |test_loader_| will be used when Start() is called. | |
| 86 loader->test_loader_ = scoped_ptr<WebURLLoader>(url_loader); | |
| 87 return loader; | |
| 88 } | |
| 89 | |
| 90 bool loading() { return loading_; } | |
| 91 void set_loading(bool loading) { loading_ = loading; } | |
| 92 bool downloading() { return downloading_; } | 155 bool downloading() { return downloading_; } |
| 93 void set_downloading(bool downloading) { downloading_ = downloading; } | 156 void set_downloading(bool downloading) { downloading_ = downloading; } |
| 157 bool range_supported() { return url_data_->range_supported(); } |
| 94 | 158 |
| 95 private: | 159 private: |
| 96 // Whether the resource is downloading or deferred. | 160 // Whether the resource is downloading or deferred. |
| 97 bool downloading_; | 161 bool downloading_; |
| 98 | 162 |
| 99 // Whether the resource load has starting loading but yet to been cancelled. | 163 // Whether the resource load has starting loading but yet to been cancelled. |
| 100 bool loading_; | 164 bool loading_; |
| 101 | 165 |
| 102 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSource); | 166 DISALLOW_COPY_AND_ASSIGN(MockMultibufferDataSource); |
| 103 }; | 167 }; |
| 104 | 168 |
| 105 static const int64 kFileSize = 5000000; | 169 static const int64 kFileSize = 5000000; |
| 106 static const int64 kFarReadPosition = 4000000; | 170 static const int64 kFarReadPosition = 3997696; |
| 107 static const int kDataSize = 1024; | 171 static const int kDataSize = 32 << 10; |
| 108 | 172 |
| 109 static const char kHttpUrl[] = "http://localhost/foo.webm"; | 173 static const char kHttpUrl[] = "http://localhost/foo.webm"; |
| 110 static const char kFileUrl[] = "file:///tmp/bar.webm"; | 174 static const char kFileUrl[] = "file:///tmp/bar.webm"; |
| 111 static const char kHttpDifferentPathUrl[] = "http://localhost/bar.webm"; | 175 static const char kHttpDifferentPathUrl[] = "http://localhost/bar.webm"; |
| 112 static const char kHttpDifferentOriginUrl[] = "http://127.0.0.1/foo.webm"; | 176 static const char kHttpDifferentOriginUrl[] = "http://127.0.0.1/foo.webm"; |
| 113 | 177 |
| 114 class BufferedDataSourceTest : public testing::Test { | 178 class MultibufferDataSourceTest : public testing::Test { |
| 115 public: | 179 public: |
| 116 BufferedDataSourceTest() | 180 MultibufferDataSourceTest() |
| 117 : view_(WebView::create(NULL)), | 181 : view_(WebView::create(NULL)), |
| 118 frame_( | 182 frame_( |
| 119 WebLocalFrame::create(blink::WebTreeScopeType::Document, &client_)), | 183 WebLocalFrame::create(blink::WebTreeScopeType::Document, &client_)), |
| 120 preload_(BufferedDataSource::AUTO) { | 184 preload_(MultibufferDataSource::AUTO), |
| 185 resource_multibuffer_( |
| 186 make_linked_ptr(new MockResourceMultiBuffer(frame_))) { |
| 121 view_->setMainFrame(frame_); | 187 view_->setMainFrame(frame_); |
| 122 } | 188 } |
| 123 | 189 |
| 124 virtual ~BufferedDataSourceTest() { | 190 virtual ~MultibufferDataSourceTest() { |
| 125 view_->close(); | 191 view_->close(); |
| 126 frame_->close(); | 192 frame_->close(); |
| 127 } | 193 } |
| 128 | 194 |
| 129 MOCK_METHOD1(OnInitialize, void(bool)); | 195 MOCK_METHOD1(OnInitialize, void(bool)); |
| 130 | 196 |
| 131 void Initialize(const char* url, bool expected) { | 197 void Initialize(const char* url, bool expected) { |
| 132 GURL gurl(url); | 198 GURL gurl(url); |
| 133 data_source_.reset( | 199 data_source_.reset(new MockMultibufferDataSource( |
| 134 new MockBufferedDataSource(gurl, | 200 gurl, message_loop_.task_runner(), resource_multibuffer_, |
| 135 message_loop_.task_runner(), | 201 view_->mainFrame()->toWebLocalFrame(), &host_)); |
| 136 view_->mainFrame()->toWebLocalFrame(), | |
| 137 &host_)); | |
| 138 data_source_->SetPreload(preload_); | 202 data_source_->SetPreload(preload_); |
| 139 | 203 |
| 140 response_generator_.reset(new TestResponseGenerator(gurl, kFileSize)); | 204 response_generator_.reset(new TestResponseGenerator(gurl, kFileSize)); |
| 141 ExpectCreateResourceLoader(); | |
| 142 EXPECT_CALL(*this, OnInitialize(expected)); | 205 EXPECT_CALL(*this, OnInitialize(expected)); |
| 143 data_source_->Initialize(base::Bind(&BufferedDataSourceTest::OnInitialize, | 206 data_source_->Initialize(base::Bind( |
| 144 base::Unretained(this))); | 207 &MultibufferDataSourceTest::OnInitialize, base::Unretained(this))); |
| 145 message_loop_.RunUntilIdle(); | 208 message_loop_.RunUntilIdle(); |
| 146 | 209 |
| 147 bool is_http = gurl.SchemeIsHTTPOrHTTPS(); | 210 // Always loading after initialize. |
| 148 EXPECT_EQ(data_source_->downloading(), is_http); | 211 EXPECT_EQ(data_source_->downloading(), true); |
| 149 } | 212 } |
| 150 | 213 |
| 151 // Helper to initialize tests with a valid 200 response. | 214 // Helper to initialize tests with a valid 200 response. |
| 152 void InitializeWith200Response() { | 215 void InitializeWith200Response() { |
| 153 Initialize(kHttpUrl, true); | 216 Initialize(kHttpUrl, true); |
| 154 | 217 |
| 155 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | 218 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 156 Respond(response_generator_->Generate200()); | 219 Respond(response_generator_->Generate200()); |
| 220 |
| 221 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
| 222 ReceiveData(kDataSize); |
| 157 } | 223 } |
| 158 | 224 |
| 159 // Helper to initialize tests with a valid 206 response. | 225 // Helper to initialize tests with a valid 206 response. |
| 160 void InitializeWith206Response() { | 226 void InitializeWith206Response() { |
| 161 Initialize(kHttpUrl, true); | 227 Initialize(kHttpUrl, true); |
| 162 | 228 |
| 163 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | 229 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 164 Respond(response_generator_->Generate206(0)); | 230 Respond(response_generator_->Generate206(0)); |
| 231 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
| 232 ReceiveData(kDataSize); |
| 165 } | 233 } |
| 166 | 234 |
| 167 // Helper to initialize tests with a valid file:// response. | 235 // Helper to initialize tests with a valid file:// response. |
| 168 void InitializeWithFileResponse() { | 236 void InitializeWithFileResponse() { |
| 169 Initialize(kFileUrl, true); | 237 Initialize(kFileUrl, true); |
| 170 | 238 |
| 171 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); | 239 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); |
| 172 EXPECT_CALL(host_, AddBufferedByteRange(0, kFileSize)); | 240 EXPECT_CALL(host_, AddBufferedByteRange(0, kFileSize)); |
| 173 Respond(response_generator_->GenerateFileResponse(0)); | 241 Respond(response_generator_->GenerateFileResponse(0)); |
| 242 |
| 243 ReceiveData(kDataSize); |
| 174 } | 244 } |
| 175 | 245 |
| 176 // Stops any active loaders and shuts down the data source. | 246 // Stops any active loaders and shuts down the data source. |
| 177 // | 247 // |
| 178 // This typically happens when the page is closed and for our purposes is | 248 // This typically happens when the page is closed and for our purposes is |
| 179 // appropriate to do when tearing down a test. | 249 // appropriate to do when tearing down a test. |
| 180 void Stop() { | 250 void Stop() { |
| 181 if (data_source_->loading()) { | 251 if (loading()) { |
| 182 loader()->didFail(url_loader(), response_generator_->GenerateError()); | 252 data_provider()->didFail(url_loader(), |
| 253 response_generator_->GenerateError()); |
| 183 message_loop_.RunUntilIdle(); | 254 message_loop_.RunUntilIdle(); |
| 184 } | 255 } |
| 185 | 256 |
| 186 data_source_->Stop(); | 257 data_source_->Stop(); |
| 187 message_loop_.RunUntilIdle(); | 258 message_loop_.RunUntilIdle(); |
| 188 } | 259 } |
| 189 | 260 |
| 190 void ExpectCreateResourceLoader() { | |
| 191 EXPECT_CALL(*data_source_, CreateResourceLoader(_, _)) | |
| 192 .WillOnce(Invoke(data_source_.get(), | |
| 193 &MockBufferedDataSource::CreateMockResourceLoader)); | |
| 194 message_loop_.RunUntilIdle(); | |
| 195 } | |
| 196 | |
| 197 void Respond(const WebURLResponse& response) { | 261 void Respond(const WebURLResponse& response) { |
| 198 loader()->didReceiveResponse(url_loader(), response); | 262 EXPECT_TRUE(url_loader()); |
| 263 if (!active_loader()) |
| 264 return; |
| 265 data_provider()->didReceiveResponse(url_loader(), response); |
| 199 message_loop_.RunUntilIdle(); | 266 message_loop_.RunUntilIdle(); |
| 200 } | 267 } |
| 201 | 268 |
| 202 void ReceiveData(int size) { | 269 void ReceiveData(int size) { |
| 270 EXPECT_TRUE(url_loader()); |
| 271 if (!url_loader()) |
| 272 return; |
| 203 scoped_ptr<char[]> data(new char[size]); | 273 scoped_ptr<char[]> data(new char[size]); |
| 204 memset(data.get(), 0xA5, size); // Arbitrary non-zero value. | 274 memset(data.get(), 0xA5, size); // Arbitrary non-zero value. |
| 205 | 275 |
| 206 loader()->didReceiveData(url_loader(), data.get(), size, size); | 276 data_provider()->didReceiveData(url_loader(), data.get(), size, size); |
| 207 message_loop_.RunUntilIdle(); | 277 message_loop_.RunUntilIdle(); |
| 208 } | 278 } |
| 209 | 279 |
| 210 void FinishLoading() { | 280 void FinishLoading() { |
| 211 data_source_->set_loading(false); | 281 EXPECT_TRUE(url_loader()); |
| 212 loader()->didFinishLoading(url_loader(), 0, -1); | 282 if (!url_loader()) |
| 283 return; |
| 284 data_provider()->didFinishLoading(url_loader(), 0, -1); |
| 213 message_loop_.RunUntilIdle(); | 285 message_loop_.RunUntilIdle(); |
| 214 } | 286 } |
| 215 | 287 |
| 288 void Restart() { |
| 289 EXPECT_TRUE(data_provider()); |
| 290 EXPECT_FALSE(active_loader_allownull()); |
| 291 if (!data_provider()) |
| 292 return; |
| 293 data_provider()->Start(); |
| 294 } |
| 295 |
| 216 MOCK_METHOD1(ReadCallback, void(int size)); | 296 MOCK_METHOD1(ReadCallback, void(int size)); |
| 217 | 297 |
| 218 void ReadAt(int64 position) { | 298 void ReadAt(int64 position, int64 howmuch = kDataSize) { |
| 219 data_source_->Read(position, kDataSize, buffer_, | 299 data_source_->Read(position, howmuch, buffer_, |
| 220 base::Bind(&BufferedDataSourceTest::ReadCallback, | 300 base::Bind(&MultibufferDataSourceTest::ReadCallback, |
| 221 base::Unretained(this))); | 301 base::Unretained(this))); |
| 222 message_loop_.RunUntilIdle(); | 302 message_loop_.RunUntilIdle(); |
| 223 } | 303 } |
| 224 | 304 |
| 225 void ExecuteMixedResponseSuccessTest(const WebURLResponse& response1, | 305 void ExecuteMixedResponseSuccessTest(const WebURLResponse& response1, |
| 226 const WebURLResponse& response2) { | 306 const WebURLResponse& response2) { |
| 227 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); | 307 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); |
| 228 EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, kDataSize * 2 - 1)); | 308 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); |
| 229 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | 309 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
| 230 EXPECT_CALL(*this, ReadCallback(kDataSize)).Times(2); | 310 EXPECT_CALL(*this, ReadCallback(kDataSize)).Times(2); |
| 231 | 311 |
| 232 Respond(response1); | 312 Respond(response1); |
| 313 ReceiveData(kDataSize); |
| 233 ReadAt(0); | 314 ReadAt(0); |
| 234 ReceiveData(kDataSize); | 315 EXPECT_TRUE(loading()); |
| 235 EXPECT_TRUE(data_source_->loading()); | |
| 236 | 316 |
| 237 ExpectCreateResourceLoader(); | |
| 238 FinishLoading(); | 317 FinishLoading(); |
| 318 Restart(); |
| 239 ReadAt(kDataSize); | 319 ReadAt(kDataSize); |
| 240 Respond(response2); | 320 Respond(response2); |
| 241 ReceiveData(kDataSize); | 321 ReceiveData(kDataSize); |
| 242 FinishLoading(); | 322 FinishLoading(); |
| 243 Stop(); | 323 Stop(); |
| 244 } | 324 } |
| 245 | 325 |
| 246 void ExecuteMixedResponseFailureTest(const WebURLResponse& response1, | 326 void ExecuteMixedResponseFailureTest(const WebURLResponse& response1, |
| 247 const WebURLResponse& response2) { | 327 const WebURLResponse& response2) { |
| 248 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); | 328 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); |
| 249 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | 329 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
| 250 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 330 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 251 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 331 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 252 | 332 |
| 253 Respond(response1); | 333 Respond(response1); |
| 334 ReceiveData(kDataSize); |
| 254 ReadAt(0); | 335 ReadAt(0); |
| 255 ReceiveData(kDataSize); | 336 EXPECT_TRUE(loading()); |
| 256 EXPECT_TRUE(data_source_->loading()); | |
| 257 | 337 |
| 258 ExpectCreateResourceLoader(); | |
| 259 FinishLoading(); | 338 FinishLoading(); |
| 339 Restart(); |
| 260 ReadAt(kDataSize); | 340 ReadAt(kDataSize); |
| 261 Respond(response2); | 341 Respond(response2); |
| 262 Stop(); | 342 Stop(); |
| 263 } | 343 } |
| 264 | 344 |
| 265 // Accessors for private variables on |data_source_|. | 345 void CheckCapacityDefer() { |
| 266 BufferedResourceLoader* loader() { | 346 EXPECT_EQ(2 << 20, preload_low()); |
| 267 return data_source_->loader_.get(); | 347 EXPECT_EQ(3 << 20, preload_high()); |
| 268 } | |
| 269 ActiveLoader* active_loader() { return loader()->active_loader_.get(); } | |
| 270 WebURLLoader* url_loader() { | |
| 271 return loader()->active_loader_->loader_.get(); | |
| 272 } | 348 } |
| 273 | 349 |
| 274 BufferedDataSource::Preload preload() { return data_source_->preload_; } | 350 void CheckReadThenDefer() { |
| 275 void set_preload(BufferedDataSource::Preload preload) { preload_ = preload; } | 351 EXPECT_EQ(0, preload_low()); |
| 276 BufferedResourceLoader::DeferStrategy defer_strategy() { | 352 EXPECT_EQ(0, preload_high()); |
| 277 return loader()->defer_strategy_; | 353 } |
| 354 |
| 355 void CheckNeverDefer() { |
| 356 EXPECT_EQ(1LL << 40, preload_low()); |
| 357 EXPECT_EQ(1LL << 40, preload_high()); |
| 358 } |
| 359 |
| 360 // Accessors for private variables on |data_source_|. |
| 361 MultiBufferReader* loader() { return data_source_->reader_.get(); } |
| 362 |
| 363 MockMultiBufferDataProvider* data_provider() { |
| 364 return resource_multibuffer_->GetProvider(); |
| 365 } |
| 366 ActiveLoader* active_loader() { |
| 367 EXPECT_TRUE(data_provider()); |
| 368 if (!data_provider()) |
| 369 return nullptr; |
| 370 return data_provider()->active_loader_.get(); |
| 371 } |
| 372 ActiveLoader* active_loader_allownull() { |
| 373 MockMultiBufferDataProvider* data_provider = |
| 374 resource_multibuffer_->GetProvider_allownull(); |
| 375 if (!data_provider) |
| 376 return nullptr; |
| 377 return data_provider->active_loader_.get(); |
| 378 } |
| 379 WebURLLoader* url_loader() { |
| 380 EXPECT_TRUE(active_loader()); |
| 381 if (!active_loader()) |
| 382 return nullptr; |
| 383 return active_loader()->loader_.get(); |
| 384 } |
| 385 |
| 386 bool loading() { return resource_multibuffer_->loading(); } |
| 387 |
| 388 MultibufferDataSource::Preload preload() { return data_source_->preload_; } |
| 389 void set_preload(MultibufferDataSource::Preload preload) { |
| 390 preload_ = preload; |
| 391 } |
| 392 int64 preload_high() { |
| 393 CHECK(loader()); |
| 394 return loader()->preload_high(); |
| 395 } |
| 396 int64 preload_low() { |
| 397 CHECK(loader()); |
| 398 return loader()->preload_low(); |
| 278 } | 399 } |
| 279 int data_source_bitrate() { return data_source_->bitrate_; } | 400 int data_source_bitrate() { return data_source_->bitrate_; } |
| 280 double data_source_playback_rate() { return data_source_->playback_rate_; } | 401 double data_source_playback_rate() { return data_source_->playback_rate_; } |
| 281 int loader_bitrate() { return loader()->bitrate_; } | |
| 282 double loader_playback_rate() { return loader()->playback_rate_; } | |
| 283 bool is_local_source() { return data_source_->assume_fully_buffered(); } | 402 bool is_local_source() { return data_source_->assume_fully_buffered(); } |
| 284 void set_might_be_reused_from_cache_in_future(bool value) { | 403 void set_might_be_reused_from_cache_in_future(bool value) { |
| 285 loader()->might_be_reused_from_cache_in_future_ = value; | 404 data_source_->url_data_->set_cacheable(value); |
| 286 } | 405 } |
| 287 | 406 |
| 288 scoped_ptr<MockBufferedDataSource> data_source_; | 407 protected: |
| 289 | |
| 290 scoped_ptr<TestResponseGenerator> response_generator_; | |
| 291 MockWebFrameClient client_; | 408 MockWebFrameClient client_; |
| 292 WebView* view_; | 409 WebView* view_; |
| 293 WebLocalFrame* frame_; | 410 WebLocalFrame* frame_; |
| 411 MultibufferDataSource::Preload preload_; |
| 412 linked_ptr<MockResourceMultiBuffer> resource_multibuffer_; |
| 413 |
| 414 scoped_ptr<MockMultibufferDataSource> data_source_; |
| 415 |
| 416 scoped_ptr<TestResponseGenerator> response_generator_; |
| 294 | 417 |
| 295 StrictMock<MockBufferedDataSourceHost> host_; | 418 StrictMock<MockBufferedDataSourceHost> host_; |
| 296 base::MessageLoop message_loop_; | 419 base::MessageLoop message_loop_; |
| 297 | 420 |
| 298 private: | 421 // Used for calling MultibufferDataSource::Read(). |
| 299 // Used for calling BufferedDataSource::Read(). | 422 uint8 buffer_[kDataSize * 2]; |
| 300 uint8 buffer_[kDataSize]; | |
| 301 | 423 |
| 302 BufferedDataSource::Preload preload_; | 424 DISALLOW_COPY_AND_ASSIGN(MultibufferDataSourceTest); |
| 303 | |
| 304 DISALLOW_COPY_AND_ASSIGN(BufferedDataSourceTest); | |
| 305 }; | 425 }; |
| 306 | 426 |
| 307 TEST_F(BufferedDataSourceTest, Range_Supported) { | 427 TEST_F(MultibufferDataSourceTest, Range_Supported) { |
| 308 InitializeWith206Response(); | 428 InitializeWith206Response(); |
| 309 | 429 |
| 310 EXPECT_TRUE(data_source_->loading()); | 430 EXPECT_TRUE(loading()); |
| 311 EXPECT_FALSE(data_source_->IsStreaming()); | 431 EXPECT_FALSE(data_source_->IsStreaming()); |
| 312 Stop(); | 432 Stop(); |
| 313 } | 433 } |
| 314 | 434 |
| 315 TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) { | 435 TEST_F(MultibufferDataSourceTest, Range_InstanceSizeUnknown) { |
| 316 Initialize(kHttpUrl, true); | 436 Initialize(kHttpUrl, true); |
| 317 | 437 |
| 318 Respond(response_generator_->Generate206( | 438 Respond(response_generator_->Generate206( |
| 319 0, TestResponseGenerator::kNoContentRangeInstanceSize)); | 439 0, TestResponseGenerator::kNoContentRangeInstanceSize)); |
| 320 | 440 |
| 321 EXPECT_TRUE(data_source_->loading()); | 441 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
| 442 ReceiveData(kDataSize); |
| 443 |
| 444 EXPECT_TRUE(loading()); |
| 322 EXPECT_TRUE(data_source_->IsStreaming()); | 445 EXPECT_TRUE(data_source_->IsStreaming()); |
| 323 Stop(); | 446 Stop(); |
| 324 } | 447 } |
| 325 | 448 |
| 326 TEST_F(BufferedDataSourceTest, Range_NotFound) { | 449 TEST_F(MultibufferDataSourceTest, Range_NotFound) { |
| 327 Initialize(kHttpUrl, false); | 450 Initialize(kHttpUrl, false); |
| 328 Respond(response_generator_->Generate404()); | 451 Respond(response_generator_->Generate404()); |
| 329 | 452 |
| 330 EXPECT_FALSE(data_source_->loading()); | 453 EXPECT_FALSE(loading()); |
| 331 Stop(); | 454 Stop(); |
| 332 } | 455 } |
| 333 | 456 |
| 334 TEST_F(BufferedDataSourceTest, Range_NotSupported) { | 457 TEST_F(MultibufferDataSourceTest, Range_NotSupported) { |
| 335 InitializeWith200Response(); | 458 InitializeWith200Response(); |
| 336 | 459 |
| 337 EXPECT_TRUE(data_source_->loading()); | 460 EXPECT_TRUE(loading()); |
| 338 EXPECT_TRUE(data_source_->IsStreaming()); | 461 EXPECT_TRUE(data_source_->IsStreaming()); |
| 339 Stop(); | 462 Stop(); |
| 340 } | 463 } |
| 341 | 464 |
| 342 // Special carve-out for Apache versions that choose to return a 200 for | 465 // Special carve-out for Apache versions that choose to return a 200 for |
| 343 // Range:0- ("because it's more efficient" than a 206) | 466 // Range:0- ("because it's more efficient" than a 206) |
| 344 TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) { | 467 TEST_F(MultibufferDataSourceTest, Range_SupportedButReturned200) { |
| 345 Initialize(kHttpUrl, true); | 468 Initialize(kHttpUrl, true); |
| 346 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | 469 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 347 WebURLResponse response = response_generator_->Generate200(); | 470 WebURLResponse response = response_generator_->Generate200(); |
| 348 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"), | 471 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"), |
| 349 WebString::fromUTF8("bytes")); | 472 WebString::fromUTF8("bytes")); |
| 350 Respond(response); | 473 Respond(response); |
| 351 | 474 |
| 352 EXPECT_TRUE(data_source_->loading()); | 475 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
| 476 ReceiveData(kDataSize); |
| 477 |
| 478 EXPECT_TRUE(loading()); |
| 353 EXPECT_FALSE(data_source_->IsStreaming()); | 479 EXPECT_FALSE(data_source_->IsStreaming()); |
| 354 Stop(); | 480 Stop(); |
| 355 } | 481 } |
| 356 | 482 |
| 357 TEST_F(BufferedDataSourceTest, Range_MissingContentRange) { | 483 TEST_F(MultibufferDataSourceTest, Range_MissingContentRange) { |
| 358 Initialize(kHttpUrl, false); | 484 Initialize(kHttpUrl, false); |
| 359 Respond(response_generator_->Generate206( | 485 Respond(response_generator_->Generate206( |
| 360 0, TestResponseGenerator::kNoContentRange)); | 486 0, TestResponseGenerator::kNoContentRange)); |
| 361 | 487 |
| 362 EXPECT_FALSE(data_source_->loading()); | 488 EXPECT_FALSE(loading()); |
| 363 Stop(); | 489 Stop(); |
| 364 } | 490 } |
| 365 | 491 |
| 366 TEST_F(BufferedDataSourceTest, Range_MissingContentLength) { | 492 TEST_F(MultibufferDataSourceTest, Range_MissingContentLength) { |
| 367 Initialize(kHttpUrl, true); | 493 Initialize(kHttpUrl, true); |
| 368 | 494 |
| 369 // It'll manage without a Content-Length response. | 495 // It'll manage without a Content-Length response. |
| 370 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | 496 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 371 Respond(response_generator_->Generate206( | 497 Respond(response_generator_->Generate206( |
| 372 0, TestResponseGenerator::kNoContentLength)); | 498 0, TestResponseGenerator::kNoContentLength)); |
| 373 | 499 |
| 374 EXPECT_TRUE(data_source_->loading()); | 500 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
| 501 ReceiveData(kDataSize); |
| 502 |
| 503 EXPECT_TRUE(loading()); |
| 375 EXPECT_FALSE(data_source_->IsStreaming()); | 504 EXPECT_FALSE(data_source_->IsStreaming()); |
| 376 Stop(); | 505 Stop(); |
| 377 } | 506 } |
| 378 | 507 |
| 379 TEST_F(BufferedDataSourceTest, Range_WrongContentRange) { | 508 TEST_F(MultibufferDataSourceTest, Range_WrongContentRange) { |
| 380 Initialize(kHttpUrl, false); | 509 Initialize(kHttpUrl, false); |
| 381 | 510 |
| 382 // Now it's done and will fail. | 511 // Now it's done and will fail. |
| 383 Respond(response_generator_->Generate206(1337)); | 512 Respond(response_generator_->Generate206(1337)); |
| 384 | 513 |
| 385 EXPECT_FALSE(data_source_->loading()); | 514 EXPECT_FALSE(loading()); |
| 386 Stop(); | 515 Stop(); |
| 387 } | 516 } |
| 388 | 517 |
| 389 // Test the case where the initial response from the server indicates that | 518 // Test the case where the initial response from the server indicates that |
| 390 // Range requests are supported, but a later request prove otherwise. | 519 // Range requests are supported, but a later request prove otherwise. |
| 391 TEST_F(BufferedDataSourceTest, Range_ServerLied) { | 520 TEST_F(MultibufferDataSourceTest, Range_ServerLied) { |
| 392 InitializeWith206Response(); | 521 InitializeWith206Response(); |
| 393 | 522 |
| 394 // Read causing a new request to be made -- we'll expect it to error. | 523 // Read causing a new request to be made -- we'll expect it to error. |
| 395 ExpectCreateResourceLoader(); | |
| 396 ReadAt(kFarReadPosition); | 524 ReadAt(kFarReadPosition); |
| 397 | 525 |
| 398 // Return a 200 in response to a range request. | 526 // Return a 200 in response to a range request. |
| 399 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 527 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 400 Respond(response_generator_->Generate200()); | 528 Respond(response_generator_->Generate200()); |
| 401 | 529 |
| 402 EXPECT_FALSE(data_source_->loading()); | 530 EXPECT_FALSE(loading()); |
| 403 Stop(); | 531 Stop(); |
| 404 } | 532 } |
| 405 | 533 |
| 406 TEST_F(BufferedDataSourceTest, Http_AbortWhileReading) { | 534 TEST_F(MultibufferDataSourceTest, Http_AbortWhileReading) { |
| 407 InitializeWith206Response(); | 535 InitializeWith206Response(); |
| 408 | 536 |
| 409 // Make sure there's a pending read -- we'll expect it to error. | 537 // Make sure there's a pending read -- we'll expect it to error. |
| 410 ReadAt(0); | 538 ReadAt(kFileSize); |
| 411 | 539 |
| 412 // Abort!!! | 540 // Abort!!! |
| 413 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 541 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 414 data_source_->Abort(); | 542 data_source_->Abort(); |
| 415 message_loop_.RunUntilIdle(); | 543 message_loop_.RunUntilIdle(); |
| 416 | 544 |
| 417 EXPECT_FALSE(data_source_->loading()); | 545 EXPECT_FALSE(loading()); |
| 418 Stop(); | 546 Stop(); |
| 419 } | 547 } |
| 420 | 548 |
| 421 TEST_F(BufferedDataSourceTest, File_AbortWhileReading) { | 549 TEST_F(MultibufferDataSourceTest, File_AbortWhileReading) { |
| 422 InitializeWithFileResponse(); | 550 InitializeWithFileResponse(); |
| 423 | 551 |
| 424 // Make sure there's a pending read -- we'll expect it to error. | 552 // Make sure there's a pending read -- we'll expect it to error. |
| 425 ReadAt(0); | 553 ReadAt(kFileSize); |
| 426 | 554 |
| 427 // Abort!!! | 555 // Abort!!! |
| 428 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 556 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 429 data_source_->Abort(); | 557 data_source_->Abort(); |
| 430 message_loop_.RunUntilIdle(); | 558 message_loop_.RunUntilIdle(); |
| 431 | 559 |
| 432 EXPECT_FALSE(data_source_->loading()); | 560 EXPECT_FALSE(loading()); |
| 433 Stop(); | 561 Stop(); |
| 434 } | 562 } |
| 435 | 563 |
| 436 TEST_F(BufferedDataSourceTest, Http_Retry) { | 564 TEST_F(MultibufferDataSourceTest, Http_Retry) { |
| 437 InitializeWith206Response(); | 565 InitializeWith206Response(); |
| 438 | 566 |
| 439 // Read to advance our position. | 567 // Read to advance our position. |
| 440 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 568 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 441 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | |
| 442 ReadAt(0); | 569 ReadAt(0); |
| 443 ReceiveData(kDataSize); | |
| 444 | 570 |
| 445 // Issue a pending read but terminate the connection to force a retry. | 571 // Issue a pending read but terminate the connection to force a retry. |
| 446 ReadAt(kDataSize); | 572 ReadAt(kDataSize); |
| 447 ExpectCreateResourceLoader(); | |
| 448 FinishLoading(); | 573 FinishLoading(); |
| 574 Restart(); |
| 449 Respond(response_generator_->Generate206(kDataSize)); | 575 Respond(response_generator_->Generate206(kDataSize)); |
| 450 | 576 |
| 451 // Complete the read. | 577 // Complete the read. |
| 452 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 578 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 453 EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, (kDataSize * 2) - 1)); | 579 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); |
| 454 ReceiveData(kDataSize); | 580 ReceiveData(kDataSize); |
| 455 | 581 |
| 456 EXPECT_TRUE(data_source_->loading()); | 582 EXPECT_TRUE(loading()); |
| 457 Stop(); | 583 Stop(); |
| 458 } | 584 } |
| 459 | 585 |
| 460 TEST_F(BufferedDataSourceTest, Http_RetryOnError) { | 586 TEST_F(MultibufferDataSourceTest, Http_RetryOnError) { |
| 461 InitializeWith206Response(); | 587 InitializeWith206Response(); |
| 462 | 588 |
| 463 // Read to advance our position. | 589 // Read to advance our position. |
| 464 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 590 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 465 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | |
| 466 ReadAt(0); | 591 ReadAt(0); |
| 467 ReceiveData(kDataSize); | |
| 468 | 592 |
| 469 // Issue a pending read but trigger an error to force a retry. | 593 // Issue a pending read but trigger an error to force a retry. |
| 470 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 594 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 471 EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, (kDataSize * 2) - 1)); | 595 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); |
| 472 ReadAt(kDataSize); | 596 ReadAt(kDataSize); |
| 473 base::RunLoop run_loop; | 597 base::RunLoop run_loop; |
| 474 EXPECT_CALL(*data_source_, CreateResourceLoader(_, _)) | 598 data_provider()->didFail(url_loader(), response_generator_->GenerateError()); |
| 475 .WillOnce( | 599 data_provider()->RunOnStart(run_loop.QuitClosure()); |
| 476 DoAll(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit), | |
| 477 Invoke(data_source_.get(), | |
| 478 &MockBufferedDataSource::CreateMockResourceLoader))); | |
| 479 loader()->didFail(url_loader(), response_generator_->GenerateError()); | |
| 480 run_loop.Run(); | 600 run_loop.Run(); |
| 481 Respond(response_generator_->Generate206(kDataSize)); | 601 Respond(response_generator_->Generate206(kDataSize)); |
| 482 ReceiveData(kDataSize); | 602 ReceiveData(kDataSize); |
| 483 FinishLoading(); | 603 FinishLoading(); |
| 484 EXPECT_FALSE(data_source_->loading()); | 604 EXPECT_FALSE(loading()); |
| 485 Stop(); | 605 Stop(); |
| 486 } | 606 } |
| 487 | 607 |
| 488 TEST_F(BufferedDataSourceTest, Http_PartialResponse) { | 608 TEST_F(MultibufferDataSourceTest, Http_PartialResponse) { |
| 489 Initialize(kHttpUrl, true); | 609 Initialize(kHttpUrl, true); |
| 490 WebURLResponse response1 = | 610 WebURLResponse response1 = |
| 491 response_generator_->GeneratePartial206(0, kDataSize - 1); | 611 response_generator_->GeneratePartial206(0, kDataSize - 1); |
| 492 WebURLResponse response2 = | 612 WebURLResponse response2 = |
| 493 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); | 613 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); |
| 494 // The origin URL of response1 and response2 are same. So no error should | 614 // The origin URL of response1 and response2 are same. So no error should |
| 495 // occur. | 615 // occur. |
| 496 ExecuteMixedResponseSuccessTest(response1, response2); | 616 ExecuteMixedResponseSuccessTest(response1, response2); |
| 497 } | 617 } |
| 498 | 618 |
| 499 TEST_F(BufferedDataSourceTest, | 619 TEST_F(MultibufferDataSourceTest, |
| 500 Http_MixedResponse_RedirectedToDifferentPathResponse) { | 620 Http_MixedResponse_RedirectedToDifferentPathResponse) { |
| 501 Initialize(kHttpUrl, true); | 621 Initialize(kHttpUrl, true); |
| 502 WebURLResponse response1 = | 622 WebURLResponse response1 = |
| 503 response_generator_->GeneratePartial206(0, kDataSize - 1); | 623 response_generator_->GeneratePartial206(0, kDataSize - 1); |
| 504 WebURLResponse response2 = | 624 WebURLResponse response2 = |
| 505 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); | 625 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); |
| 506 response2.setURL(GURL(kHttpDifferentPathUrl)); | 626 response2.setURL(GURL(kHttpDifferentPathUrl)); |
| 507 // The origin URL of response1 and response2 are same. So no error should | 627 // The origin URL of response1 and response2 are same. So no error should |
| 508 // occur. | 628 // occur. |
| 509 ExecuteMixedResponseSuccessTest(response1, response2); | 629 ExecuteMixedResponseSuccessTest(response1, response2); |
| 510 } | 630 } |
| 511 | 631 |
| 512 TEST_F(BufferedDataSourceTest, | 632 TEST_F(MultibufferDataSourceTest, |
| 513 Http_MixedResponse_RedirectedToDifferentOriginResponse) { | 633 Http_MixedResponse_RedirectedToDifferentOriginResponse) { |
| 514 Initialize(kHttpUrl, true); | 634 Initialize(kHttpUrl, true); |
| 515 WebURLResponse response1 = | 635 WebURLResponse response1 = |
| 516 response_generator_->GeneratePartial206(0, kDataSize - 1); | 636 response_generator_->GeneratePartial206(0, kDataSize - 1); |
| 517 WebURLResponse response2 = | 637 WebURLResponse response2 = |
| 518 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); | 638 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); |
| 519 response2.setURL(GURL(kHttpDifferentOriginUrl)); | 639 response2.setURL(GURL(kHttpDifferentOriginUrl)); |
| 520 // The origin URL of response1 and response2 are different. So an error should | 640 // The origin URL of response1 and response2 are different. So an error should |
| 521 // occur. | 641 // occur. |
| 522 ExecuteMixedResponseFailureTest(response1, response2); | 642 ExecuteMixedResponseFailureTest(response1, response2); |
| 523 } | 643 } |
| 524 | 644 |
| 525 TEST_F(BufferedDataSourceTest, | 645 TEST_F(MultibufferDataSourceTest, |
| 526 Http_MixedResponse_ServiceWorkerGeneratedResponseAndNormalResponse) { | 646 Http_MixedResponse_ServiceWorkerGeneratedResponseAndNormalResponse) { |
| 527 Initialize(kHttpUrl, true); | 647 Initialize(kHttpUrl, true); |
| 528 WebURLResponse response1 = | 648 WebURLResponse response1 = |
| 529 response_generator_->GeneratePartial206(0, kDataSize - 1); | 649 response_generator_->GeneratePartial206(0, kDataSize - 1); |
| 530 response1.setWasFetchedViaServiceWorker(true); | 650 response1.setWasFetchedViaServiceWorker(true); |
| 531 WebURLResponse response2 = | 651 WebURLResponse response2 = |
| 532 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); | 652 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); |
| 533 // response1 is generated in a Service Worker but response2 is from a native | 653 // response1 is generated in a Service Worker but response2 is from a native |
| 534 // server. So an error should occur. | 654 // server. So an error should occur. |
| 535 ExecuteMixedResponseFailureTest(response1, response2); | 655 ExecuteMixedResponseFailureTest(response1, response2); |
| 536 } | 656 } |
| 537 | 657 |
| 538 TEST_F(BufferedDataSourceTest, | 658 TEST_F(MultibufferDataSourceTest, |
| 539 Http_MixedResponse_ServiceWorkerProxiedAndSameURLResponse) { | 659 Http_MixedResponse_ServiceWorkerProxiedAndSameURLResponse) { |
| 540 Initialize(kHttpUrl, true); | 660 Initialize(kHttpUrl, true); |
| 541 WebURLResponse response1 = | 661 WebURLResponse response1 = |
| 542 response_generator_->GeneratePartial206(0, kDataSize - 1); | 662 response_generator_->GeneratePartial206(0, kDataSize - 1); |
| 543 response1.setWasFetchedViaServiceWorker(true); | 663 response1.setWasFetchedViaServiceWorker(true); |
| 544 response1.setOriginalURLViaServiceWorker(GURL(kHttpUrl)); | 664 response1.setOriginalURLViaServiceWorker(GURL(kHttpUrl)); |
| 545 WebURLResponse response2 = | 665 WebURLResponse response2 = |
| 546 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); | 666 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); |
| 547 // The origin URL of response1 and response2 are same. So no error should | 667 // The origin URL of response1 and response2 are same. So no error should |
| 548 // occur. | 668 // occur. |
| 549 ExecuteMixedResponseSuccessTest(response1, response2); | 669 ExecuteMixedResponseSuccessTest(response1, response2); |
| 550 } | 670 } |
| 551 | 671 |
| 552 TEST_F(BufferedDataSourceTest, | 672 TEST_F(MultibufferDataSourceTest, |
| 553 Http_MixedResponse_ServiceWorkerProxiedAndDifferentPathResponse) { | 673 Http_MixedResponse_ServiceWorkerProxiedAndDifferentPathResponse) { |
| 554 Initialize(kHttpUrl, true); | 674 Initialize(kHttpUrl, true); |
| 555 WebURLResponse response1 = | 675 WebURLResponse response1 = |
| 556 response_generator_->GeneratePartial206(0, kDataSize - 1); | 676 response_generator_->GeneratePartial206(0, kDataSize - 1); |
| 557 response1.setWasFetchedViaServiceWorker(true); | 677 response1.setWasFetchedViaServiceWorker(true); |
| 558 response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentPathUrl)); | 678 response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentPathUrl)); |
| 559 WebURLResponse response2 = | 679 WebURLResponse response2 = |
| 560 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); | 680 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); |
| 561 // The origin URL of response1 and response2 are same. So no error should | 681 // The origin URL of response1 and response2 are same. So no error should |
| 562 // occur. | 682 // occur. |
| 563 ExecuteMixedResponseSuccessTest(response1, response2); | 683 ExecuteMixedResponseSuccessTest(response1, response2); |
| 564 } | 684 } |
| 565 | 685 |
| 566 TEST_F(BufferedDataSourceTest, | 686 TEST_F(MultibufferDataSourceTest, |
| 567 Http_MixedResponse_ServiceWorkerProxiedAndDifferentOriginResponse) { | 687 Http_MixedResponse_ServiceWorkerProxiedAndDifferentOriginResponse) { |
| 568 Initialize(kHttpUrl, true); | 688 Initialize(kHttpUrl, true); |
| 569 WebURLResponse response1 = | 689 WebURLResponse response1 = |
| 570 response_generator_->GeneratePartial206(0, kDataSize - 1); | 690 response_generator_->GeneratePartial206(0, kDataSize - 1); |
| 571 response1.setWasFetchedViaServiceWorker(true); | 691 response1.setWasFetchedViaServiceWorker(true); |
| 572 response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentOriginUrl)); | 692 response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentOriginUrl)); |
| 573 WebURLResponse response2 = | 693 WebURLResponse response2 = |
| 574 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); | 694 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); |
| 575 // The origin URL of response1 and response2 are different. So an error should | 695 // The origin URL of response1 and response2 are different. So an error should |
| 576 // occur. | 696 // occur. |
| 577 ExecuteMixedResponseFailureTest(response1, response2); | 697 ExecuteMixedResponseFailureTest(response1, response2); |
| 578 } | 698 } |
| 579 | 699 |
| 580 TEST_F(BufferedDataSourceTest, File_Retry) { | 700 TEST_F(MultibufferDataSourceTest, File_Retry) { |
| 581 InitializeWithFileResponse(); | 701 InitializeWithFileResponse(); |
| 582 | 702 |
| 583 // Read to advance our position. | 703 // Read to advance our position. |
| 584 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 704 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 585 ReadAt(0); | 705 ReadAt(0); |
| 586 ReceiveData(kDataSize); | |
| 587 | 706 |
| 588 // Issue a pending read but terminate the connection to force a retry. | 707 // Issue a pending read but terminate the connection to force a retry. |
| 589 ReadAt(kDataSize); | 708 ReadAt(kDataSize); |
| 590 ExpectCreateResourceLoader(); | |
| 591 FinishLoading(); | 709 FinishLoading(); |
| 710 Restart(); |
| 592 Respond(response_generator_->GenerateFileResponse(kDataSize)); | 711 Respond(response_generator_->GenerateFileResponse(kDataSize)); |
| 593 | 712 |
| 594 // Complete the read. | 713 // Complete the read. |
| 595 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 714 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 596 ReceiveData(kDataSize); | 715 ReceiveData(kDataSize); |
| 597 | 716 |
| 598 EXPECT_TRUE(data_source_->loading()); | 717 EXPECT_TRUE(loading()); |
| 599 Stop(); | 718 Stop(); |
| 600 } | 719 } |
| 601 | 720 |
| 602 TEST_F(BufferedDataSourceTest, Http_TooManyRetries) { | 721 TEST_F(MultibufferDataSourceTest, Http_TooManyRetries) { |
| 603 InitializeWith206Response(); | 722 InitializeWith206Response(); |
| 604 | 723 |
| 605 // Make sure there's a pending read -- we'll expect it to error. | 724 // Make sure there's a pending read -- we'll expect it to error. |
| 606 ReadAt(0); | 725 ReadAt(kDataSize); |
| 607 | 726 |
| 608 // It'll try three times. | 727 // It'll try three times. |
| 609 ExpectCreateResourceLoader(); | |
| 610 FinishLoading(); | 728 FinishLoading(); |
| 611 Respond(response_generator_->Generate206(0)); | 729 Restart(); |
| 730 Respond(response_generator_->Generate206(kDataSize)); |
| 612 | 731 |
| 613 ExpectCreateResourceLoader(); | |
| 614 FinishLoading(); | 732 FinishLoading(); |
| 615 Respond(response_generator_->Generate206(0)); | 733 Restart(); |
| 734 Respond(response_generator_->Generate206(kDataSize)); |
| 616 | 735 |
| 617 ExpectCreateResourceLoader(); | |
| 618 FinishLoading(); | 736 FinishLoading(); |
| 619 Respond(response_generator_->Generate206(0)); | 737 Restart(); |
| 738 Respond(response_generator_->Generate206(kDataSize)); |
| 620 | 739 |
| 621 // It'll error after this. | 740 // It'll error after this. |
| 622 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 741 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 623 FinishLoading(); | 742 FinishLoading(); |
| 624 | 743 |
| 625 EXPECT_FALSE(data_source_->loading()); | 744 EXPECT_FALSE(loading()); |
| 626 Stop(); | 745 Stop(); |
| 627 } | 746 } |
| 628 | 747 |
| 629 TEST_F(BufferedDataSourceTest, File_TooManyRetries) { | 748 TEST_F(MultibufferDataSourceTest, File_TooManyRetries) { |
| 630 InitializeWithFileResponse(); | 749 InitializeWithFileResponse(); |
| 631 | 750 |
| 632 // Make sure there's a pending read -- we'll expect it to error. | 751 // Make sure there's a pending read -- we'll expect it to error. |
| 633 ReadAt(0); | 752 ReadAt(kDataSize); |
| 634 | 753 |
| 635 // It'll try three times. | 754 // It'll try three times. |
| 636 ExpectCreateResourceLoader(); | |
| 637 FinishLoading(); | 755 FinishLoading(); |
| 756 Restart(); |
| 638 Respond(response_generator_->GenerateFileResponse(0)); | 757 Respond(response_generator_->GenerateFileResponse(0)); |
| 639 | 758 |
| 640 ExpectCreateResourceLoader(); | |
| 641 FinishLoading(); | 759 FinishLoading(); |
| 760 Restart(); |
| 642 Respond(response_generator_->GenerateFileResponse(0)); | 761 Respond(response_generator_->GenerateFileResponse(0)); |
| 643 | 762 |
| 644 ExpectCreateResourceLoader(); | |
| 645 FinishLoading(); | 763 FinishLoading(); |
| 764 Restart(); |
| 646 Respond(response_generator_->GenerateFileResponse(0)); | 765 Respond(response_generator_->GenerateFileResponse(0)); |
| 647 | 766 |
| 648 // It'll error after this. | 767 // It'll error after this. |
| 649 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 768 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 650 FinishLoading(); | 769 FinishLoading(); |
| 651 | 770 |
| 652 EXPECT_FALSE(data_source_->loading()); | 771 EXPECT_FALSE(loading()); |
| 653 Stop(); | 772 Stop(); |
| 654 } | 773 } |
| 655 | 774 |
| 656 TEST_F(BufferedDataSourceTest, File_InstanceSizeUnknown) { | 775 TEST_F(MultibufferDataSourceTest, File_InstanceSizeUnknown) { |
| 657 Initialize(kFileUrl, false); | 776 Initialize(kFileUrl, false); |
| 777 |
| 778 Respond( |
| 779 response_generator_->GenerateFileResponse(media::DataSource::kReadError)); |
| 780 ReceiveData(kDataSize); |
| 781 |
| 658 EXPECT_FALSE(data_source_->downloading()); | 782 EXPECT_FALSE(data_source_->downloading()); |
| 659 | 783 EXPECT_FALSE(loading()); |
| 660 Respond(response_generator_->GenerateFileResponse(-1)); | |
| 661 | |
| 662 EXPECT_FALSE(data_source_->loading()); | |
| 663 Stop(); | 784 Stop(); |
| 664 } | 785 } |
| 665 | 786 |
| 666 TEST_F(BufferedDataSourceTest, File_Successful) { | 787 TEST_F(MultibufferDataSourceTest, File_Successful) { |
| 667 InitializeWithFileResponse(); | 788 InitializeWithFileResponse(); |
| 668 | 789 |
| 669 EXPECT_TRUE(data_source_->loading()); | 790 EXPECT_TRUE(loading()); |
| 670 EXPECT_FALSE(data_source_->IsStreaming()); | 791 EXPECT_FALSE(data_source_->IsStreaming()); |
| 671 Stop(); | 792 Stop(); |
| 672 } | 793 } |
| 673 | 794 |
| 674 TEST_F(BufferedDataSourceTest, StopDuringRead) { | 795 TEST_F(MultibufferDataSourceTest, StopDuringRead) { |
| 675 InitializeWith206Response(); | 796 InitializeWith206Response(); |
| 676 | 797 |
| 677 uint8 buffer[256]; | 798 uint8 buffer[256]; |
| 678 data_source_->Read(0, arraysize(buffer), buffer, base::Bind( | 799 data_source_->Read(0, arraysize(buffer), buffer, |
| 679 &BufferedDataSourceTest::ReadCallback, base::Unretained(this))); | 800 base::Bind(&MultibufferDataSourceTest::ReadCallback, |
| 801 base::Unretained(this))); |
| 680 | 802 |
| 681 // The outstanding read should fail before the stop callback runs. | 803 // The outstanding read should fail before the stop callback runs. |
| 682 { | 804 { |
| 683 InSequence s; | 805 InSequence s; |
| 684 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 806 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 685 data_source_->Stop(); | 807 data_source_->Stop(); |
| 686 } | 808 } |
| 687 message_loop_.RunUntilIdle(); | 809 message_loop_.RunUntilIdle(); |
| 688 } | 810 } |
| 689 | 811 |
| 690 TEST_F(BufferedDataSourceTest, DefaultValues) { | 812 TEST_F(MultibufferDataSourceTest, DefaultValues) { |
| 691 InitializeWith206Response(); | 813 InitializeWith206Response(); |
| 692 | 814 |
| 693 // Ensure we have sane values for default loading scenario. | 815 // Ensure we have sane values for default loading scenario. |
| 694 EXPECT_EQ(BufferedDataSource::AUTO, preload()); | 816 EXPECT_EQ(MultibufferDataSource::AUTO, preload()); |
| 695 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | 817 EXPECT_EQ(2 << 20, preload_low()); |
| 818 EXPECT_EQ(3 << 20, preload_high()); |
| 696 | 819 |
| 697 EXPECT_EQ(0, data_source_bitrate()); | 820 EXPECT_EQ(0, data_source_bitrate()); |
| 698 EXPECT_EQ(0.0, data_source_playback_rate()); | 821 EXPECT_EQ(0.0, data_source_playback_rate()); |
| 699 EXPECT_EQ(0, loader_bitrate()); | 822 |
| 700 EXPECT_EQ(0.0, loader_playback_rate()); | 823 EXPECT_TRUE(loading()); |
| 701 | 824 Stop(); |
| 702 EXPECT_TRUE(data_source_->loading()); | 825 } |
| 703 Stop(); | 826 |
| 704 } | 827 TEST_F(MultibufferDataSourceTest, SetBitrate) { |
| 705 | |
| 706 TEST_F(BufferedDataSourceTest, SetBitrate) { | |
| 707 InitializeWith206Response(); | 828 InitializeWith206Response(); |
| 708 | 829 |
| 709 data_source_->SetBitrate(1234); | 830 data_source_->SetBitrate(1234); |
| 710 message_loop_.RunUntilIdle(); | 831 message_loop_.RunUntilIdle(); |
| 711 EXPECT_EQ(1234, data_source_bitrate()); | 832 EXPECT_EQ(1234, data_source_bitrate()); |
| 712 EXPECT_EQ(1234, loader_bitrate()); | |
| 713 | 833 |
| 714 // Read so far ahead to cause the loader to get recreated. | 834 // Read so far ahead to cause the loader to get recreated. |
| 715 BufferedResourceLoader* old_loader = loader(); | 835 MockMultiBufferDataProvider* old_loader = data_provider(); |
| 716 ExpectCreateResourceLoader(); | |
| 717 ReadAt(kFarReadPosition); | 836 ReadAt(kFarReadPosition); |
| 718 Respond(response_generator_->Generate206(kFarReadPosition)); | 837 Respond(response_generator_->Generate206(kFarReadPosition)); |
| 719 | 838 |
| 720 // Verify loader changed but still has same bitrate. | 839 // Verify loader changed but still has same bitrate. |
| 721 EXPECT_NE(old_loader, loader()); | 840 EXPECT_NE(old_loader, data_provider()); |
| 722 EXPECT_EQ(1234, loader_bitrate()); | 841 |
| 723 | 842 EXPECT_TRUE(loading()); |
| 724 EXPECT_TRUE(data_source_->loading()); | |
| 725 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 843 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 726 Stop(); | 844 Stop(); |
| 727 } | 845 } |
| 728 | 846 |
| 729 TEST_F(BufferedDataSourceTest, MediaPlaybackRateChanged) { | 847 TEST_F(MultibufferDataSourceTest, MediaPlaybackRateChanged) { |
| 730 InitializeWith206Response(); | 848 InitializeWith206Response(); |
| 731 | 849 |
| 732 data_source_->MediaPlaybackRateChanged(2.0); | 850 data_source_->MediaPlaybackRateChanged(2.0); |
| 733 message_loop_.RunUntilIdle(); | 851 message_loop_.RunUntilIdle(); |
| 734 EXPECT_EQ(2.0, data_source_playback_rate()); | 852 EXPECT_EQ(2.0, data_source_playback_rate()); |
| 735 EXPECT_EQ(2.0, loader_playback_rate()); | |
| 736 | 853 |
| 737 // Read so far ahead to cause the loader to get recreated. | 854 // Read so far ahead to cause the loader to get recreated. |
| 738 BufferedResourceLoader* old_loader = loader(); | 855 MockMultiBufferDataProvider* old_loader = data_provider(); |
| 739 ExpectCreateResourceLoader(); | |
| 740 ReadAt(kFarReadPosition); | 856 ReadAt(kFarReadPosition); |
| 741 Respond(response_generator_->Generate206(kFarReadPosition)); | 857 Respond(response_generator_->Generate206(kFarReadPosition)); |
| 742 | 858 |
| 743 // Verify loader changed but still has same playback rate. | 859 // Verify loader changed but still has same playback rate. |
| 744 EXPECT_NE(old_loader, loader()); | 860 EXPECT_NE(old_loader, data_provider()); |
| 745 | 861 |
| 746 EXPECT_TRUE(data_source_->loading()); | 862 EXPECT_TRUE(loading()); |
| 747 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 863 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 748 Stop(); | 864 Stop(); |
| 749 } | 865 } |
| 750 | 866 |
| 751 TEST_F(BufferedDataSourceTest, Http_Read) { | 867 TEST_F(MultibufferDataSourceTest, Http_Read) { |
| 752 InitializeWith206Response(); | 868 InitializeWith206Response(); |
| 753 | 869 |
| 870 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 871 ReadAt(0, kDataSize * 2); |
| 872 |
| 873 ReadAt(kDataSize, kDataSize); |
| 874 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 875 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); |
| 876 ReceiveData(kDataSize / 2); |
| 877 ReceiveData(kDataSize / 2); |
| 878 |
| 879 EXPECT_TRUE(data_source_->downloading()); |
| 880 Stop(); |
| 881 } |
| 882 |
| 883 TEST_F(MultibufferDataSourceTest, Http_Read_Seek) { |
| 884 InitializeWith206Response(); |
| 885 |
| 886 // Read a bit from the beginning. |
| 887 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 754 ReadAt(0); | 888 ReadAt(0); |
| 755 | 889 |
| 756 // Receive first half of the read. | |
| 757 EXPECT_CALL(host_, AddBufferedByteRange(0, (kDataSize / 2) - 1)); | |
| 758 ReceiveData(kDataSize / 2); | |
| 759 | |
| 760 // Receive last half of the read. | |
| 761 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
| 762 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | |
| 763 ReceiveData(kDataSize / 2); | |
| 764 | |
| 765 EXPECT_TRUE(data_source_->downloading()); | |
| 766 Stop(); | |
| 767 } | |
| 768 | |
| 769 TEST_F(BufferedDataSourceTest, Http_Read_Seek) { | |
| 770 InitializeWith206Response(); | |
| 771 | |
| 772 // Read a bit from the beginning. | |
| 773 ReadAt(0); | |
| 774 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
| 775 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | |
| 776 ReceiveData(kDataSize); | |
| 777 | |
| 778 // Simulate a seek by reading a bit beyond kDataSize. | 890 // Simulate a seek by reading a bit beyond kDataSize. |
| 779 ReadAt(kDataSize * 2); | 891 ReadAt(kDataSize * 2); |
| 780 | 892 |
| 781 // We receive data leading up to but not including our read. | 893 // We receive data leading up to but not including our read. |
| 782 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2 - 1)); | 894 // No notification will happen, since it's progress outside |
| 895 // of our current range. |
| 783 ReceiveData(kDataSize); | 896 ReceiveData(kDataSize); |
| 784 | 897 |
| 785 // We now receive the rest of the data for our read. | 898 // We now receive the rest of the data for our read. |
| 786 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 899 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 787 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 3 - 1)); | 900 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 3)); |
| 788 ReceiveData(kDataSize); | 901 ReceiveData(kDataSize); |
| 789 | 902 |
| 790 EXPECT_TRUE(data_source_->downloading()); | 903 EXPECT_TRUE(data_source_->downloading()); |
| 791 Stop(); | 904 Stop(); |
| 792 } | 905 } |
| 793 | 906 |
| 794 TEST_F(BufferedDataSourceTest, File_Read) { | 907 TEST_F(MultibufferDataSourceTest, File_Read) { |
| 795 InitializeWithFileResponse(); | 908 InitializeWithFileResponse(); |
| 796 | 909 |
| 910 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 911 ReadAt(0, kDataSize * 2); |
| 912 |
| 913 ReadAt(kDataSize, kDataSize); |
| 914 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 915 ReceiveData(kDataSize); |
| 916 |
| 917 Stop(); |
| 918 } |
| 919 |
| 920 TEST_F(MultibufferDataSourceTest, Http_FinishLoading) { |
| 921 InitializeWith206Response(); |
| 922 |
| 923 EXPECT_TRUE(data_source_->downloading()); |
| 924 // premature didFinishLoading() will cause a retry. |
| 925 FinishLoading(); |
| 926 EXPECT_TRUE(data_source_->downloading()); |
| 927 |
| 928 Stop(); |
| 929 } |
| 930 |
| 931 TEST_F(MultibufferDataSourceTest, File_FinishLoading) { |
| 932 InitializeWithFileResponse(); |
| 933 |
| 934 ReceiveData(kDataSize); |
| 935 |
| 936 EXPECT_TRUE(data_source_->downloading()); |
| 937 // premature didFinishLoading() will cause a retry. |
| 938 FinishLoading(); |
| 939 EXPECT_TRUE(data_source_->downloading()); |
| 940 |
| 941 Stop(); |
| 942 } |
| 943 |
| 944 TEST_F(MultibufferDataSourceTest, LocalResource_DeferStrategy) { |
| 945 InitializeWithFileResponse(); |
| 946 |
| 947 EXPECT_EQ(MultibufferDataSource::AUTO, preload()); |
| 948 EXPECT_TRUE(is_local_source()); |
| 949 CheckCapacityDefer(); |
| 950 |
| 951 data_source_->MediaIsPlaying(); |
| 952 CheckCapacityDefer(); |
| 953 |
| 954 data_source_->MediaIsPaused(); |
| 955 CheckCapacityDefer(); |
| 956 |
| 957 Stop(); |
| 958 } |
| 959 |
| 960 TEST_F(MultibufferDataSourceTest, LocalResource_PreloadMetadata_DeferStrategy) { |
| 961 set_preload(MultibufferDataSource::METADATA); |
| 962 InitializeWithFileResponse(); |
| 963 |
| 964 EXPECT_EQ(MultibufferDataSource::METADATA, preload()); |
| 965 EXPECT_TRUE(is_local_source()); |
| 966 CheckReadThenDefer(); |
| 967 |
| 968 data_source_->MediaIsPlaying(); |
| 969 CheckCapacityDefer(); |
| 970 |
| 971 data_source_->MediaIsPaused(); |
| 972 CheckCapacityDefer(); |
| 973 |
| 974 Stop(); |
| 975 } |
| 976 |
| 977 TEST_F(MultibufferDataSourceTest, ExternalResource_Reponse200_DeferStrategy) { |
| 978 InitializeWith200Response(); |
| 979 |
| 980 EXPECT_EQ(MultibufferDataSource::AUTO, preload()); |
| 981 EXPECT_FALSE(is_local_source()); |
| 982 EXPECT_FALSE(data_source_->range_supported()); |
| 983 CheckCapacityDefer(); |
| 984 |
| 985 data_source_->MediaIsPlaying(); |
| 986 CheckCapacityDefer(); |
| 987 |
| 988 data_source_->MediaIsPaused(); |
| 989 CheckCapacityDefer(); |
| 990 |
| 991 Stop(); |
| 992 } |
| 993 |
| 994 TEST_F(MultibufferDataSourceTest, |
| 995 ExternalResource_Response200_PreloadMetadata_DeferStrategy) { |
| 996 set_preload(MultibufferDataSource::METADATA); |
| 997 InitializeWith200Response(); |
| 998 |
| 999 EXPECT_EQ(MultibufferDataSource::METADATA, preload()); |
| 1000 EXPECT_FALSE(is_local_source()); |
| 1001 EXPECT_FALSE(data_source_->range_supported()); |
| 1002 CheckReadThenDefer(); |
| 1003 |
| 1004 data_source_->MediaIsPlaying(); |
| 1005 CheckCapacityDefer(); |
| 1006 |
| 1007 data_source_->MediaIsPaused(); |
| 1008 CheckCapacityDefer(); |
| 1009 |
| 1010 Stop(); |
| 1011 } |
| 1012 |
| 1013 TEST_F(MultibufferDataSourceTest, ExternalResource_Reponse206_DeferStrategy) { |
| 1014 InitializeWith206Response(); |
| 1015 |
| 1016 EXPECT_EQ(MultibufferDataSource::AUTO, preload()); |
| 1017 EXPECT_FALSE(is_local_source()); |
| 1018 EXPECT_TRUE(data_source_->range_supported()); |
| 1019 CheckCapacityDefer(); |
| 1020 |
| 1021 data_source_->MediaIsPlaying(); |
| 1022 CheckCapacityDefer(); |
| 1023 set_might_be_reused_from_cache_in_future(true); |
| 1024 data_source_->MediaIsPaused(); |
| 1025 CheckNeverDefer(); |
| 1026 |
| 1027 data_source_->MediaIsPlaying(); |
| 1028 CheckCapacityDefer(); |
| 1029 |
| 1030 set_might_be_reused_from_cache_in_future(false); |
| 1031 data_source_->MediaIsPaused(); |
| 1032 CheckCapacityDefer(); |
| 1033 |
| 1034 Stop(); |
| 1035 } |
| 1036 |
| 1037 TEST_F(MultibufferDataSourceTest, |
| 1038 ExternalResource_Response206_PreloadMetadata_DeferStrategy) { |
| 1039 set_preload(MultibufferDataSource::METADATA); |
| 1040 InitializeWith206Response(); |
| 1041 |
| 1042 EXPECT_EQ(MultibufferDataSource::METADATA, preload()); |
| 1043 EXPECT_FALSE(is_local_source()); |
| 1044 EXPECT_TRUE(data_source_->range_supported()); |
| 1045 CheckReadThenDefer(); |
| 1046 |
| 1047 data_source_->MediaIsPlaying(); |
| 1048 CheckCapacityDefer(); |
| 1049 |
| 1050 set_might_be_reused_from_cache_in_future(true); |
| 1051 data_source_->MediaIsPaused(); |
| 1052 CheckNeverDefer(); |
| 1053 |
| 1054 data_source_->MediaIsPlaying(); |
| 1055 CheckCapacityDefer(); |
| 1056 set_might_be_reused_from_cache_in_future(false); |
| 1057 data_source_->MediaIsPaused(); |
| 1058 CheckCapacityDefer(); |
| 1059 |
| 1060 Stop(); |
| 1061 } |
| 1062 |
| 1063 TEST_F(MultibufferDataSourceTest, ExternalResource_Response206_VerifyDefer) { |
| 1064 set_preload(MultibufferDataSource::METADATA); |
| 1065 InitializeWith206Response(); |
| 1066 |
| 1067 EXPECT_EQ(MultibufferDataSource::METADATA, preload()); |
| 1068 EXPECT_FALSE(is_local_source()); |
| 1069 EXPECT_TRUE(data_source_->range_supported()); |
| 1070 CheckReadThenDefer(); |
| 1071 |
| 1072 // Read a bit from the beginning. |
| 1073 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 797 ReadAt(0); | 1074 ReadAt(0); |
| 798 | 1075 |
| 799 // Receive first half of the read but no buffering update. | |
| 800 ReceiveData(kDataSize / 2); | |
| 801 | |
| 802 // Receive last half of the read but no buffering update. | |
| 803 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
| 804 ReceiveData(kDataSize / 2); | |
| 805 | |
| 806 Stop(); | |
| 807 } | |
| 808 | |
| 809 TEST_F(BufferedDataSourceTest, Http_FinishLoading) { | |
| 810 InitializeWith206Response(); | |
| 811 | |
| 812 EXPECT_TRUE(data_source_->downloading()); | |
| 813 FinishLoading(); | |
| 814 EXPECT_FALSE(data_source_->downloading()); | |
| 815 | |
| 816 Stop(); | |
| 817 } | |
| 818 | |
| 819 TEST_F(BufferedDataSourceTest, File_FinishLoading) { | |
| 820 InitializeWithFileResponse(); | |
| 821 | |
| 822 EXPECT_FALSE(data_source_->downloading()); | |
| 823 FinishLoading(); | |
| 824 EXPECT_FALSE(data_source_->downloading()); | |
| 825 | |
| 826 Stop(); | |
| 827 } | |
| 828 | |
| 829 TEST_F(BufferedDataSourceTest, LocalResource_DeferStrategy) { | |
| 830 InitializeWithFileResponse(); | |
| 831 | |
| 832 EXPECT_EQ(BufferedDataSource::AUTO, preload()); | |
| 833 EXPECT_TRUE(is_local_source()); | |
| 834 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 835 | |
| 836 data_source_->MediaIsPlaying(); | |
| 837 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 838 | |
| 839 data_source_->MediaIsPaused(); | |
| 840 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 841 | |
| 842 Stop(); | |
| 843 } | |
| 844 | |
| 845 TEST_F(BufferedDataSourceTest, LocalResource_PreloadMetadata_DeferStrategy) { | |
| 846 set_preload(BufferedDataSource::METADATA); | |
| 847 InitializeWithFileResponse(); | |
| 848 | |
| 849 EXPECT_EQ(BufferedDataSource::METADATA, preload()); | |
| 850 EXPECT_TRUE(is_local_source()); | |
| 851 EXPECT_EQ(BufferedResourceLoader::kReadThenDefer, defer_strategy()); | |
| 852 | |
| 853 data_source_->MediaIsPlaying(); | |
| 854 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 855 | |
| 856 data_source_->MediaIsPaused(); | |
| 857 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 858 | |
| 859 Stop(); | |
| 860 } | |
| 861 | |
| 862 TEST_F(BufferedDataSourceTest, ExternalResource_Reponse200_DeferStrategy) { | |
| 863 InitializeWith200Response(); | |
| 864 | |
| 865 EXPECT_EQ(BufferedDataSource::AUTO, preload()); | |
| 866 EXPECT_FALSE(is_local_source()); | |
| 867 EXPECT_FALSE(loader()->range_supported()); | |
| 868 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 869 | |
| 870 data_source_->MediaIsPlaying(); | |
| 871 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 872 | |
| 873 data_source_->MediaIsPaused(); | |
| 874 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 875 | |
| 876 Stop(); | |
| 877 } | |
| 878 | |
| 879 TEST_F(BufferedDataSourceTest, | |
| 880 ExternalResource_Response200_PreloadMetadata_DeferStrategy) { | |
| 881 set_preload(BufferedDataSource::METADATA); | |
| 882 InitializeWith200Response(); | |
| 883 | |
| 884 EXPECT_EQ(BufferedDataSource::METADATA, preload()); | |
| 885 EXPECT_FALSE(is_local_source()); | |
| 886 EXPECT_FALSE(loader()->range_supported()); | |
| 887 EXPECT_EQ(BufferedResourceLoader::kReadThenDefer, defer_strategy()); | |
| 888 | |
| 889 data_source_->MediaIsPlaying(); | |
| 890 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 891 | |
| 892 data_source_->MediaIsPaused(); | |
| 893 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 894 | |
| 895 Stop(); | |
| 896 } | |
| 897 | |
| 898 TEST_F(BufferedDataSourceTest, ExternalResource_Reponse206_DeferStrategy) { | |
| 899 InitializeWith206Response(); | |
| 900 | |
| 901 EXPECT_EQ(BufferedDataSource::AUTO, preload()); | |
| 902 EXPECT_FALSE(is_local_source()); | |
| 903 EXPECT_TRUE(loader()->range_supported()); | |
| 904 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 905 | |
| 906 data_source_->MediaIsPlaying(); | |
| 907 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 908 set_might_be_reused_from_cache_in_future(true); | |
| 909 data_source_->MediaIsPaused(); | |
| 910 EXPECT_EQ(BufferedResourceLoader::kNeverDefer, defer_strategy()); | |
| 911 | |
| 912 data_source_->MediaIsPlaying(); | |
| 913 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 914 set_might_be_reused_from_cache_in_future(false); | |
| 915 data_source_->MediaIsPaused(); | |
| 916 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 917 | |
| 918 Stop(); | |
| 919 } | |
| 920 | |
| 921 TEST_F(BufferedDataSourceTest, | |
| 922 ExternalResource_Response206_PreloadMetadata_DeferStrategy) { | |
| 923 set_preload(BufferedDataSource::METADATA); | |
| 924 InitializeWith206Response(); | |
| 925 | |
| 926 EXPECT_EQ(BufferedDataSource::METADATA, preload()); | |
| 927 EXPECT_FALSE(is_local_source()); | |
| 928 EXPECT_TRUE(loader()->range_supported()); | |
| 929 EXPECT_EQ(BufferedResourceLoader::kReadThenDefer, defer_strategy()); | |
| 930 | |
| 931 data_source_->MediaIsPlaying(); | |
| 932 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 933 set_might_be_reused_from_cache_in_future(true); | |
| 934 data_source_->MediaIsPaused(); | |
| 935 EXPECT_EQ(BufferedResourceLoader::kNeverDefer, defer_strategy()); | |
| 936 | |
| 937 data_source_->MediaIsPlaying(); | |
| 938 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 939 set_might_be_reused_from_cache_in_future(false); | |
| 940 data_source_->MediaIsPaused(); | |
| 941 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
| 942 | |
| 943 Stop(); | |
| 944 } | |
| 945 | |
| 946 TEST_F(BufferedDataSourceTest, ExternalResource_Response206_VerifyDefer) { | |
| 947 set_preload(BufferedDataSource::METADATA); | |
| 948 InitializeWith206Response(); | |
| 949 | |
| 950 EXPECT_EQ(BufferedDataSource::METADATA, preload()); | |
| 951 EXPECT_FALSE(is_local_source()); | |
| 952 EXPECT_TRUE(loader()->range_supported()); | |
| 953 EXPECT_EQ(BufferedResourceLoader::kReadThenDefer, defer_strategy()); | |
| 954 | |
| 955 // Read a bit from the beginning. | |
| 956 ReadAt(0); | |
| 957 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
| 958 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | |
| 959 ReceiveData(kDataSize); | |
| 960 | |
| 961 ASSERT_TRUE(active_loader()); | 1076 ASSERT_TRUE(active_loader()); |
| 962 EXPECT_TRUE(active_loader()->deferred()); | 1077 EXPECT_TRUE(active_loader()->deferred()); |
| 963 } | 1078 } |
| 964 | 1079 |
| 965 TEST_F(BufferedDataSourceTest, ExternalResource_Response206_CancelAfterDefer) { | 1080 TEST_F(MultibufferDataSourceTest, |
| 966 set_preload(BufferedDataSource::METADATA); | 1081 ExternalResource_Response206_CancelAfterDefer) { |
| 967 InitializeWith206Response(); | 1082 set_preload(MultibufferDataSource::METADATA); |
| 968 | 1083 InitializeWith206Response(); |
| 969 EXPECT_EQ(BufferedDataSource::METADATA, preload()); | 1084 |
| 970 EXPECT_FALSE(is_local_source()); | 1085 EXPECT_EQ(MultibufferDataSource::METADATA, preload()); |
| 971 EXPECT_TRUE(loader()->range_supported()); | 1086 EXPECT_FALSE(is_local_source()); |
| 972 EXPECT_EQ(BufferedResourceLoader::kReadThenDefer, defer_strategy()); | 1087 |
| 1088 EXPECT_TRUE(data_source_->range_supported()); |
| 1089 CheckReadThenDefer(); |
| 1090 |
| 1091 ReadAt(kDataSize); |
| 973 | 1092 |
| 974 data_source_->OnBufferingHaveEnough(); | 1093 data_source_->OnBufferingHaveEnough(); |
| 975 | |
| 976 ASSERT_TRUE(active_loader()); | 1094 ASSERT_TRUE(active_loader()); |
| 977 | 1095 |
| 978 // Read a bit from the beginning. | 1096 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 979 ReadAt(0); | 1097 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); |
| 980 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 1098 ReceiveData(kDataSize); |
| 981 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | 1099 |
| 982 ReceiveData(kDataSize); | 1100 EXPECT_FALSE(active_loader_allownull()); |
| 983 | |
| 984 EXPECT_FALSE(active_loader()); | |
| 985 } | 1101 } |
| 986 | 1102 |
| 987 } // namespace media | 1103 } // namespace media |
| OLD | NEW |