| Index: chrome/browser/policy/policy_prefs_browsertest.cc
 | 
| diff --git a/chrome/browser/policy/policy_prefs_browsertest.cc b/chrome/browser/policy/policy_prefs_browsertest.cc
 | 
| index 1dd1dd06dfa6f3bda42a22748132ac6b7a3b3ba9..65dfcf1e44c22e47c3a2e3c994322d0d87eb4634 100644
 | 
| --- a/chrome/browser/policy/policy_prefs_browsertest.cc
 | 
| +++ b/chrome/browser/policy/policy_prefs_browsertest.cc
 | 
| @@ -3,6 +3,7 @@
 | 
|  // found in the LICENSE file.
 | 
|  
 | 
|  #include <algorithm>
 | 
| +#include <iterator>
 | 
|  #include <map>
 | 
|  #include <sstream>
 | 
|  #include <string>
 | 
| @@ -12,6 +13,7 @@
 | 
|  #include "base/file_util.h"
 | 
|  #include "base/files/file_path.h"
 | 
|  #include "base/json/json_reader.h"
 | 
| +#include "base/logging.h"
 | 
|  #include "base/memory/scoped_ptr.h"
 | 
|  #include "base/memory/scoped_vector.h"
 | 
|  #include "base/prefs/pref_service.h"
 | 
| @@ -30,6 +32,7 @@
 | 
|  #include "chrome/browser/ui/tabs/tab_strip_model.h"
 | 
|  #include "chrome/test/base/in_process_browser_test.h"
 | 
|  #include "chrome/test/base/ui_test_utils.h"
 | 
| +#include "components/policy/core/common/schema.h"
 | 
|  #include "content/public/browser/web_contents.h"
 | 
|  #include "content/public/test/browser_test_utils.h"
 | 
|  #include "policy/policy_constants.h"
 | 
| @@ -209,12 +212,16 @@ class PolicyTestCases {
 | 
|        ADD_FAILURE() << "Error parsing policy_test_cases.json: " << error_string;
 | 
|        return;
 | 
|      }
 | 
| -    const PolicyDefinitionList* list = GetChromePolicyDefinitionList();
 | 
| -    for (const PolicyDefinitionList::Entry* policy = list->begin;
 | 
| -         policy != list->end; ++policy) {
 | 
| -      PolicyTestCase* policy_test_case = GetPolicyTestCase(dict, policy->name);
 | 
| +    Schema chrome_schema = Schema::Wrap(GetChromeSchemaData());
 | 
| +    if (!chrome_schema.valid()) {
 | 
| +      ADD_FAILURE();
 | 
| +      return;
 | 
| +    }
 | 
| +    for (Schema::Iterator it = chrome_schema.GetPropertiesIterator();
 | 
| +         !it.IsAtEnd(); it.Advance()) {
 | 
| +      PolicyTestCase* policy_test_case = GetPolicyTestCase(dict, it.key());
 | 
|        if (policy_test_case)
 | 
| -        (*policy_test_cases_)[policy->name] = policy_test_case;
 | 
| +        (*policy_test_cases_)[it.key()] = policy_test_case;
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -379,11 +386,90 @@ void VerifyControlledSettingIndicators(Browser* browser,
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
| +// A forward iterator that iterates over the Chrome policy names, using the
 | 
| +// Chrome schema data.
 | 
| +class TestCaseIterator
 | 
| +    : public std::iterator<std::forward_iterator_tag, const char*> {
 | 
| + public:
 | 
| +  static TestCaseIterator GetBegin() {
 | 
| +    Schema chrome_schema = Schema::Wrap(GetChromeSchemaData());
 | 
| +    CHECK(chrome_schema.valid());
 | 
| +    return TestCaseIterator(chrome_schema.GetPropertiesIterator());
 | 
| +  }
 | 
| +
 | 
| +  static TestCaseIterator GetEnd() {
 | 
| +    return TestCaseIterator();
 | 
| +  }
 | 
| +
 | 
| +  TestCaseIterator() {}
 | 
| +
 | 
| +  explicit TestCaseIterator(const Schema::Iterator& it)
 | 
| +      : it_(it.IsAtEnd() ? NULL : new Schema::Iterator(it)) {}
 | 
| +
 | 
| +  TestCaseIterator(const TestCaseIterator& other)
 | 
| +      : it_(other.it_ ? new Schema::Iterator(*other.it_) : NULL) {}
 | 
| +
 | 
| +  ~TestCaseIterator() {}
 | 
| +
 | 
| +  TestCaseIterator& operator=(const TestCaseIterator& other) {
 | 
| +    it_.reset(other.it_ ? new Schema::Iterator(*other.it_) : NULL);
 | 
| +    return *this;
 | 
| +  }
 | 
| +
 | 
| +  bool Equals(const TestCaseIterator& other) const {
 | 
| +    // Assume that both iterators are working with the same Schema; therefore
 | 
| +    // the key()s returned are the same.
 | 
| +    if (!it_ || !other.it_)
 | 
| +      return !it_ && !other.it_;
 | 
| +    return it_->key() == other.it_->key();
 | 
| +  }
 | 
| +
 | 
| +  bool operator==(const TestCaseIterator& other) const {
 | 
| +    return Equals(other);
 | 
| +  }
 | 
| +
 | 
| +  bool operator !=(const TestCaseIterator& other) const {
 | 
| +    return !Equals(other);
 | 
| +  }
 | 
| +
 | 
| +  const char* operator*() const {
 | 
| +    if (!it_) {
 | 
| +      NOTREACHED();
 | 
| +      return NULL;
 | 
| +    }
 | 
| +    return it_->key();
 | 
| +  }
 | 
| +
 | 
| +  TestCaseIterator& Advance() {
 | 
| +    if (it_) {
 | 
| +      it_->Advance();
 | 
| +      if (it_->IsAtEnd())
 | 
| +        it_.reset();
 | 
| +    } else {
 | 
| +      NOTREACHED();
 | 
| +    }
 | 
| +    return *this;
 | 
| +  }
 | 
| +
 | 
| +  TestCaseIterator& operator++() {
 | 
| +    return Advance();
 | 
| +  }
 | 
| +
 | 
| +  TestCaseIterator operator++(int) {
 | 
| +    TestCaseIterator current = *this;
 | 
| +    Advance();
 | 
| +    return current;
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +  scoped_ptr<Schema::Iterator> it_;
 | 
| +};
 | 
| +
 | 
|  // Base class for tests that change policy and are parameterized with a policy
 | 
|  // definition.
 | 
|  class PolicyPrefsTest
 | 
|      : public InProcessBrowserTest,
 | 
| -      public testing::WithParamInterface<PolicyDefinitionList::Entry> {
 | 
| +      public testing::WithParamInterface<const char*> {
 | 
|   protected:
 | 
|    virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
 | 
|      EXPECT_CALL(provider_, IsInitializationComplete(_))
 | 
| @@ -411,20 +497,22 @@ TEST(PolicyPrefsTestCoverageTest, AllPoliciesHaveATestCase) {
 | 
|    // This test fails when a policy is added to
 | 
|    // chrome/app/policy/policy_templates.json but a test case is not added to
 | 
|    // chrome/test/data/policy/policy_test_cases.json.
 | 
| +  Schema chrome_schema = Schema::Wrap(GetChromeSchemaData());
 | 
| +  ASSERT_TRUE(chrome_schema.valid());
 | 
| +
 | 
|    PolicyTestCases policy_test_cases;
 | 
| -  const PolicyDefinitionList* list = GetChromePolicyDefinitionList();
 | 
| -  for (const PolicyDefinitionList::Entry* policy = list->begin;
 | 
| -       policy != list->end; ++policy) {
 | 
| -    EXPECT_TRUE(ContainsKey(policy_test_cases.map(), policy->name))
 | 
| -        << "Missing policy test case for: " << policy->name;
 | 
| +  for (Schema::Iterator it = chrome_schema.GetPropertiesIterator();
 | 
| +       !it.IsAtEnd(); it.Advance()) {
 | 
| +    EXPECT_TRUE(ContainsKey(policy_test_cases.map(), it.key()))
 | 
| +        << "Missing policy test case for: " << it.key();
 | 
|    }
 | 
|  }
 | 
|  
 | 
|  IN_PROC_BROWSER_TEST_P(PolicyPrefsTest, PolicyToPrefsMapping) {
 | 
|    // Verifies that policies make their corresponding preferences become managed,
 | 
|    // and that the user can't override that setting.
 | 
| -  const PolicyTestCase* test_case = policy_test_cases_.Get(GetParam().name);
 | 
| -  ASSERT_TRUE(test_case) << "PolicyTestCase not found for " << GetParam().name;
 | 
| +  const PolicyTestCase* test_case = policy_test_cases_.Get(GetParam());
 | 
| +  ASSERT_TRUE(test_case) << "PolicyTestCase not found for " << GetParam();
 | 
|    const ScopedVector<PrefMapping>& pref_mappings = test_case->pref_mappings();
 | 
|    if (!test_case->IsSupported() || pref_mappings.empty())
 | 
|      return;
 | 
| @@ -469,9 +557,9 @@ IN_PROC_BROWSER_TEST_P(PolicyPrefsTest, CheckPolicyIndicators) {
 | 
|    // Verifies that controlled setting indicators correctly show whether a pref's
 | 
|    // value is recommended or enforced by a corresponding policy.
 | 
|    const PolicyTestCase* policy_test_case =
 | 
| -      policy_test_cases_.Get(GetParam().name);
 | 
| +      policy_test_cases_.Get(GetParam());
 | 
|    ASSERT_TRUE(policy_test_case) << "PolicyTestCase not found for "
 | 
| -      << GetParam().name;
 | 
| +      << GetParam();
 | 
|    const ScopedVector<PrefMapping>& pref_mappings =
 | 
|        policy_test_case->pref_mappings();
 | 
|    if (!policy_test_case->IsSupported() || pref_mappings.empty())
 | 
| @@ -564,10 +652,9 @@ IN_PROC_BROWSER_TEST_P(PolicyPrefsTest, CheckPolicyIndicators) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -INSTANTIATE_TEST_CASE_P(
 | 
| -    PolicyPrefsTestInstance,
 | 
| -    PolicyPrefsTest,
 | 
| -    testing::ValuesIn(GetChromePolicyDefinitionList()->begin,
 | 
| -                      GetChromePolicyDefinitionList()->end));
 | 
| +INSTANTIATE_TEST_CASE_P(PolicyPrefsTestInstance,
 | 
| +                        PolicyPrefsTest,
 | 
| +                        testing::ValuesIn(TestCaseIterator::GetBegin(),
 | 
| +                                          TestCaseIterator::GetEnd()));
 | 
|  
 | 
|  }  // namespace policy
 | 
| 
 |