OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
8 #include "media/base/media_log.h" | 8 #include "media/base/media_log.h" |
9 #include "media/base/mock_filters.h" | 9 #include "media/base/mock_filters.h" |
10 #include "media/base/test_helpers.h" | 10 #include "media/base/test_helpers.h" |
11 #include "media/blink/buffered_data_source.h" | 11 #include "media/blink/buffered_data_source.h" |
12 #include "media/blink/mock_webframeclient.h" | 12 #include "media/blink/mock_webframeclient.h" |
13 #include "media/blink/mock_weburlloader.h" | 13 #include "media/blink/mock_weburlloader.h" |
| 14 #include "media/blink/multibuffer_data_source.h" |
| 15 #include "media/blink/multibuffer_reader.h" |
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 |
OLD | NEW |