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