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

Side by Side Diff: chrome/browser/extensions/extension_prefs_unittest.cc

Issue 5213002: Fix for Bug 50726 "Save extension list and "winning" prefs from extensions" (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Addressed comments, moved ExtensionPrefStore reference to Profile Created 10 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/message_loop.h" 5 #include "base/message_loop.h"
6 #include "base/path_service.h" 6 #include "base/path_service.h"
7 #include "base/scoped_temp_dir.h" 7 #include "base/scoped_temp_dir.h"
8 #include "base/stl_util-inl.h" 8 #include "base/stl_util-inl.h"
9 #include "base/string_number_conversions.h" 9 #include "base/string_number_conversions.h"
10 #include "base/stringprintf.h" 10 #include "base/stringprintf.h"
11 #include "chrome/browser/browser_thread.h" 11 #include "chrome/browser/browser_thread.h"
12 #include "chrome/browser/extensions/extension_prefs.h" 12 #include "chrome/browser/extensions/extension_prefs.h"
13 #include "chrome/browser/extensions/test_extension_prefs.h" 13 #include "chrome/browser/extensions/test_extension_prefs.h"
14 #include "chrome/browser/prefs/pref_change_registrar.h"
14 #include "chrome/browser/prefs/pref_service.h" 15 #include "chrome/browser/prefs/pref_service.h"
15 #include "chrome/common/chrome_paths.h" 16 #include "chrome/common/chrome_paths.h"
16 #include "chrome/common/extensions/extension_constants.h" 17 #include "chrome/common/extensions/extension_constants.h"
18 #include "chrome/test/mock_notification_observer.h"
17 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
18 20
19 using base::Time; 21 using base::Time;
20 using base::TimeDelta; 22 using base::TimeDelta;
21 23
24 const char kPref1[] = "path1.subpath";
25 const char kPref2[] = "path2";
26 const char kPref3[] = "path3";
27 const char kPref4[] = "path4";
28
29 // Default values in case an extension pref value is not overridden.
30 const char kDefaultPref1[] = "default pref 1";
31 const char kDefaultPref2[] = "default pref 2";
32 const char kDefaultPref3[] = "default pref 3";
33 const char kDefaultPref4[] = "default pref 4";
34
22 static void AddPattern(ExtensionExtent* extent, const std::string& pattern) { 35 static void AddPattern(ExtensionExtent* extent, const std::string& pattern) {
23 int schemes = URLPattern::SCHEME_ALL; 36 int schemes = URLPattern::SCHEME_ALL;
24 extent->AddPattern(URLPattern(schemes, pattern)); 37 extent->AddPattern(URLPattern(schemes, pattern));
25 } 38 }
26 39
27 static void AssertEqualExtents(ExtensionExtent* extent1, 40 static void AssertEqualExtents(ExtensionExtent* extent1,
28 ExtensionExtent* extent2) { 41 ExtensionExtent* extent2) {
29 std::vector<URLPattern> patterns1 = extent1->patterns(); 42 std::vector<URLPattern> patterns1 = extent1->patterns();
30 std::vector<URLPattern> patterns2 = extent2->patterns(); 43 std::vector<URLPattern> patterns2 = extent2->patterns();
31 std::set<std::string> strings1; 44 std::set<std::string> strings1;
(...skipping 16 matching lines...) Expand all
48 61
49 // This function will get called once, and is the right place to do operations 62 // This function will get called once, and is the right place to do operations
50 // on ExtensionPrefs that write data. 63 // on ExtensionPrefs that write data.
51 virtual void Initialize() = 0; 64 virtual void Initialize() = 0;
52 65
53 // This function will be called twice - once while the original ExtensionPrefs 66 // This function will be called twice - once while the original ExtensionPrefs
54 // object is still alive, and once after recreation. Thus, it tests that 67 // object is still alive, and once after recreation. Thus, it tests that
55 // things don't break after any ExtensionPrefs startup work. 68 // things don't break after any ExtensionPrefs startup work.
56 virtual void Verify() = 0; 69 virtual void Verify() = 0;
57 70
71 // This function is called to Register preference default values.
72 virtual void RegisterPreferences() {}
73
58 virtual void SetUp() { 74 virtual void SetUp() {
75 RegisterPreferences();
59 Initialize(); 76 Initialize();
60 } 77 }
61 78
62 virtual void TearDown() { 79 virtual void TearDown() {
63 Verify(); 80 Verify();
64 81
65 // Reset ExtensionPrefs, and re-verify. 82 // Reset ExtensionPrefs, and re-verify.
66 prefs_.RecreateExtensionPrefs(); 83 prefs_.RecreateExtensionPrefs();
84 RegisterPreferences();
67 Verify(); 85 Verify();
68 } 86 }
69 87
70 protected: 88 protected:
71 ExtensionPrefs* prefs() { return prefs_.prefs(); } 89 ExtensionPrefs* prefs() { return prefs_.prefs(); }
72 90
73 TestExtensionPrefs prefs_; 91 TestExtensionPrefs prefs_;
74 92
75 private: 93 private:
76 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefsTest); 94 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefsTest);
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 EXPECT_EQ(NULL, prefs()->GetInstalledExtensionInfo(not_installed_id_)); 319 EXPECT_EQ(NULL, prefs()->GetInstalledExtensionInfo(not_installed_id_));
302 320
303 ExtensionList::const_iterator iter; 321 ExtensionList::const_iterator iter;
304 for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) { 322 for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) {
305 EXPECT_FALSE(prefs()->IsExtensionBlacklisted((*iter)->id())); 323 EXPECT_FALSE(prefs()->IsExtensionBlacklisted((*iter)->id()));
306 } 324 }
307 // Blacklist one installed and one not-installed extension id. 325 // Blacklist one installed and one not-installed extension id.
308 std::set<std::string> blacklisted_ids; 326 std::set<std::string> blacklisted_ids;
309 blacklisted_ids.insert(extensions_[0]->id()); 327 blacklisted_ids.insert(extensions_[0]->id());
310 blacklisted_ids.insert(not_installed_id_); 328 blacklisted_ids.insert(not_installed_id_);
329
Mattias Nissler (ping if slow) 2010/12/01 10:36:36 any reason for the added newline?
battre (please use the other) 2010/12/01 17:44:38 Done.
311 prefs()->UpdateBlacklist(blacklisted_ids); 330 prefs()->UpdateBlacklist(blacklisted_ids);
312 } 331 }
313 332
314 virtual void Verify() { 333 virtual void Verify() {
315 // Make sure the two id's we expect to be blacklisted are. 334 // Make sure the two id's we expect to be blacklisted are.
316 EXPECT_TRUE(prefs()->IsExtensionBlacklisted(extensions_[0]->id())); 335 EXPECT_TRUE(prefs()->IsExtensionBlacklisted(extensions_[0]->id()));
317 EXPECT_TRUE(prefs()->IsExtensionBlacklisted(not_installed_id_)); 336 EXPECT_TRUE(prefs()->IsExtensionBlacklisted(not_installed_id_));
318 337
319 // Make sure the other id's are not blacklisted. 338 // Make sure the other id's are not blacklisted.
320 ExtensionList::const_iterator iter; 339 ExtensionList::const_iterator iter;
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 EXPECT_EQ(launch_index + 1, new_launch_index); 537 EXPECT_EQ(launch_index + 1, new_launch_index);
519 538
520 // This extension doesn't exist, so it should return -1. 539 // This extension doesn't exist, so it should return -1.
521 EXPECT_EQ(-1, prefs()->GetAppLaunchIndex("foo")); 540 EXPECT_EQ(-1, prefs()->GetAppLaunchIndex("foo"));
522 } 541 }
523 542
524 private: 543 private:
525 scoped_refptr<Extension> extension_; 544 scoped_refptr<Extension> extension_;
526 }; 545 };
527 TEST_F(ExtensionPrefsAppLaunchIndex, ExtensionPrefsAppLaunchIndex) {} 546 TEST_F(ExtensionPrefsAppLaunchIndex, ExtensionPrefsAppLaunchIndex) {}
547
548 namespace keys = extension_manifest_keys;
549
550 class ExtensionPrefsPreferencesBase : public ExtensionPrefsTest {
551 public:
552 ExtensionPrefsPreferencesBase()
553 : ExtensionPrefsTest(),
554 ext1_(NULL),
555 ext2_(NULL),
556 ext3_(NULL),
557 installed() {
558 DictionaryValue simple_dict;
559 std::string error;
560
561 simple_dict.SetString(keys::kVersion, "1.0.0.0");
562 simple_dict.SetString(keys::kName, "unused");
563
564 ext1_scoped_ = Extension::Create(
565 prefs_.temp_dir().AppendASCII("ext1_"), Extension::INVALID,
566 simple_dict, false, &error);
567 ext2_scoped_ = Extension::Create(
568 prefs_.temp_dir().AppendASCII("ext2_"), Extension::INVALID,
569 simple_dict, false, &error);
570 ext3_scoped_ = Extension::Create(
571 prefs_.temp_dir().AppendASCII("ext3_"), Extension::INVALID,
572 simple_dict, false, &error);
573
574 ext1_ = ext1_scoped_.get();
575 ext2_ = ext2_scoped_.get();
576 ext3_ = ext3_scoped_.get();
577
578 for (size_t i = 0; i < arraysize(installed); ++i)
579 installed[i] = false;
580 }
581
582 void RegisterPreferences() {
583 prefs()->pref_service()->RegisterStringPref(kPref1, kDefaultPref1);
584 prefs()->pref_service()->RegisterStringPref(kPref2, kDefaultPref2);
585 prefs()->pref_service()->RegisterStringPref(kPref3, kDefaultPref3);
586 prefs()->pref_service()->RegisterStringPref(kPref4, kDefaultPref4);
587 }
588
589 void InstallExtControlledPref(Extension *ext,
590 const std::string& key,
591 Value* val) {
592 // Install extension the first time a preference is set for it.
593 Extension* extensions[] = {ext1_, ext2_, ext3_};
594 for (int i = 0; i < 3; ++i) {
595 if (ext == extensions[i] && !installed[i]) {
596 prefs()->OnExtensionInstalled(ext, Extension::ENABLED, true);
597 installed[i] = true;
598 break;
599 }
600 }
601
602 prefs()->SetExtensionControlledPref(ext->id(), key, val);
603 }
604
605 void UninstallExtension(const std::string& extension_id) {
606 prefs()->OnExtensionUninstalled(extension_id, Extension::INTERNAL, false);
607 }
608
609 // Weak references, for convenience.
610 Extension* ext1_;
611 Extension* ext2_;
612 Extension* ext3_;
613
614 // Flags indicating whether each of the extensions has been installed, yet.
615 bool installed[3];
616
617 private:
618 scoped_refptr<Extension> ext1_scoped_;
619 scoped_refptr<Extension> ext2_scoped_;
620 scoped_refptr<Extension> ext3_scoped_;
621 };
622
623 class ExtensionPrefsInstallOneExtension
624 : public ExtensionPrefsPreferencesBase {
625 virtual void Initialize() {
626 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
627 }
628 virtual void Verify() {
629 std::string actual = prefs()->pref_service()->GetString(kPref1);
630 EXPECT_EQ("val1", actual);
631 }
632 };
633 TEST_F(ExtensionPrefsInstallOneExtension, ExtensionPrefsInstallOneExtension) {}
634
635 // Make sure the last-installed extension wins for each preference.
636 class ExtensionPrefsInstallOverwrittenExtensions
637 : public ExtensionPrefsPreferencesBase {
638 virtual void Initialize() {
639 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
640 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2"));
641 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3"));
642
643 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4"));
644 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val5"));
645
646 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val6"));
647 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val7"));
648 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val8"));
649 }
650 virtual void Verify() {
651 std::string actual;
652 actual = prefs()->pref_service()->GetString(kPref1);
653 EXPECT_EQ("val3", actual);
654 actual = prefs()->pref_service()->GetString(kPref2);
655 EXPECT_EQ("val5", actual);
656 actual = prefs()->pref_service()->GetString(kPref3);
657 EXPECT_EQ("val8", actual);
658 }
659 };
660 TEST_F(ExtensionPrefsInstallOverwrittenExtensions,
661 ExtensionPrefsInstallOverwrittenExtensions) {}
662
663 // Make sure the last-installed extension wins even if other extensions set
664 // the same or different preferences later.
665 class ExtensionPrefsInstallInterleavedExtensions
666 : public ExtensionPrefsPreferencesBase {
667 virtual void Initialize() {
668 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
669 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val2"));
670 InstallExtControlledPref(ext3_, kPref3, Value::CreateStringValue("val3"));
671
672 InstallExtControlledPref(ext3_, kPref3, Value::CreateStringValue("val4"));
673 InstallExtControlledPref(ext2_, kPref3, Value::CreateStringValue("val5"));
674 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val6"));
675
676 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val7"));
677 }
678 virtual void Verify() {
679 std::string actual;
680 actual = prefs()->pref_service()->GetString(kPref1);
681 EXPECT_EQ("val7", actual);
682 actual = prefs()->pref_service()->GetString(kPref2);
683 EXPECT_EQ("val2", actual);
684 actual = prefs()->pref_service()->GetString(kPref3);
685 EXPECT_EQ("val4", actual);
686 }
687 };
688 TEST_F(ExtensionPrefsInstallInterleavedExtensions,
689 ExtensionPrefsInstallInterleavedExtensions) {}
690
691 class ExtensionPrefsUninstallOnlyExtension
692 : public ExtensionPrefsPreferencesBase {
693 virtual void Initialize() {
694 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
695 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val2"));
696
697 UninstallExtension(ext1_->id());
698 }
699 virtual void Verify() {
700 std::string actual;
701 actual = prefs()->pref_service()->GetString(kPref1);
702 EXPECT_EQ(kDefaultPref1, actual);
703 actual = prefs()->pref_service()->GetString(kPref2);
704 EXPECT_EQ(kDefaultPref2, actual);
705 }
706 };
707 TEST_F(ExtensionPrefsUninstallOnlyExtension,
708 ExtensionPrefsUninstallOnlyExtension) {}
709
710 // Tests uninstalling an extension that wasn't winning for any preferences.
711 class ExtensionPrefsUninstallIrrelevantExtension
712 : public ExtensionPrefsPreferencesBase {
713 virtual void Initialize() {
714 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
715 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2"));
716
717 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val3"));
718 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val4"));
719
720 UninstallExtension(ext1_->id());
721 }
722 virtual void Verify() {
723 std::string actual;
724 actual = prefs()->pref_service()->GetString(kPref1);
725 EXPECT_EQ("val2", actual);
726 actual = prefs()->pref_service()->GetString(kPref2);
727 EXPECT_EQ("val4", actual);
728 }
729 };
730 TEST_F(ExtensionPrefsUninstallIrrelevantExtension,
731 ExtensionPrefsUninstallIrrelevantExtension) {}
732
733 // Tests uninstalling an extension that was winning for all preferences.
734 class ExtensionPrefsUninstallExtensionFromTop
735 : public ExtensionPrefsPreferencesBase {
736 virtual void Initialize() {
737 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
738 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2"));
739 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3"));
740
741 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4"));
742 InstallExtControlledPref(ext3_, kPref2, Value::CreateStringValue("val5"));
743
744 UninstallExtension(ext3_->id());
745 }
746 virtual void Verify() {
747 std::string actual;
748 actual = prefs()->pref_service()->GetString(kPref1);
749 EXPECT_EQ("val2", actual);
750 actual = prefs()->pref_service()->GetString(kPref2);
751 EXPECT_EQ("val4", actual);
752 }
753 };
754 TEST_F(ExtensionPrefsUninstallExtensionFromTop,
755 ExtensionPrefsUninstallExtensionFromTop) {}
756
757 // Tests uninstalling an extension that was winning for only some preferences.
758 class ExtensionPrefsUninstallExtensionFromMiddle
759 : public ExtensionPrefsPreferencesBase {
760 virtual void Initialize() {
761 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
762 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2"));
763 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3"));
764
765 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4"));
766 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val5"));
767
768 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val6"));
769
770 InstallExtControlledPref(ext2_, kPref4, Value::CreateStringValue("val7"));
771
772 UninstallExtension(ext2_->id());
773 }
774 virtual void Verify() {
775 std::string actual;
776 actual = prefs()->pref_service()->GetString(kPref1);
777 EXPECT_EQ("val3", actual);
778 actual = prefs()->pref_service()->GetString(kPref2);
779 EXPECT_EQ("val4", actual);
780 actual = prefs()->pref_service()->GetString(kPref3);
781 EXPECT_EQ("val6", actual);
782 actual = prefs()->pref_service()->GetString(kPref4);
783 EXPECT_EQ(kDefaultPref4, actual);
784 }
785 };
786 TEST_F(ExtensionPrefsUninstallExtensionFromMiddle,
787 ExtensionPrefsUninstallExtensionFromMiddle) {}
788
789 // Tests triggering of notifications to registered observers
790 class ExtensionPrefsNotifyWhenNeeded
791 : public ExtensionPrefsPreferencesBase {
792 virtual void Initialize() {
793 using testing::_;
794 using testing::Mock;
795 using testing::StrEq;
796
797 scoped_ptr<MockNotificationObserver> observer(
798 new MockNotificationObserver());
799 PrefChangeRegistrar registrar;
800 registrar.Init(prefs()->pref_service());
801 registrar.Add(kPref1, observer.get());
802
803 EXPECT_CALL(*observer, Observe(_, _, _));
804 InstallExtControlledPref(ext1_, kPref1,
805 Value::CreateStringValue("https://www.chromium.org"));
806 Mock::VerifyAndClearExpectations(observer.get());
807
808 EXPECT_CALL(*observer, Observe(_, _, _)).Times(0);
809 InstallExtControlledPref(ext1_, kPref1,
810 Value::CreateStringValue("https://www.chromium.org"));
811 Mock::VerifyAndClearExpectations(observer.get());
812
813 EXPECT_CALL(*observer, Observe(_, _, _)).Times(2);
814 InstallExtControlledPref(ext1_, kPref1,
815 Value::CreateStringValue("chrome://newtab"));
816
817 UninstallExtension(ext1_->id());
818 registrar.Remove(kPref1, observer.get());
819 }
820 virtual void Verify() {
821 std::string actual = prefs()->pref_service()->GetString(kPref1);
822 EXPECT_EQ(kDefaultPref1, actual);
823 }
824 };
825 TEST_F(ExtensionPrefsNotifyWhenNeeded,
826 ExtensionPrefsNotifyWhenNeeded) {}
827
828 // Tests disabling an extension
829 class ExtensionPrefsDisableExt
830 : public ExtensionPrefsPreferencesBase {
831 virtual void Initialize() {
832 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
833 std::string actual = prefs()->pref_service()->GetString(kPref1);
834 EXPECT_EQ("val1", actual);
835 prefs()->SetExtensionState(ext1_, Extension::DISABLED);
836 }
837 virtual void Verify() {
838 std::string actual = prefs()->pref_service()->GetString(kPref1);
839 EXPECT_EQ(kDefaultPref1, actual);
840 }
841 };
842 TEST_F(ExtensionPrefsDisableExt, ExtensionPrefsDisableExt) {}
843
844 // Tests disabling and reenabling an extension
845 class ExtensionPrefsReenableExt
846 : public ExtensionPrefsPreferencesBase {
847 virtual void Initialize() {
848 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
849 prefs()->SetExtensionState(ext1_, Extension::DISABLED);
850 prefs()->SetExtensionState(ext1_, Extension::ENABLED);
851 }
852 virtual void Verify() {
853 std::string actual = prefs()->pref_service()->GetString(kPref1);
854 EXPECT_EQ("val1", actual);
855 }
856 };
857 TEST_F(ExtensionPrefsDisableExt, ExtensionPrefsReenableExt) {}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698