13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be
321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file.
421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/policy/asynchronous_policy_loader.h"
621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/policy/asynchronous_policy_provider.h"
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/policy/asynchronous_policy_test_base.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/policy/mock_configuration_policy_provider.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/policy/mock_configuration_policy_store.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "testing/gmock/include/gmock/gmock.h"
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing ::testing::_;
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing ::testing::InSequence;
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing ::testing::Return;
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace policy {
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass MockConfigurationPolicyObserver
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    : public ConfigurationPolicyProvider::Observer {
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  MOCK_METHOD0(OnUpdatePolicy, void());
223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void OnProviderGoingAway() {}
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen};
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass AsynchronousPolicyLoaderTest : public AsynchronousPolicyTestBase {
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AsynchronousPolicyLoaderTest() {}
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual ~AsynchronousPolicyLoaderTest() {}
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void SetUp() {
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    AsynchronousPolicyTestBase::SetUp();
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    mock_provider_.reset(new MockConfigurationPolicyProvider());
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen protected:
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<MockConfigurationPolicyProvider> mock_provider_;
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private:
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DISALLOW_COPY_AND_ASSIGN(AsynchronousPolicyLoaderTest);
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen};
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenACTION(CreateTestDictionary) {
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return new DictionaryValue();
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenACTION_P(CreateSequencedTestDictionary, number) {
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DictionaryValue* test_dictionary = new DictionaryValue();
4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  test_dictionary->SetInteger("id", ++(*number));
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return test_dictionary;
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenACTION(RescheduleImmediatePolicyReload) {
5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  *arg1 = base::TimeDelta();
5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return false;
5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(AsynchronousPolicyLoaderTest, InitialLoad) {
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DictionaryValue* template_dict(new DictionaryValue());
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(*delegate_, Load()).WillOnce(Return(template_dict));
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_refptr<AsynchronousPolicyLoader> loader =
6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      new AsynchronousPolicyLoader(delegate_.release(), 10);
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Init();
6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const DictionaryValue* loaded_dict(loader->policy());
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(loaded_dict->Equals(template_dict));
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Verify that the fallback policy requests are made.
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(AsynchronousPolicyLoaderTest, InitialLoadWithFallback) {
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int dictionary_number = 0;
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InSequence s;
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(*delegate_, Load()).WillOnce(
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      CreateSequencedTestDictionary(&dictionary_number));
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(*delegate_, Load()).WillOnce(
7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      CreateSequencedTestDictionary(&dictionary_number));
7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_refptr<AsynchronousPolicyLoader> loader =
7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      new AsynchronousPolicyLoader(delegate_.release(), 10);
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Init();
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Reload();
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const DictionaryValue* loaded_dict(loader->policy());
8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int loaded_number;
8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(loaded_dict->GetInteger("id", &loaded_number));
8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(dictionary_number, loaded_number);
8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Ensure that calling stop on the loader stops subsequent reloads from
8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// happening.
9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(AsynchronousPolicyLoaderTest, Stop) {
9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ON_CALL(*delegate_, Load()).WillByDefault(CreateTestDictionary());
9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(*delegate_, Load()).Times(1);
9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_refptr<AsynchronousPolicyLoader> loader =
9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      new AsynchronousPolicyLoader(delegate_.release(), 10);
9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Init();
9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Stop();
9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Reload();
10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Verifies that the provider is notified upon policy reload, but only
10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// if the policy changed.
10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(AsynchronousPolicyLoaderTest, ProviderNotificationOnPolicyChange) {
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  InSequence s;
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  MockConfigurationPolicyObserver observer;
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int dictionary_number_1 = 0;
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int dictionary_number_2 = 0;
11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(*delegate_, Load()).WillOnce(
11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      CreateSequencedTestDictionary(&dictionary_number_1));
11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(*delegate_, Load()).WillOnce(
11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      CreateSequencedTestDictionary(&dictionary_number_2));
11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(observer, OnUpdatePolicy()).Times(0);
11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(*delegate_, Load()).WillOnce(
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      CreateSequencedTestDictionary(&dictionary_number_2));
11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(observer, OnUpdatePolicy()).Times(1);
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_CALL(*delegate_, Load()).WillOnce(
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      CreateSequencedTestDictionary(&dictionary_number_1));
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_refptr<AsynchronousPolicyLoader> loader =
12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      new AsynchronousPolicyLoader(delegate_.release(), 10);
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AsynchronousPolicyProvider provider(NULL, loader);
12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // |registrar| must be declared last so that it is destroyed first.
12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ConfigurationPolicyObserverRegistrar registrar;
1253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  registrar.Init(&provider, &observer);
12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Reload();
12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Reload();
13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loader->Reload();
13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  loop_.RunAllPending();
13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}  // namespace policy
136