// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import "ios/web/browsing_data_partition_impl.h" #include "base/ios/ios_util.h" #include "base/memory/scoped_ptr.h" #import "base/test/ios/wait_util.h" #include "ios/web/public/active_state_manager.h" #include "ios/web/public/browser_state.h" #import "ios/web/public/crw_browsing_data_store.h" #include "ios/web/public/test/test_browser_state.h" #include "ios/web/public/test/test_web_thread_bundle.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" namespace web { namespace { class BrowsingDataPartitionImplTest : public PlatformTest { protected: void SetUp() override { PlatformTest::SetUp(); browser_state_.reset(new TestBrowserState()); BrowserState::GetActiveStateManager(browser_state_.get())->SetActive(true); } void TearDown() override { // The BrowserState needs to be destroyed first so that it is outlived by // the WebThreadBundle. BrowserState::GetActiveStateManager(browser_state_.get())->SetActive(false); base::test::ios::WaitUntilCondition(^bool { return BrowsingDataPartition::IsSynchronized(); }); browser_state_.reset(); PlatformTest::TearDown(); } // The BrowserState used for testing purposes. scoped_ptr browser_state_; private: // Used to create TestWebThreads. TestWebThreadBundle thread_bundle_; }; } // namespace // Tests that a BrowsingDataPartitionImplTest is succesfully created with a // BrowserState. And that it returns a non-nil BrowsingDataStore. TEST_F(BrowsingDataPartitionImplTest, CreationAndBrowsingDataStore) { if (!base::ios::IsRunningOnIOS8OrLater()) { return; } BrowsingDataPartition* browsing_data_partition = BrowserState::GetBrowsingDataPartition(browser_state_.get()); ASSERT_TRUE(browsing_data_partition); EXPECT_TRUE(browsing_data_partition->GetBrowsingDataStore()); } // Tests that a BrowsingDataPartitionImplTest successfully handles the case when // multiple BrowserStates are made active/inactive. TEST_F(BrowsingDataPartitionImplTest, ManyBrowserStates) { if (!base::ios::IsRunningOnIOS8OrLater()) { return; } scoped_ptr browser_state_1(new TestBrowserState); scoped_ptr browser_state_2(new TestBrowserState); // Create a BrowsingDataPartition associated with each of the BrowserStates. ASSERT_TRUE(BrowserState::GetBrowsingDataPartition(browser_state_.get())); ASSERT_TRUE(BrowserState::GetBrowsingDataPartition(browser_state_1.get())); ASSERT_TRUE(BrowserState::GetBrowsingDataPartition(browser_state_2.get())); ASSERT_TRUE(BrowsingDataPartition::IsSynchronized()); BrowserState::GetActiveStateManager(browser_state_.get())->SetActive(false); BrowserState::GetActiveStateManager(browser_state_1.get())->SetActive(true); BrowserState::GetActiveStateManager(browser_state_1.get())->SetActive(false); BrowserState::GetActiveStateManager(browser_state_2.get())->SetActive(true); BrowserState::GetActiveStateManager(browser_state_2.get())->SetActive(false); // Test an edge case where a |makeActive:| call is enqueued in the same // runloop as when the associated ActiveStateManager's active state is // changed. CRWBrowsingDataStore* store = BrowserState::GetBrowsingDataPartition(browser_state_2.get()) ->GetBrowsingDataStore(); [store makeActiveWithCompletionHandler:nil]; EXPECT_FALSE(BrowsingDataPartition::IsSynchronized()); base::test::ios::WaitUntilCondition(^bool() { return BrowsingDataPartition::IsSynchronized(); }); } } // namespace web