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