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