Index: chrome/browser/prefs/tracked/protected_pref_store_unittest.cc |
diff --git a/chrome/browser/prefs/tracked/protected_pref_store_unittest.cc b/chrome/browser/prefs/tracked/protected_pref_store_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4f3ca2456c8365cadfb270a8f3aecd57d8b5378d |
--- /dev/null |
+++ b/chrome/browser/prefs/tracked/protected_pref_store_unittest.cc |
@@ -0,0 +1,254 @@ |
+// Copyright 2014 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. |
+ |
+#include "chrome/browser/prefs/tracked/protected_pref_store.cc" |
erikwright (departed)
2014/03/26 21:08:12
Ha. Can't believe I wrote it, not too surprised y'
|
+ |
+#include <set> |
+#include <string> |
+ |
+#include "base/bind.h" |
+#include "base/callback.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/prefs/persistent_pref_store.h" |
+#include "base/prefs/pref_store_observer_mock.h" |
+#include "base/prefs/testing_pref_store.h" |
+#include "base/values.h" |
+#include "chrome/browser/prefs/tracked/protected_pref_store.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+const char kProtectedPref[] = "protected_pref"; |
+const char kUnprotectedPref[] = "unprotected_pref"; |
+ |
+const char kValue1[] = "value1"; |
+const char kValue2[] = "value2"; |
+ |
+class MockReadErrorDelegate : public PersistentPrefStore::ReadErrorDelegate { |
+ public: |
+ struct Data { |
+ bool invoked; |
+ PersistentPrefStore::PrefReadError read_error; |
+ }; |
+ |
+ explicit MockReadErrorDelegate(Data* data) : data_(data) { |
+ DCHECK(data_); |
+ EXPECT_FALSE(data_->invoked); |
+ } |
+ |
+ // PersistentPrefStore::ReadErrorDelegate implementation |
+ virtual void OnError(PersistentPrefStore::PrefReadError read_error) OVERRIDE { |
+ EXPECT_FALSE(data_->invoked); |
+ data_->invoked = true; |
+ data_->read_error = read_error; |
+ } |
+ |
+ private: |
+ Data* data_; |
+}; |
+ |
+} // namespace |
+ |
+class ProtectedPrefStoreTest : public testing::Test { |
+ public: |
+ ProtectedPrefStoreTest() |
+ : initialization_callback_invoked_(false), |
+ read_error_delegate_data_( |
+ {false, PersistentPrefStore::PREF_READ_ERROR_NONE}), |
+ read_error_delegate_( |
+ new MockReadErrorDelegate(&read_error_delegate_data_)) {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ protected_store_ = new TestingPrefStore; |
+ unprotected_store_ = new TestingPrefStore; |
+ |
+ std::set<std::string> protected_pref_names; |
+ protected_pref_names.insert(kProtectedPref); |
+ |
+ combined_store_ = new ProtectedPrefStore( |
+ unprotected_store_, |
+ protected_store_, |
+ protected_pref_names, |
+ base::Bind(&ProtectedPrefStoreTest::InitializationCallback, |
+ base::Unretained(this))); |
+ |
+ combined_store_->AddObserver(&observer_); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ combined_store_->RemoveObserver(&observer_); |
+ } |
+ |
+ protected: |
+ scoped_ptr<PersistentPrefStore::ReadErrorDelegate> GetReadErrorDelegate() { |
+ EXPECT_TRUE(read_error_delegate_); |
+ return read_error_delegate_ |
+ .PassAs<PersistentPrefStore::ReadErrorDelegate>(); |
+ } |
+ |
+ PrefStoreObserverMock observer_; |
+ bool initialization_callback_invoked_; |
+ |
+ scoped_refptr<TestingPrefStore> unprotected_store_; |
+ scoped_refptr<TestingPrefStore> protected_store_; |
+ scoped_refptr<ProtectedPrefStore> combined_store_; |
+ |
+ MockReadErrorDelegate::Data read_error_delegate_data_; |
+ |
+ private: |
+ void InitializationCallback() { |
+ EXPECT_FALSE(observer_.initialized); |
+ EXPECT_FALSE(initialization_callback_invoked_); |
+ initialization_callback_invoked_ = true; |
+ } |
+ |
+ scoped_ptr<MockReadErrorDelegate> read_error_delegate_; |
+}; |
+ |
+TEST_F(ProtectedPrefStoreTest, StoreValues) { |
+ ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, |
+ combined_store_->ReadPrefs()); |
+ |
+ // Properly stores new values. |
+ combined_store_->SetValue(kProtectedPref, new base::StringValue(kValue1)); |
+ combined_store_->SetValue(kUnprotectedPref, new base::StringValue(kValue2)); |
+ |
+ ASSERT_TRUE(protected_store_->GetValue(kProtectedPref, NULL)); |
+ ASSERT_FALSE(protected_store_->GetValue(kUnprotectedPref, NULL)); |
+ ASSERT_FALSE(unprotected_store_->GetValue(kProtectedPref, NULL)); |
+ ASSERT_TRUE(unprotected_store_->GetValue(kUnprotectedPref, NULL)); |
+ |
+ ASSERT_TRUE(combined_store_->GetValue(kProtectedPref, NULL)); |
+ ASSERT_TRUE(combined_store_->GetValue(kUnprotectedPref, NULL)); |
+ |
+ ASSERT_FALSE(protected_store_->committed()); |
+ ASSERT_FALSE(unprotected_store_->committed()); |
+ |
+ combined_store_->CommitPendingWrite(); |
+ |
+ ASSERT_TRUE(protected_store_->committed()); |
+ ASSERT_TRUE(unprotected_store_->committed()); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, ReadValues) { |
+ protected_store_->SetValue(kProtectedPref, new base::StringValue(kValue1)); |
+ unprotected_store_->SetValue(kUnprotectedPref, |
+ new base::StringValue(kValue2)); |
+ |
+ // Works properly with values that are already there. |
+ ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, |
+ combined_store_->ReadPrefs()); |
+ ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, |
+ combined_store_->GetReadError()); |
+ |
+ ASSERT_TRUE(protected_store_->GetValue(kProtectedPref, NULL)); |
+ ASSERT_FALSE(protected_store_->GetValue(kUnprotectedPref, NULL)); |
+ ASSERT_FALSE(unprotected_store_->GetValue(kProtectedPref, NULL)); |
+ ASSERT_TRUE(unprotected_store_->GetValue(kUnprotectedPref, NULL)); |
+ |
+ ASSERT_TRUE(combined_store_->GetValue(kProtectedPref, NULL)); |
+ ASSERT_TRUE(combined_store_->GetValue(kUnprotectedPref, NULL)); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, PreviouslyProtected) { |
+ protected_store_->SetValue(kUnprotectedPref, new base::StringValue(kValue1)); |
+ combined_store_->ReadPrefs(); |
+ // It will read from the protected store. |
+ ASSERT_TRUE(combined_store_->GetValue(kUnprotectedPref, NULL)); |
+ ASSERT_TRUE(protected_store_->GetValue(kUnprotectedPref, NULL)); |
+ ASSERT_FALSE(unprotected_store_->GetValue(kUnprotectedPref, NULL)); |
+ |
+ // But when we update the value... |
+ combined_store_->SetValue(kUnprotectedPref, new base::StringValue(kValue2)); |
+ // ...it will be migrated. |
+ ASSERT_TRUE(combined_store_->GetValue(kUnprotectedPref, NULL)); |
+ ASSERT_FALSE(protected_store_->GetValue(kUnprotectedPref, NULL)); |
+ ASSERT_TRUE(unprotected_store_->GetValue(kUnprotectedPref, NULL)); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, Observer) { |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, |
+ combined_store_->ReadPrefs()); |
+ EXPECT_TRUE(initialization_callback_invoked_); |
+ EXPECT_TRUE(observer_.initialized); |
+ EXPECT_TRUE(observer_.initialization_success); |
+ EXPECT_TRUE(observer_.changed_keys.empty()); |
+ combined_store_->SetValue(kProtectedPref, new base::StringValue(kValue1)); |
+ EXPECT_THAT(observer_.changed_keys, testing::ElementsAre(kProtectedPref)); |
+ observer_.changed_keys.clear(); |
+ combined_store_->SetValue(kUnprotectedPref, new base::StringValue(kValue2)); |
+ EXPECT_THAT(observer_.changed_keys, testing::ElementsAre(kUnprotectedPref)); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, ProtectedPrefReadError) { |
+ protected_store_->set_read_error( |
+ PersistentPrefStore::PREF_READ_ERROR_NO_FILE); |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE, |
+ combined_store_->ReadPrefs()); |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE, |
+ combined_store_->GetReadError()); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, UnprotectedPrefReadError) { |
+ unprotected_store_->set_read_error( |
+ PersistentPrefStore::PREF_READ_ERROR_NO_FILE); |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE, |
+ combined_store_->ReadPrefs()); |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE, |
+ combined_store_->GetReadError()); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, BothPrefReadError) { |
+ unprotected_store_->set_read_error( |
+ PersistentPrefStore::PREF_READ_ERROR_NO_FILE); |
+ protected_store_->set_read_error( |
+ PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED); |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE, |
+ combined_store_->ReadPrefs()); |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE, |
+ combined_store_->GetReadError()); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, BothPrefReadErrorAsync) { |
+ unprotected_store_->set_read_error( |
+ PersistentPrefStore::PREF_READ_ERROR_NO_FILE); |
+ protected_store_->set_read_error( |
+ PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED); |
+ |
+ protected_store_->SetBlockAsyncRead(true); |
+ |
+ EXPECT_FALSE(read_error_delegate_data_.invoked); |
+ |
+ combined_store_->ReadPrefsAsync(GetReadErrorDelegate().release()); |
+ |
+ EXPECT_FALSE(read_error_delegate_data_.invoked); |
+ |
+ protected_store_->SetBlockAsyncRead(false); |
+ |
+ EXPECT_TRUE(read_error_delegate_data_.invoked); |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE, |
+ combined_store_->GetReadError()); |
+ EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NO_FILE, |
+ combined_store_->GetReadError()); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, IsInitializationComplete) { |
+ EXPECT_FALSE(combined_store_->IsInitializationComplete()); |
+ combined_store_->ReadPrefs(); |
+ EXPECT_TRUE(combined_store_->IsInitializationComplete()); |
+} |
+ |
+TEST_F(ProtectedPrefStoreTest, IsInitializationCompleteAsync) { |
+ protected_store_->SetBlockAsyncRead(true); |
+ unprotected_store_->SetBlockAsyncRead(true); |
+ EXPECT_FALSE(combined_store_->IsInitializationComplete()); |
+ combined_store_->ReadPrefsAsync(NULL); |
+ EXPECT_FALSE(combined_store_->IsInitializationComplete()); |
+ protected_store_->SetBlockAsyncRead(false); |
+ EXPECT_FALSE(combined_store_->IsInitializationComplete()); |
+ unprotected_store_->SetBlockAsyncRead(false); |
+ EXPECT_TRUE(combined_store_->IsInitializationComplete()); |
+} |