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

Side by Side Diff: webkit/media/simple_data_source_unittest.cc

Issue 9344003: Fix re-entrancy bug in SimpleDataSource::Abort() introduced in r118338. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/media/simple_data_source.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "media/base/filters.h" 6 #include "media/base/filters.h"
7 #include "media/base/mock_callback.h" 7 #include "media/base/mock_callback.h"
8 #include "media/base/mock_data_source_host.h" 8 #include "media/base/mock_data_source_host.h"
9 #include "media/base/mock_filters.h" 9 #include "media/base/mock_filters.h"
10 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 void Redirect(const char* url) { 120 void Redirect(const char* url) {
121 GURL redirectUrl(url); 121 GURL redirectUrl(url);
122 WebURLRequest newRequest(redirectUrl); 122 WebURLRequest newRequest(redirectUrl);
123 WebURLResponse redirectResponse(gurl_); 123 WebURLResponse redirectResponse(gurl_);
124 124
125 data_source_->willSendRequest(url_loader_, newRequest, redirectResponse); 125 data_source_->willSendRequest(url_loader_, newRequest, redirectResponse);
126 126
127 MessageLoop::current()->RunAllPending(); 127 MessageLoop::current()->RunAllPending();
128 } 128 }
129 129
130 void DestroyDataSource() { 130 void StopAndDestroyDataSource() {
131 data_source_->Stop(media::NewExpectedClosure()); 131 data_source_->Stop(media::NewExpectedClosure());
132 MessageLoop::current()->RunAllPending(); 132 MessageLoop::current()->RunAllPending();
133
134 data_source_ = NULL; 133 data_source_ = NULL;
135 } 134 }
136 135
136 void AbortAndDestroyDataSource() {
137 data_source_->Abort();
138 MessageLoop::current()->RunAllPending();
139 data_source_ = NULL;
140 }
141
137 void AsyncRead() { 142 void AsyncRead() {
138 for (int i = 0; i < kDataSize; ++i) { 143 for (int i = 0; i < kDataSize; ++i) {
139 uint8 buffer[1]; 144 uint8 buffer[1];
140 145
141 EXPECT_CALL(*this, ReadCallback(1)); 146 EXPECT_CALL(*this, ReadCallback(1));
142 data_source_->Read( 147 data_source_->Read(
143 i, 1, buffer, 148 i, 1, buffer,
144 base::Bind(&SimpleDataSourceTest::ReadCallback, 149 base::Bind(&SimpleDataSourceTest::ReadCallback,
145 base::Unretained(this))); 150 base::Unretained(this)));
146 EXPECT_EQ(static_cast<uint8>(data_[i]), buffer[0]); 151 EXPECT_EQ(static_cast<uint8>(data_[i]), buffer[0]);
(...skipping 14 matching lines...) Expand all
161 166
162 char data_[kDataSize]; 167 char data_[kDataSize];
163 168
164 DISALLOW_COPY_AND_ASSIGN(SimpleDataSourceTest); 169 DISALLOW_COPY_AND_ASSIGN(SimpleDataSourceTest);
165 }; 170 };
166 171
167 TEST_F(SimpleDataSourceTest, InitializeHTTP) { 172 TEST_F(SimpleDataSourceTest, InitializeHTTP) {
168 InitializeDataSource(kHttpUrl, 173 InitializeDataSource(kHttpUrl,
169 media::NewExpectedStatusCB(media::PIPELINE_OK)); 174 media::NewExpectedStatusCB(media::PIPELINE_OK));
170 RequestSucceeded(); 175 RequestSucceeded();
171 DestroyDataSource(); 176 StopAndDestroyDataSource();
172 } 177 }
173 178
174 TEST_F(SimpleDataSourceTest, InitializeHTTPS) { 179 TEST_F(SimpleDataSourceTest, InitializeHTTPS) {
175 InitializeDataSource(kHttpsUrl, 180 InitializeDataSource(kHttpsUrl,
176 media::NewExpectedStatusCB(media::PIPELINE_OK)); 181 media::NewExpectedStatusCB(media::PIPELINE_OK));
177 RequestSucceeded(); 182 RequestSucceeded();
178 DestroyDataSource(); 183 StopAndDestroyDataSource();
179 } 184 }
180 185
181 TEST_F(SimpleDataSourceTest, InitializeFile) { 186 TEST_F(SimpleDataSourceTest, InitializeFile) {
182 InitializeDataSource(kFileUrl, 187 InitializeDataSource(kFileUrl,
183 media::NewExpectedStatusCB(media::PIPELINE_OK)); 188 media::NewExpectedStatusCB(media::PIPELINE_OK));
184 RequestSucceeded(); 189 RequestSucceeded();
185 DestroyDataSource(); 190 StopAndDestroyDataSource();
186 } 191 }
187 192
188 TEST_F(SimpleDataSourceTest, InitializeData) { 193 TEST_F(SimpleDataSourceTest, InitializeData) {
189 url_loader_ = new NiceMock<MockWebURLLoader>(); 194 url_loader_ = new NiceMock<MockWebURLLoader>();
190 195
191 data_source_ = new SimpleDataSource(MessageLoop::current(), 196 data_source_ = new SimpleDataSource(MessageLoop::current(),
192 view_->mainFrame()); 197 view_->mainFrame());
193 // There is no need to provide a message loop to data source. 198 // There is no need to provide a message loop to data source.
194 data_source_->set_host(&host_); 199 data_source_->set_host(&host_);
195 data_source_->SetURLLoaderForTest(url_loader_); 200 data_source_->SetURLLoaderForTest(url_loader_);
196 201
197 EXPECT_CALL(host_, SetTotalBytes(sizeof(kDataUrlDecoded))); 202 EXPECT_CALL(host_, SetTotalBytes(sizeof(kDataUrlDecoded)));
198 EXPECT_CALL(host_, SetBufferedBytes(sizeof(kDataUrlDecoded))); 203 EXPECT_CALL(host_, SetBufferedBytes(sizeof(kDataUrlDecoded)));
199 204
200 data_source_->Initialize(GURL(kDataUrl), 205 data_source_->Initialize(GURL(kDataUrl),
201 media::NewExpectedStatusCB(media::PIPELINE_OK)); 206 media::NewExpectedStatusCB(media::PIPELINE_OK));
202 MessageLoop::current()->RunAllPending(); 207 MessageLoop::current()->RunAllPending();
203 208
204 DestroyDataSource(); 209 StopAndDestroyDataSource();
205 } 210 }
206 211
207 TEST_F(SimpleDataSourceTest, RequestFailed) { 212 TEST_F(SimpleDataSourceTest, RequestFailed) {
208 InitializeDataSource(kHttpUrl, 213 InitializeDataSource(kHttpUrl,
209 media::NewExpectedStatusCB(media::PIPELINE_ERROR_NETWORK)); 214 media::NewExpectedStatusCB(media::PIPELINE_ERROR_NETWORK));
210 RequestFailed(); 215 RequestFailed();
211 DestroyDataSource(); 216 StopAndDestroyDataSource();
212 } 217 }
213 218
214 static void OnStatusCB(bool* called, media::PipelineStatus status) { 219 static void OnStatusCB(bool* called, media::PipelineStatus status) {
215 *called = true; 220 *called = true;
216 } 221 }
217 222
218 TEST_F(SimpleDataSourceTest, StopWhenDownloading) { 223 TEST_F(SimpleDataSourceTest, StopWhenDownloading) {
219 // The callback should be deleted, but not executed. 224 // The callback should be deleted, but not executed.
220 // TODO(scherkus): should this really be the behaviour? Seems strange... 225 // TODO(scherkus): should this really be the behaviour? Seems strange...
221 bool was_called = false; 226 bool was_called = false;
222 InitializeDataSource(kHttpUrl, base::Bind(&OnStatusCB, &was_called)); 227 InitializeDataSource(kHttpUrl, base::Bind(&OnStatusCB, &was_called));
223 228
224 EXPECT_CALL(*url_loader_, cancel()); 229 EXPECT_CALL(*url_loader_, cancel());
225 DestroyDataSource(); 230 StopAndDestroyDataSource();
226 EXPECT_FALSE(was_called); 231 EXPECT_FALSE(was_called);
227 } 232 }
228 233
234 TEST_F(SimpleDataSourceTest, AbortWhenDownloading) {
235 // The callback should be deleted, but not executed.
236 // TODO(scherkus): should this really be the behaviour? Seems strange...
237 bool was_called = false;
238 InitializeDataSource(kHttpUrl, base::Bind(&OnStatusCB, &was_called));
239
240 EXPECT_CALL(*url_loader_, cancel());
241 AbortAndDestroyDataSource();
242 EXPECT_FALSE(was_called);
243 }
244
229 TEST_F(SimpleDataSourceTest, AsyncRead) { 245 TEST_F(SimpleDataSourceTest, AsyncRead) {
230 InitializeDataSource(kFileUrl, 246 InitializeDataSource(kFileUrl,
231 media::NewExpectedStatusCB(media::PIPELINE_OK)); 247 media::NewExpectedStatusCB(media::PIPELINE_OK));
232 RequestSucceeded(); 248 RequestSucceeded();
233 AsyncRead(); 249 AsyncRead();
234 DestroyDataSource(); 250 StopAndDestroyDataSource();
235 } 251 }
236 252
237 // NOTE: This test will need to be reworked a little once 253 // NOTE: This test will need to be reworked a little once
238 // http://code.google.com/p/chromium/issues/detail?id=72578 254 // http://code.google.com/p/chromium/issues/detail?id=72578
239 // is fixed. 255 // is fixed.
240 TEST_F(SimpleDataSourceTest, HasSingleOrigin) { 256 TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
241 // Make sure no redirect case works as expected. 257 // Make sure no redirect case works as expected.
242 InitializeDataSource(kHttpUrl, 258 InitializeDataSource(kHttpUrl,
243 media::NewExpectedStatusCB(media::PIPELINE_OK)); 259 media::NewExpectedStatusCB(media::PIPELINE_OK));
244 RequestSucceeded(); 260 RequestSucceeded();
245 EXPECT_TRUE(data_source_->HasSingleOrigin()); 261 EXPECT_TRUE(data_source_->HasSingleOrigin());
246 DestroyDataSource(); 262 StopAndDestroyDataSource();
247 263
248 // Test redirect to the same domain. 264 // Test redirect to the same domain.
249 InitializeDataSource(kHttpUrl, 265 InitializeDataSource(kHttpUrl,
250 media::NewExpectedStatusCB(media::PIPELINE_OK)); 266 media::NewExpectedStatusCB(media::PIPELINE_OK));
251 Redirect(kHttpRedirectToSameDomainUrl1); 267 Redirect(kHttpRedirectToSameDomainUrl1);
252 RequestSucceeded(); 268 RequestSucceeded();
253 EXPECT_TRUE(data_source_->HasSingleOrigin()); 269 EXPECT_TRUE(data_source_->HasSingleOrigin());
254 DestroyDataSource(); 270 StopAndDestroyDataSource();
255 271
256 // Test redirect twice to the same domain. 272 // Test redirect twice to the same domain.
257 InitializeDataSource(kHttpUrl, 273 InitializeDataSource(kHttpUrl,
258 media::NewExpectedStatusCB(media::PIPELINE_OK)); 274 media::NewExpectedStatusCB(media::PIPELINE_OK));
259 Redirect(kHttpRedirectToSameDomainUrl1); 275 Redirect(kHttpRedirectToSameDomainUrl1);
260 Redirect(kHttpRedirectToSameDomainUrl2); 276 Redirect(kHttpRedirectToSameDomainUrl2);
261 RequestSucceeded(); 277 RequestSucceeded();
262 EXPECT_TRUE(data_source_->HasSingleOrigin()); 278 EXPECT_TRUE(data_source_->HasSingleOrigin());
263 DestroyDataSource(); 279 StopAndDestroyDataSource();
264 280
265 // Test redirect to a different domain. 281 // Test redirect to a different domain.
266 InitializeDataSource(kHttpUrl, 282 InitializeDataSource(kHttpUrl,
267 media::NewExpectedStatusCB(media::PIPELINE_OK)); 283 media::NewExpectedStatusCB(media::PIPELINE_OK));
268 Redirect(kHttpRedirectToDifferentDomainUrl1); 284 Redirect(kHttpRedirectToDifferentDomainUrl1);
269 RequestSucceeded(); 285 RequestSucceeded();
270 EXPECT_FALSE(data_source_->HasSingleOrigin()); 286 EXPECT_FALSE(data_source_->HasSingleOrigin());
271 DestroyDataSource(); 287 StopAndDestroyDataSource();
272 288
273 // Test redirect to the same domain and then to a different domain. 289 // Test redirect to the same domain and then to a different domain.
274 InitializeDataSource(kHttpUrl, 290 InitializeDataSource(kHttpUrl,
275 media::NewExpectedStatusCB(media::PIPELINE_OK)); 291 media::NewExpectedStatusCB(media::PIPELINE_OK));
276 Redirect(kHttpRedirectToSameDomainUrl1); 292 Redirect(kHttpRedirectToSameDomainUrl1);
277 Redirect(kHttpRedirectToDifferentDomainUrl1); 293 Redirect(kHttpRedirectToDifferentDomainUrl1);
278 RequestSucceeded(); 294 RequestSucceeded();
279 EXPECT_FALSE(data_source_->HasSingleOrigin()); 295 EXPECT_FALSE(data_source_->HasSingleOrigin());
280 DestroyDataSource(); 296 StopAndDestroyDataSource();
281 } 297 }
282 298
283 } // namespace webkit_media 299 } // namespace webkit_media
OLDNEW
« no previous file with comments | « webkit/media/simple_data_source.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698