Chromium Code Reviews| Index: chrome/browser/policy/user_cloud_policy_store_unittest.cc |
| diff --git a/chrome/browser/policy/user_cloud_policy_store_unittest.cc b/chrome/browser/policy/user_cloud_policy_store_unittest.cc |
| index aef93ed0c5ae5500d85c37f29e033b7634179992..12a04108d8bc8453e50143a7814d95abb5f78bc1 100644 |
| --- a/chrome/browser/policy/user_cloud_policy_store_unittest.cc |
| +++ b/chrome/browser/policy/user_cloud_policy_store_unittest.cc |
| @@ -6,6 +6,7 @@ |
| #include "base/message_loop.h" |
| #include "base/run_loop.h" |
| +#include "base/scoped_temp_dir.h" |
| #include "chrome/browser/policy/policy_builder.h" |
| #include "chrome/browser/signin/signin_manager.h" |
| #include "chrome/browser/signin/signin_manager_factory.h" |
| @@ -45,11 +46,12 @@ class UserCloudPolicyStoreTest : public testing::Test { |
| profile_(new TestingProfile()) {} |
| virtual void SetUp() OVERRIDE { |
| + ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir()); |
| SigninManager* signin = static_cast<SigninManager*>( |
| SigninManagerFactory::GetInstance()->SetTestingFactoryAndUse( |
| profile_.get(), FakeSigninManager::Build)); |
| signin->SetAuthenticatedUsername(PolicyBuilder::kFakeUsername); |
| - store_.reset(new UserCloudPolicyStore(profile_.get())); |
| + store_.reset(new UserCloudPolicyStore(profile_.get(), policy_file())); |
| store_->AddObserver(&observer_); |
| policy_.payload().mutable_showhomebutton()->set_showhomebutton(true); |
| @@ -63,19 +65,23 @@ class UserCloudPolicyStoreTest : public testing::Test { |
| run_loop.RunUntilIdle(); |
| } |
| + FilePath policy_file() { |
| + return tmp_dir_.path().AppendASCII("policy"); |
| + } |
| + |
| // Verifies that store_->policy_map() has the ShowHomeButton entry. |
| - void VerifyPolicyMap() { |
| - EXPECT_EQ(1U, store_->policy_map().size()); |
| + void VerifyPolicyMap(CloudPolicyStore* store) { |
| + EXPECT_EQ(1U, store->policy_map().size()); |
| const PolicyMap::Entry* entry = |
| - store_->policy_map().Get(key::kShowHomeButton); |
| + store->policy_map().Get(key::kShowHomeButton); |
| ASSERT_TRUE(entry); |
| EXPECT_TRUE(base::FundamentalValue(true).Equals(entry->value)); |
| } |
| // Install an expectation on |observer_| for an error code. |
| - void ExpectError(CloudPolicyStore::Status error) { |
| + void ExpectError(CloudPolicyStore* store, CloudPolicyStore::Status error) { |
| EXPECT_CALL(observer_, |
| - OnStoreError(AllOf(Eq(store_.get()), |
| + OnStoreError(AllOf(Eq(store), |
| Property(&CloudPolicyStore::status, |
| Eq(error))))); |
| } |
| @@ -92,10 +98,24 @@ class UserCloudPolicyStoreTest : public testing::Test { |
| content::TestBrowserThread file_thread_; |
| scoped_ptr<TestingProfile> profile_; |
| + ScopedTempDir tmp_dir_; |
| DISALLOW_COPY_AND_ASSIGN(UserCloudPolicyStoreTest); |
| }; |
| +TEST_F(UserCloudPolicyStoreTest, LoadWithNoFile) { |
| + EXPECT_FALSE(store_->policy()); |
| + EXPECT_TRUE(store_->policy_map().empty()); |
| + |
| + EXPECT_CALL(observer_, OnStoreLoaded(store_.get())); |
| + store_->Load(); |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| + |
| + EXPECT_FALSE(store_->policy()); |
| + EXPECT_TRUE(store_->policy_map().empty()); |
| +} |
| + |
| TEST_F(UserCloudPolicyStoreTest, Store) { |
| EXPECT_FALSE(store_->policy()); |
| EXPECT_TRUE(store_->policy_map().empty()); |
| @@ -111,24 +131,105 @@ TEST_F(UserCloudPolicyStoreTest, Store) { |
| ASSERT_TRUE(store_->policy()); |
| EXPECT_EQ(policy_.policy_data().SerializeAsString(), |
| store_->policy()->SerializeAsString()); |
| - VerifyPolicyMap(); |
| + VerifyPolicyMap(store_.get()); |
| EXPECT_EQ(CloudPolicyStore::STATUS_OK, store_->status()); |
| } |
| +TEST_F(UserCloudPolicyStoreTest, StoreTwoTimes) { |
| + EXPECT_FALSE(store_->policy()); |
| + EXPECT_TRUE(store_->policy_map().empty()); |
| + |
| + // Store a simple policy then store a second policy before the first one |
| + // finishes validating, and make sure the second policy ends up as the active |
| + // policy. |
| + EXPECT_CALL(observer_, OnStoreLoaded(store_.get())).Times(2); |
| + |
| + UserPolicyBuilder first_policy; |
| + first_policy.payload().mutable_showhomebutton()->set_showhomebutton(false); |
| + first_policy.Build(); |
| + store_->Store(first_policy.policy()); |
| + store_->Store(policy_.policy()); |
| + |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| + |
| + // Policy should be decoded and stored. |
| + ASSERT_TRUE(store_->policy()); |
| + EXPECT_EQ(policy_.policy_data().SerializeAsString(), |
| + store_->policy()->SerializeAsString()); |
| + VerifyPolicyMap(store_.get()); |
|
Mattias Nissler (ping if slow)
2012/08/20 15:29:30
shouldn't this fail now that show home button is f
Andrew T Wilson (Slow)
2012/08/20 18:04:37
No, because the first policy I store is the one wi
Mattias Nissler (ping if slow)
2012/08/21 10:45:16
True, I had missed that. Makes sense then.
|
| + EXPECT_EQ(CloudPolicyStore::STATUS_OK, store_->status()); |
| +} |
| + |
| +TEST_F(UserCloudPolicyStoreTest, StoreThenLoad) { |
| + // Store a simple policy and make sure it can be read back in. |
| + // policy. |
| + EXPECT_CALL(observer_, OnStoreLoaded(store_.get())); |
| + store_->Store(policy_.policy()); |
| + { |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| + } |
| + |
| + // Now, make sure the policy can be read back in from a second store. |
| + scoped_ptr<UserCloudPolicyStore> store2( |
| + new UserCloudPolicyStore(profile_.get(), policy_file())); |
| + store2->AddObserver(&observer_); |
| + EXPECT_CALL(observer_, OnStoreLoaded(store2.get())); |
| + store2->Load(); |
| + { |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| + } |
| + ASSERT_TRUE(store2->policy()); |
| + EXPECT_EQ(policy_.policy_data().SerializeAsString(), |
| + store2->policy()->SerializeAsString()); |
| + VerifyPolicyMap(store2.get()); |
| + EXPECT_EQ(CloudPolicyStore::STATUS_OK, store2->status()); |
| + store2->RemoveObserver(&observer_); |
| +} |
| + |
| TEST_F(UserCloudPolicyStoreTest, StoreValidationError) { |
| // Create an invalid policy (no policy type). |
| policy_.policy_data().clear_policy_type(); |
| policy_.Build(); |
| // Store policy. |
| - ExpectError(CloudPolicyStore::STATUS_VALIDATION_ERROR); |
| + ExpectError(store_.get(), CloudPolicyStore::STATUS_VALIDATION_ERROR); |
| store_->Store(policy_.policy()); |
| base::RunLoop run_loop; |
| run_loop.RunUntilIdle(); |
| ASSERT_FALSE(store_->policy()); |
| } |
| +TEST_F(UserCloudPolicyStoreTest, LoadValidationError) { |
| + // Force a validation error by changing the username after policy is stored. |
| + EXPECT_CALL(observer_, OnStoreLoaded(store_.get())); |
| + store_->Store(policy_.policy()); |
| + { |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| + } |
| + |
| + // Sign out, and sign back in as a different user, and try to load the profile |
| + // data (should fail due to mismatched username). |
| + SigninManagerFactory::GetForProfile(profile_.get())->SignOut(); |
| + SigninManagerFactory::GetForProfile(profile_.get())->SetAuthenticatedUsername( |
| + "foobar@foobar.com"); |
| + |
| + scoped_ptr<UserCloudPolicyStore> store2( |
| + new UserCloudPolicyStore(profile_.get(), policy_file())); |
| + store2->AddObserver(&observer_); |
| + ExpectError(store2.get(), CloudPolicyStore::STATUS_VALIDATION_ERROR); |
| + store2->Load(); |
| + { |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| + } |
| + ASSERT_FALSE(store2->policy()); |
| + store2->RemoveObserver(&observer_); |
| +} |
| + |
| } // namespace |
| } // namespace policy |
| - |