OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/logging.h" | |
6 #include "base/path_service.h" | |
7 #include "base/stringprintf.h" | |
8 #include "chrome/browser/browser_process.h" | |
9 #include "chrome/browser/download/download_test_observer.h" | |
10 #include "chrome/browser/prefs/pref_service.h" | |
11 #include "chrome/browser/profiles/profile.h" | |
12 #include "chrome/browser/profiles/profile_manager.h" | |
13 #include "chrome/browser/ui/browser.h" | |
14 #include "chrome/browser/ui/browser_window.h" | |
15 #include "chrome/browser/ui/webui/active_downloads_ui.h" | |
16 #include "chrome/common/chrome_paths.h" | |
17 #include "chrome/common/pref_names.h" | |
18 #include "chrome/test/base/in_process_browser_test.h" | |
19 #include "chrome/test/base/ui_test_utils.h" | |
20 #include "content/browser/download/download_item.h" | |
21 #include "content/browser/net/url_request_slow_download_job.h" | |
22 #include "content/browser/tab_contents/tab_contents.h" | |
23 #include "content/common/page_transition_types.h" | |
24 #include "content/common/url_constants.h" | |
25 | |
26 class BrowserCloseTest : public InProcessBrowserTest { | |
27 public: | |
28 // Structure defining test cases for DownloadsCloseCheck. | |
29 struct DownloadsCloseCheckCase { | |
30 std::string DebugString() const; | |
31 | |
32 // Input | |
33 struct { | |
achuithb
2011/08/29 17:19:10
Isn't struct profile_a {} more readable than struc
Randy Smith (Not in Mondays)
2011/10/13 20:06:04
Sure, but it doesn't mean the same thing. In the
| |
34 struct { | |
35 int windows; | |
36 int downloads; | |
37 } regular; | |
38 struct { | |
39 int windows; | |
40 int downloads; | |
41 } incognito; | |
42 } profile_a; | |
43 | |
44 struct { | |
45 struct { | |
46 int windows; | |
47 int downloads; | |
48 } regular; | |
49 struct { | |
50 int windows; | |
51 int downloads; | |
52 } incognito; | |
53 } profile_b; | |
54 | |
55 // We always probe a window in profile A. | |
56 enum { REGULAR = 0, INCOGNITO = 1 } window_to_probe; | |
57 | |
58 // Output | |
59 Browser::DownloadClosePreventionType type; | |
60 | |
61 // Unchecked if type == DOWNLOAD_CLOSE_OK. | |
62 int num_blocking; | |
63 }; | |
64 | |
65 protected: | |
66 // Create a second profile to work within multi-profile. | |
67 Profile* CreateSecondProfile() { | |
68 FilePath user_data_dir; | |
69 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); | |
70 | |
71 if (!second_profile_data_dir_.CreateUniqueTempDirUnderPath(user_data_dir)) | |
72 return NULL; | |
73 | |
74 return g_browser_process->profile_manager()->GetProfile( | |
75 second_profile_data_dir_.path()); | |
76 } | |
77 | |
78 // Create |num_downloads| number of downloads that are stalled | |
79 // (will quickly get to a place where the server won't | |
80 // provide any more data) so that we can test closing the | |
81 // browser with active downloads. | |
82 void CreateStalledDownloads(Browser* browser, int num_downloads) { | |
83 GURL url(URLRequestSlowDownloadJob::kKnownSizeUrl); | |
84 | |
85 if (num_downloads == 0) | |
86 return; | |
87 | |
88 // Setup an observer waiting for the given number of downloads | |
89 // to get to IN_PROGRESS. | |
90 DownloadManager* download_manager = | |
91 browser->profile()->GetDownloadManager(); | |
92 scoped_ptr<DownloadTestObserver> observer( | |
93 new DownloadTestObserver( | |
94 download_manager, num_downloads, | |
95 DownloadItem::IN_PROGRESS, | |
96 true, // Bail on select file | |
achuithb
2011/08/29 17:19:10
nits: 2 space between comment and code? period at
Randy Smith (Not in Mondays)
2011/10/13 20:06:04
Done.
| |
97 DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); | |
98 | |
99 // Set of that number of downloads. | |
100 while (num_downloads--) | |
101 ui_test_utils::NavigateToURLWithDisposition( | |
102 browser, url, NEW_BACKGROUND_TAB, | |
103 ui_test_utils::BROWSER_TEST_NONE); | |
104 | |
105 // Wait for them. | |
106 observer->WaitForFinished(); | |
107 } | |
108 | |
109 // All all downloads created in CreateStalledDownloads() to | |
110 // complete, and block in this routine until they do complete. | |
111 void CompleteAllDownloads(Browser* browser) { | |
112 GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl); | |
113 ui_test_utils::NavigateToURL(browser, finish_url); | |
114 | |
115 // Go through and, for every single profile, wait until there are | |
116 // no active downloads on that download manager. | |
117 std::vector<Profile*> profiles( | |
118 g_browser_process->profile_manager()->GetLoadedProfiles()); | |
119 for (std::vector<Profile*>::const_iterator pit = profiles.begin(); | |
120 pit != profiles.end(); ++pit) { | |
121 if ((*pit)->HasCreatedDownloadManager()) { | |
122 DownloadManager *mgr = (*pit)->GetDownloadManager(); | |
123 scoped_refptr<DownloadTestFlushObserver> observer( | |
124 new DownloadTestFlushObserver(mgr)); | |
125 observer->WaitForFlush(); | |
126 } | |
127 } | |
128 } | |
129 | |
130 // Create a Browser (with associated window) on the specified profile. | |
131 Browser* CreateBrowserOnProfile(Profile* profile) { | |
132 Browser* new_browser = Browser::Create(profile); | |
133 new_browser->AddSelectedTabWithURL(GURL(chrome::kAboutBlankURL), | |
134 PageTransition::START_PAGE); | |
135 ui_test_utils::WaitForNavigation( | |
136 &new_browser->GetSelectedTabContents()->controller()); | |
137 new_browser->window()->Show(); | |
138 return new_browser; | |
139 } | |
140 | |
141 // Adjust the number of browsers and associated windows up or down | |
142 // to |num_windows|. This routine assumes that there is only a single | |
143 // browser associated with the profile on entry. |*base_browser| contains | |
144 // this browser, and the profile is derived from that browser. On output, | |
145 // if |*base_browser| was destroyed (because |num_windows == 0|), NULL | |
146 // is assigned to that memory location. | |
147 bool AdjustBrowsersOnProfile(Browser** base_browser, int num_windows) { | |
148 int num_downloads_blocking; | |
149 if (num_windows == 0) { | |
150 if (Browser::DOWNLOAD_CLOSE_OK != | |
151 (*base_browser)->OkToCloseWithInProgressDownloads( | |
152 &num_downloads_blocking)) | |
153 return false; | |
154 (*base_browser)->window()->Close(); | |
155 *base_browser = 0; | |
156 return true; | |
157 } | |
158 | |
159 // num_windows > 0 | |
160 Profile* profile((*base_browser)->profile()); | |
161 for (int w = 1; w < num_windows; w++) { | |
achuithb
2011/08/29 17:19:10
nit: ++w
Randy Smith (Not in Mondays)
2011/10/13 20:06:04
Done.
| |
162 CreateBrowserOnProfile(profile); | |
163 } | |
164 return true; | |
165 } | |
166 | |
167 // Test a specific DownloadsCloseCheckCase. Returns false if | |
168 // an assertion has failed and the test should be aborted. | |
169 bool CheckDownloadsClose(const DownloadsCloseCheckCase& check_case, | |
170 Profile* profile_a, | |
171 Profile* profile_b) { | |
172 // Test invariant: so that we don't actually try and close the browser, | |
173 // we always enter the function with a single browser window open on the | |
174 // main profile. That means we need to exit the function the same way. | |
175 // So we setup everything except for the profile_a regular, and then | |
176 // flip the bit on the main window. | |
177 // Note that this means that browser() is unreliable in the context | |
178 // of this function or its callers; we'll be killing that main window | |
179 // and recreating it fairly frequently. | |
180 | |
181 #if 0 | |
achuithb
2011/08/29 17:19:10
I'm assuming you're working on fixing this?
Randy Smith (Not in Mondays)
2011/10/13 20:06:04
Yep. It's gone now.
| |
182 #if !defined(OS_MACOSX) | |
183 // Window closes are delayed until the outer run loop on the mac. | |
184 EXPECT_EQ(1u, BrowserList::size()) << "Case: " << check_case.DebugString(); | |
185 if (BrowserList::size() != 1u) | |
186 return false; | |
187 #endif | |
188 #endif | |
189 | |
190 Browser* entry_browser = *BrowserList::begin(); | |
191 EXPECT_EQ(profile_a, entry_browser->profile()) << "Case: " | |
192 << check_case.DebugString(); | |
193 if (profile_a != entry_browser->profile()) | |
194 return false; | |
195 int total_download_count = | |
196 g_browser_process->profile_manager()->TotalDownloadCount(); | |
197 EXPECT_EQ(0, g_browser_process->profile_manager()->TotalDownloadCount()) | |
198 << "Case: " << check_case.DebugString(); | |
199 if (0 != total_download_count) | |
200 return false; | |
201 | |
202 Profile* profile_a_incognito = profile_a->GetOffTheRecordProfile(); | |
203 Profile* profile_b_incognito = profile_b->GetOffTheRecordProfile(); | |
204 | |
205 // For simplicty of coding, we create a window on each profile so that | |
206 // we can easily create downloads, then we destroy or create windows | |
207 // as necessary. | |
208 Browser* browser_a_regular(CreateBrowserOnProfile(profile_a)); | |
209 Browser* browser_a_incognito(CreateBrowserOnProfile(profile_a_incognito)); | |
210 Browser* browser_b_regular(CreateBrowserOnProfile(profile_b)); | |
211 Browser* browser_b_incognito(CreateBrowserOnProfile(profile_b_incognito)); | |
212 | |
213 // Kill our entry browser. | |
214 entry_browser->window()->Close(); | |
215 entry_browser = NULL; | |
216 | |
217 // Create all downloads needed. | |
218 CreateStalledDownloads( | |
219 browser_a_regular, check_case.profile_a.regular.downloads); | |
220 CreateStalledDownloads( | |
221 browser_a_incognito, check_case.profile_a.incognito.downloads); | |
222 CreateStalledDownloads( | |
223 browser_b_regular, check_case.profile_b.regular.downloads); | |
224 CreateStalledDownloads( | |
225 browser_b_incognito, check_case.profile_b.incognito.downloads); | |
226 | |
227 // Adjust the windows | |
228 Browser** browsers[] = { | |
229 &browser_a_regular, &browser_a_incognito, | |
230 &browser_b_regular, &browser_b_incognito | |
231 }; | |
232 int window_counts[] = { | |
233 check_case.profile_a.regular.windows, | |
234 check_case.profile_a.incognito.windows, | |
235 check_case.profile_b.regular.windows, | |
236 check_case.profile_b.incognito.windows, | |
237 }; | |
238 for (size_t i = 0; i < arraysize(browsers); i++) { | |
achuithb
2011/08/29 17:19:10
nit: ++i
Randy Smith (Not in Mondays)
2011/10/13 20:06:04
Done.
| |
239 bool result = AdjustBrowsersOnProfile(browsers[i], window_counts[i]); | |
240 EXPECT_TRUE(result); | |
241 if (!result) | |
242 return false; | |
243 } | |
244 | |
245 #if defined(OS_CHROMEOS) | |
246 // Get rid of downloads panel on ChromeOS | |
247 Browser* panel = ActiveDownloadsUI::GetPopup(); | |
248 if (panel) | |
249 panel->CloseWindow(); | |
250 ui_test_utils::RunAllPendingInMessageLoop(); | |
251 #endif | |
252 | |
253 // All that work, for this one little test. | |
254 EXPECT_TRUE((check_case.window_to_probe == | |
255 DownloadsCloseCheckCase::REGULAR) || | |
256 (check_case.window_to_probe == | |
257 DownloadsCloseCheckCase::INCOGNITO)); | |
258 if (!((check_case.window_to_probe == | |
259 DownloadsCloseCheckCase::REGULAR) || | |
260 (check_case.window_to_probe == | |
261 DownloadsCloseCheckCase::INCOGNITO))) | |
262 return false; | |
263 | |
264 int num_downloads_blocking; | |
265 Browser* browser_to_probe = | |
266 (check_case.window_to_probe == DownloadsCloseCheckCase::REGULAR ? | |
267 browser_a_regular : | |
268 browser_a_incognito); | |
269 Browser::DownloadClosePreventionType type = | |
270 browser_to_probe->OkToCloseWithInProgressDownloads( | |
271 &num_downloads_blocking); | |
272 EXPECT_EQ(check_case.type, type) << check_case.DebugString(); | |
273 if (check_case.type != Browser::DOWNLOAD_CLOSE_OK) | |
274 EXPECT_EQ(check_case.num_blocking, num_downloads_blocking) | |
275 << check_case.DebugString(); | |
276 | |
277 // Release all the downloads. | |
278 CompleteAllDownloads(browser_to_probe); | |
279 | |
280 // Create a new main window and kill everything else. | |
281 entry_browser = CreateBrowserOnProfile(profile_a); | |
282 for (BrowserList::const_iterator bit = BrowserList::begin(); | |
283 bit != BrowserList::end(); ++bit) { | |
284 if ((*bit) != entry_browser) { | |
285 EXPECT_TRUE((*bit)->window()); | |
286 if (!(*bit)->window()) | |
287 return false; | |
288 (*bit)->window()->Close(); | |
289 } | |
290 } | |
291 ui_test_utils::RunAllPendingInMessageLoop(); | |
292 | |
293 return true; | |
294 } | |
295 | |
296 ScopedTempDir second_profile_data_dir_; | |
297 }; | |
298 | |
299 std::string BrowserCloseTest::DownloadsCloseCheckCase::DebugString() const { | |
300 std::string result; | |
301 result += "Case: {"; | |
302 if (profile_a.regular.windows || profile_a.regular.downloads) | |
303 result += base::StringPrintf("Regular profile A: (%d w, %d d), ", | |
304 profile_a.regular.windows, | |
305 profile_a.regular.downloads); | |
306 if (profile_a.incognito.windows || profile_a.incognito.downloads) | |
307 result += base::StringPrintf("Incognito profile A: (%d w, %d d), ", | |
308 profile_a.incognito.windows, | |
309 profile_a.incognito.downloads); | |
310 if (profile_b.regular.windows || profile_b.regular.downloads) | |
311 result += base::StringPrintf("Regular profile B: (%d w, %d d), ", | |
312 profile_b.regular.windows, | |
313 profile_b.regular.downloads); | |
314 if (profile_b.incognito.windows || profile_b.incognito.downloads) | |
315 result += base::StringPrintf("Incognito profile B: (%d w, %d d), ", | |
316 profile_b.incognito.windows, | |
317 profile_b.incognito.downloads); | |
318 result += (window_to_probe == REGULAR ? "Probe regular" : | |
319 window_to_probe == INCOGNITO ? "Probe incognito" : | |
320 "Probe unknown"); | |
321 result += "} -> "; | |
322 if (type == Browser::DOWNLOAD_CLOSE_OK) { | |
323 result += "No warning"; | |
324 } else { | |
325 result += base::StringPrintf( | |
326 "%s (%d downloads) warning", | |
327 (type == Browser::DOWNLOAD_CLOSE_BROWSER_SHUTDOWN ? "Browser shutdown" : | |
328 type == Browser::DOWNLOAD_CLOSE_LAST_WINDOW_IN_INCOGNITO_PROFILE ? | |
329 "Incognito close" : "Unknown"), | |
330 num_blocking); | |
331 } | |
332 return result; | |
333 } | |
334 | |
335 static const BrowserCloseTest::DownloadsCloseCheckCase | |
336 download_close_check_cases[] = { | |
337 // Top level nesting is {profile_a, profile_b} | |
338 // Second level nesting is {regular, incognito | |
339 // Third level (inner) nesting is {windows, downloads} | |
340 | |
341 // Last window (incognito) triggers browser close warning. | |
342 {{{0, 0}, {1, 1}}, {{0, 0}, {0, 0}}, | |
343 BrowserCloseTest::DownloadsCloseCheckCase::INCOGNITO, | |
344 Browser::DOWNLOAD_CLOSE_BROWSER_SHUTDOWN, 1}, | |
345 | |
346 // Last incognito window triggers incognito close warning. | |
347 {{{1, 0}, {1, 1}}, {{0, 0}, {0, 0}}, | |
348 BrowserCloseTest::DownloadsCloseCheckCase::INCOGNITO, | |
349 Browser::DOWNLOAD_CLOSE_LAST_WINDOW_IN_INCOGNITO_PROFILE, 1}, | |
350 | |
351 // Last incognito window with no downloads triggers no warning. | |
352 {{{0, 0}, {1, 0}}, {{0, 0}, {0, 0}}, | |
353 BrowserCloseTest::DownloadsCloseCheckCase::INCOGNITO, | |
354 Browser::DOWNLOAD_CLOSE_OK}, | |
355 | |
356 // Last incognito window with window+download on another incognito profile | |
357 // triggers no warning. | |
358 {{{0, 0}, {1, 0}}, {{0, 0}, {1, 1}}, | |
359 BrowserCloseTest::DownloadsCloseCheckCase::INCOGNITO, | |
360 Browser::DOWNLOAD_CLOSE_OK}, | |
361 | |
362 // Non-last incognito window triggers no warning. | |
363 {{{0, 0}, {2, 1}}, {{0, 0}, {0, 0}}, | |
364 BrowserCloseTest::DownloadsCloseCheckCase::INCOGNITO, | |
365 Browser::DOWNLOAD_CLOSE_OK}, | |
366 | |
367 // Non-last regular window triggers no warning. | |
368 {{{2, 1}, {0, 0}}, {{0, 0}, {0, 0}}, | |
369 BrowserCloseTest::DownloadsCloseCheckCase::REGULAR, | |
370 Browser::DOWNLOAD_CLOSE_OK}, | |
371 | |
372 // Last regular window triggers browser close. | |
373 {{{1, 1}, {0, 0}}, {{0, 0}, {0, 0}}, | |
374 BrowserCloseTest::DownloadsCloseCheckCase::REGULAR, | |
375 Browser::DOWNLOAD_CLOSE_BROWSER_SHUTDOWN, 1}, | |
376 | |
377 // Last regular window triggers browser close for download on different | |
378 // profile. | |
379 {{{1, 0}, {0, 0}}, {{0, 1}, {0, 0}}, | |
380 BrowserCloseTest::DownloadsCloseCheckCase::REGULAR, | |
381 Browser::DOWNLOAD_CLOSE_BROWSER_SHUTDOWN, 1}, | |
382 | |
383 // Last regular window triggers no warning if incognito | |
384 // active (http://crbug.com/61257). | |
385 {{{1, 0}, {1, 1}}, {{0, 0}, {0, 0}}, | |
386 BrowserCloseTest::DownloadsCloseCheckCase::REGULAR, | |
387 Browser::DOWNLOAD_CLOSE_OK}, | |
388 | |
389 // Last regular window triggers no warning if other profile window active. | |
390 {{{1, 1}, {0, 0}}, {{1, 0}, {0, 0}}, | |
391 BrowserCloseTest::DownloadsCloseCheckCase::REGULAR, | |
392 Browser::DOWNLOAD_CLOSE_OK}, | |
393 | |
394 // Last regular window triggers no warning if other incognito window | |
395 // active. | |
396 {{{1, 0}, {0, 0}}, {{0, 0}, {1, 1}}, | |
397 BrowserCloseTest::DownloadsCloseCheckCase::REGULAR, | |
398 Browser::DOWNLOAD_CLOSE_OK}, | |
399 | |
400 // Last regular window triggers no warning if incognito active. | |
401 {{{1, 1}, {1, 0}}, {{0, 0}, {0, 0}}, | |
402 BrowserCloseTest::DownloadsCloseCheckCase::REGULAR, | |
403 Browser::DOWNLOAD_CLOSE_OK}, | |
404 | |
405 // Test plural for regular. | |
406 {{{1, 2}, {0, 0}}, {{0, 0}, {0, 0}}, | |
407 BrowserCloseTest::DownloadsCloseCheckCase::REGULAR, | |
408 Browser::DOWNLOAD_CLOSE_BROWSER_SHUTDOWN, 2}, | |
409 | |
410 // Test plural for incognito. | |
411 {{{1, 0}, {1, 2}}, {{0, 0}, {0, 0}}, | |
412 BrowserCloseTest::DownloadsCloseCheckCase::INCOGNITO, | |
413 Browser::DOWNLOAD_CLOSE_LAST_WINDOW_IN_INCOGNITO_PROFILE, 2}, | |
414 }; | |
415 | |
416 | |
417 // The following test is split into three chunks to reduce the chance | |
418 // of hitting the 25s timeout. | |
419 | |
420 IN_PROC_BROWSER_TEST_F(BrowserCloseTest, DownloadsCloseCheck_0) { | |
421 Profile* profile_a = browser()->profile(); | |
achuithb
2011/08/29 17:19:10
Any reason to not pull out the boiler-plate in Dow
Randy Smith (Not in Mondays)
2011/10/13 20:06:04
Nope; hadn't gotten to it. Done.
| |
422 Profile* profile_b = CreateSecondProfile(); | |
423 ASSERT_TRUE(profile_b); | |
424 | |
425 ScopedTempDir profile_a_dir; | |
426 ASSERT_TRUE(profile_a_dir.CreateUniqueTempDir()); | |
427 profile_a->GetPrefs()->SetFilePath( | |
428 prefs::kDownloadDefaultDirectory, | |
429 profile_a_dir.path()); | |
430 ScopedTempDir profile_b_dir; | |
431 ASSERT_TRUE(profile_b_dir.CreateUniqueTempDir()); | |
432 profile_b->GetPrefs()->SetFilePath( | |
433 prefs::kDownloadDefaultDirectory, | |
434 profile_b_dir.path()); | |
435 | |
436 for (size_t i = 0; i < arraysize(download_close_check_cases) / 3; ++i) { | |
437 const DownloadsCloseCheckCase& check_case(download_close_check_cases[i]); | |
438 ASSERT_TRUE(CheckDownloadsClose(check_case, profile_a, profile_b)); | |
439 } | |
440 } | |
441 | |
442 IN_PROC_BROWSER_TEST_F(BrowserCloseTest, DownloadsCloseCheck_1) { | |
443 Profile* profile_a = browser()->profile(); | |
444 Profile* profile_b = CreateSecondProfile(); | |
445 ASSERT_TRUE(profile_b); | |
446 | |
447 ScopedTempDir profile_a_dir; | |
448 ASSERT_TRUE(profile_a_dir.CreateUniqueTempDir()); | |
449 profile_a->GetPrefs()->SetFilePath( | |
450 prefs::kDownloadDefaultDirectory, | |
451 profile_a_dir.path()); | |
452 ScopedTempDir profile_b_dir; | |
453 ASSERT_TRUE(profile_b_dir.CreateUniqueTempDir()); | |
454 profile_b->GetPrefs()->SetFilePath( | |
455 prefs::kDownloadDefaultDirectory, | |
456 profile_b_dir.path()); | |
457 | |
458 for (size_t i = arraysize(download_close_check_cases) / 3; | |
459 i < 2 * arraysize(download_close_check_cases) / 3; ++i) { | |
460 const DownloadsCloseCheckCase& check_case(download_close_check_cases[i]); | |
461 ASSERT_TRUE(CheckDownloadsClose(check_case, profile_a, profile_b)); | |
462 } | |
463 } | |
464 | |
465 IN_PROC_BROWSER_TEST_F(BrowserCloseTest, DownloadsCloseCheck_2) { | |
466 Profile* profile_a = browser()->profile(); | |
467 Profile* profile_b = CreateSecondProfile(); | |
468 ASSERT_TRUE(profile_b); | |
469 | |
470 ScopedTempDir profile_a_dir; | |
471 ASSERT_TRUE(profile_a_dir.CreateUniqueTempDir()); | |
472 profile_a->GetPrefs()->SetFilePath( | |
473 prefs::kDownloadDefaultDirectory, | |
474 profile_a_dir.path()); | |
475 ScopedTempDir profile_b_dir; | |
476 ASSERT_TRUE(profile_b_dir.CreateUniqueTempDir()); | |
477 profile_b->GetPrefs()->SetFilePath( | |
478 prefs::kDownloadDefaultDirectory, | |
479 profile_b_dir.path()); | |
480 | |
481 for (size_t i = 2 * arraysize(download_close_check_cases) / 3; | |
482 i < arraysize(download_close_check_cases); ++i) { | |
483 const DownloadsCloseCheckCase& check_case(download_close_check_cases[i]); | |
484 ASSERT_TRUE(CheckDownloadsClose(check_case, profile_a, profile_b)); | |
485 } | |
486 } | |
OLD | NEW |