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

Unified Diff: services/preferences/persistent_pref_store_impl_unittest.cc

Issue 2767743003: Pref service: Merge connectors and send a PrefRegistry in Connect(). (Closed)
Patch Set: Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « services/preferences/persistent_pref_store_impl.cc ('k') | services/preferences/pref_store_manager_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/preferences/persistent_pref_store_impl_unittest.cc
diff --git a/services/preferences/persistent_pref_store_impl_unittest.cc b/services/preferences/persistent_pref_store_impl_unittest.cc
index 806a3428e9b0d8b14c487b5b54fd6db8b71aee5b..b47e86a1068a8a3cacf2ebae811b238c98372f9d 100644
--- a/services/preferences/persistent_pref_store_impl_unittest.cc
+++ b/services/preferences/persistent_pref_store_impl_unittest.cc
@@ -12,6 +12,7 @@
#include "base/run_loop.h"
#include "base/values.h"
#include "components/prefs/in_memory_pref_store.h"
+#include "components/prefs/pref_registry_simple.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/preferences/public/cpp/persistent_pref_store_client.h"
#include "services/preferences/public/interfaces/preferences.mojom.h"
@@ -40,14 +41,17 @@ class PersistentPrefStoreMock : public InMemoryPrefStore {
~PersistentPrefStoreMock() override = default;
};
-class PrefStoreConnectorMock : public mojom::PrefStoreConnector {
- public:
- MOCK_METHOD1(Connect, void(const ConnectCallback&));
-};
-
class InitializationMockPersistentPrefStore : public InMemoryPrefStore {
public:
- bool IsInitializationComplete() const override { return initialized_; }
+ InitializationMockPersistentPrefStore(
+ bool success,
+ PersistentPrefStore::PrefReadError error,
+ bool read_only)
+ : success_(success), read_error_(error), read_only_(read_only) {}
+
+ bool IsInitializationComplete() const override {
+ return initialized_ && success_;
+ }
void AddObserver(PrefStore::Observer* observer) override {
observers_.AddObserver(observer);
@@ -59,6 +63,17 @@ class InitializationMockPersistentPrefStore : public InMemoryPrefStore {
void ReadPrefsAsync(ReadErrorDelegate* error_delegate) override {
DCHECK(!error_delegate);
+ DCHECK(!initialized_);
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE,
+ base::Bind(&InitializationMockPersistentPrefStore::CompleteRead, this));
+ }
+
+ void CompleteRead() {
+ initialized_ = true;
+ for (auto& observer : observers_) {
+ observer.OnInitializationCompleted(success_);
+ }
}
PersistentPrefStore::PrefReadError GetReadError() const override {
@@ -66,77 +81,87 @@ class InitializationMockPersistentPrefStore : public InMemoryPrefStore {
}
bool ReadOnly() const override { return read_only_; }
- void Initialize(bool success,
- PersistentPrefStore::PrefReadError error,
- bool read_only) {
- initialized_ = success;
- read_error_ = error;
- read_only_ = read_only;
- for (auto& observer : observers_) {
- observer.OnInitializationCompleted(initialized_);
- }
- }
-
private:
~InitializationMockPersistentPrefStore() override = default;
- PersistentPrefStore::PrefReadError read_error_;
- bool read_only_ = false;
bool initialized_ = false;
+ bool success_;
+ PersistentPrefStore::PrefReadError read_error_;
+ bool read_only_;
base::ObserverList<PrefStore::Observer, true> observers_;
};
+constexpr char kKey[] = "path.to.key";
+constexpr char kOtherKey[] = "path.to.other_key";
+
+mojom::PrefRegistryPtr WrapPrefRegistry(PrefRegistry& pref_registry) {
+ auto registry = mojom::PrefRegistry::New();
+ for (auto& pref : pref_registry) {
+ auto registration = mojom::PrefRegistration::New();
+ registration->set_owning_registration(mojom::OwningPrefRegistration::New(
+ pref.second->CreateDeepCopy(),
+ pref_registry.GetRegistrationFlags(pref.first)));
+ registry->registrations[pref.first] = std::move(registration);
+ }
+ return registry;
+}
+
class PersistentPrefStoreImplTest : public testing::Test {
public:
PersistentPrefStoreImplTest() = default;
// testing::Test:
+ void SetUp() override {
+ auto pref_registry = make_scoped_refptr(new PrefRegistrySimple);
+ pref_registry->RegisterStringPref(kKey, "");
+ pref_registry->RegisterIntegerPref(kOtherKey, 123);
+ pref_registry_ = std::move(pref_registry);
+ }
+
void TearDown() override {
pref_store_ = nullptr;
base::RunLoop().RunUntilIdle();
- bindings_.CloseAllBindings();
- backing_pref_store_.reset();
+ impl_.reset();
base::RunLoop().RunUntilIdle();
}
void CreateImpl(scoped_refptr<PersistentPrefStore> backing_pref_store) {
- backing_pref_store_ = base::MakeUnique<PersistentPrefStoreImpl>(
- std::move(backing_pref_store), nullptr);
- mojo::Binding<mojom::PersistentPrefStoreConnector> binding(
- backing_pref_store_.get());
+ base::RunLoop run_loop;
+ bool initialized = backing_pref_store->IsInitializationComplete();
+ impl_ = base::MakeUnique<PersistentPrefStoreImpl>(
+ std::move(backing_pref_store), nullptr, run_loop.QuitClosure());
+ if (!initialized)
+ run_loop.Run();
pref_store_ = CreateConnection();
}
- mojom::PersistentPrefStoreConnectorPtr CreateConnector() {
- return bindings_.CreateInterfacePtrAndBind(backing_pref_store_.get());
- }
-
- scoped_refptr<PersistentPrefStore> CreateConnection() {
+ scoped_refptr<PersistentPrefStore> CreateConnection(
+ scoped_refptr<PrefRegistry> pref_registry = nullptr) {
+ if (!pref_registry)
+ pref_registry = pref_registry_;
return make_scoped_refptr(new PersistentPrefStoreClient(
- bindings_.CreateInterfacePtrAndBind(backing_pref_store_.get())));
+ impl_->Connect(WrapPrefRegistry(*pref_registry))));
}
PersistentPrefStore* pref_store() { return pref_store_.get(); }
+ PrefRegistry* pref_registry() { return pref_registry_.get(); }
private:
base::MessageLoop message_loop_;
- std::unique_ptr<PersistentPrefStoreImpl> backing_pref_store_;
- mojo::BindingSet<mojom::PersistentPrefStoreConnector> bindings_;
+ std::unique_ptr<PersistentPrefStoreImpl> impl_;
scoped_refptr<PersistentPrefStore> pref_store_;
+ scoped_refptr<PrefRegistry> pref_registry_;
DISALLOW_COPY_AND_ASSIGN(PersistentPrefStoreImplTest);
};
TEST_F(PersistentPrefStoreImplTest, InitializationSuccess) {
auto backing_pref_store =
- make_scoped_refptr(new InitializationMockPersistentPrefStore);
+ make_scoped_refptr(new InitializationMockPersistentPrefStore(
+ true, PersistentPrefStore::PREF_READ_ERROR_NONE, false));
CreateImpl(backing_pref_store);
- backing_pref_store->Initialize(
- true, PersistentPrefStore::PREF_READ_ERROR_NONE, false);
- EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
EXPECT_TRUE(pref_store()->IsInitializationComplete());
EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
pref_store()->GetReadError());
@@ -145,12 +170,9 @@ TEST_F(PersistentPrefStoreImplTest, InitializationSuccess) {
TEST_F(PersistentPrefStoreImplTest, InitializationFailure) {
auto backing_pref_store =
- make_scoped_refptr(new InitializationMockPersistentPrefStore);
+ make_scoped_refptr(new InitializationMockPersistentPrefStore(
+ false, PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE, true));
CreateImpl(backing_pref_store);
- backing_pref_store->Initialize(
- false, PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE, true);
- EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE,
- pref_store()->ReadPrefs());
EXPECT_FALSE(pref_store()->IsInitializationComplete());
EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE,
pref_store()->GetReadError());
@@ -176,85 +198,11 @@ class TestReadErrorDelegate : public PersistentPrefStore::ReadErrorDelegate {
const base::Closure quit_;
};
-TEST_F(PersistentPrefStoreImplTest, InitializationFailure_AsyncRead) {
- auto backing_pref_store =
- make_scoped_refptr(new InitializationMockPersistentPrefStore);
- CreateImpl(backing_pref_store);
- backing_pref_store->Initialize(
- false, PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE, true);
- PersistentPrefStore::PrefReadError read_error =
- PersistentPrefStore::PREF_READ_ERROR_NONE;
- base::RunLoop run_loop;
- pref_store()->ReadPrefsAsync(
- new TestReadErrorDelegate(&read_error, run_loop.QuitClosure()));
- run_loop.Run();
- EXPECT_FALSE(pref_store()->IsInitializationComplete());
- EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE, read_error);
- EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE,
- pref_store()->GetReadError());
- EXPECT_TRUE(pref_store()->ReadOnly());
-}
-
-TEST_F(PersistentPrefStoreImplTest, DelayedInitializationSuccess) {
- auto backing_pref_store =
- make_scoped_refptr(new InitializationMockPersistentPrefStore);
-
- CreateImpl(backing_pref_store);
- auto connector = CreateConnector();
- base::RunLoop run_loop;
- connector->Connect(base::Bind(
- [](const base::Closure& quit,
- PersistentPrefStore::PrefReadError read_error, bool read_only,
- std::unique_ptr<base::DictionaryValue> local_prefs,
- mojom::PersistentPrefStorePtr pref_store,
- mojom::PrefStoreObserverRequest observer_request) {
- quit.Run();
- EXPECT_FALSE(read_only);
- EXPECT_TRUE(local_prefs);
- EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, read_error);
- },
- run_loop.QuitClosure()));
- connector.FlushForTesting();
- backing_pref_store->Initialize(
- true, PersistentPrefStore::PREF_READ_ERROR_NONE, false);
- run_loop.Run();
-}
-
-TEST_F(PersistentPrefStoreImplTest, DelayedInitializationFailure) {
- auto backing_pref_store =
- make_scoped_refptr(new InitializationMockPersistentPrefStore);
-
- CreateImpl(backing_pref_store);
- auto connector = CreateConnector();
- base::RunLoop run_loop;
- connector->Connect(base::Bind(
- [](const base::Closure& quit,
- PersistentPrefStore::PrefReadError read_error, bool read_only,
- std::unique_ptr<base::DictionaryValue> local_prefs,
- mojom::PersistentPrefStorePtr pref_store,
- mojom::PrefStoreObserverRequest observer_request) {
- quit.Run();
- EXPECT_TRUE(read_only);
- EXPECT_FALSE(local_prefs);
- EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED,
- read_error);
- },
- run_loop.QuitClosure()));
- connector.FlushForTesting();
- backing_pref_store->Initialize(
- false, PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED, true);
- run_loop.Run();
-}
-
-constexpr char kKey[] = "path.to.key";
-
TEST_F(PersistentPrefStoreImplTest, InitialValue) {
auto backing_pref_store = make_scoped_refptr(new InMemoryPrefStore());
const base::Value value("value");
backing_pref_store->SetValue(kKey, value.CreateDeepCopy(), 0);
CreateImpl(backing_pref_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
EXPECT_TRUE(pref_store()->IsInitializationComplete());
const base::Value* output = nullptr;
ASSERT_TRUE(pref_store()->GetValue(kKey, &output));
@@ -267,8 +215,6 @@ TEST_F(PersistentPrefStoreImplTest, InitialValueWithoutPathExpansion) {
dict.SetStringWithoutPathExpansion(kKey, "value");
backing_pref_store->SetValue(kKey, dict.CreateDeepCopy(), 0);
CreateImpl(backing_pref_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
EXPECT_TRUE(pref_store()->IsInitializationComplete());
const base::Value* output = nullptr;
ASSERT_TRUE(pref_store()->GetValue(kKey, &output));
@@ -278,13 +224,9 @@ TEST_F(PersistentPrefStoreImplTest, InitialValueWithoutPathExpansion) {
TEST_F(PersistentPrefStoreImplTest, WriteObservedByOtherClient) {
auto backing_pref_store = make_scoped_refptr(new InMemoryPrefStore());
CreateImpl(backing_pref_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
EXPECT_TRUE(pref_store()->IsInitializationComplete());
auto other_pref_store = CreateConnection();
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- other_pref_store->ReadPrefs());
EXPECT_TRUE(other_pref_store->IsInitializationComplete());
const base::Value value("value");
@@ -304,17 +246,39 @@ TEST_F(PersistentPrefStoreImplTest, WriteObservedByOtherClient) {
EXPECT_TRUE(value.Equals(output));
}
+TEST_F(PersistentPrefStoreImplTest, UnregisteredPrefNotObservedByOtherClient) {
+ auto backing_pref_store = make_scoped_refptr(new InMemoryPrefStore());
+ CreateImpl(backing_pref_store);
+ EXPECT_TRUE(pref_store()->IsInitializationComplete());
+
+ auto pref_registry = make_scoped_refptr(new PrefRegistrySimple());
+ pref_registry->RegisterStringPref(kKey, "");
+ auto other_pref_store = CreateConnection(std::move(pref_registry));
+ EXPECT_TRUE(other_pref_store->IsInitializationComplete());
+
+ pref_store()->SetValue(kOtherKey, base::MakeUnique<base::Value>(123), 0);
+ pref_store()->SetValue(kKey, base::MakeUnique<base::Value>("value"), 0);
+
+ PrefStoreObserverMock observer;
+ other_pref_store->AddObserver(&observer);
+ base::RunLoop run_loop;
+ EXPECT_CALL(observer, OnPrefValueChanged(kOtherKey)).Times(0);
+ EXPECT_CALL(observer, OnPrefValueChanged(kKey))
+ .Times(1)
+ .WillOnce(WithoutArgs(Invoke([&run_loop]() { run_loop.Quit(); })));
+ run_loop.Run();
+ other_pref_store->RemoveObserver(&observer);
+
+ EXPECT_FALSE(other_pref_store->GetValue(kOtherKey, nullptr));
+}
+
TEST_F(PersistentPrefStoreImplTest,
WriteWithoutPathExpansionObservedByOtherClient) {
auto backing_pref_store = make_scoped_refptr(new InMemoryPrefStore());
CreateImpl(backing_pref_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
EXPECT_TRUE(pref_store()->IsInitializationComplete());
auto other_pref_store = CreateConnection();
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- other_pref_store->ReadPrefs());
EXPECT_TRUE(other_pref_store->IsInitializationComplete());
base::DictionaryValue dict;
@@ -340,13 +304,9 @@ TEST_F(PersistentPrefStoreImplTest, RemoveObservedByOtherClient) {
const base::Value value("value");
backing_pref_store->SetValue(kKey, value.CreateDeepCopy(), 0);
CreateImpl(backing_pref_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
EXPECT_TRUE(pref_store()->IsInitializationComplete());
auto other_pref_store = CreateConnection();
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- other_pref_store->ReadPrefs());
EXPECT_TRUE(other_pref_store->IsInitializationComplete());
const base::Value* output = nullptr;
@@ -378,13 +338,9 @@ TEST_F(PersistentPrefStoreImplTest,
dict.SetStringWithoutPathExpansion(kKey, "value");
backing_pref_store->SetValue(kKey, dict.CreateDeepCopy(), 0);
CreateImpl(backing_pref_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
EXPECT_TRUE(pref_store()->IsInitializationComplete());
auto other_pref_store = CreateConnection();
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- other_pref_store->ReadPrefs());
EXPECT_TRUE(other_pref_store->IsInitializationComplete());
const base::Value* output = nullptr;
@@ -417,8 +373,6 @@ TEST_F(PersistentPrefStoreImplTest,
TEST_F(PersistentPrefStoreImplTest, CommitPendingWrite) {
auto backing_store = make_scoped_refptr(new PersistentPrefStoreMock);
CreateImpl(backing_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
base::RunLoop run_loop;
EXPECT_CALL(*backing_store, CommitPendingWrite())
.Times(2)
@@ -430,8 +384,6 @@ TEST_F(PersistentPrefStoreImplTest, CommitPendingWrite) {
TEST_F(PersistentPrefStoreImplTest, SchedulePendingLossyWrites) {
auto backing_store = make_scoped_refptr(new PersistentPrefStoreMock);
CreateImpl(backing_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
base::RunLoop run_loop;
EXPECT_CALL(*backing_store, SchedulePendingLossyWrites())
.Times(1)
@@ -444,8 +396,6 @@ TEST_F(PersistentPrefStoreImplTest, SchedulePendingLossyWrites) {
TEST_F(PersistentPrefStoreImplTest, ClearMutableValues) {
auto backing_store = make_scoped_refptr(new PersistentPrefStoreMock);
CreateImpl(backing_store);
- ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE,
- pref_store()->ReadPrefs());
base::RunLoop run_loop;
EXPECT_CALL(*backing_store, ClearMutableValues())
.Times(1)
« no previous file with comments | « services/preferences/persistent_pref_store_impl.cc ('k') | services/preferences/pref_store_manager_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698