15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/mock_configuration_policy_provider.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/policy_map.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "policy/policy_constants.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::AnyNumber; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMainSettingsPage[] = "chrome://settings-frame"; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCrosSettingsPrefix[] = "cros."; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contains the details of a single test case verifying that the controlled 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// setting indicators for a pref affected by a policy work correctly. This is 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// part of the data loaded from chrome/test/data/policy/policy_test_cases.json. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IndicatorTestCase { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IndicatorTestCase(const base::DictionaryValue& policy, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool readonly) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : policy_(policy.DeepCopy()), value_(value), readonly_(readonly) {} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~IndicatorTestCase() {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& policy() const { return *policy_; } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value() const { return value_; } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool readonly() const { return readonly_; } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::DictionaryValue> policy_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool readonly_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IndicatorTestCase); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contains the testing details for a single pref affected by a policy. This is 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// part of the data loaded from chrome/test/data/policy/policy_test_cases.json. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefMapping { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefMapping(const std::string& pref, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_local_state, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& indicator_test_setup_js, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& indicator_selector) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : pref_(pref), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_local_state_(is_local_state), 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) indicator_test_setup_js_(indicator_test_setup_js), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator_selector_(indicator_selector) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PrefMapping() {} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref() const { return pref_; } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_local_state() const { return is_local_state_; } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& indicator_test_setup_js() const { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return indicator_test_setup_js_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& indicator_selector() const { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return indicator_selector_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopedVector<IndicatorTestCase>& indicator_test_cases() const { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return indicator_test_cases_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddIndicatorTestCase(IndicatorTestCase* test_case) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator_test_cases_.push_back(test_case); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string pref_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_local_state_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string indicator_test_setup_js_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indicator_selector_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<IndicatorTestCase> indicator_test_cases_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrefMapping); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contains the testing details for a single policy. This is part of the data 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loaded from chrome/test/data/policy/policy_test_cases.json. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyTestCase { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestCase(const std::string& name, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_official_only, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_be_recommended) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : name_(name), 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_official_only_(is_official_only), 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) can_be_recommended_(can_be_recommended) {} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PolicyTestCase() {} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name() const { return name_; } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_official_only() const { return is_official_only_; } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_be_recommended() const { return can_be_recommended_; } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsOsSupported() const { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string os("win"); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string os("mac"); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string os("chromeos"); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string os("linux"); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error "Unknown platform" 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::find(supported_os_.begin(), supported_os_.end(), os) != 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_os_.end(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddSupportedOs(const std::string& os) { supported_os_.push_back(os); } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsSupported() const { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OFFICIAL_BUILD) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_official_only()) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsOsSupported(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyMap& test_policy() const { return test_policy_; } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetTestPolicy(const PolicyMap& policy) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_policy_.CopyFrom(policy); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopedVector<PrefMapping>& pref_mappings() const { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pref_mappings_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPrefMapping(PrefMapping* pref_mapping) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mappings_.push_back(pref_mapping); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_official_only_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_be_recommended_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> supported_os_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyMap test_policy_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<PrefMapping> pref_mappings_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PolicyTestCase); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parses all policy test cases and makes then available in a map. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyTestCases { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, PolicyTestCase*> PolicyTestCaseMap; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef PolicyTestCaseMap::const_iterator iterator; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestCases() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_test_cases_ = new std::map<std::string, PolicyTestCase*>(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path = ui_test_utils::GetTestFilePath( 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("policy")), 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("policy_test_cases.json"))); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_util::ReadFileToString(path, &json)) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code = -1; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_string; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* dict = NULL; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json, base::JSON_PARSE_RFC, &error_code, &error_string)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.get() || !value->GetAsDictionary(&dict)) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Error parsing policy_test_cases.json: " << error_string; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyDefinitionList* list = GetChromePolicyDefinitionList(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (const PolicyDefinitionList::Entry* policy = list->begin; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy != list->end; ++policy) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestCase* policy_test_case = GetPolicyTestCase(dict, policy->name); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy_test_case) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*policy_test_cases_)[policy->name] = policy_test_case; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PolicyTestCases() { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteValues(policy_test_cases_); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete policy_test_cases_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyTestCase* Get(const std::string& name) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator it = policy_test_cases_->find(name); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it == end() ? NULL : it->second; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyTestCaseMap& map() const { return *policy_test_cases_; } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator begin() const { return policy_test_cases_->begin(); } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator end() const { return policy_test_cases_->end(); } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestCase* GetPolicyTestCase(const base::DictionaryValue* tests, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* policy_test_dict = NULL; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tests->GetDictionary(name, &policy_test_dict)) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_official_only = false; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_test_dict->GetBoolean("official_only", &is_official_only); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_be_recommended = false; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_test_dict->GetBoolean("can_be_recommended", &can_be_recommended); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestCase* policy_test_case = 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PolicyTestCase(name, is_official_only, can_be_recommended); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* os_list = NULL; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy_test_dict->GetList("os", &os_list)) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < os_list->GetSize(); ++i) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string os; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (os_list->GetString(i, &os)) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_test_case->AddSupportedOs(os); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* policy_dict = NULL; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy_test_dict->GetDictionary("test_policy", &policy_dict)) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyMap policy; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy.LoadFrom(policy_dict, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_test_case->SetTestPolicy(policy); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* pref_mappings = NULL; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy_test_dict->GetList("pref_mappings", &pref_mappings)) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < pref_mappings->GetSize(); ++i) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* pref_mapping_dict = NULL; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string pref; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pref_mappings->GetDictionary(i, &pref_mapping_dict) || 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !pref_mapping_dict->GetString("pref", &pref)) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Malformed pref_mappings entry in " 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "policy_test_cases.json."; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_local_state = false; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping_dict->GetBoolean("local_state", &is_local_state); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indicator_test_setup_js; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping_dict->GetString("indicator_test_setup_js", 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &indicator_test_setup_js); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indicator_selector; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping_dict->GetString("indicator_selector", &indicator_selector); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefMapping* pref_mapping = new PrefMapping( 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref, is_local_state, indicator_test_setup_js, indicator_selector); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* indicator_tests = NULL; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pref_mapping_dict->GetList("indicator_tests", &indicator_tests)) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < indicator_tests->GetSize(); ++i) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* indicator_test_dict = NULL; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* policy = NULL; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!indicator_tests->GetDictionary(i, &indicator_test_dict) || 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !indicator_test_dict->GetDictionary("policy", &policy)) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Malformed indicator_tests entry in " 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "policy_test_cases.json."; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator_test_dict->GetString("value", &value); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool readonly = false; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator_test_dict->GetBoolean("readonly", &readonly); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping->AddIndicatorTestCase( 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IndicatorTestCase(*policy, value, readonly)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_test_case->AddPrefMapping(pref_mapping); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return policy_test_case; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestCaseMap* policy_test_cases_; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PolicyTestCases); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VerifyControlledSettingIndicators(Browser* browser, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& selector, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& controlled_by, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool readonly) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::stringstream javascript; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) javascript << "var nodes = document.querySelectorAll(" 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " 'span.controlled-setting-indicator" 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << selector.c_str() << "');" 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "var indicators = [];" 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "for (var i = 0; i < nodes.length; i++) {" 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " var node = nodes[i];" 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " var indicator = {};" 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " indicator.value = node.value || '';" 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " indicator.controlledBy = node.controlledBy || '';" 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " indicator.readOnly = node.readOnly || false;" 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " indicator.visible =" 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " window.getComputedStyle(node).display != 'none';" 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " indicators.push(indicator)" 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "}" 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "domAutomationController.send(JSON.stringify(indicators));"; 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* contents = 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetActiveWebContents(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the state of all controlled setting indicators matching the 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |selector| as JSON. 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, javascript.str(), 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &json)); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value_ptr(base::JSONReader::Read(json)); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* indicators = NULL; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value_ptr.get()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value_ptr->GetAsList(&indicators)); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that controlled setting indicators representing |value| are visible 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and have the correct state while those not representing |value| are 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invisible. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!controlled_by.empty()) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(indicators->GetSize(), 0u) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Expected to find at least one controlled setting indicator."; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool have_visible_indicators = false; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::ListValue::const_iterator indicator = indicators->begin(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator != indicators->end(); ++indicator) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* properties = NULL; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE((*indicator)->GetAsDictionary(&properties)); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indicator_value; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indicator_controlled_by; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool indicator_readonly; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool indicator_visible; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(properties->GetString("value", &indicator_value)); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(properties->GetString("controlledBy", 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &indicator_controlled_by)); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(properties->GetBoolean("readOnly", &indicator_readonly)); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(properties->GetBoolean("visible", &indicator_visible)); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!controlled_by.empty() && (indicator_value == value)) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(controlled_by, indicator_controlled_by); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(readonly, indicator_readonly); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(indicator_visible); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) have_visible_indicators = true; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(indicator_visible); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!controlled_by.empty()) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(have_visible_indicators) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Expected to find at least one visible controlled setting " 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "indicator."; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for tests that change policy and are parameterized with a policy 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// definition. 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyPrefsTest 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public InProcessBrowserTest, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public testing::WithParamInterface<PolicyDefinitionList::Entry> { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(provider_, IsInitializationComplete(_)) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(true)); 39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(provider_, RegisterPolicyDomain(_)).Times(AnyNumber()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::WaitForTemplateURLServiceToLoad( 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(browser()->profile())); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateProviderPolicy(const PolicyMap& policy) { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) provider_.UpdateChromePolicy(policy); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RunLoop loop; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop.RunUntilIdle(); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestCases policy_test_cases_; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConfigurationPolicyProvider provider_; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PolicyPrefsTestCoverageTest, AllPoliciesHaveATestCase) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that all known policies have a test case in the JSON file. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test fails when a policy is added to 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome/app/policy/policy_templates.json but a test case is not added to 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome/test/data/policy/policy_test_cases.json. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestCases policy_test_cases; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyDefinitionList* list = GetChromePolicyDefinitionList(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (const PolicyDefinitionList::Entry* policy = list->begin; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy != list->end; ++policy) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsKey(policy_test_cases.map(), policy->name)) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Missing policy test case for: " << policy->name; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(PolicyPrefsTest, PolicyToPrefsMapping) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that policies make their corresponding preferences become managed, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and that the user can't override that setting. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyTestCase* test_case = policy_test_cases_.Get(GetParam().name); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_case) << "PolicyTestCase not found for " << GetParam().name; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopedVector<PrefMapping>& pref_mappings = test_case->pref_mappings(); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!test_case->IsSupported() || pref_mappings.empty()) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "Testing policy: " << test_case->name(); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ScopedVector<PrefMapping>::const_iterator 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping = pref_mappings.begin(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping != pref_mappings.end(); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++pref_mapping) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip Chrome OS preferences that use a different backend and cannot be 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // retrieved through the prefs mechanism. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWithASCII((*pref_mapping)->pref(), kCrosSettingsPrefix, true)) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* user_prefs = browser()->profile()->GetPrefs(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = (*pref_mapping)->is_local_state() ? 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state : user_prefs; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The preference must have been registered. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrefService::Preference* pref = 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->FindPreference((*pref_mapping)->pref().c_str()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pref); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->ClearPref((*pref_mapping)->pref().c_str()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that setting the policy overrides the pref. 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyMap kNoPolicies; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateProviderPolicy(kNoPolicies); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref->IsDefaultValue()); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref->IsUserModifiable()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pref->IsUserControlled()); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pref->IsManaged()); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateProviderPolicy(test_case->test_policy()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pref->IsDefaultValue()); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pref->IsUserModifiable()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pref->IsUserControlled()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref->IsManaged()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(PolicyPrefsTest, CheckPolicyIndicators) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that controlled setting indicators correctly show whether a pref's 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value is recommended or enforced by a corresponding policy. 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyTestCase* policy_test_case = 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_test_cases_.Get(GetParam().name); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(policy_test_case) << "PolicyTestCase not found for " 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << GetParam().name; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopedVector<PrefMapping>& pref_mappings = 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_test_case->pref_mappings(); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!policy_test_case->IsSupported() || pref_mappings.empty()) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_indicator_tests = false; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ScopedVector<PrefMapping>::const_iterator 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping = pref_mappings.begin(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping != pref_mappings.end(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++pref_mapping) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(*pref_mapping)->indicator_test_cases().empty()) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_indicator_tests = true; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_indicator_tests) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "Testing policy: " << policy_test_case->name(); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ScopedVector<PrefMapping>::const_iterator 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping = pref_mappings.begin(); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_mapping != pref_mappings.end(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++pref_mapping) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopedVector<IndicatorTestCase>& 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator_test_cases = (*pref_mapping)->indicator_test_cases(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (indicator_test_cases.empty()) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL(kMainSettingsPage)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(*pref_mapping)->indicator_test_setup_js().empty()) { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScript( 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(), 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*pref_mapping)->indicator_test_setup_js())); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indicator_selector = (*pref_mapping)->indicator_selector(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (indicator_selector.empty()) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator_selector = "[pref=\"" + (*pref_mapping)->pref() + "\"]"; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ScopedVector<IndicatorTestCase>::const_iterator 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator_test_case = indicator_test_cases.begin(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator_test_case != indicator_test_cases.end(); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++indicator_test_case) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that no controlled setting indicator is visible when no value is 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // set by policy. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyMap policies; 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateProviderPolicy(policies); 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyControlledSettingIndicators( 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser(), indicator_selector, std::string(), std::string(), false); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the appropriate controlled setting indicator is shown when a 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value is enforced by policy. 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policies.LoadFrom(&(*indicator_test_case)->policy(), 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateProviderPolicy(policies); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyControlledSettingIndicators(browser(), indicator_selector, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*indicator_test_case)->value(), 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "policy", 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*indicator_test_case)->readonly()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!policy_test_case->can_be_recommended()) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* user_prefs = browser()->profile()->GetPrefs(); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = (*pref_mapping)->is_local_state() ? 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state : user_prefs; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The preference must have been registered. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrefService::Preference* pref = 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->FindPreference((*pref_mapping)->pref().c_str()); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pref); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the appropriate controlled setting indicator is shown when a 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value is recommended by policy and the user has not overridden the 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recommendation. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policies.LoadFrom(&(*indicator_test_case)->policy(), 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateProviderPolicy(policies); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyControlledSettingIndicators(browser(), indicator_selector, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*indicator_test_case)->value(), 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "recommended", 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*indicator_test_case)->readonly()); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the appropriate controlled setting indicator is shown when a 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value is recommended by policy and the user has overriddent the 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recommendation. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->Set((*pref_mapping)->pref().c_str(), *pref->GetValue()); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyControlledSettingIndicators(browser(), indicator_selector, 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*indicator_test_case)->value(), 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hasRecommendation", 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*indicator_test_case)->readonly()); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->ClearPref((*pref_mapping)->pref().c_str()); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P( 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyPrefsTestInstance, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyPrefsTest, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::ValuesIn(GetChromePolicyDefinitionList()->begin, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetChromePolicyDefinitionList()->end)); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace policy 576