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

Unified Diff: chrome/browser/policy/policy_prefs_browsertest.cc

Issue 10916244: Convert the last policy.PolicyTest pyauto test to a browser_test. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 3 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/policy/policy_prefs_browsertest.cc
diff --git a/chrome/browser/policy/policy_prefs_browsertest.cc b/chrome/browser/policy/policy_prefs_browsertest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e27fe3c87fb52c84095c4f6e3a93fc752cfea9c2
--- /dev/null
+++ b/chrome/browser/policy/policy_prefs_browsertest.cc
@@ -0,0 +1,268 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <algorithm>
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/file_path.h"
+#include "base/file_util.h"
+#include "base/json/json_reader.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/stl_util.h"
+#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/policy/browser_policy_connector.h"
+#include "chrome/browser/policy/mock_configuration_policy_provider.h"
+#include "chrome/browser/policy/policy_map.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "googleurl/src/gurl.h"
+#include "policy/policy_constants.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if defined(OS_MACOSX)
+#include "base/base_paths.h"
+#include "base/mac/foundation_util.h"
+#include "base/path_service.h"
+#include "chrome/common/chrome_constants.h"
+#endif
+
+using testing::Return;
+
+namespace policy {
+
+namespace {
+
+// Contains the testing details for a single policy, loaded from
+// chrome/test/data/policy/policy_test_cases.json.
+class PolicyTestCase {
+ public:
+ explicit PolicyTestCase(const std::string& name)
+ : name_(name),
+ is_local_state_(false),
+ official_only_(false) {}
+ ~PolicyTestCase() {}
+
+ const std::string& name() const { return name_; }
+
+ void set_pref(const std::string& pref) { pref_ = pref; }
+ const std::string& pref() const { return pref_; }
+ const char* pref_name() const { return pref_.c_str(); }
+
+ const PolicyMap& test_policy() const { return test_policy_; }
+ void set_test_policy(const PolicyMap& policy) {
+ test_policy_.CopyFrom(policy);
+ }
+
+ const std::vector<GURL>& settings_pages() const { return settings_pages_; }
+ void add_settings_page(const GURL& url) { settings_pages_.push_back(url); }
jam 2012/09/11 23:18:41 nit: AddSettingsPage, unix_hacker style is only fo
Joao da Silva 2012/09/12 12:13:57 Done.
+
+ bool is_os_supported() const {
jam 2012/09/11 23:18:41 ditto, IsOSSupported
Joao da Silva 2012/09/12 12:13:57 Done.
+#if defined(OS_WIN)
+ const std::string os("win");
+#elif defined(OS_MACOSX)
+ const std::string os("mac");
+#elif defined(OS_CHROMEOS)
+ const std::string os("chromeos");
+#elif defined(OS_LINUX)
+ const std::string os("linux");
+#else
+#error "Unknown platform"
+#endif
+ return std::find(supported_os_.begin(), supported_os_.end(), os) !=
+ supported_os_.end();
+ }
+
+ void add_supported_os(const std::string& os) { supported_os_.push_back(os); }
jam 2012/09/11 23:18:41 AddSupportedOS
Joao da Silva 2012/09/12 12:13:57 Done.
+
+ bool is_local_state() const { return is_local_state_; }
+ void set_local_state(bool flag) { is_local_state_ = flag; }
+
+ bool is_official_only() const { return official_only_; }
+ void set_official_only(bool flag) { official_only_ = flag; }
+
+ bool is_supported() const {
jam 2012/09/11 23:18:41 IsSupported
Joao da Silva 2012/09/12 12:13:57 Done.
+#if !defined(OFFICIAL_BUILD)
+ if (is_official_only())
+ return false;
+#endif
+ return is_os_supported();
+ }
+
+ private:
+ std::string name_;
+ std::string pref_;
+ PolicyMap test_policy_;
+ std::vector<GURL> settings_pages_;
+ std::vector<std::string> supported_os_;
+ bool is_local_state_;
+ bool official_only_;
+
+ DISALLOW_COPY_AND_ASSIGN(PolicyTestCase);
+};
+
+} // namespace
+
+class PolicyPrefsTest : public InProcessBrowserTest {
+ protected:
+ PolicyPrefsTest() {}
+ virtual ~PolicyPrefsTest() {}
+
+ // Loads policy_test_cases.json and builds a map of test cases.
+ static void SetUpTestCase() {
+#if defined(OS_MACOSX)
+ // Ugly hack to work around http://crbug.com/63183, since this uses the
+ // PathService from GetTestFilePath() above before BrowserTestBase() and
+ // InProcessBrowserTest() are invoked. Those ctors include similar hacks.
+ base::mac::SetOverrideAmIBundled(true);
+ FilePath chrome_path;
+ CHECK(PathService::Get(base::FILE_EXE, &chrome_path));
+ FilePath fixed_chrome_path =
+ chrome_path.DirName().Append(chrome::kBrowserProcessExecutablePath);
+ CHECK(PathService::Override(base::FILE_EXE, fixed_chrome_path));
Joao da Silva 2012/09/11 22:17:39 I'd like to avoid this hack if you have a better i
jam 2012/09/11 23:18:41 I don't know enough about this area, I would check
+#endif
+
+ FilePath path = ui_test_utils::GetTestFilePath(
+ FilePath(FILE_PATH_LITERAL("policy")),
+ FilePath(FILE_PATH_LITERAL("policy_test_cases.json")));
+ std::string json;
+ ASSERT_TRUE(file_util::ReadFileToString(path, &json));
+ int error_code = -1;
+ std::string error_string;
+ scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
+ json, base::JSON_ALLOW_TRAILING_COMMAS, &error_code, &error_string));
+ ASSERT_TRUE(value.get())
+ << "Error parsing policy_test_cases.json: " << error_string;
+ base::DictionaryValue* dict = NULL;
+ ASSERT_TRUE(value->GetAsDictionary(&dict));
+ policy_test_cases_ = new std::map<std::string, PolicyTestCase*>();
+ const PolicyDefinitionList* list = GetChromePolicyDefinitionList();
+ for (const PolicyDefinitionList::Entry* policy = list->begin;
+ policy != list->end; ++policy) {
+ PolicyTestCase* test_case = GetTestCase(dict, policy->name);
+ if (test_case)
+ (*policy_test_cases_)[policy->name] = test_case;
+ }
+
+#if defined(OS_MACOSX)
+ // Restore |chrome_path| so that the fix in InProcessBrowserTest() works.
jam 2012/09/11 23:18:41 you mean SetUpTestCase?
Joao da Silva 2012/09/12 12:13:57 InProcessBrowserTest() has code similar to the fix
+ CHECK(PathService::Override(base::FILE_EXE, chrome_path));
+#endif
+ }
+
+ static void TearDownTestCase() {
+ STLDeleteValues(policy_test_cases_);
+ delete policy_test_cases_;
+ }
+
+ static PolicyTestCase* GetTestCase(const base::DictionaryValue* tests,
+ const std::string& name) {
+ const base::DictionaryValue* dict = NULL;
+ if (!tests->GetDictionary(name, &dict))
+ return NULL;
+ PolicyTestCase* test_case = new PolicyTestCase(name);
+ std::string pref;
+ if (dict->GetString("pref", &pref))
+ test_case->set_pref(pref);
+ const base::DictionaryValue* policy_dict = NULL;
+ if (dict->GetDictionary("test_policy", &policy_dict)) {
+ PolicyMap policies;
+ policies.LoadFrom(policy_dict, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER);
+ test_case->set_test_policy(policies);
+ }
+ const base::ListValue* settings_pages = NULL;
+ if (dict->GetList("settings_pages", &settings_pages)) {
+ for (size_t i = 0; i < settings_pages->GetSize(); ++i) {
+ std::string page;
+ if (settings_pages->GetString(i, &page))
+ test_case->add_settings_page(GURL(page));
+ }
+ }
+ const base::ListValue* supported_os = NULL;
+ if (dict->GetList("os", &supported_os)) {
+ for (size_t i = 0; i < supported_os->GetSize(); ++i) {
+ std::string os;
+ if (supported_os->GetString(i, &os))
+ test_case->add_supported_os(os);
+ }
+ }
+ bool flag = false;
+ if (dict->GetBoolean("local_state", &flag))
+ test_case->set_local_state(flag);
+ if (dict->GetBoolean("official_only", &flag))
+ test_case->set_official_only(flag);
+ return test_case;
+ }
+
+ virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
+ EXPECT_CALL(provider_, IsInitializationComplete())
+ .WillRepeatedly(Return(true));
+ BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
+ }
+
+ static std::map<std::string, PolicyTestCase*>* policy_test_cases_;
+ MockConfigurationPolicyProvider provider_;
+};
+
+std::map<std::string, PolicyTestCase*>* PolicyPrefsTest::policy_test_cases_ = 0;
+
+IN_PROC_BROWSER_TEST_F(PolicyPrefsTest, AllPoliciesHaveATestCase) {
+ // Verifies that all known policies have a test case in the JSON file.
+ // This test fails when a policy is added to
+ // chrome/app/policy/policy_templates.json but a test case is not added to
+ // chrome/test/data/policy/policy_test_cases.json.
+ const PolicyDefinitionList* list = GetChromePolicyDefinitionList();
+ for (const PolicyDefinitionList::Entry* policy = list->begin;
+ policy != list->end; ++policy) {
+ EXPECT_TRUE(ContainsKey(*policy_test_cases_, policy->name))
+ << "Missing policy test case for: " << policy->name;
+ }
+}
+
+IN_PROC_BROWSER_TEST_F(PolicyPrefsTest, PolicyToPrefsMapping) {
+ // Verifies that policies make their corresponding preferences become managed,
+ // and that the user can't override that setting.
+ const PolicyMap kNoPolicies;
+ PrefService* profile_prefs = browser()->profile()->GetPrefs();
+ PrefService* local_state = g_browser_process->local_state();
+ std::map<std::string, PolicyTestCase*>::iterator it;
+ for (it = policy_test_cases_->begin();
+ it != policy_test_cases_->end(); ++it) {
+ PolicyTestCase* test_case = it->second;
+ if (!test_case->is_supported() || test_case->pref().empty())
+ continue;
+ LOG(INFO) << "Testing policy: " << test_case->name();
+ // Clear policies.
+ provider_.UpdateChromePolicy(kNoPolicies);
+
+ PrefService* prefs =
+ test_case->is_local_state() ? local_state : profile_prefs;
+ // The preference must have been registered.
+ const PrefService::Preference* pref =
+ prefs->FindPreference(test_case->pref_name());
+ ASSERT_TRUE(pref);
+ prefs->ClearPref(test_case->pref_name());
+
+ // Verify that setting the policy overrides the pref.
+ EXPECT_TRUE(pref->IsDefaultValue());
+ EXPECT_TRUE(pref->IsUserModifiable());
+ EXPECT_FALSE(pref->IsUserControlled());
+ EXPECT_FALSE(pref->IsManaged());
+
+ provider_.UpdateChromePolicy(test_case->test_policy());
+ EXPECT_FALSE(pref->IsDefaultValue());
+ EXPECT_FALSE(pref->IsUserModifiable());
+ EXPECT_FALSE(pref->IsUserControlled());
+ EXPECT_TRUE(pref->IsManaged());
+ }
+}
+
+} // namespace policy
« no previous file with comments | « no previous file | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698