| 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 "chrome/browser/prefs/pref_member.h" |  | 
|    6  |  | 
|    7 #include "base/bind.h" |  | 
|    8 #include "base/message_loop.h" |  | 
|    9 #include "chrome/browser/prefs/pref_value_store.h" |  | 
|   10 #include "chrome/common/chrome_notification_types.h" |  | 
|   11 #include "chrome/test/base/testing_pref_service.h" |  | 
|   12 #include "content/public/browser/notification_details.h" |  | 
|   13 #include "content/public/browser/notification_source.h" |  | 
|   14 #include "content/public/test/test_browser_thread.h" |  | 
|   15 #include "testing/gtest/include/gtest/gtest.h" |  | 
|   16  |  | 
|   17 using content::BrowserThread; |  | 
|   18  |  | 
|   19 namespace { |  | 
|   20  |  | 
|   21 const char kBoolPref[] = "bool"; |  | 
|   22 const char kIntPref[] = "int"; |  | 
|   23 const char kDoublePref[] = "double"; |  | 
|   24 const char kStringPref[] = "string"; |  | 
|   25  |  | 
|   26 void RegisterTestPrefs(PrefService* prefs) { |  | 
|   27   prefs->RegisterBooleanPref(kBoolPref, false, PrefService::UNSYNCABLE_PREF); |  | 
|   28   prefs->RegisterIntegerPref(kIntPref, 0, PrefService::UNSYNCABLE_PREF); |  | 
|   29   prefs->RegisterDoublePref(kDoublePref, 0.0, PrefService::UNSYNCABLE_PREF); |  | 
|   30   prefs->RegisterStringPref(kStringPref, |  | 
|   31                             "default", |  | 
|   32                             PrefService::UNSYNCABLE_PREF); |  | 
|   33 } |  | 
|   34  |  | 
|   35 class GetPrefValueCallback |  | 
|   36     : public base::RefCountedThreadSafe<GetPrefValueCallback> { |  | 
|   37  public: |  | 
|   38   GetPrefValueCallback() : value_(false) {} |  | 
|   39  |  | 
|   40   void Init(const char* pref_name, PrefService* prefs) { |  | 
|   41     pref_.Init(pref_name, prefs, NULL); |  | 
|   42     pref_.MoveToThread(BrowserThread::IO); |  | 
|   43   } |  | 
|   44  |  | 
|   45   bool FetchValue() { |  | 
|   46     if (!BrowserThread::PostTask( |  | 
|   47         BrowserThread::IO, FROM_HERE, |  | 
|   48         base::Bind(&GetPrefValueCallback::GetPrefValueOnIOThread, this))) { |  | 
|   49       return false; |  | 
|   50     } |  | 
|   51     MessageLoop::current()->Run(); |  | 
|   52     return true; |  | 
|   53   } |  | 
|   54  |  | 
|   55   bool value() { return value_; } |  | 
|   56  |  | 
|   57  private: |  | 
|   58   friend class base::RefCountedThreadSafe<GetPrefValueCallback>; |  | 
|   59   ~GetPrefValueCallback() {} |  | 
|   60  |  | 
|   61   void GetPrefValueOnIOThread() { |  | 
|   62     value_ = pref_.GetValue(); |  | 
|   63     BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |  | 
|   64                             MessageLoop::QuitClosure()); |  | 
|   65   } |  | 
|   66  |  | 
|   67   BooleanPrefMember pref_; |  | 
|   68   bool value_; |  | 
|   69 }; |  | 
|   70  |  | 
|   71 class PrefMemberTestClass : public content::NotificationObserver { |  | 
|   72  public: |  | 
|   73   explicit PrefMemberTestClass(PrefService* prefs) |  | 
|   74       : observe_cnt_(0), prefs_(prefs) { |  | 
|   75     str_.Init(kStringPref, prefs, this); |  | 
|   76   } |  | 
|   77  |  | 
|   78   virtual void Observe(int type, |  | 
|   79                        const content::NotificationSource& source, |  | 
|   80                        const content::NotificationDetails& details) { |  | 
|   81     DCHECK(chrome::NOTIFICATION_PREF_CHANGED == type); |  | 
|   82     PrefService* prefs_in = content::Source<PrefService>(source).ptr(); |  | 
|   83     EXPECT_EQ(prefs_in, prefs_); |  | 
|   84     std::string* pref_name_in = content::Details<std::string>(details).ptr(); |  | 
|   85     EXPECT_EQ(*pref_name_in, kStringPref); |  | 
|   86     EXPECT_EQ(str_.GetValue(), prefs_->GetString(kStringPref)); |  | 
|   87     ++observe_cnt_; |  | 
|   88   } |  | 
|   89  |  | 
|   90   StringPrefMember str_; |  | 
|   91   int observe_cnt_; |  | 
|   92  |  | 
|   93  private: |  | 
|   94   PrefService* prefs_; |  | 
|   95 }; |  | 
|   96  |  | 
|   97 }  // anonymous namespace |  | 
|   98  |  | 
|   99 TEST(PrefMemberTest, BasicGetAndSet) { |  | 
|  100   TestingPrefService prefs; |  | 
|  101   RegisterTestPrefs(&prefs); |  | 
|  102  |  | 
|  103   // Test bool |  | 
|  104   BooleanPrefMember boolean; |  | 
|  105   boolean.Init(kBoolPref, &prefs, NULL); |  | 
|  106  |  | 
|  107   // Check the defaults |  | 
|  108   EXPECT_FALSE(prefs.GetBoolean(kBoolPref)); |  | 
|  109   EXPECT_FALSE(boolean.GetValue()); |  | 
|  110   EXPECT_FALSE(*boolean); |  | 
|  111  |  | 
|  112   // Try changing through the member variable. |  | 
|  113   boolean.SetValue(true); |  | 
|  114   EXPECT_TRUE(boolean.GetValue()); |  | 
|  115   EXPECT_TRUE(prefs.GetBoolean(kBoolPref)); |  | 
|  116   EXPECT_TRUE(*boolean); |  | 
|  117  |  | 
|  118   // Try changing back through the pref. |  | 
|  119   prefs.SetBoolean(kBoolPref, false); |  | 
|  120   EXPECT_FALSE(prefs.GetBoolean(kBoolPref)); |  | 
|  121   EXPECT_FALSE(boolean.GetValue()); |  | 
|  122   EXPECT_FALSE(*boolean); |  | 
|  123  |  | 
|  124   // Test int |  | 
|  125   IntegerPrefMember integer; |  | 
|  126   integer.Init(kIntPref, &prefs, NULL); |  | 
|  127  |  | 
|  128   // Check the defaults |  | 
|  129   EXPECT_EQ(0, prefs.GetInteger(kIntPref)); |  | 
|  130   EXPECT_EQ(0, integer.GetValue()); |  | 
|  131   EXPECT_EQ(0, *integer); |  | 
|  132  |  | 
|  133   // Try changing through the member variable. |  | 
|  134   integer.SetValue(5); |  | 
|  135   EXPECT_EQ(5, integer.GetValue()); |  | 
|  136   EXPECT_EQ(5, prefs.GetInteger(kIntPref)); |  | 
|  137   EXPECT_EQ(5, *integer); |  | 
|  138  |  | 
|  139   // Try changing back through the pref. |  | 
|  140   prefs.SetInteger(kIntPref, 2); |  | 
|  141   EXPECT_EQ(2, prefs.GetInteger(kIntPref)); |  | 
|  142   EXPECT_EQ(2, integer.GetValue()); |  | 
|  143   EXPECT_EQ(2, *integer); |  | 
|  144  |  | 
|  145   // Test double |  | 
|  146   DoublePrefMember double_member; |  | 
|  147   double_member.Init(kDoublePref, &prefs, NULL); |  | 
|  148  |  | 
|  149   // Check the defaults |  | 
|  150   EXPECT_EQ(0.0, prefs.GetDouble(kDoublePref)); |  | 
|  151   EXPECT_EQ(0.0, double_member.GetValue()); |  | 
|  152   EXPECT_EQ(0.0, *double_member); |  | 
|  153  |  | 
|  154   // Try changing through the member variable. |  | 
|  155   double_member.SetValue(1.0); |  | 
|  156   EXPECT_EQ(1.0, double_member.GetValue()); |  | 
|  157   EXPECT_EQ(1.0, prefs.GetDouble(kDoublePref)); |  | 
|  158   EXPECT_EQ(1.0, *double_member); |  | 
|  159  |  | 
|  160   // Try changing back through the pref. |  | 
|  161   prefs.SetDouble(kDoublePref, 3.0); |  | 
|  162   EXPECT_EQ(3.0, prefs.GetDouble(kDoublePref)); |  | 
|  163   EXPECT_EQ(3.0, double_member.GetValue()); |  | 
|  164   EXPECT_EQ(3.0, *double_member); |  | 
|  165  |  | 
|  166   // Test string |  | 
|  167   StringPrefMember string; |  | 
|  168   string.Init(kStringPref, &prefs, NULL); |  | 
|  169  |  | 
|  170   // Check the defaults |  | 
|  171   EXPECT_EQ("default", prefs.GetString(kStringPref)); |  | 
|  172   EXPECT_EQ("default", string.GetValue()); |  | 
|  173   EXPECT_EQ("default", *string); |  | 
|  174  |  | 
|  175   // Try changing through the member variable. |  | 
|  176   string.SetValue("foo"); |  | 
|  177   EXPECT_EQ("foo", string.GetValue()); |  | 
|  178   EXPECT_EQ("foo", prefs.GetString(kStringPref)); |  | 
|  179   EXPECT_EQ("foo", *string); |  | 
|  180  |  | 
|  181   // Try changing back through the pref. |  | 
|  182   prefs.SetString(kStringPref, "bar"); |  | 
|  183   EXPECT_EQ("bar", prefs.GetString(kStringPref)); |  | 
|  184   EXPECT_EQ("bar", string.GetValue()); |  | 
|  185   EXPECT_EQ("bar", *string); |  | 
|  186 } |  | 
|  187  |  | 
|  188 TEST(PrefMemberTest, TwoPrefs) { |  | 
|  189   // Make sure two DoublePrefMembers stay in sync. |  | 
|  190   TestingPrefService prefs; |  | 
|  191   RegisterTestPrefs(&prefs); |  | 
|  192  |  | 
|  193   DoublePrefMember pref1; |  | 
|  194   pref1.Init(kDoublePref, &prefs, NULL); |  | 
|  195   DoublePrefMember pref2; |  | 
|  196   pref2.Init(kDoublePref, &prefs, NULL); |  | 
|  197  |  | 
|  198   pref1.SetValue(2.3); |  | 
|  199   EXPECT_EQ(2.3, *pref2); |  | 
|  200  |  | 
|  201   pref2.SetValue(3.5); |  | 
|  202   EXPECT_EQ(3.5, *pref1); |  | 
|  203  |  | 
|  204   prefs.SetDouble(kDoublePref, 4.2); |  | 
|  205   EXPECT_EQ(4.2, *pref1); |  | 
|  206   EXPECT_EQ(4.2, *pref2); |  | 
|  207 } |  | 
|  208  |  | 
|  209 TEST(PrefMemberTest, Observer) { |  | 
|  210   TestingPrefService prefs; |  | 
|  211   RegisterTestPrefs(&prefs); |  | 
|  212  |  | 
|  213   PrefMemberTestClass test_obj(&prefs); |  | 
|  214   EXPECT_EQ("default", *test_obj.str_); |  | 
|  215  |  | 
|  216   // Calling SetValue should not fire the observer. |  | 
|  217   test_obj.str_.SetValue("hello"); |  | 
|  218   EXPECT_EQ(0, test_obj.observe_cnt_); |  | 
|  219   EXPECT_EQ("hello", prefs.GetString(kStringPref)); |  | 
|  220  |  | 
|  221   // Changing the pref does fire the observer. |  | 
|  222   prefs.SetString(kStringPref, "world"); |  | 
|  223   EXPECT_EQ(1, test_obj.observe_cnt_); |  | 
|  224   EXPECT_EQ("world", *(test_obj.str_)); |  | 
|  225  |  | 
|  226   // Not changing the value should not fire the observer. |  | 
|  227   prefs.SetString(kStringPref, "world"); |  | 
|  228   EXPECT_EQ(1, test_obj.observe_cnt_); |  | 
|  229   EXPECT_EQ("world", *(test_obj.str_)); |  | 
|  230  |  | 
|  231   prefs.SetString(kStringPref, "hello"); |  | 
|  232   EXPECT_EQ(2, test_obj.observe_cnt_); |  | 
|  233   EXPECT_EQ("hello", prefs.GetString(kStringPref)); |  | 
|  234 } |  | 
|  235  |  | 
|  236 TEST(PrefMemberTest, NoInit) { |  | 
|  237   // Make sure not calling Init on a PrefMember doesn't cause problems. |  | 
|  238   IntegerPrefMember pref; |  | 
|  239 } |  | 
|  240  |  | 
|  241 TEST(PrefMemberTest, MoveToThread) { |  | 
|  242   TestingPrefService prefs; |  | 
|  243   scoped_refptr<GetPrefValueCallback> callback = |  | 
|  244       make_scoped_refptr(new GetPrefValueCallback()); |  | 
|  245   MessageLoop message_loop; |  | 
|  246   content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); |  | 
|  247   content::TestBrowserThread io_thread(BrowserThread::IO); |  | 
|  248   ASSERT_TRUE(io_thread.Start()); |  | 
|  249   RegisterTestPrefs(&prefs); |  | 
|  250   callback->Init(kBoolPref, &prefs); |  | 
|  251  |  | 
|  252   ASSERT_TRUE(callback->FetchValue()); |  | 
|  253   EXPECT_FALSE(callback->value()); |  | 
|  254  |  | 
|  255   prefs.SetBoolean(kBoolPref, true); |  | 
|  256  |  | 
|  257   ASSERT_TRUE(callback->FetchValue()); |  | 
|  258   EXPECT_TRUE(callback->value()); |  | 
|  259 } |  | 
| OLD | NEW |