blob: 23e30e3217c3f8e10948a37cfd98ff3f652cdd7f [file] [log] [blame]
Scott Violet87450ce2020-01-23 01:56:251// Copyright 2020 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
Scott Violet9843d0a2020-02-11 22:38:075#include "weblayer/browser/persistence/browser_persister.h"
Scott Violet87450ce2020-01-23 01:56:256
Gabriel Charette9f60dd12020-03-06 20:48:047#include "base/bind_helpers.h"
Scott Violet87450ce2020-01-23 01:56:258#include "base/files/file_path.h"
Scott Violet95a6d682020-06-11 23:28:329#include "base/files/file_util.h"
Scott Violetb2e0cf12020-03-09 18:46:4310#include "base/guid.h"
Scott Violet87450ce2020-01-23 01:56:2511#include "base/path_service.h"
12#include "base/run_loop.h"
Scott Violet95a6d682020-06-11 23:28:3213#include "base/test/bind_test_util.h"
14#include "base/threading/thread_restrictions.h"
Colin Blundellbe1dc132020-01-29 09:54:0615#include "build/build_config.h"
Scott Violet87450ce2020-01-23 01:56:2516#include "components/sessions/core/command_storage_manager_test_helper.h"
17#include "content/public/test/browser_test_utils.h"
18#include "content/public/test/url_loader_interceptor.h"
19#include "net/base/filename_util.h"
20#include "net/test/embedded_test_server/embedded_test_server.h"
Clark DuVallb7c09942020-05-20 04:12:5121#include "testing/gmock/include/gmock/gmock.h"
Scott Violet87450ce2020-01-23 01:56:2522#include "weblayer/browser/browser_impl.h"
Scott Violet95a6d682020-06-11 23:28:3223#include "weblayer/browser/persistence/browser_persister_file_utils.h"
Scott Violet87450ce2020-01-23 01:56:2524#include "weblayer/browser/profile_impl.h"
25#include "weblayer/browser/tab_impl.h"
26#include "weblayer/common/weblayer_paths.h"
27#include "weblayer/public/navigation.h"
28#include "weblayer/public/navigation_controller.h"
29#include "weblayer/public/navigation_observer.h"
30#include "weblayer/public/tab.h"
31#include "weblayer/shell/browser/shell.h"
32#include "weblayer/test/interstitial_utils.h"
33#include "weblayer/test/test_navigation_observer.h"
34#include "weblayer/test/weblayer_browser_test.h"
35#include "weblayer/test/weblayer_browser_test_utils.h"
36
37namespace weblayer {
38
Scott Violet9843d0a2020-02-11 22:38:0739class BrowserPersisterTestHelper {
Scott Violet87450ce2020-01-23 01:56:2540 public:
41 static sessions::CommandStorageManager* GetCommandStorageManager(
Scott Violet9843d0a2020-02-11 22:38:0742 BrowserPersister* persister) {
43 return persister->command_storage_manager_.get();
Scott Violet87450ce2020-01-23 01:56:2544 }
45};
46
47namespace {
Clark DuVallb7c09942020-05-20 04:12:5148using testing::UnorderedElementsAre;
Scott Violet87450ce2020-01-23 01:56:2549
50class OneShotNavigationObserver : public NavigationObserver {
51 public:
52 explicit OneShotNavigationObserver(Shell* shell) : tab_(shell->tab()) {
53 tab_->GetNavigationController()->AddObserver(this);
54 }
55
56 ~OneShotNavigationObserver() override {
57 tab_->GetNavigationController()->RemoveObserver(this);
58 }
59
60 void WaitForNavigation() { run_loop_.Run(); }
61
62 bool completed() { return completed_; }
63 bool is_error_page() { return is_error_page_; }
64 Navigation::LoadError load_error() { return load_error_; }
65 int http_status_code() { return http_status_code_; }
66 NavigationState navigation_state() { return navigation_state_; }
67
68 private:
69 // NavigationObserver implementation:
70 void NavigationCompleted(Navigation* navigation) override {
71 completed_ = true;
72 Finish(navigation);
73 }
74
75 void NavigationFailed(Navigation* navigation) override { Finish(navigation); }
76
77 void Finish(Navigation* navigation) {
78 is_error_page_ = navigation->IsErrorPage();
79 load_error_ = navigation->GetLoadError();
80 http_status_code_ = navigation->GetHttpStatusCode();
81 navigation_state_ = navigation->GetState();
82 run_loop_.Quit();
83 }
84
85 base::RunLoop run_loop_;
86 Tab* tab_;
87 bool completed_ = false;
88 bool is_error_page_ = false;
89 Navigation::LoadError load_error_ = Navigation::kNoError;
90 int http_status_code_ = 0;
91 NavigationState navigation_state_ = NavigationState::kWaitingResponse;
92};
93
94class BrowserObserverImpl : public BrowserObserver {
95 public:
96 static void WaitForNewTab(Browser* browser) {
97 BrowserObserverImpl observer(browser);
98 observer.Wait();
99 }
100
101 private:
102 explicit BrowserObserverImpl(Browser* browser) : browser_(browser) {
103 browser_->AddObserver(this);
104 }
105 ~BrowserObserverImpl() override { browser_->RemoveObserver(this); }
106
107 void Wait() { run_loop_.Run(); }
108
109 // BrowserObserver:
110 void OnTabAdded(Tab* tab) override { run_loop_.Quit(); }
111
112 Browser* browser_;
113 base::RunLoop run_loop_;
114};
115
116class BrowserNavigationObserverImpl : public BrowserObserver,
117 public NavigationObserver {
118 public:
119 static void WaitForNewTabToCompleteNavigation(Browser* browser,
120 const GURL& url,
121 int tab_to_wait_for = 1) {
122 BrowserNavigationObserverImpl observer(browser, url, tab_to_wait_for);
123 observer.Wait();
124 }
125
126 private:
127 BrowserNavigationObserverImpl(Browser* browser,
128 const GURL& url,
129 int tab_to_wait_for)
130 : browser_(browser), url_(url), tab_to_wait_for_(tab_to_wait_for) {
131 browser_->AddObserver(this);
132 }
133 ~BrowserNavigationObserverImpl() override {
134 tab_->GetNavigationController()->RemoveObserver(this);
135 }
136
137 void Wait() { run_loop_.Run(); }
138
139 // NavigationObserver;
140 void NavigationCompleted(Navigation* navigation) override {
141 if (navigation->GetURL() == url_)
142 run_loop_.Quit();
143 }
144
145 // BrowserObserver:
146 void OnTabAdded(Tab* tab) override {
147 if (--tab_to_wait_for_ != 0)
148 return;
149
150 browser_->RemoveObserver(this);
151 tab_ = tab;
152 tab_->GetNavigationController()->AddObserver(this);
153 }
154
155 Browser* browser_;
156 const GURL& url_;
157 Tab* tab_ = nullptr;
158 int tab_to_wait_for_;
159 std::unique_ptr<TestNavigationObserver> navigation_observer_;
160 base::RunLoop run_loop_;
161};
162
Scott Violet9843d0a2020-02-11 22:38:07163void ShutdownBrowserPersisterAndWait(BrowserImpl* browser) {
Scott Violet87450ce2020-01-23 01:56:25164 auto task_runner = sessions::CommandStorageManagerTestHelper(
Scott Violet9843d0a2020-02-11 22:38:07165 BrowserPersisterTestHelper::GetCommandStorageManager(
166 browser->browser_persister()))
Scott Violet87450ce2020-01-23 01:56:25167 .GetBackendTaskRunner();
168 browser->PrepareForShutdown();
169 base::RunLoop run_loop;
170 task_runner->PostTaskAndReply(FROM_HERE, base::DoNothing(),
171 run_loop.QuitClosure());
172 run_loop.Run();
173}
174
Scott Violetbf8b8aa72020-01-28 19:37:32175std::unique_ptr<BrowserImpl> CreateBrowser(ProfileImpl* profile,
176 const std::string& persistence_id) {
177 Browser::PersistenceInfo info;
178 info.id = persistence_id;
Scott Violetb7df9d62020-01-31 16:18:49179 auto browser = Browser::Create(profile, &info);
180 return std::unique_ptr<BrowserImpl>(
181 static_cast<BrowserImpl*>(browser.release()));
Scott Violetbf8b8aa72020-01-28 19:37:32182}
183
Scott Violet87450ce2020-01-23 01:56:25184} // namespace
185
Scott Violet9843d0a2020-02-11 22:38:07186using BrowserPersisterTest = WebLayerBrowserTest;
Scott Violet87450ce2020-01-23 01:56:25187
Scott Violet9843d0a2020-02-11 22:38:07188IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, SingleTab) {
Scott Violet87450ce2020-01-23 01:56:25189 ASSERT_TRUE(embedded_test_server()->Start());
190
Scott Violetbf8b8aa72020-01-28 19:37:32191 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08192 Tab* tab = browser->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25193 const GURL url = embedded_test_server()->GetURL("/simple_page.html");
Scott Violetbb6c84552020-01-29 23:35:24194 NavigateAndWaitForCompletion(url, tab);
Scott Violet9843d0a2020-02-11 22:38:07195 ShutdownBrowserPersisterAndWait(browser.get());
Scott Violetbb6c84552020-01-29 23:35:24196 tab = nullptr;
Scott Violet87450ce2020-01-23 01:56:25197 browser.reset();
198
Scott Violetbf8b8aa72020-01-28 19:37:32199 browser = CreateBrowser(GetProfile(), "x");
Scott Violet87450ce2020-01-23 01:56:25200 // Should be no tabs while waiting for restore.
201 EXPECT_TRUE(browser->GetTabs().empty());
202 // Wait for the restore and navigation to complete.
203 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
204 browser.get(), url);
205
206 ASSERT_EQ(1u, browser->GetTabs().size());
207 EXPECT_EQ(browser->GetTabs()[0], browser->GetActiveTab());
208 EXPECT_EQ(1, browser->GetTabs()[0]
209 ->GetNavigationController()
210 ->GetNavigationListSize());
211}
212
Scott Violetb2e0cf12020-03-09 18:46:43213IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, RestoresGuid) {
214 ASSERT_TRUE(embedded_test_server()->Start());
215
216 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08217 Tab* tab = browser->CreateTab();
Scott Violetb2e0cf12020-03-09 18:46:43218 const std::string original_guid = tab->GetGuid();
219 EXPECT_FALSE(original_guid.empty());
220 EXPECT_TRUE(base::IsValidGUID(original_guid));
221 const GURL url = embedded_test_server()->GetURL("/simple_page.html");
222 NavigateAndWaitForCompletion(url, tab);
223 ShutdownBrowserPersisterAndWait(browser.get());
224 tab = nullptr;
225 browser.reset();
226
227 browser = CreateBrowser(GetProfile(), "x");
228 // Should be no tabs while waiting for restore.
229 EXPECT_TRUE(browser->GetTabs().empty());
230 // Wait for the restore and navigation to complete.
231 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
232 browser.get(), url);
233
234 ASSERT_EQ(1u, browser->GetTabs().size());
235 EXPECT_EQ(browser->GetTabs()[0], browser->GetActiveTab());
236 EXPECT_EQ(original_guid, browser->GetTabs()[0]->GetGuid());
237}
238
Clark DuVallb7c09942020-05-20 04:12:51239IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, RestoresData) {
240 ASSERT_TRUE(embedded_test_server()->Start());
241
242 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08243 Tab* tab = browser->CreateTab();
Clark DuVallb7c09942020-05-20 04:12:51244 tab->SetData({{"abc", "efg"}});
245 const GURL url = embedded_test_server()->GetURL("/simple_page.html");
246 NavigateAndWaitForCompletion(url, tab);
247 ShutdownBrowserPersisterAndWait(browser.get());
248 tab = nullptr;
249 browser.reset();
250
251 browser = CreateBrowser(GetProfile(), "x");
252 // Should be no tabs while waiting for restore.
253 EXPECT_TRUE(browser->GetTabs().empty());
254 // Wait for the restore and navigation to complete.
255 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
256 browser.get(), url);
257
258 ASSERT_EQ(1u, browser->GetTabs().size());
259 EXPECT_EQ(browser->GetTabs()[0], browser->GetActiveTab());
260 EXPECT_THAT(browser->GetTabs()[0]->GetData(),
261 UnorderedElementsAre(std::make_pair("abc", "efg")));
262}
263
264IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, RestoresMostRecentData) {
265 ASSERT_TRUE(embedded_test_server()->Start());
266
267 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08268 Tab* tab = browser->CreateTab();
Clark DuVallb7c09942020-05-20 04:12:51269 tab->SetData({{"xxx", "xxx"}});
270 const GURL url = embedded_test_server()->GetURL("/simple_page.html");
271 NavigateAndWaitForCompletion(url, tab);
272
273 // Make sure the data has been saved, then set different data on the tab.
274 BrowserPersisterTestHelper::GetCommandStorageManager(
275 browser->browser_persister())
276 ->Save();
277 tab->SetData({{"abc", "efg"}});
278
279 ShutdownBrowserPersisterAndWait(browser.get());
280 tab = nullptr;
281 browser.reset();
282
283 browser = CreateBrowser(GetProfile(), "x");
284 // Should be no tabs while waiting for restore.
285 EXPECT_TRUE(browser->GetTabs().empty());
286 // Wait for the restore and navigation to complete.
287 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
288 browser.get(), url);
289
290 ASSERT_EQ(1u, browser->GetTabs().size());
291 EXPECT_EQ(browser->GetTabs()[0], browser->GetActiveTab());
292 EXPECT_THAT(browser->GetTabs()[0]->GetData(),
293 UnorderedElementsAre(std::make_pair("abc", "efg")));
294}
295
Scott Violet9843d0a2020-02-11 22:38:07296IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, TwoTabs) {
Scott Violet87450ce2020-01-23 01:56:25297 ASSERT_TRUE(embedded_test_server()->Start());
298
Scott Violetbf8b8aa72020-01-28 19:37:32299 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08300 Tab* tab1 = browser->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25301 const GURL url1 = embedded_test_server()->GetURL("/simple_page.html");
Scott Violetbb6c84552020-01-29 23:35:24302 NavigateAndWaitForCompletion(url1, tab1);
Scott Violet87450ce2020-01-23 01:56:25303
Clark DuVallb9658c12020-06-12 02:25:08304 Tab* tab2 = browser->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25305 const GURL url2 = embedded_test_server()->GetURL("/simple_page2.html");
Scott Violetbb6c84552020-01-29 23:35:24306 NavigateAndWaitForCompletion(url2, tab2);
307 browser->SetActiveTab(tab2);
Scott Violet87450ce2020-01-23 01:56:25308
Colin Blundellbe1dc132020-01-29 09:54:06309 // Shut down the service.
Scott Violet9843d0a2020-02-11 22:38:07310 ShutdownBrowserPersisterAndWait(browser.get());
Scott Violetbb6c84552020-01-29 23:35:24311 tab1 = tab2 = nullptr;
Colin Blundellbe1dc132020-01-29 09:54:06312 browser.reset();
313
314 // Recreate the browser and run the assertions twice to ensure we handle
Scott Violet87450ce2020-01-23 01:56:25315 // correctly storing state of tabs that need to be reloaded.
316 for (int i = 0; i < 2; ++i) {
Scott Violetbf8b8aa72020-01-28 19:37:32317 browser = CreateBrowser(GetProfile(), "x");
Scott Violet87450ce2020-01-23 01:56:25318 // Should be no tabs while waiting for restore.
319 EXPECT_TRUE(browser->GetTabs().empty()) << "iteration " << i;
320 // Wait for the restore and navigation to complete. This waits for the
321 // second tab as that was the active one.
322 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
323 browser.get(), url2, 2);
324
325 ASSERT_EQ(2u, browser->GetTabs().size()) << "iteration " << i;
326 // The first tab shouldn't have loaded yet, as it's not active.
327 EXPECT_TRUE(static_cast<TabImpl*>(browser->GetTabs()[0])
328 ->web_contents()
329 ->GetController()
330 .NeedsReload())
331 << "iteration " << i;
332 EXPECT_EQ(browser->GetTabs()[1], browser->GetActiveTab())
333 << "iteration " << i;
334 EXPECT_EQ(1, browser->GetTabs()[1]
335 ->GetNavigationController()
336 ->GetNavigationListSize())
337 << "iteration " << i;
Colin Blundellbe1dc132020-01-29 09:54:06338
Scott Violet9843d0a2020-02-11 22:38:07339 ShutdownBrowserPersisterAndWait(browser.get());
Scott Violet87450ce2020-01-23 01:56:25340 }
341}
342
Scott Violet9843d0a2020-02-11 22:38:07343IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, MoveBetweenBrowsers) {
Scott Violet87450ce2020-01-23 01:56:25344 ASSERT_TRUE(embedded_test_server()->Start());
345
346 // Create a browser with two tabs.
Scott Violetbf8b8aa72020-01-28 19:37:32347 std::unique_ptr<BrowserImpl> browser1 = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08348 Tab* tab1 = browser1->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25349 const GURL url1 = embedded_test_server()->GetURL("/simple_page.html");
Scott Violetbb6c84552020-01-29 23:35:24350 NavigateAndWaitForCompletion(url1, tab1);
Scott Violet87450ce2020-01-23 01:56:25351
Clark DuVallb9658c12020-06-12 02:25:08352 Tab* tab2 = browser1->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25353 const GURL url2 = embedded_test_server()->GetURL("/simple_page2.html");
Scott Violetbb6c84552020-01-29 23:35:24354 NavigateAndWaitForCompletion(url2, tab2);
355 browser1->SetActiveTab(tab2);
Scott Violet87450ce2020-01-23 01:56:25356
357 // Create another browser with a single tab.
Scott Violetbf8b8aa72020-01-28 19:37:32358 std::unique_ptr<BrowserImpl> browser2 = CreateBrowser(GetProfile(), "y");
Clark DuVallb9658c12020-06-12 02:25:08359 Tab* tab3 = browser2->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25360 const GURL url3 = embedded_test_server()->GetURL("/simple_page3.html");
Scott Violetbb6c84552020-01-29 23:35:24361 NavigateAndWaitForCompletion(url3, tab3);
Scott Violet87450ce2020-01-23 01:56:25362
363 // Move |tab2| to |browser2|.
Clark DuVallb9658c12020-06-12 02:25:08364 browser2->AddTab(tab2);
Scott Violetbb6c84552020-01-29 23:35:24365 browser2->SetActiveTab(tab2);
Scott Violet87450ce2020-01-23 01:56:25366
Scott Violet9843d0a2020-02-11 22:38:07367 ShutdownBrowserPersisterAndWait(browser1.get());
368 ShutdownBrowserPersisterAndWait(browser2.get());
Scott Violetbb6c84552020-01-29 23:35:24369 tab1 = nullptr;
Scott Violet87450ce2020-01-23 01:56:25370 browser1.reset();
371
Scott Violetbb6c84552020-01-29 23:35:24372 tab2 = tab3 = nullptr;
Scott Violet87450ce2020-01-23 01:56:25373 browser2.reset();
374
375 // Restore the browsers.
Scott Violetbf8b8aa72020-01-28 19:37:32376 browser1 = CreateBrowser(GetProfile(), "x");
Scott Violet87450ce2020-01-23 01:56:25377 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
378 browser1.get(), url1, 1);
379 ASSERT_EQ(1u, browser1->GetTabs().size());
380 EXPECT_EQ(1, browser1->GetTabs()[0]
381 ->GetNavigationController()
382 ->GetNavigationListSize());
383
Scott Violetbf8b8aa72020-01-28 19:37:32384 browser2 = CreateBrowser(GetProfile(), "y");
Scott Violet87450ce2020-01-23 01:56:25385 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
386 browser2.get(), url2, 2);
387 ASSERT_EQ(2u, browser2->GetTabs().size());
388 EXPECT_EQ(1, browser2->GetTabs()[1]
389 ->GetNavigationController()
390 ->GetNavigationListSize());
391
392 // As |tab3| isn't active it needs to be loaded. Force that now.
393 TabImpl* restored_tab_3 = static_cast<TabImpl*>(browser2->GetTabs()[0]);
394 EXPECT_TRUE(restored_tab_3->web_contents()->GetController().NeedsReload());
395 restored_tab_3->web_contents()->GetController().LoadIfNecessary();
396 content::WaitForLoadStop(restored_tab_3->web_contents());
Scott Violet87450ce2020-01-23 01:56:25397}
398
Scott Violet95a6d682020-06-11 23:28:32399class BrowserPersisterTestWithTwoPersistedIds : public WebLayerBrowserTest {
400 public:
401 // WebLayerBrowserTest:
402 void SetUpOnMainThread() override {
403 WebLayerBrowserTest::SetUpOnMainThread();
404 // Configure two browsers with ids 'x' and 'y'.
405 ASSERT_TRUE(embedded_test_server()->Start());
406 std::unique_ptr<BrowserImpl> browser1 = CreateBrowser(GetProfile(), "x");
407 const GURL url1 = embedded_test_server()->GetURL("/simple_page.html");
Clark DuVallb9658c12020-06-12 02:25:08408 NavigateAndWaitForCompletion(url1, browser1->CreateTab());
Scott Violet95a6d682020-06-11 23:28:32409
410 std::unique_ptr<BrowserImpl> browser2 = CreateBrowser(GetProfile(), "y");
411 const GURL url2 = embedded_test_server()->GetURL("/simple_page3.html");
Clark DuVallb9658c12020-06-12 02:25:08412 NavigateAndWaitForCompletion(url2, browser2->CreateTab());
Scott Violet95a6d682020-06-11 23:28:32413
414 // Shut down the browsers.
415 ShutdownBrowserPersisterAndWait(browser1.get());
416 browser1.reset();
417 ShutdownBrowserPersisterAndWait(browser2.get());
418 browser2.reset();
419 }
420};
421
422IN_PROC_BROWSER_TEST_F(BrowserPersisterTestWithTwoPersistedIds,
423 GetBrowserPersistenceIds) {
424 {
425 // Create a file that has the name of a valid persistence file, but has
426 // invalid contents.
427 base::ScopedAllowBlockingForTesting allow_blocking;
428 base::WriteFile(BuildPathForBrowserPersister(
429 GetProfile()->GetBrowserPersisterDataBaseDir(), "z"),
430 "a bogus persistence file");
431 }
432
433 base::RunLoop run_loop;
434 base::flat_set<std::string> persistence_ids;
435 GetProfile()->GetBrowserPersistenceIds(
436 base::BindLambdaForTesting([&](base::flat_set<std::string> ids) {
437 persistence_ids = std::move(ids);
438 run_loop.Quit();
439 }));
440 run_loop.Run();
441 ASSERT_EQ(2u, persistence_ids.size());
442 EXPECT_TRUE(persistence_ids.contains("x"));
443 EXPECT_TRUE(persistence_ids.contains("y"));
444}
445
446IN_PROC_BROWSER_TEST_F(BrowserPersisterTestWithTwoPersistedIds,
447 RemoveBrowserPersistenceStorage) {
448 base::FilePath file_path1 = BuildPathForBrowserPersister(
449 GetProfile()->GetBrowserPersisterDataBaseDir(), "x");
450 base::FilePath file_path2 = BuildPathForBrowserPersister(
451 GetProfile()->GetBrowserPersisterDataBaseDir(), "y");
452
453 {
454 base::ScopedAllowBlockingForTesting allow_blocking;
455 ASSERT_TRUE(base::PathExists(file_path1));
456 ASSERT_TRUE(base::PathExists(file_path2));
457 }
458 base::RunLoop run_loop;
459 base::flat_set<std::string> persistence_ids;
460 persistence_ids.insert("x");
461 persistence_ids.insert("y");
462 GetProfile()->RemoveBrowserPersistenceStorage(
463 base::BindLambdaForTesting([&](bool result) {
464 EXPECT_TRUE(result);
465 run_loop.Quit();
466 }),
467 std::move(persistence_ids));
468 run_loop.Run();
469 {
470 base::ScopedAllowBlockingForTesting allow_blocking;
471 EXPECT_FALSE(base::PathExists(file_path1));
472 EXPECT_FALSE(base::PathExists(file_path2));
473 }
474}
475
Scott Violet87450ce2020-01-23 01:56:25476} // namespace weblayer