1 // Copyright 2013 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 <stddef.h>
6
7 #include <memory>
8
9 #include "base/run_loop.h"
10 #include "base/stl_util.h"
11 #include "chrome/browser/extensions/extension_prefs_unittest.h"
12 #include "chrome/browser/extensions/extension_service.h"
13 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
14 #include "chrome/browser/media_galleries/media_galleries_test_util.h"
15 #include "chrome/test/base/testing_profile.h"
16 #include "components/storage_monitor/test_storage_monitor.h"
17 #include "extensions/browser/extension_prefs.h"
18 #include "extensions/browser/extension_system.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace {
22
AddGalleryPermission(MediaGalleryPrefId gallery,bool has_access,std::vector<MediaGalleryPermission> * vector)23 void AddGalleryPermission(MediaGalleryPrefId gallery,
24 bool has_access,
25 std::vector<MediaGalleryPermission>* vector) {
26 MediaGalleryPermission permission;
27 permission.pref_id = gallery;
28 permission.has_permission = has_access;
29 vector->push_back(permission);
30 }
31
32 } // namespace
33
34 // Test the MediaGalleries permissions functions.
35 class MediaGalleriesPermissionsTest : public extensions::ExtensionPrefsTest {
36 protected:
MediaGalleriesPermissionsTest()37 MediaGalleriesPermissionsTest() {}
~MediaGalleriesPermissionsTest()38 ~MediaGalleriesPermissionsTest() override {}
39
40 // This is the same implementation as ExtensionPrefsTest::TearDown(), except
41 // for also resetting the ExtensionPrefs used by |gallery_prefs_| after
42 // TestExtensionPrefs reconstructs them.
TearDown()43 void TearDown() override {
44 Verify();
45
46 // Reset ExtensionPrefs, and re-verify.
47 prefs_.ResetPrefRegistry();
48 RegisterPreferences(prefs_.pref_registry().get());
49 prefs_.RecreateExtensionPrefs();
50 gallery_prefs_->SetExtensionPrefsForTesting(prefs());
51 Verify();
52 prefs_.pref_service()->CommitPendingWrite();
53 base::RunLoop().RunUntilIdle();
54
55 storage_monitor::TestStorageMonitor::Destroy();
56
57 testing::Test::TearDown();
58 }
59
Initialize()60 void Initialize() override {
61 ASSERT_TRUE(storage_monitor::TestStorageMonitor::CreateAndInstall());
62 profile_.reset(new TestingProfile);
63 gallery_prefs_.reset(new MediaGalleriesPreferences(profile_.get()));
64 base::RunLoop loop;
65 gallery_prefs_->EnsureInitialized(loop.QuitClosure());
66 loop.Run();
67
68 gallery_prefs_->SetExtensionPrefsForTesting(prefs());
69
70 extension1_id_ = prefs_.AddExtensionAndReturnId("test1");
71 extension2_id_ = prefs_.AddExtensionAndReturnId("test2");
72 extension3_id_ = prefs_.AddExtensionAndReturnId("test3");
73 // Id4 isn't used to ensure that an empty permission list is ok.
74 extension4_id_ = prefs_.AddExtensionAndReturnId("test4");
75 Verify();
76
77 gallery_prefs_->SetGalleryPermissionInPrefs(extension1_id_, 1, false);
78 AddGalleryPermission(1, false, &extension1_expectation_);
79 Verify();
80
81 gallery_prefs_->SetGalleryPermissionInPrefs(extension1_id_, 2, true);
82 AddGalleryPermission(2, true, &extension1_expectation_);
83 Verify();
84
85 gallery_prefs_->SetGalleryPermissionInPrefs(extension1_id_, 2, false);
86 extension1_expectation_[1].has_permission = false;
87 Verify();
88
89 gallery_prefs_->SetGalleryPermissionInPrefs(extension2_id_, 1, true);
90 gallery_prefs_->SetGalleryPermissionInPrefs(extension2_id_, 3, true);
91 gallery_prefs_->SetGalleryPermissionInPrefs(extension2_id_, 4, true);
92 AddGalleryPermission(1, true, &extension2_expectation_);
93 AddGalleryPermission(3, true, &extension2_expectation_);
94 AddGalleryPermission(4, true, &extension2_expectation_);
95 Verify();
96
97 gallery_prefs_->SetGalleryPermissionInPrefs(extension3_id_, 3, true);
98 AddGalleryPermission(3, true, &extension3_expectation_);
99 Verify();
100
101 gallery_prefs_->RemoveGalleryPermissionsFromPrefs(3);
102 extension2_expectation_.erase(extension2_expectation_.begin() + 1);
103 extension3_expectation_.erase(extension3_expectation_.begin());
104 Verify();
105
106 gallery_prefs_->UnsetGalleryPermissionInPrefs(extension1_id_, 1);
107 extension1_expectation_.erase(extension1_expectation_.begin());
108 Verify();
109 }
110
Verify()111 void Verify() override {
112 struct TestData {
113 std::string* id;
114 std::vector<MediaGalleryPermission>* expectation;
115 };
116
117 const TestData test_data[] = {{&extension1_id_, &extension1_expectation_},
118 {&extension2_id_, &extension2_expectation_},
119 {&extension3_id_, &extension3_expectation_},
120 {&extension4_id_, &extension4_expectation_}};
121 for (size_t i = 0; i < base::size(test_data); i++) {
122 std::vector<MediaGalleryPermission> actual =
123 gallery_prefs_->GetGalleryPermissionsFromPrefs(*test_data[i].id);
124 EXPECT_EQ(test_data[i].expectation->size(), actual.size());
125 for (size_t permission_entry = 0;
126 permission_entry < test_data[i].expectation->size() &&
127 permission_entry < actual.size();
128 permission_entry++) {
129 EXPECT_EQ(test_data[i].expectation->at(permission_entry).pref_id,
130 actual[permission_entry].pref_id);
131 EXPECT_EQ(test_data[i].expectation->at(permission_entry).has_permission,
132 actual[permission_entry].has_permission);
133 }
134 }
135 }
136
137 std::string extension1_id_;
138 std::string extension2_id_;
139 std::string extension3_id_;
140 std::string extension4_id_;
141
142 std::vector<MediaGalleryPermission> extension1_expectation_;
143 std::vector<MediaGalleryPermission> extension2_expectation_;
144 std::vector<MediaGalleryPermission> extension3_expectation_;
145 std::vector<MediaGalleryPermission> extension4_expectation_;
146
147 // Needed for |gallery_prefs_| to initialize correctly.
148 EnsureMediaDirectoriesExists ensure_media_directories_exists_;
149
150 std::unique_ptr<TestingProfile> profile_;
151 std::unique_ptr<MediaGalleriesPreferences> gallery_prefs_;
152 };
153
TEST_F(MediaGalleriesPermissionsTest,MediaGalleries)154 TEST_F(MediaGalleriesPermissionsTest, MediaGalleries) {}
155