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

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: added MEDIA_BLINK_EXPORT 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"
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698