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 <CoreFoundation/CoreFoundation.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/files/file_path.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_cftyperef.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/async_policy_provider.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/configuration_policy_provider_test.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_bundle.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/policy_loader_mac.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/policy/core/common/policy_test_utils.h" 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/preferences_mock_mac.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::ScopedCFTypeRef; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestHarness : public PolicyProviderTestHarness { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestHarness(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestHarness(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ConfigurationPolicyProvider* CreateProvider( 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry* registry, 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner) OVERRIDE; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallEmptyPolicy() OVERRIDE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallStringPolicy(const std::string& policy_name, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& policy_value) OVERRIDE; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallIntegerPolicy(const std::string& policy_name, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int policy_value) OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallBooleanPolicy(const std::string& policy_name, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool policy_value) OVERRIDE; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallStringListPolicy( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& policy_name, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* policy_value) OVERRIDE; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallDictionaryPolicy( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& policy_name, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* policy_value) OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static PolicyProviderTestHarness* Create(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPreferences* prefs_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestHarness); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestHarness::TestHarness() 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PolicyProviderTestHarness(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER) {} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestHarness::~TestHarness() {} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::SetUp() {} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ConfigurationPolicyProvider* TestHarness::CreateProvider( 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry* registry, 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_ = new MockPreferences(); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<AsyncPolicyLoader> loader( 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new PolicyLoaderMac(task_runner, base::FilePath(), prefs_)); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return new AsyncPolicyProvider(registry, loader.Pass()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallEmptyPolicy() {} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallStringPolicy(const std::string& policy_name, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& policy_value) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFStringRef> value(base::SysUTF8ToCFStringRef(policy_value)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->AddTestItem(name, value, true); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallIntegerPolicy(const std::string& policy_name, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int policy_value) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFNumberRef> value( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFNumberCreate(NULL, kCFNumberIntType, &policy_value)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->AddTestItem(name, value, true); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallBooleanPolicy(const std::string& policy_name, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool policy_value) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->AddTestItem(name, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_value ? kCFBooleanTrue : kCFBooleanFalse, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallStringListPolicy(const std::string& policy_name, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* policy_value) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name)); 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScopedCFTypeRef<CFPropertyListRef> array(ValueToProperty(policy_value)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(array); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->AddTestItem(name, array, true); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallDictionaryPolicy( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& policy_name, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* policy_value) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name)); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScopedCFTypeRef<CFPropertyListRef> dict(ValueToProperty(policy_value)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->AddTestItem(name, dict, true); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PolicyProviderTestHarness* TestHarness::Create() { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new TestHarness(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instantiate abstract test case for basic policy reading tests. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyProviderMacTest, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigurationPolicyProviderTest, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Values(TestHarness::Create)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(joaodasilva): instantiate Configuration3rdPartyPolicyProviderTest too 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// once the mac loader supports 3rd party policy. http://crbug.com/108995 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Special test cases for some mac preferences details. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyLoaderMacTest : public PolicyTestBase { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyLoaderMacTest() 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : prefs_(new MockPreferences()) {} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PolicyLoaderMacTest() {} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestBase::SetUp(); 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<AsyncPolicyLoader> loader(new PolicyLoaderMac( 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) loop_.message_loop_proxy(), base::FilePath(), prefs_)); 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider_.reset(new AsyncPolicyProvider(&schema_registry_, loader.Pass())); 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider_->Init(&schema_registry_); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider_->Shutdown(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestBase::TearDown(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPreferences* prefs_; 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<AsyncPolicyProvider> provider_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyLoaderMacTest, Invalid) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFStringRef> name( 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::SysUTF8ToCFStringRef(test_keys::kKeyString)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char buffer[] = "binary \xde\xad\xbe\xef data"; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFDataRef> invalid_data( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFDataCreate(kCFAllocatorDefault, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const UInt8 *>(buffer), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(buffer))); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(invalid_data); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->AddTestItem(name, invalid_data.get(), true); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->AddTestItem(name, invalid_data.get(), false); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the provider read the updated |prefs_|. 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider_->RefreshPolicies(); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop_.RunUntilIdle(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyBundle kEmptyBundle; 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(provider_->policies().Equals(kEmptyBundle)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyLoaderMacTest, TestNonForcedValue) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFStringRef> name( 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::SysUTF8ToCFStringRef(test_keys::kKeyString)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedCFTypeRef<CFPropertyListRef> test_value( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SysUTF8ToCFStringRef("string value")); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_value.get()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->AddTestItem(name, test_value.get(), false); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the provider read the updated |prefs_|. 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider_->RefreshPolicies(); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop_.RunUntilIdle(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyBundle expected_bundle; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .Set(test_keys::kKeyString, 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) POLICY_LEVEL_RECOMMENDED, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) POLICY_SCOPE_USER, 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::StringValue("string value"), 1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NULL); 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(provider_->policies().Equals(expected_bundle)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace policy 201