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

Side by Side Diff: media/blink/multibuffer_data_source_unittest.cc

Issue 1399603003: Tie multibuffers to URLs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@media_cache
Patch Set: compile fixes Created 5 years, 2 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
OLDNEW
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"
14 #include "media/blink/test_response_generator.h" 16 #include "media/blink/test_response_generator.h"
15 #include "third_party/WebKit/public/platform/WebURLResponse.h" 17 #include "third_party/WebKit/public/platform/WebURLResponse.h"
16 #include "third_party/WebKit/public/web/WebLocalFrame.h" 18 #include "third_party/WebKit/public/web/WebLocalFrame.h"
17 #include "third_party/WebKit/public/web/WebView.h" 19 #include "third_party/WebKit/public/web/WebView.h"
18 20
19 using ::testing::_; 21 using ::testing::_;
20 using ::testing::Assign; 22 using ::testing::Assign;
21 using ::testing::DoAll; 23 using ::testing::DoAll;
22 using ::testing::Invoke; 24 using ::testing::Invoke;
23 using ::testing::InvokeWithoutArgs; 25 using ::testing::InvokeWithoutArgs;
24 using ::testing::InSequence; 26 using ::testing::InSequence;
25 using ::testing::NiceMock; 27 using ::testing::NiceMock;
26 using ::testing::StrictMock; 28 using ::testing::StrictMock;
27 29
28 using blink::WebLocalFrame; 30 using blink::WebLocalFrame;
29 using blink::WebString; 31 using blink::WebString;
30 using blink::WebURLLoader; 32 using blink::WebURLLoader;
31 using blink::WebURLResponse; 33 using blink::WebURLResponse;
32 using blink::WebView; 34 using blink::WebView;
33 35
34 namespace media { 36 namespace media {
35 37
38 class MockResourceMultiBuffer;
39
40 class MockMultiBufferDataProvider : public ResourceMultiBufferDataProvider {
41 public:
42 MockMultiBufferDataProvider(MultiBuffer::BlockId pos,
43 MockResourceMultiBuffer* multibuffer);
44 ~MockMultiBufferDataProvider();
45 void ForgetMockMultiBuffer() { mock_multibuffer_ = nullptr; }
46 void Start() override {
47 // Create a mock active loader.
48 // Keep track of active loading state via loadAsynchronously() and cancel().
49 NiceMock<MockWebURLLoader>* url_loader = new NiceMock<MockWebURLLoader>();
50 ON_CALL(*url_loader, cancel())
51 .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) {
62 on_start_ = cb;
63 }
64
65 private:
66 MockResourceMultiBuffer* mock_multibuffer_;
67 bool loading_;
68 base::Closure on_start_;
69 };
70
71 class MockResourceMultiBuffer : public ResourceMultiBuffer {
72 public:
73 explicit MockResourceMultiBuffer(blink::WebFrame* frame)
74 : ResourceMultiBuffer(frame) {
75 }
76 ~MockResourceMultiBuffer() override {
77 for (auto i : data_providers_)
78 i->ForgetMockMultiBuffer();
79 }
80 MultiBuffer::DataProvider* CreateWriter(const BlockId& pos) override {
81 MockMultiBufferDataProvider* ret =
82 new MockMultiBufferDataProvider(pos, this);
83 data_providers_.insert(ret);
84 ret->Start();
85 return ret;
86 }
87 void Unregister(MockMultiBufferDataProvider* provider) {
88 data_providers_.erase(provider);
89 }
90
91 MockMultiBufferDataProvider* GetProvider() {
92 EXPECT_EQ(data_providers_.size(), 1U);
93 if (data_providers_.size() != 1) return nullptr;
94 return *data_providers_.begin();
95 }
96 MockMultiBufferDataProvider* GetProvider_allownull() {
97 EXPECT_LE(data_providers_.size(), 1U);
98 if (data_providers_.size() != 1U) return nullptr;
99 return *data_providers_.begin();
100 }
101 bool HasProvider() const {
102 return data_providers_.size() == 1U;
103 }
104 bool loading() {
105 if (data_providers_.empty()) return false;
106 return GetProvider()->loading();
107 }
108 private:
109 std::set<MockMultiBufferDataProvider*> data_providers_;
110 };
111
112 MockMultiBufferDataProvider::MockMultiBufferDataProvider(
113 MultiBuffer::BlockId pos,
114 MockResourceMultiBuffer* multibuffer)
115 : ResourceMultiBufferDataProvider(pos, multibuffer),
116 mock_multibuffer_(multibuffer),
117 loading_(false) {
118 }
119
120 MockMultiBufferDataProvider::~MockMultiBufferDataProvider() {
121 if (mock_multibuffer_)
122 mock_multibuffer_->Unregister(this);
123 }
124
36 class MockBufferedDataSourceHost : public BufferedDataSourceHost { 125 class MockBufferedDataSourceHost : public BufferedDataSourceHost {
37 public: 126 public:
38 MockBufferedDataSourceHost() {} 127 MockBufferedDataSourceHost() {}
39 virtual ~MockBufferedDataSourceHost() {} 128 virtual ~MockBufferedDataSourceHost() {}
40 129
41 MOCK_METHOD1(SetTotalBytes, void(int64 total_bytes)); 130 MOCK_METHOD1(SetTotalBytes, void(int64 total_bytes));
42 MOCK_METHOD2(AddBufferedByteRange, void(int64 start, int64 end)); 131 MOCK_METHOD2(AddBufferedByteRange, void(int64 start, int64 end));
43 132
44 private: 133 private:
45 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSourceHost); 134 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSourceHost);
46 }; 135 };
47 136
48 // Overrides CreateResourceLoader() to permit injecting a MockWebURLLoader. 137 class MockMultibufferDataSource : public MultibufferDataSource {
49 // Also keeps track of whether said MockWebURLLoader is actively loading.
50 class MockBufferedDataSource : public BufferedDataSource {
51 public: 138 public:
52 MockBufferedDataSource( 139 MockMultibufferDataSource(
53 const GURL& url, 140 const GURL& url,
54 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 141 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
142 ResourceMultiBuffer* multibuffer,
55 WebLocalFrame* frame, 143 WebLocalFrame* frame,
56 BufferedDataSourceHost* host) 144 BufferedDataSourceHost* host)
57 : BufferedDataSource(url, 145 : MultibufferDataSource(url,
58 BufferedResourceLoader::kUnspecified, 146 UrlData::kUnspecified,
59 task_runner, 147 task_runner,
60 frame, 148 multibuffer,
61 new media::MediaLog(), 149 frame,
62 host, 150 new media::MediaLog(),
63 base::Bind(&MockBufferedDataSource::set_downloading, 151 host,
64 base::Unretained(this))), 152 base::Bind(
65 downloading_(false), 153 &MockMultibufferDataSource::set_downloading,
66 loading_(false) {} 154 base::Unretained(this))),
67 virtual ~MockBufferedDataSource() {} 155 downloading_(false) {}
68 156
69 MOCK_METHOD2(CreateResourceLoader, BufferedResourceLoader*(int64, int64)); 157 bool downloading() { return downloading_; }
70 BufferedResourceLoader* CreateMockResourceLoader(int64 first_byte_position, 158 void set_downloading(bool downloading) {
71 int64 last_byte_position) { 159 downloading_ = downloading;
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 } 160 }
89 161 bool range_supported() { return url_data_->range_supported(); }
90 bool loading() { return loading_; }
91 void set_loading(bool loading) { loading_ = loading; }
92 bool downloading() { return downloading_; }
93 void set_downloading(bool downloading) { downloading_ = downloading; }
94 162
95 private: 163 private:
96 // Whether the resource is downloading or deferred. 164 // Whether the resource is downloading or deferred.
97 bool downloading_; 165 bool downloading_;
98 166
99 // Whether the resource load has starting loading but yet to been cancelled. 167 // Whether the resource load has starting loading but yet to been cancelled.
100 bool loading_; 168 bool loading_;
101 169
102 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSource); 170 DISALLOW_COPY_AND_ASSIGN(MockMultibufferDataSource);
103 }; 171 };
104 172
105 static const int64 kFileSize = 5000000; 173 static const int64 kFileSize = 5000000;
106 static const int64 kFarReadPosition = 4000000; 174 static const int64 kFarReadPosition = 3997696;
107 static const int kDataSize = 1024; 175 static const int kDataSize = 32 << 10;
108 176
109 static const char kHttpUrl[] = "http://localhost/foo.webm"; 177 static const char kHttpUrl[] = "http://localhost/foo.webm";
110 static const char kFileUrl[] = "file:///tmp/bar.webm"; 178 static const char kFileUrl[] = "file:///tmp/bar.webm";
111 static const char kHttpDifferentPathUrl[] = "http://localhost/bar.webm"; 179 static const char kHttpDifferentPathUrl[] = "http://localhost/bar.webm";
112 static const char kHttpDifferentOriginUrl[] = "http://127.0.0.1/foo.webm"; 180 static const char kHttpDifferentOriginUrl[] = "http://127.0.0.1/foo.webm";
113 181
114 class BufferedDataSourceTest : public testing::Test { 182 class MultibufferDataSourceTest : public testing::Test {
115 public: 183 public:
116 BufferedDataSourceTest() 184 MultibufferDataSourceTest()
117 : view_(WebView::create(NULL)), 185 : view_(WebView::create(NULL)),
118 frame_( 186 frame_(
119 WebLocalFrame::create(blink::WebTreeScopeType::Document, &client_)), 187 WebLocalFrame::create(blink::WebTreeScopeType::Document, &client_)),
120 preload_(BufferedDataSource::AUTO) { 188 preload_(MultibufferDataSource::AUTO),
189 resource_multibuffer_(frame_) {
121 view_->setMainFrame(frame_); 190 view_->setMainFrame(frame_);
122 } 191 }
123 192
124 virtual ~BufferedDataSourceTest() { 193 virtual ~MultibufferDataSourceTest() {
125 view_->close(); 194 view_->close();
126 frame_->close(); 195 frame_->close();
127 } 196 }
128 197
129 MOCK_METHOD1(OnInitialize, void(bool)); 198 MOCK_METHOD1(OnInitialize, void(bool));
130 199
131 void Initialize(const char* url, bool expected) { 200 void Initialize(const char* url, bool expected) {
132 GURL gurl(url); 201 GURL gurl(url);
133 data_source_.reset( 202 data_source_.reset(
134 new MockBufferedDataSource(gurl, 203 new MockMultibufferDataSource(gurl,
135 message_loop_.task_runner(), 204 message_loop_.task_runner(),
205 &resource_multibuffer_,
136 view_->mainFrame()->toWebLocalFrame(), 206 view_->mainFrame()->toWebLocalFrame(),
137 &host_)); 207 &host_));
138 data_source_->SetPreload(preload_); 208 data_source_->SetPreload(preload_);
139 209
140 response_generator_.reset(new TestResponseGenerator(gurl, kFileSize)); 210 response_generator_.reset(new TestResponseGenerator(gurl, kFileSize));
141 ExpectCreateResourceLoader();
142 EXPECT_CALL(*this, OnInitialize(expected)); 211 EXPECT_CALL(*this, OnInitialize(expected));
143 data_source_->Initialize(base::Bind(&BufferedDataSourceTest::OnInitialize, 212 data_source_->Initialize(
144 base::Unretained(this))); 213 base::Bind(&MultibufferDataSourceTest::OnInitialize,
214 base::Unretained(this)));
145 message_loop_.RunUntilIdle(); 215 message_loop_.RunUntilIdle();
146 216
147 bool is_http = gurl.SchemeIsHTTPOrHTTPS(); 217 // Always loading after initialize.
148 EXPECT_EQ(data_source_->downloading(), is_http); 218 EXPECT_EQ(data_source_->downloading(), true);
149 } 219 }
150 220
151 // Helper to initialize tests with a valid 200 response. 221 // Helper to initialize tests with a valid 200 response.
152 void InitializeWith200Response() { 222 void InitializeWith200Response() {
153 Initialize(kHttpUrl, true); 223 Initialize(kHttpUrl, true);
154 224
155 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); 225 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
156 Respond(response_generator_->Generate200()); 226 Respond(response_generator_->Generate200());
227
228 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
229 ReceiveData(kDataSize);
157 } 230 }
158 231
159 // Helper to initialize tests with a valid 206 response. 232 // Helper to initialize tests with a valid 206 response.
160 void InitializeWith206Response() { 233 void InitializeWith206Response() {
161 Initialize(kHttpUrl, true); 234 Initialize(kHttpUrl, true);
162 235
163 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); 236 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
164 Respond(response_generator_->Generate206(0)); 237 Respond(response_generator_->Generate206(0));
238 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
239 ReceiveData(kDataSize);
165 } 240 }
166 241
167 // Helper to initialize tests with a valid file:// response. 242 // Helper to initialize tests with a valid file:// response.
168 void InitializeWithFileResponse() { 243 void InitializeWithFileResponse() {
169 Initialize(kFileUrl, true); 244 Initialize(kFileUrl, true);
170 245
171 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); 246 EXPECT_CALL(host_, SetTotalBytes(kFileSize));
172 EXPECT_CALL(host_, AddBufferedByteRange(0, kFileSize)); 247 EXPECT_CALL(host_, AddBufferedByteRange(0, kFileSize));
173 Respond(response_generator_->GenerateFileResponse(0)); 248 Respond(response_generator_->GenerateFileResponse(0));
249
250 ReceiveData(kDataSize);
174 } 251 }
175 252
176 // Stops any active loaders and shuts down the data source. 253 // Stops any active loaders and shuts down the data source.
177 // 254 //
178 // This typically happens when the page is closed and for our purposes is 255 // This typically happens when the page is closed and for our purposes is
179 // appropriate to do when tearing down a test. 256 // appropriate to do when tearing down a test.
180 void Stop() { 257 void Stop() {
181 if (data_source_->loading()) { 258 if (loading()) {
182 loader()->didFail(url_loader(), response_generator_->GenerateError()); 259 data_provider()->didFail(
260 url_loader(), response_generator_->GenerateError());
183 message_loop_.RunUntilIdle(); 261 message_loop_.RunUntilIdle();
184 } 262 }
185 263
186 data_source_->Stop(); 264 data_source_->Stop();
187 message_loop_.RunUntilIdle(); 265 message_loop_.RunUntilIdle();
188 } 266 }
189 267
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) { 268 void Respond(const WebURLResponse& response) {
198 loader()->didReceiveResponse(url_loader(), response); 269 EXPECT_TRUE(url_loader());
270 if (!active_loader()) return;
271 data_provider()->didReceiveResponse(url_loader(), response);
199 message_loop_.RunUntilIdle(); 272 message_loop_.RunUntilIdle();
200 } 273 }
201 274
202 void ReceiveData(int size) { 275 void ReceiveData(int size) {
276 EXPECT_TRUE(url_loader());
277 if (!url_loader()) return;
203 scoped_ptr<char[]> data(new char[size]); 278 scoped_ptr<char[]> data(new char[size]);
204 memset(data.get(), 0xA5, size); // Arbitrary non-zero value. 279 memset(data.get(), 0xA5, size); // Arbitrary non-zero value.
205 280
206 loader()->didReceiveData(url_loader(), data.get(), size, size); 281 data_provider()->didReceiveData(url_loader(), data.get(), size, size);
207 message_loop_.RunUntilIdle(); 282 message_loop_.RunUntilIdle();
208 } 283 }
209 284
210 void FinishLoading() { 285 void FinishLoading() {
211 data_source_->set_loading(false); 286 EXPECT_TRUE(url_loader());
212 loader()->didFinishLoading(url_loader(), 0, -1); 287 if (!url_loader()) return;
288 data_provider()->didFinishLoading(url_loader(), 0, -1);
213 message_loop_.RunUntilIdle(); 289 message_loop_.RunUntilIdle();
214 } 290 }
215 291
292 void Restart() {
293 EXPECT_TRUE(data_provider());
294 EXPECT_FALSE(active_loader_allownull());
295 if (!data_provider()) return;
296 data_provider()->Start();
297 }
298
216 MOCK_METHOD1(ReadCallback, void(int size)); 299 MOCK_METHOD1(ReadCallback, void(int size));
217 300
218 void ReadAt(int64 position) { 301 void ReadAt(int64 position, int64 howmuch=kDataSize) {
219 data_source_->Read(position, kDataSize, buffer_, 302 data_source_->Read(position, howmuch, buffer_,
220 base::Bind(&BufferedDataSourceTest::ReadCallback, 303 base::Bind(&MultibufferDataSourceTest::ReadCallback,
221 base::Unretained(this))); 304 base::Unretained(this)));
222 message_loop_.RunUntilIdle(); 305 message_loop_.RunUntilIdle();
223 } 306 }
224 307
225 void ExecuteMixedResponseSuccessTest(const WebURLResponse& response1, 308 void ExecuteMixedResponseSuccessTest(const WebURLResponse& response1,
226 const WebURLResponse& response2) { 309 const WebURLResponse& response2) {
227 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); 310 EXPECT_CALL(host_, SetTotalBytes(kFileSize));
228 EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, kDataSize * 2 - 1)); 311 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
229 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); 312 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
230 EXPECT_CALL(*this, ReadCallback(kDataSize)).Times(2); 313 EXPECT_CALL(*this, ReadCallback(kDataSize)).Times(2);
231 314
232 Respond(response1); 315 Respond(response1);
316 ReceiveData(kDataSize);
233 ReadAt(0); 317 ReadAt(0);
234 ReceiveData(kDataSize); 318 EXPECT_TRUE(loading());
235 EXPECT_TRUE(data_source_->loading());
236 319
237 ExpectCreateResourceLoader();
238 FinishLoading(); 320 FinishLoading();
321 Restart();
239 ReadAt(kDataSize); 322 ReadAt(kDataSize);
240 Respond(response2); 323 Respond(response2);
241 ReceiveData(kDataSize); 324 ReceiveData(kDataSize);
242 FinishLoading(); 325 FinishLoading();
243 Stop(); 326 Stop();
244 } 327 }
245 328
246 void ExecuteMixedResponseFailureTest(const WebURLResponse& response1, 329 void ExecuteMixedResponseFailureTest(const WebURLResponse& response1,
247 const WebURLResponse& response2) { 330 const WebURLResponse& response2) {
248 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); 331 EXPECT_CALL(host_, SetTotalBytes(kFileSize));
249 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); 332 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
250 EXPECT_CALL(*this, ReadCallback(kDataSize)); 333 EXPECT_CALL(*this, ReadCallback(kDataSize));
251 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); 334 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
252 335
253 Respond(response1); 336 Respond(response1);
337 ReceiveData(kDataSize);
254 ReadAt(0); 338 ReadAt(0);
255 ReceiveData(kDataSize); 339 EXPECT_TRUE(loading());
256 EXPECT_TRUE(data_source_->loading());
257 340
258 ExpectCreateResourceLoader();
259 FinishLoading(); 341 FinishLoading();
342 Restart();
260 ReadAt(kDataSize); 343 ReadAt(kDataSize);
261 Respond(response2); 344 Respond(response2);
262 Stop(); 345 Stop();
263 } 346 }
264 347
348 void CheckCapacityDefer() {
349 EXPECT_EQ(2 << 20, preload_low());
350 EXPECT_EQ(3 << 20, preload_high());
351 }
352
353 void CheckReadThenDefer() {
354 EXPECT_EQ(0, preload_low());
355 EXPECT_EQ(0, preload_high());
356 }
357
358 void CheckNeverDefer() {
359 EXPECT_EQ(1LL << 40, preload_low());
360 EXPECT_EQ(1LL << 40, preload_high());
361 }
362
265 // Accessors for private variables on |data_source_|. 363 // Accessors for private variables on |data_source_|.
266 BufferedResourceLoader* loader() { 364 MultiBufferReader* loader() {
267 return data_source_->loader_.get(); 365 return data_source_->loader_.get();
268 } 366 }
269 ActiveLoader* active_loader() { return loader()->active_loader_.get(); } 367
368 MockMultiBufferDataProvider* data_provider() {
369 return resource_multibuffer_.GetProvider();
370 }
371 ActiveLoader* active_loader() {
372 EXPECT_TRUE(data_provider());
373 if (!data_provider()) return nullptr;
374 return data_provider()->active_loader_.get();
375 }
376 ActiveLoader* active_loader_allownull() {
377 MockMultiBufferDataProvider* data_provider =
378 resource_multibuffer_.GetProvider_allownull();
379 if (!data_provider) return nullptr;
380 return data_provider->active_loader_.get();
381 }
270 WebURLLoader* url_loader() { 382 WebURLLoader* url_loader() {
271 return loader()->active_loader_->loader_.get(); 383 EXPECT_TRUE(active_loader());
384 if (!active_loader()) return nullptr;
385 return active_loader()->loader_.get();
272 } 386 }
273 387
274 BufferedDataSource::Preload preload() { return data_source_->preload_; } 388 bool loading() { return resource_multibuffer_.loading(); }
275 void set_preload(BufferedDataSource::Preload preload) { preload_ = preload; } 389
276 BufferedResourceLoader::DeferStrategy defer_strategy() { 390 MultibufferDataSource::Preload preload() { return data_source_->preload_; }
277 return loader()->defer_strategy_; 391 void set_preload(MultibufferDataSource::Preload preload) {
392 preload_ = preload;
393 }
394 int64 preload_high() {
395 CHECK(loader());
396 return loader()->preload_high(); }
397 int64 preload_low() {
398 CHECK(loader());
399 return loader()->preload_low();
278 } 400 }
279 int data_source_bitrate() { return data_source_->bitrate_; } 401 int data_source_bitrate() { return data_source_->bitrate_; }
280 double data_source_playback_rate() { return data_source_->playback_rate_; } 402 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(); } 403 bool is_local_source() { return data_source_->assume_fully_buffered(); }
284 void set_might_be_reused_from_cache_in_future(bool value) { 404 void set_might_be_reused_from_cache_in_future(bool value) {
285 loader()->might_be_reused_from_cache_in_future_ = value; 405 data_source_->url_data_->set_cacheable(value);
286 } 406 }
287 407
288 scoped_ptr<MockBufferedDataSource> data_source_; 408 protected:
289
290 scoped_ptr<TestResponseGenerator> response_generator_;
291 MockWebFrameClient client_; 409 MockWebFrameClient client_;
292 WebView* view_; 410 WebView* view_;
293 WebLocalFrame* frame_; 411 WebLocalFrame* frame_;
412 MultibufferDataSource::Preload preload_;
413 MockResourceMultiBuffer resource_multibuffer_;
414
415 scoped_ptr<MockMultibufferDataSource> data_source_;
416
417 scoped_ptr<TestResponseGenerator> response_generator_;
294 418
295 StrictMock<MockBufferedDataSourceHost> host_; 419 StrictMock<MockBufferedDataSourceHost> host_;
296 base::MessageLoop message_loop_; 420 base::MessageLoop message_loop_;
297 421
298 private: 422 // Used for calling MultibufferDataSource::Read().
299 // Used for calling BufferedDataSource::Read(). 423 uint8 buffer_[kDataSize * 2];
300 uint8 buffer_[kDataSize];
301 424
302 BufferedDataSource::Preload preload_; 425 DISALLOW_COPY_AND_ASSIGN(MultibufferDataSourceTest);
303
304 DISALLOW_COPY_AND_ASSIGN(BufferedDataSourceTest);
305 }; 426 };
306 427
307 TEST_F(BufferedDataSourceTest, Range_Supported) { 428 TEST_F(MultibufferDataSourceTest, Range_Supported) {
308 InitializeWith206Response(); 429 InitializeWith206Response();
309 430
310 EXPECT_TRUE(data_source_->loading()); 431 EXPECT_TRUE(loading());
311 EXPECT_FALSE(data_source_->IsStreaming()); 432 EXPECT_FALSE(data_source_->IsStreaming());
312 Stop(); 433 Stop();
313 } 434 }
314 435
315 TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) { 436 TEST_F(MultibufferDataSourceTest, Range_InstanceSizeUnknown) {
316 Initialize(kHttpUrl, true); 437 Initialize(kHttpUrl, true);
317 438
318 Respond(response_generator_->Generate206( 439 Respond(response_generator_->Generate206(
319 0, TestResponseGenerator::kNoContentRangeInstanceSize)); 440 0, TestResponseGenerator::kNoContentRangeInstanceSize));
320 441
321 EXPECT_TRUE(data_source_->loading()); 442 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
443 ReceiveData(kDataSize);
444
445 EXPECT_TRUE(loading());
322 EXPECT_TRUE(data_source_->IsStreaming()); 446 EXPECT_TRUE(data_source_->IsStreaming());
323 Stop(); 447 Stop();
324 } 448 }
325 449
326 TEST_F(BufferedDataSourceTest, Range_NotFound) { 450 TEST_F(MultibufferDataSourceTest, Range_NotFound) {
327 Initialize(kHttpUrl, false); 451 Initialize(kHttpUrl, false);
328 Respond(response_generator_->Generate404()); 452 Respond(response_generator_->Generate404());
329 453
330 EXPECT_FALSE(data_source_->loading()); 454 EXPECT_FALSE(loading());
331 Stop(); 455 Stop();
332 } 456 }
333 457
334 TEST_F(BufferedDataSourceTest, Range_NotSupported) { 458 TEST_F(MultibufferDataSourceTest, Range_NotSupported) {
335 InitializeWith200Response(); 459 InitializeWith200Response();
336 460
337 EXPECT_TRUE(data_source_->loading()); 461 EXPECT_TRUE(loading());
338 EXPECT_TRUE(data_source_->IsStreaming()); 462 EXPECT_TRUE(data_source_->IsStreaming());
339 Stop(); 463 Stop();
340 } 464 }
341 465
342 // Special carve-out for Apache versions that choose to return a 200 for 466 // Special carve-out for Apache versions that choose to return a 200 for
343 // Range:0- ("because it's more efficient" than a 206) 467 // Range:0- ("because it's more efficient" than a 206)
344 TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) { 468 TEST_F(MultibufferDataSourceTest, Range_SupportedButReturned200) {
345 Initialize(kHttpUrl, true); 469 Initialize(kHttpUrl, true);
346 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); 470 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
347 WebURLResponse response = response_generator_->Generate200(); 471 WebURLResponse response = response_generator_->Generate200();
348 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"), 472 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"),
349 WebString::fromUTF8("bytes")); 473 WebString::fromUTF8("bytes"));
350 Respond(response); 474 Respond(response);
351 475
352 EXPECT_TRUE(data_source_->loading()); 476 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
477 ReceiveData(kDataSize);
478
479 EXPECT_TRUE(loading());
353 EXPECT_FALSE(data_source_->IsStreaming()); 480 EXPECT_FALSE(data_source_->IsStreaming());
354 Stop(); 481 Stop();
355 } 482 }
356 483
357 TEST_F(BufferedDataSourceTest, Range_MissingContentRange) { 484 TEST_F(MultibufferDataSourceTest, Range_MissingContentRange) {
358 Initialize(kHttpUrl, false); 485 Initialize(kHttpUrl, false);
359 Respond(response_generator_->Generate206( 486 Respond(response_generator_->Generate206(
360 0, TestResponseGenerator::kNoContentRange)); 487 0, TestResponseGenerator::kNoContentRange));
361 488
362 EXPECT_FALSE(data_source_->loading()); 489 EXPECT_FALSE(loading());
363 Stop(); 490 Stop();
364 } 491 }
365 492
366 TEST_F(BufferedDataSourceTest, Range_MissingContentLength) { 493 TEST_F(MultibufferDataSourceTest, Range_MissingContentLength) {
367 Initialize(kHttpUrl, true); 494 Initialize(kHttpUrl, true);
368 495
369 // It'll manage without a Content-Length response. 496 // It'll manage without a Content-Length response.
370 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); 497 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
371 Respond(response_generator_->Generate206( 498 Respond(response_generator_->Generate206(
372 0, TestResponseGenerator::kNoContentLength)); 499 0, TestResponseGenerator::kNoContentLength));
373 500
374 EXPECT_TRUE(data_source_->loading()); 501 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
502 ReceiveData(kDataSize);
503
504 EXPECT_TRUE(loading());
375 EXPECT_FALSE(data_source_->IsStreaming()); 505 EXPECT_FALSE(data_source_->IsStreaming());
376 Stop(); 506 Stop();
377 } 507 }
378 508
379 TEST_F(BufferedDataSourceTest, Range_WrongContentRange) { 509 TEST_F(MultibufferDataSourceTest, Range_WrongContentRange) {
380 Initialize(kHttpUrl, false); 510 Initialize(kHttpUrl, false);
381 511
382 // Now it's done and will fail. 512 // Now it's done and will fail.
383 Respond(response_generator_->Generate206(1337)); 513 Respond(response_generator_->Generate206(1337));
384 514
385 EXPECT_FALSE(data_source_->loading()); 515 EXPECT_FALSE(loading());
386 Stop(); 516 Stop();
387 } 517 }
388 518
389 // Test the case where the initial response from the server indicates that 519 // Test the case where the initial response from the server indicates that
390 // Range requests are supported, but a later request prove otherwise. 520 // Range requests are supported, but a later request prove otherwise.
391 TEST_F(BufferedDataSourceTest, Range_ServerLied) { 521 TEST_F(MultibufferDataSourceTest, Range_ServerLied) {
392 InitializeWith206Response(); 522 InitializeWith206Response();
393 523
394 // Read causing a new request to be made -- we'll expect it to error. 524 // Read causing a new request to be made -- we'll expect it to error.
395 ExpectCreateResourceLoader();
396 ReadAt(kFarReadPosition); 525 ReadAt(kFarReadPosition);
397 526
398 // Return a 200 in response to a range request. 527 // Return a 200 in response to a range request.
399 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); 528 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
400 Respond(response_generator_->Generate200()); 529 Respond(response_generator_->Generate200());
401 530
402 EXPECT_FALSE(data_source_->loading()); 531 EXPECT_FALSE(loading());
403 Stop(); 532 Stop();
404 } 533 }
405 534
406 TEST_F(BufferedDataSourceTest, Http_AbortWhileReading) { 535 TEST_F(MultibufferDataSourceTest, Http_AbortWhileReading) {
407 InitializeWith206Response(); 536 InitializeWith206Response();
408 537
409 // Make sure there's a pending read -- we'll expect it to error. 538 // Make sure there's a pending read -- we'll expect it to error.
410 ReadAt(0); 539 ReadAt(kFileSize);
411 540
412 // Abort!!! 541 // Abort!!!
413 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); 542 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
414 data_source_->Abort(); 543 data_source_->Abort();
415 message_loop_.RunUntilIdle(); 544 message_loop_.RunUntilIdle();
416 545
417 EXPECT_FALSE(data_source_->loading()); 546 EXPECT_FALSE(loading());
418 Stop(); 547 Stop();
419 } 548 }
420 549
421 TEST_F(BufferedDataSourceTest, File_AbortWhileReading) { 550 TEST_F(MultibufferDataSourceTest, File_AbortWhileReading) {
422 InitializeWithFileResponse(); 551 InitializeWithFileResponse();
423 552
424 // Make sure there's a pending read -- we'll expect it to error. 553 // Make sure there's a pending read -- we'll expect it to error.
425 ReadAt(0); 554 ReadAt(kFileSize);
426 555
427 // Abort!!! 556 // Abort!!!
428 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); 557 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
429 data_source_->Abort(); 558 data_source_->Abort();
430 message_loop_.RunUntilIdle(); 559 message_loop_.RunUntilIdle();
431 560
432 EXPECT_FALSE(data_source_->loading()); 561 EXPECT_FALSE(loading());
433 Stop(); 562 Stop();
434 } 563 }
435 564
436 TEST_F(BufferedDataSourceTest, Http_Retry) { 565 TEST_F(MultibufferDataSourceTest, Http_Retry) {
437 InitializeWith206Response(); 566 InitializeWith206Response();
438 567
439 // Read to advance our position. 568 // Read to advance our position.
440 EXPECT_CALL(*this, ReadCallback(kDataSize)); 569 EXPECT_CALL(*this, ReadCallback(kDataSize));
441 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1));
442 ReadAt(0); 570 ReadAt(0);
443 ReceiveData(kDataSize);
444 571
445 // Issue a pending read but terminate the connection to force a retry. 572 // Issue a pending read but terminate the connection to force a retry.
446 ReadAt(kDataSize); 573 ReadAt(kDataSize);
447 ExpectCreateResourceLoader();
448 FinishLoading(); 574 FinishLoading();
575 Restart();
449 Respond(response_generator_->Generate206(kDataSize)); 576 Respond(response_generator_->Generate206(kDataSize));
450 577
451 // Complete the read. 578 // Complete the read.
452 EXPECT_CALL(*this, ReadCallback(kDataSize)); 579 EXPECT_CALL(*this, ReadCallback(kDataSize));
453 EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, (kDataSize * 2) - 1)); 580 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
454 ReceiveData(kDataSize); 581 ReceiveData(kDataSize);
455 582
456 EXPECT_TRUE(data_source_->loading()); 583 EXPECT_TRUE(loading());
457 Stop(); 584 Stop();
458 } 585 }
459 586
460 TEST_F(BufferedDataSourceTest, Http_RetryOnError) { 587 TEST_F(MultibufferDataSourceTest, Http_RetryOnError) {
461 InitializeWith206Response(); 588 InitializeWith206Response();
462 589
463 // Read to advance our position. 590 // Read to advance our position.
464 EXPECT_CALL(*this, ReadCallback(kDataSize)); 591 EXPECT_CALL(*this, ReadCallback(kDataSize));
465 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1));
466 ReadAt(0); 592 ReadAt(0);
467 ReceiveData(kDataSize);
468 593
469 // Issue a pending read but trigger an error to force a retry. 594 // Issue a pending read but trigger an error to force a retry.
470 EXPECT_CALL(*this, ReadCallback(kDataSize)); 595 EXPECT_CALL(*this, ReadCallback(kDataSize));
471 EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, (kDataSize * 2) - 1)); 596 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
472 ReadAt(kDataSize); 597 ReadAt(kDataSize);
473 base::RunLoop run_loop; 598 base::RunLoop run_loop;
474 EXPECT_CALL(*data_source_, CreateResourceLoader(_, _)) 599 data_provider()->didFail(url_loader(), response_generator_->GenerateError());
475 .WillOnce( 600 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(); 601 run_loop.Run();
481 Respond(response_generator_->Generate206(kDataSize)); 602 Respond(response_generator_->Generate206(kDataSize));
482 ReceiveData(kDataSize); 603 ReceiveData(kDataSize);
483 FinishLoading(); 604 FinishLoading();
484 EXPECT_FALSE(data_source_->loading()); 605 EXPECT_FALSE(loading());
485 Stop(); 606 Stop();
486 } 607 }
487 608
488 TEST_F(BufferedDataSourceTest, Http_PartialResponse) { 609 TEST_F(MultibufferDataSourceTest, Http_PartialResponse) {
489 Initialize(kHttpUrl, true); 610 Initialize(kHttpUrl, true);
490 WebURLResponse response1 = 611 WebURLResponse response1 =
491 response_generator_->GeneratePartial206(0, kDataSize - 1); 612 response_generator_->GeneratePartial206(0, kDataSize - 1);
492 WebURLResponse response2 = 613 WebURLResponse response2 =
493 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); 614 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
494 // The origin URL of response1 and response2 are same. So no error should 615 // The origin URL of response1 and response2 are same. So no error should
495 // occur. 616 // occur.
496 ExecuteMixedResponseSuccessTest(response1, response2); 617 ExecuteMixedResponseSuccessTest(response1, response2);
497 } 618 }
498 619
499 TEST_F(BufferedDataSourceTest, 620 TEST_F(MultibufferDataSourceTest,
500 Http_MixedResponse_RedirectedToDifferentPathResponse) { 621 Http_MixedResponse_RedirectedToDifferentPathResponse) {
501 Initialize(kHttpUrl, true); 622 Initialize(kHttpUrl, true);
502 WebURLResponse response1 = 623 WebURLResponse response1 =
503 response_generator_->GeneratePartial206(0, kDataSize - 1); 624 response_generator_->GeneratePartial206(0, kDataSize - 1);
504 WebURLResponse response2 = 625 WebURLResponse response2 =
505 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); 626 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
506 response2.setURL(GURL(kHttpDifferentPathUrl)); 627 response2.setURL(GURL(kHttpDifferentPathUrl));
507 // The origin URL of response1 and response2 are same. So no error should 628 // The origin URL of response1 and response2 are same. So no error should
508 // occur. 629 // occur.
509 ExecuteMixedResponseSuccessTest(response1, response2); 630 ExecuteMixedResponseSuccessTest(response1, response2);
510 } 631 }
511 632
512 TEST_F(BufferedDataSourceTest, 633 TEST_F(MultibufferDataSourceTest,
513 Http_MixedResponse_RedirectedToDifferentOriginResponse) { 634 Http_MixedResponse_RedirectedToDifferentOriginResponse) {
514 Initialize(kHttpUrl, true); 635 Initialize(kHttpUrl, true);
515 WebURLResponse response1 = 636 WebURLResponse response1 =
516 response_generator_->GeneratePartial206(0, kDataSize - 1); 637 response_generator_->GeneratePartial206(0, kDataSize - 1);
517 WebURLResponse response2 = 638 WebURLResponse response2 =
518 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); 639 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
519 response2.setURL(GURL(kHttpDifferentOriginUrl)); 640 response2.setURL(GURL(kHttpDifferentOriginUrl));
520 // The origin URL of response1 and response2 are different. So an error should 641 // The origin URL of response1 and response2 are different. So an error should
521 // occur. 642 // occur.
522 ExecuteMixedResponseFailureTest(response1, response2); 643 ExecuteMixedResponseFailureTest(response1, response2);
523 } 644 }
524 645
525 TEST_F(BufferedDataSourceTest, 646 TEST_F(MultibufferDataSourceTest,
526 Http_MixedResponse_ServiceWorkerGeneratedResponseAndNormalResponse) { 647 Http_MixedResponse_ServiceWorkerGeneratedResponseAndNormalResponse) {
527 Initialize(kHttpUrl, true); 648 Initialize(kHttpUrl, true);
528 WebURLResponse response1 = 649 WebURLResponse response1 =
529 response_generator_->GeneratePartial206(0, kDataSize - 1); 650 response_generator_->GeneratePartial206(0, kDataSize - 1);
530 response1.setWasFetchedViaServiceWorker(true); 651 response1.setWasFetchedViaServiceWorker(true);
531 WebURLResponse response2 = 652 WebURLResponse response2 =
532 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); 653 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
533 // response1 is generated in a Service Worker but response2 is from a native 654 // response1 is generated in a Service Worker but response2 is from a native
534 // server. So an error should occur. 655 // server. So an error should occur.
535 ExecuteMixedResponseFailureTest(response1, response2); 656 ExecuteMixedResponseFailureTest(response1, response2);
536 } 657 }
537 658
538 TEST_F(BufferedDataSourceTest, 659 TEST_F(MultibufferDataSourceTest,
539 Http_MixedResponse_ServiceWorkerProxiedAndSameURLResponse) { 660 Http_MixedResponse_ServiceWorkerProxiedAndSameURLResponse) {
540 Initialize(kHttpUrl, true); 661 Initialize(kHttpUrl, true);
541 WebURLResponse response1 = 662 WebURLResponse response1 =
542 response_generator_->GeneratePartial206(0, kDataSize - 1); 663 response_generator_->GeneratePartial206(0, kDataSize - 1);
543 response1.setWasFetchedViaServiceWorker(true); 664 response1.setWasFetchedViaServiceWorker(true);
544 response1.setOriginalURLViaServiceWorker(GURL(kHttpUrl)); 665 response1.setOriginalURLViaServiceWorker(GURL(kHttpUrl));
545 WebURLResponse response2 = 666 WebURLResponse response2 =
546 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); 667 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
547 // The origin URL of response1 and response2 are same. So no error should 668 // The origin URL of response1 and response2 are same. So no error should
548 // occur. 669 // occur.
549 ExecuteMixedResponseSuccessTest(response1, response2); 670 ExecuteMixedResponseSuccessTest(response1, response2);
550 } 671 }
551 672
552 TEST_F(BufferedDataSourceTest, 673 TEST_F(MultibufferDataSourceTest,
553 Http_MixedResponse_ServiceWorkerProxiedAndDifferentPathResponse) { 674 Http_MixedResponse_ServiceWorkerProxiedAndDifferentPathResponse) {
554 Initialize(kHttpUrl, true); 675 Initialize(kHttpUrl, true);
555 WebURLResponse response1 = 676 WebURLResponse response1 =
556 response_generator_->GeneratePartial206(0, kDataSize - 1); 677 response_generator_->GeneratePartial206(0, kDataSize - 1);
557 response1.setWasFetchedViaServiceWorker(true); 678 response1.setWasFetchedViaServiceWorker(true);
558 response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentPathUrl)); 679 response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentPathUrl));
559 WebURLResponse response2 = 680 WebURLResponse response2 =
560 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); 681 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
561 // The origin URL of response1 and response2 are same. So no error should 682 // The origin URL of response1 and response2 are same. So no error should
562 // occur. 683 // occur.
563 ExecuteMixedResponseSuccessTest(response1, response2); 684 ExecuteMixedResponseSuccessTest(response1, response2);
564 } 685 }
565 686
566 TEST_F(BufferedDataSourceTest, 687 TEST_F(MultibufferDataSourceTest,
567 Http_MixedResponse_ServiceWorkerProxiedAndDifferentOriginResponse) { 688 Http_MixedResponse_ServiceWorkerProxiedAndDifferentOriginResponse) {
568 Initialize(kHttpUrl, true); 689 Initialize(kHttpUrl, true);
569 WebURLResponse response1 = 690 WebURLResponse response1 =
570 response_generator_->GeneratePartial206(0, kDataSize - 1); 691 response_generator_->GeneratePartial206(0, kDataSize - 1);
571 response1.setWasFetchedViaServiceWorker(true); 692 response1.setWasFetchedViaServiceWorker(true);
572 response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentOriginUrl)); 693 response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentOriginUrl));
573 WebURLResponse response2 = 694 WebURLResponse response2 =
574 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1); 695 response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
575 // The origin URL of response1 and response2 are different. So an error should 696 // The origin URL of response1 and response2 are different. So an error should
576 // occur. 697 // occur.
577 ExecuteMixedResponseFailureTest(response1, response2); 698 ExecuteMixedResponseFailureTest(response1, response2);
578 } 699 }
579 700
580 TEST_F(BufferedDataSourceTest, File_Retry) { 701 TEST_F(MultibufferDataSourceTest, File_Retry) {
581 InitializeWithFileResponse(); 702 InitializeWithFileResponse();
582 703
583 // Read to advance our position. 704 // Read to advance our position.
584 EXPECT_CALL(*this, ReadCallback(kDataSize)); 705 EXPECT_CALL(*this, ReadCallback(kDataSize));
585 ReadAt(0); 706 ReadAt(0);
586 ReceiveData(kDataSize);
587 707
588 // Issue a pending read but terminate the connection to force a retry. 708 // Issue a pending read but terminate the connection to force a retry.
589 ReadAt(kDataSize); 709 ReadAt(kDataSize);
590 ExpectCreateResourceLoader();
591 FinishLoading(); 710 FinishLoading();
711 Restart();
592 Respond(response_generator_->GenerateFileResponse(kDataSize)); 712 Respond(response_generator_->GenerateFileResponse(kDataSize));
593 713
594 // Complete the read. 714 // Complete the read.
595 EXPECT_CALL(*this, ReadCallback(kDataSize)); 715 EXPECT_CALL(*this, ReadCallback(kDataSize));
596 ReceiveData(kDataSize); 716 ReceiveData(kDataSize);
597 717
598 EXPECT_TRUE(data_source_->loading()); 718 EXPECT_TRUE(loading());
599 Stop(); 719 Stop();
600 } 720 }
601 721
602 TEST_F(BufferedDataSourceTest, Http_TooManyRetries) { 722 TEST_F(MultibufferDataSourceTest, Http_TooManyRetries) {
603 InitializeWith206Response(); 723 InitializeWith206Response();
604 724
605 // Make sure there's a pending read -- we'll expect it to error. 725 // Make sure there's a pending read -- we'll expect it to error.
606 ReadAt(0); 726 ReadAt(kDataSize);
607 727
608 // It'll try three times. 728 // It'll try three times.
609 ExpectCreateResourceLoader();
610 FinishLoading(); 729 FinishLoading();
611 Respond(response_generator_->Generate206(0)); 730 Restart();
731 Respond(response_generator_->Generate206(kDataSize));
612 732
613 ExpectCreateResourceLoader();
614 FinishLoading(); 733 FinishLoading();
615 Respond(response_generator_->Generate206(0)); 734 Restart();
735 Respond(response_generator_->Generate206(kDataSize));
616 736
617 ExpectCreateResourceLoader();
618 FinishLoading(); 737 FinishLoading();
619 Respond(response_generator_->Generate206(0)); 738 Restart();
739 Respond(response_generator_->Generate206(kDataSize));
620 740
621 // It'll error after this. 741 // It'll error after this.
622 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); 742 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
623 FinishLoading(); 743 FinishLoading();
624 744
625 EXPECT_FALSE(data_source_->loading()); 745 EXPECT_FALSE(loading());
626 Stop(); 746 Stop();
627 } 747 }
628 748
629 TEST_F(BufferedDataSourceTest, File_TooManyRetries) { 749 TEST_F(MultibufferDataSourceTest, File_TooManyRetries) {
630 InitializeWithFileResponse(); 750 InitializeWithFileResponse();
631 751
632 // Make sure there's a pending read -- we'll expect it to error. 752 // Make sure there's a pending read -- we'll expect it to error.
633 ReadAt(0); 753 ReadAt(kDataSize);
634 754
635 // It'll try three times. 755 // It'll try three times.
636 ExpectCreateResourceLoader();
637 FinishLoading(); 756 FinishLoading();
757 Restart();
638 Respond(response_generator_->GenerateFileResponse(0)); 758 Respond(response_generator_->GenerateFileResponse(0));
639 759
640 ExpectCreateResourceLoader();
641 FinishLoading(); 760 FinishLoading();
761 Restart();
642 Respond(response_generator_->GenerateFileResponse(0)); 762 Respond(response_generator_->GenerateFileResponse(0));
643 763
644 ExpectCreateResourceLoader();
645 FinishLoading(); 764 FinishLoading();
765 Restart();
646 Respond(response_generator_->GenerateFileResponse(0)); 766 Respond(response_generator_->GenerateFileResponse(0));
647 767
648 // It'll error after this. 768 // It'll error after this.
649 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); 769 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
650 FinishLoading(); 770 FinishLoading();
651 771
652 EXPECT_FALSE(data_source_->loading()); 772 EXPECT_FALSE(loading());
653 Stop(); 773 Stop();
654 } 774 }
655 775
656 TEST_F(BufferedDataSourceTest, File_InstanceSizeUnknown) { 776 TEST_F(MultibufferDataSourceTest, File_InstanceSizeUnknown) {
657 Initialize(kFileUrl, false); 777 Initialize(kFileUrl, false);
778
779 Respond(response_generator_->GenerateFileResponse(
780 media::DataSource::kReadError));
781 ReceiveData(kDataSize);
782
658 EXPECT_FALSE(data_source_->downloading()); 783 EXPECT_FALSE(data_source_->downloading());
659 784 EXPECT_FALSE(loading());
660 Respond(response_generator_->GenerateFileResponse(-1));
661
662 EXPECT_FALSE(data_source_->loading());
663 Stop(); 785 Stop();
664 } 786 }
665 787
666 TEST_F(BufferedDataSourceTest, File_Successful) { 788 TEST_F(MultibufferDataSourceTest, File_Successful) {
667 InitializeWithFileResponse(); 789 InitializeWithFileResponse();
668 790
669 EXPECT_TRUE(data_source_->loading()); 791 EXPECT_TRUE(loading());
670 EXPECT_FALSE(data_source_->IsStreaming()); 792 EXPECT_FALSE(data_source_->IsStreaming());
671 Stop(); 793 Stop();
672 } 794 }
673 795
674 TEST_F(BufferedDataSourceTest, StopDuringRead) { 796 TEST_F(MultibufferDataSourceTest, StopDuringRead) {
675 InitializeWith206Response(); 797 InitializeWith206Response();
676 798
677 uint8 buffer[256]; 799 uint8 buffer[256];
678 data_source_->Read(0, arraysize(buffer), buffer, base::Bind( 800 data_source_->Read(0, arraysize(buffer), buffer, base::Bind(
679 &BufferedDataSourceTest::ReadCallback, base::Unretained(this))); 801 &MultibufferDataSourceTest::ReadCallback, 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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698