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

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: Same patch but without stuff that is already included in 5204006 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/common/notification_details.h"
19 #include "chrome/common/notification_observer_mock.h"
20 #include "chrome/common/notification_source.h"
17 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
18 22
19 using base::Time; 23 using base::Time;
20 using base::TimeDelta; 24 using base::TimeDelta;
21 25
26 const char kPref1[] = "path1.subpath";
27 const char kPref2[] = "path2";
28 const char kPref3[] = "path3";
29 const char kPref4[] = "path4";
30
31 // Default values in case an extension pref value is not overridden.
32 const char kDefaultPref1[] = "default pref 1";
33 const char kDefaultPref2[] = "default pref 2";
34 const char kDefaultPref3[] = "default pref 3";
35 const char kDefaultPref4[] = "default pref 4";
36
22 static void AddPattern(ExtensionExtent* extent, const std::string& pattern) { 37 static void AddPattern(ExtensionExtent* extent, const std::string& pattern) {
23 int schemes = URLPattern::SCHEME_ALL; 38 int schemes = URLPattern::SCHEME_ALL;
24 extent->AddPattern(URLPattern(schemes, pattern)); 39 extent->AddPattern(URLPattern(schemes, pattern));
25 } 40 }
26 41
27 static void AssertEqualExtents(ExtensionExtent* extent1, 42 static void AssertEqualExtents(ExtensionExtent* extent1,
28 ExtensionExtent* extent2) { 43 ExtensionExtent* extent2) {
29 std::vector<URLPattern> patterns1 = extent1->patterns(); 44 std::vector<URLPattern> patterns1 = extent1->patterns();
30 std::vector<URLPattern> patterns2 = extent2->patterns(); 45 std::vector<URLPattern> patterns2 = extent2->patterns();
31 std::set<std::string> strings1; 46 std::set<std::string> strings1;
(...skipping 16 matching lines...) Expand all
48 63
49 // This function will get called once, and is the right place to do operations 64 // This function will get called once, and is the right place to do operations
50 // on ExtensionPrefs that write data. 65 // on ExtensionPrefs that write data.
51 virtual void Initialize() = 0; 66 virtual void Initialize() = 0;
52 67
53 // This function will be called twice - once while the original ExtensionPrefs 68 // This function will be called twice - once while the original ExtensionPrefs
54 // object is still alive, and once after recreation. Thus, it tests that 69 // object is still alive, and once after recreation. Thus, it tests that
55 // things don't break after any ExtensionPrefs startup work. 70 // things don't break after any ExtensionPrefs startup work.
56 virtual void Verify() = 0; 71 virtual void Verify() = 0;
57 72
73 // This function is called to Register preference default values.
74 virtual void RegisterPreferences() {}
75
58 virtual void SetUp() { 76 virtual void SetUp() {
77 RegisterPreferences();
59 Initialize(); 78 Initialize();
60 } 79 }
61 80
62 virtual void TearDown() { 81 virtual void TearDown() {
63 Verify(); 82 Verify();
64 83
65 // Reset ExtensionPrefs, and re-verify. 84 // Reset ExtensionPrefs, and re-verify.
66 prefs_.RecreateExtensionPrefs(); 85 prefs_.RecreateExtensionPrefs();
86 RegisterPreferences();
67 Verify(); 87 Verify();
68 } 88 }
69 89
70 protected: 90 protected:
71 ExtensionPrefs* prefs() { return prefs_.prefs(); } 91 ExtensionPrefs* prefs() { return prefs_.prefs(); }
72 92
73 TestExtensionPrefs prefs_; 93 TestExtensionPrefs prefs_;
74 94
75 private: 95 private:
76 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefsTest); 96 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefsTest);
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 EXPECT_EQ(launch_index + 1, new_launch_index); 538 EXPECT_EQ(launch_index + 1, new_launch_index);
519 539
520 // This extension doesn't exist, so it should return -1. 540 // This extension doesn't exist, so it should return -1.
521 EXPECT_EQ(-1, prefs()->GetAppLaunchIndex("foo")); 541 EXPECT_EQ(-1, prefs()->GetAppLaunchIndex("foo"));
522 } 542 }
523 543
524 private: 544 private:
525 scoped_refptr<Extension> extension_; 545 scoped_refptr<Extension> extension_;
526 }; 546 };
527 TEST_F(ExtensionPrefsAppLaunchIndex, ExtensionPrefsAppLaunchIndex) {} 547 TEST_F(ExtensionPrefsAppLaunchIndex, ExtensionPrefsAppLaunchIndex) {}
548
549 namespace keys = extension_manifest_keys;
550
551 class ExtensionPrefsPreferencesBase : public ExtensionPrefsTest {
552 public:
553 ExtensionPrefsPreferencesBase()
554 : ExtensionPrefsTest(),
555 ext1_(NULL),
556 ext2_(NULL),
557 ext3_(NULL),
558 installed() {
559 DictionaryValue simple_dict;
560 std::string error;
561
562 simple_dict.SetString(keys::kVersion, "1.0.0.0");
563 simple_dict.SetString(keys::kName, "unused");
564
565 ext1_scoped_ = Extension::Create(
566 prefs_.temp_dir().AppendASCII("ext1_"), Extension::INVALID,
567 simple_dict, false, &error);
568 ext2_scoped_ = Extension::Create(
569 prefs_.temp_dir().AppendASCII("ext2_"), Extension::INVALID,
570 simple_dict, false, &error);
571 ext3_scoped_ = Extension::Create(
572 prefs_.temp_dir().AppendASCII("ext3_"), Extension::INVALID,
573 simple_dict, false, &error);
574
575 ext1_ = ext1_scoped_.get();
576 ext2_ = ext2_scoped_.get();
577 ext3_ = ext3_scoped_.get();
578
579 for (size_t i = 0; i < arraysize(installed); ++i)
580 installed[i] = false;
581 }
582
583 void RegisterPreferences() {
584 prefs()->pref_service()->RegisterStringPref(kPref1, kDefaultPref1);
585 prefs()->pref_service()->RegisterStringPref(kPref2, kDefaultPref2);
586 prefs()->pref_service()->RegisterStringPref(kPref3, kDefaultPref3);
587 prefs()->pref_service()->RegisterStringPref(kPref4, kDefaultPref4);
588 }
589
590 void InstallExtControlledPref(Extension *ext,
591 const std::string& key,
592 Value* val) {
593 // Install extension the first time a preference is set for it.
594 Extension* extensions[] = {ext1_, ext2_, ext3_};
595 for (int i = 0; i < 3; ++i) {
596 if (ext == extensions[i] && !installed[i]) {
597 prefs()->OnExtensionInstalled(ext, Extension::ENABLED, true);
598 installed[i] = true;
599 break;
600 }
601 }
602
603 prefs()->SetExtensionControlledPref(ext->id(), key, val);
604 }
605
606 void UninstallExtension(const std::string& extension_id) {
607 prefs()->OnExtensionUninstalled(extension_id, Extension::INTERNAL, false);
608 }
609
610 // Weak references, for convenience.
611 Extension* ext1_;
612 Extension* ext2_;
613 Extension* ext3_;
614
615 // Flags indicating whether each of the extensions has been installed, yet.
616 bool installed[3];
617
618 private:
619 scoped_refptr<Extension> ext1_scoped_;
620 scoped_refptr<Extension> ext2_scoped_;
621 scoped_refptr<Extension> ext3_scoped_;
622 };
623
624 class ExtensionPrefsInstallOneExtension
625 : public ExtensionPrefsPreferencesBase {
626 virtual void Initialize() {
627 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
628 }
629 virtual void Verify() {
630 std::string actual = prefs()->pref_service()->GetString(kPref1);
631 EXPECT_EQ("val1", actual);
632 }
633 };
634 TEST_F(ExtensionPrefsInstallOneExtension, ExtensionPrefsInstallOneExtension) {}
635
636 // Make sure the last-installed extension wins for each preference.
637 class ExtensionPrefsInstallOverwrittenExtensions
638 : public ExtensionPrefsPreferencesBase {
639 virtual void Initialize() {
640 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
641 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2"));
642 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3"));
643
644 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4"));
645 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val5"));
646
647 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val6"));
648 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val7"));
649 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val8"));
650 }
651 virtual void Verify() {
652 std::string actual;
653 actual = prefs()->pref_service()->GetString(kPref1);
654 EXPECT_EQ("val3", actual);
655 actual = prefs()->pref_service()->GetString(kPref2);
656 EXPECT_EQ("val5", actual);
657 actual = prefs()->pref_service()->GetString(kPref3);
658 EXPECT_EQ("val8", actual);
659 }
660 };
661 TEST_F(ExtensionPrefsInstallOverwrittenExtensions,
662 ExtensionPrefsInstallOverwrittenExtensions) {}
663
664 // Make sure the last-installed extension wins even if other extensions set
665 // the same or different preferences later.
666 class ExtensionPrefsInstallInterleavedExtensions
667 : public ExtensionPrefsPreferencesBase {
668 virtual void Initialize() {
669 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
670 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val2"));
671 InstallExtControlledPref(ext3_, kPref3, Value::CreateStringValue("val3"));
672
673 InstallExtControlledPref(ext3_, kPref3, Value::CreateStringValue("val4"));
674 InstallExtControlledPref(ext2_, kPref3, Value::CreateStringValue("val5"));
675 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val6"));
676
677 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val7"));
678 }
679 virtual void Verify() {
680 std::string actual;
681 actual = prefs()->pref_service()->GetString(kPref1);
682 EXPECT_EQ("val7", actual);
683 actual = prefs()->pref_service()->GetString(kPref2);
684 EXPECT_EQ("val2", actual);
685 actual = prefs()->pref_service()->GetString(kPref3);
686 EXPECT_EQ("val4", actual);
687 }
688 };
689 TEST_F(ExtensionPrefsInstallInterleavedExtensions,
690 ExtensionPrefsInstallInterleavedExtensions) {}
691
692 class ExtensionPrefsUninstallOnlyExtension
693 : public ExtensionPrefsPreferencesBase {
694 virtual void Initialize() {
695 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
696 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val2"));
697
698 UninstallExtension(ext1_->id());
699 }
700 virtual void Verify() {
701 std::string actual;
702 actual = prefs()->pref_service()->GetString(kPref1);
703 EXPECT_EQ(kDefaultPref1, actual);
704 actual = prefs()->pref_service()->GetString(kPref2);
705 EXPECT_EQ(kDefaultPref2, actual);
706 }
707 };
708 TEST_F(ExtensionPrefsUninstallOnlyExtension,
709 ExtensionPrefsUninstallOnlyExtension) {}
710
711 // Tests uninstalling an extension that wasn't winning for any preferences.
712 class ExtensionPrefsUninstallIrrelevantExtension
713 : public ExtensionPrefsPreferencesBase {
714 virtual void Initialize() {
715 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
716 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2"));
717
718 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val3"));
719 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val4"));
720
721 UninstallExtension(ext1_->id());
722 }
723 virtual void Verify() {
724 std::string actual;
725 actual = prefs()->pref_service()->GetString(kPref1);
726 EXPECT_EQ("val2", actual);
727 actual = prefs()->pref_service()->GetString(kPref2);
728 EXPECT_EQ("val4", actual);
729 }
730 };
731 TEST_F(ExtensionPrefsUninstallIrrelevantExtension,
732 ExtensionPrefsUninstallIrrelevantExtension) {}
733
734 // Tests uninstalling an extension that was winning for all preferences.
735 class ExtensionPrefsUninstallExtensionFromTop
736 : public ExtensionPrefsPreferencesBase {
737 virtual void Initialize() {
738 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
739 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2"));
740 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3"));
741
742 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4"));
743 InstallExtControlledPref(ext3_, kPref2, Value::CreateStringValue("val5"));
744
745 UninstallExtension(ext3_->id());
746 }
747 virtual void Verify() {
748 std::string actual;
749 actual = prefs()->pref_service()->GetString(kPref1);
750 EXPECT_EQ("val2", actual);
751 actual = prefs()->pref_service()->GetString(kPref2);
752 EXPECT_EQ("val4", actual);
753 }
754 };
755 TEST_F(ExtensionPrefsUninstallExtensionFromTop,
756 ExtensionPrefsUninstallExtensionFromTop) {}
757
758 // Tests uninstalling an extension that was winning for only some preferences.
759 class ExtensionPrefsUninstallExtensionFromMiddle
760 : public ExtensionPrefsPreferencesBase {
761 virtual void Initialize() {
762 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
763 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2"));
764 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3"));
765
766 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4"));
767 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val5"));
768
769 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val6"));
770
771 InstallExtControlledPref(ext2_, kPref4, Value::CreateStringValue("val7"));
772
773 UninstallExtension(ext2_->id());
774 }
775 virtual void Verify() {
776 std::string actual;
777 actual = prefs()->pref_service()->GetString(kPref1);
778 EXPECT_EQ("val3", actual);
779 actual = prefs()->pref_service()->GetString(kPref2);
780 EXPECT_EQ("val4", actual);
781 actual = prefs()->pref_service()->GetString(kPref3);
782 EXPECT_EQ("val6", actual);
783 actual = prefs()->pref_service()->GetString(kPref4);
784 EXPECT_EQ(kDefaultPref4, actual);
785 }
786 };
787 TEST_F(ExtensionPrefsUninstallExtensionFromMiddle,
788 ExtensionPrefsUninstallExtensionFromMiddle) {}
789
790 // Tests triggering of notifications to registered observers
791 class ExtensionPrefsNotifyWhenNeeded
792 : public ExtensionPrefsPreferencesBase {
793 virtual void Initialize() {
794 using testing::_;
795 using testing::Mock;
796 using testing::StrEq;
797
798 scoped_ptr<NotificationObserverMock> observer(
799 new NotificationObserverMock());
800 PrefChangeRegistrar registrar;
801 registrar.Init(prefs()->pref_service());
802 registrar.Add(kPref1, observer.get());
803
804 EXPECT_CALL(*observer, Observe(_, _, _));
805 InstallExtControlledPref(ext1_, kPref1,
806 Value::CreateStringValue("https://www.chromium.org"));
807 Mock::VerifyAndClearExpectations(observer.get());
808
809 EXPECT_CALL(*observer, Observe(_, _, _)).Times(0);
810 InstallExtControlledPref(ext1_, kPref1,
811 Value::CreateStringValue("https://www.chromium.org"));
812 Mock::VerifyAndClearExpectations(observer.get());
813
814 EXPECT_CALL(*observer, Observe(_, _, _)).Times(2);
815 InstallExtControlledPref(ext1_, kPref1,
816 Value::CreateStringValue("chrome://newtab"));
817
818 UninstallExtension(ext1_->id());
819 registrar.Remove(kPref1, observer.get());
820 }
821 virtual void Verify() {
822 std::string actual = prefs()->pref_service()->GetString(kPref1);
823 EXPECT_EQ(kDefaultPref1, actual);
824 }
825 };
826 TEST_F(ExtensionPrefsNotifyWhenNeeded,
827 ExtensionPrefsNotifyWhenNeeded) {}
828
829 // Tests disabling an extension
830 class ExtensionPrefsDisableExt
831 : public ExtensionPrefsPreferencesBase {
832 virtual void Initialize() {
833 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
834 std::string actual = prefs()->pref_service()->GetString(kPref1);
835 EXPECT_EQ("val1", actual);
836 prefs()->SetExtensionState(ext1_, Extension::DISABLED);
837 }
838 virtual void Verify() {
839 std::string actual = prefs()->pref_service()->GetString(kPref1);
840 EXPECT_EQ(kDefaultPref1, actual);
841 }
842 };
843 TEST_F(ExtensionPrefsDisableExt, ExtensionPrefsDisableExt) {}
844
845 // Tests disabling and reenabling an extension
846 class ExtensionPrefsReenableExt
847 : public ExtensionPrefsPreferencesBase {
848 virtual void Initialize() {
849 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1"));
850 prefs()->SetExtensionState(ext1_, Extension::DISABLED);
851 prefs()->SetExtensionState(ext1_, Extension::ENABLED);
852 }
853 virtual void Verify() {
854 std::string actual = prefs()->pref_service()->GetString(kPref1);
855 EXPECT_EQ("val1", actual);
856 }
857 };
858 TEST_F(ExtensionPrefsDisableExt, ExtensionPrefsReenableExt) {}
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_prefs.cc ('k') | chrome/browser/extensions/extension_proxy_api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698