| Index: chrome/browser/policy/schema_map_unittest.cc | 
| diff --git a/chrome/browser/policy/policy_domain_descriptor_unittest.cc b/chrome/browser/policy/schema_map_unittest.cc | 
| similarity index 53% | 
| copy from chrome/browser/policy/policy_domain_descriptor_unittest.cc | 
| copy to chrome/browser/policy/schema_map_unittest.cc | 
| index 7841a8a6c687814fac2b3da15346decc6495c381..b72336c1d2b77ea3ddd409cb28e707de21744d99 100644 | 
| --- a/chrome/browser/policy/policy_domain_descriptor_unittest.cc | 
| +++ b/chrome/browser/policy/schema_map_unittest.cc | 
| @@ -1,76 +1,118 @@ | 
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
| +// Copyright 2013 The Chromium Authors. All rights reserved. | 
| // Use of this source code is governed by a BSD-style license that can be | 
| // found in the LICENSE file. | 
|  | 
| -#include "chrome/browser/policy/policy_domain_descriptor.h" | 
| +#include "chrome/browser/policy/schema_map.h" | 
|  | 
| -#include <string> | 
| - | 
| -#include "base/callback.h" | 
| #include "base/memory/weak_ptr.h" | 
| #include "base/values.h" | 
| #include "chrome/browser/policy/external_data_fetcher.h" | 
| #include "chrome/browser/policy/external_data_manager.h" | 
| #include "chrome/browser/policy/policy_bundle.h" | 
| #include "chrome/browser/policy/policy_map.h" | 
| +#include "components/policy/core/common/schema.h" | 
| #include "testing/gtest/include/gtest/gtest.h" | 
|  | 
| namespace policy { | 
|  | 
| -class PolicyDomainDescriptorTest : public testing::Test { | 
| +namespace { | 
| + | 
| +const char kTestSchema[] = | 
| +    "{" | 
| +    "  \"type\": \"object\"," | 
| +    "  \"properties\": {" | 
| +    "    \"string\": { \"type\": \"string\" }," | 
| +    "    \"integer\": { \"type\": \"integer\" }," | 
| +    "    \"boolean\": { \"type\": \"boolean\" }," | 
| +    "    \"null\": { \"type\": \"null\" }," | 
| +    "    \"double\": { \"type\": \"number\" }," | 
| +    "    \"list\": {" | 
| +    "      \"type\": \"array\"," | 
| +    "      \"items\": { \"type\": \"string\" }" | 
| +    "    }," | 
| +    "    \"object\": {" | 
| +    "      \"type\": \"object\"," | 
| +    "      \"properties\": {" | 
| +    "        \"a\": { \"type\": \"string\" }," | 
| +    "        \"b\": { \"type\": \"integer\" }" | 
| +    "      }" | 
| +    "    }" | 
| +    "  }" | 
| +    "}"; | 
| + | 
| +}  // namespace | 
| + | 
| +class SchemaMapTest : public testing::Test { | 
| protected: | 
| -  scoped_ptr<ExternalDataFetcher> CreateExternalDataFetcher() const; | 
| +  scoped_refptr<SchemaMap> CreateTestMap() { | 
| +    std::string error; | 
| +    Schema schema = Schema::Parse(kTestSchema, &error); | 
| +    if (!schema.valid()) { | 
| +      ADD_FAILURE() << error; | 
| +      return NULL; | 
| +    } | 
| + | 
| +    ComponentMap component_map; | 
| +    component_map["extension-1"] = schema; | 
| +    component_map["extension-2"] = schema; | 
| +    component_map["legacy-extension"] = Schema(); | 
| + | 
| +    DomainMap domain_map; | 
| +    domain_map[POLICY_DOMAIN_EXTENSIONS] = component_map; | 
| + | 
| +    return new SchemaMap(domain_map); | 
| +  } | 
| }; | 
|  | 
| -scoped_ptr<ExternalDataFetcher> | 
| -    PolicyDomainDescriptorTest::CreateExternalDataFetcher() const { | 
| -  return make_scoped_ptr( | 
| -      new ExternalDataFetcher(base::WeakPtr<ExternalDataManager>(), | 
| -                              std::string())); | 
| +TEST_F(SchemaMapTest, Empty) { | 
| +  scoped_refptr<SchemaMap> map = new SchemaMap(); | 
| +  EXPECT_TRUE(map->GetDomains().empty()); | 
| +  EXPECT_FALSE(map->GetComponents(POLICY_DOMAIN_CHROME)); | 
| +  EXPECT_FALSE(map->GetComponents(POLICY_DOMAIN_EXTENSIONS)); | 
| +  EXPECT_FALSE(map->GetSchema(PolicyNamespace(POLICY_DOMAIN_CHROME, ""))); | 
| } | 
|  | 
| -TEST_F(PolicyDomainDescriptorTest, FilterBundle) { | 
| -  scoped_refptr<PolicyDomainDescriptor> descriptor = | 
| -      new PolicyDomainDescriptor(POLICY_DOMAIN_EXTENSIONS); | 
| -  EXPECT_EQ(POLICY_DOMAIN_EXTENSIONS, descriptor->domain()); | 
| -  EXPECT_TRUE(descriptor->components().empty()); | 
| +TEST_F(SchemaMapTest, Lookups) { | 
| +  scoped_refptr<SchemaMap> map = CreateTestMap(); | 
| +  ASSERT_TRUE(map); | 
| + | 
| +  EXPECT_FALSE(map->GetSchema( | 
| +      PolicyNamespace(POLICY_DOMAIN_CHROME, ""))); | 
| +  EXPECT_FALSE(map->GetSchema( | 
| +      PolicyNamespace(POLICY_DOMAIN_CHROME, "extension-1"))); | 
| +  EXPECT_FALSE(map->GetSchema( | 
| +      PolicyNamespace(POLICY_DOMAIN_CHROME, "legacy-extension"))); | 
| +  EXPECT_FALSE(map->GetSchema( | 
| +      PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, ""))); | 
| +  EXPECT_FALSE(map->GetSchema( | 
| +      PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "extension-3"))); | 
| + | 
| +  const Schema* schema = | 
| +      map->GetSchema(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "extension-1")); | 
| +  ASSERT_TRUE(schema); | 
| +  EXPECT_TRUE(schema->valid()); | 
| + | 
| +  schema = map->GetSchema( | 
| +      PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "legacy-extension")); | 
| +  ASSERT_TRUE(schema); | 
| +  EXPECT_FALSE(schema->valid()); | 
| +} | 
|  | 
| +TEST_F(SchemaMapTest, FilterBundle) { | 
| std::string error; | 
| -  Schema schema = Schema::Parse( | 
| -      "{" | 
| -      "  \"type\":\"object\"," | 
| -      "  \"properties\": {" | 
| -      "    \"Array\": {" | 
| -      "      \"type\": \"array\"," | 
| -      "      \"items\": { \"type\": \"string\" }" | 
| -      "    }," | 
| -      "    \"Boolean\": { \"type\": \"boolean\" }," | 
| -      "    \"Integer\": { \"type\": \"integer\" }," | 
| -      "    \"Null\": { \"type\": \"null\" }," | 
| -      "    \"Number\": { \"type\": \"number\" }," | 
| -      "    \"Object\": {" | 
| -      "      \"type\": \"object\"," | 
| -      "      \"properties\": {" | 
| -      "        \"a\": { \"type\": \"string\" }," | 
| -      "        \"b\": { \"type\": \"integer\" }" | 
| -      "      }" | 
| -      "    }," | 
| -      "    \"String\": { \"type\": \"string\" }" | 
| -      "  }" | 
| -      "}", &error); | 
| +  Schema schema = Schema::Parse(kTestSchema, &error); | 
| ASSERT_TRUE(schema.valid()) << error; | 
|  | 
| -  descriptor->RegisterComponent("abc", schema); | 
| - | 
| -  EXPECT_EQ(1u, descriptor->components().size()); | 
| -  EXPECT_EQ(1u, descriptor->components().count("abc")); | 
| +  DomainMap domain_map; | 
| +  domain_map[POLICY_DOMAIN_EXTENSIONS]["abc"] = schema; | 
| +  scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); | 
|  | 
| PolicyBundle bundle; | 
| -  descriptor->FilterBundle(&bundle); | 
| +  schema_map->FilterBundle(&bundle); | 
| const PolicyBundle empty_bundle; | 
| EXPECT_TRUE(bundle.Equals(empty_bundle)); | 
|  | 
| -  // Other namespaces aren't filtered. | 
| +  // The Chrome namespace isn't filtered. | 
| PolicyBundle expected_bundle; | 
| PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); | 
| expected_bundle.Get(chrome_ns).Set("ChromePolicy", | 
| @@ -79,7 +121,8 @@ TEST_F(PolicyDomainDescriptorTest, FilterBundle) { | 
| base::Value::CreateStringValue("value"), | 
| NULL); | 
| bundle.CopyFrom(expected_bundle); | 
| -  // Unknown components of the domain are filtered out. | 
| + | 
| +  // Unknown components are filtered out. | 
| PolicyNamespace another_extension_ns(POLICY_DOMAIN_EXTENSIONS, "xyz"); | 
| bundle.Get(another_extension_ns).Set( | 
| "AnotherExtensionPolicy", | 
| @@ -87,7 +130,7 @@ TEST_F(PolicyDomainDescriptorTest, FilterBundle) { | 
| POLICY_SCOPE_USER, | 
| base::Value::CreateStringValue("value"), | 
| NULL); | 
| -  descriptor->FilterBundle(&bundle); | 
| +  schema_map->FilterBundle(&bundle); | 
| EXPECT_TRUE(bundle.Equals(expected_bundle)); | 
|  | 
| PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "abc"); | 
| @@ -95,22 +138,22 @@ TEST_F(PolicyDomainDescriptorTest, FilterBundle) { | 
| base::ListValue list; | 
| list.AppendString("a"); | 
| list.AppendString("b"); | 
| -  map.Set("Array", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  map.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| list.DeepCopy(), NULL); | 
| -  map.Set("Boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  map.Set("boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateBooleanValue(true), NULL); | 
| -  map.Set("Integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  map.Set("integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateIntegerValue(1), NULL); | 
| -  map.Set("Null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  map.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateNullValue(), NULL); | 
| -  map.Set("Number", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  map.Set("double", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateDoubleValue(1.2), NULL); | 
| base::DictionaryValue dict; | 
| dict.SetString("a", "b"); | 
| dict.SetInteger("b", 2); | 
| -  map.Set("Object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  map.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| dict.DeepCopy(), NULL); | 
| -  map.Set("String", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  map.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateStringValue("value"), NULL); | 
|  | 
| bundle.MergeFrom(expected_bundle); | 
| @@ -120,37 +163,34 @@ TEST_F(PolicyDomainDescriptorTest, FilterBundle) { | 
| base::Value::CreateStringValue("to-be-removed"), | 
| NULL); | 
|  | 
| -  descriptor->FilterBundle(&bundle); | 
| +  schema_map->FilterBundle(&bundle); | 
| EXPECT_TRUE(bundle.Equals(expected_bundle)); | 
|  | 
| // Mismatched types are also removed. | 
| bundle.Clear(); | 
| PolicyMap& badmap = bundle.Get(extension_ns); | 
| -  badmap.Set("Array", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  badmap.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateBooleanValue(false), NULL); | 
| -  badmap.Set("Boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  badmap.Set("boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateIntegerValue(0), NULL); | 
| -  badmap.Set("Integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  badmap.Set("integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateBooleanValue(false), NULL); | 
| -  badmap.Set("Null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  badmap.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateBooleanValue(false), NULL); | 
| -  badmap.Set("Number", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  badmap.Set("double", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateBooleanValue(false), NULL); | 
| -  badmap.Set("Object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +  badmap.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| base::Value::CreateBooleanValue(false), NULL); | 
| -  badmap.Set("String", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| -             NULL, CreateExternalDataFetcher().release()); | 
| +  badmap.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 
| +             NULL, | 
| +             new ExternalDataFetcher(base::WeakPtr<ExternalDataManager>(), | 
| +                                     std::string())); | 
|  | 
| -  descriptor->FilterBundle(&bundle); | 
| +  schema_map->FilterBundle(&bundle); | 
| EXPECT_TRUE(bundle.Equals(empty_bundle)); | 
| } | 
|  | 
| -TEST_F(PolicyDomainDescriptorTest, LegacyComponents) { | 
| -  scoped_refptr<PolicyDomainDescriptor> descriptor = | 
| -      new PolicyDomainDescriptor(POLICY_DOMAIN_EXTENSIONS); | 
| -  EXPECT_EQ(POLICY_DOMAIN_EXTENSIONS, descriptor->domain()); | 
| -  EXPECT_TRUE(descriptor->components().empty()); | 
| - | 
| +TEST_F(SchemaMapTest, LegacyComponents) { | 
| std::string error; | 
| Schema schema = Schema::Parse( | 
| "{" | 
| @@ -161,10 +201,10 @@ TEST_F(PolicyDomainDescriptorTest, LegacyComponents) { | 
| "}", &error); | 
| ASSERT_TRUE(schema.valid()) << error; | 
|  | 
| -  descriptor->RegisterComponent("with-schema", schema); | 
| -  descriptor->RegisterComponent("without-schema", Schema()); | 
| - | 
| -  EXPECT_EQ(2u, descriptor->components().size()); | 
| +  DomainMap domain_map; | 
| +  domain_map[POLICY_DOMAIN_EXTENSIONS]["with-schema"] = schema; | 
| +  domain_map[POLICY_DOMAIN_EXTENSIONS]["without-schema"] = Schema(); | 
| +  scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); | 
|  | 
| // |bundle| contains policies loaded by a policy provider. | 
| PolicyBundle bundle; | 
| @@ -185,7 +225,7 @@ TEST_F(PolicyDomainDescriptorTest, LegacyComponents) { | 
| base::Value::CreateStringValue("value 2"), | 
| NULL); | 
|  | 
| -  // Other namespaces aren't filtered. | 
| +  // The Chrome namespace isn't filtered. | 
| PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); | 
| bundle.Get(chrome_ns).Set("ChromePolicy", | 
| POLICY_LEVEL_MANDATORY, | 
| @@ -211,7 +251,7 @@ TEST_F(PolicyDomainDescriptorTest, LegacyComponents) { | 
| base::Value::CreateStringValue("value 5"), | 
| NULL); | 
|  | 
| -  descriptor->FilterBundle(&bundle); | 
| +  schema_map->FilterBundle(&bundle); | 
| EXPECT_TRUE(bundle.Equals(expected_bundle)); | 
| } | 
|  | 
|  |