1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/prefs/incognito_mode_prefs.h"
6#include "chrome/browser/profiles/incognito_mode_policy_handler.h"
7#include "chrome/common/pref_names.h"
8#include "components/policy/core/browser/configuration_policy_pref_store.h"
9#include "components/policy/core/browser/configuration_policy_pref_store_test.h"
10#include "policy/policy_constants.h"
11
12namespace policy {
13
14// Tests Incognito mode availability preference setting.
15class IncognitoModePolicyHandlerTest
16    : public ConfigurationPolicyPrefStoreTest {
17 public:
18  virtual void SetUp() OVERRIDE {
19    handler_list_.AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
20          new IncognitoModePolicyHandler));
21  }
22 protected:
23  static const int kIncognitoModeAvailabilityNotSet = -1;
24
25  enum ObsoleteIncognitoEnabledValue {
26    INCOGNITO_ENABLED_UNKNOWN,
27    INCOGNITO_ENABLED_TRUE,
28    INCOGNITO_ENABLED_FALSE
29  };
30
31  void SetPolicies(ObsoleteIncognitoEnabledValue incognito_enabled,
32                   int availability) {
33    PolicyMap policy;
34    if (incognito_enabled != INCOGNITO_ENABLED_UNKNOWN) {
35      policy.Set(key::kIncognitoEnabled,
36                 POLICY_LEVEL_MANDATORY,
37                 POLICY_SCOPE_USER,
38                 new base::FundamentalValue(incognito_enabled ==
39                                            INCOGNITO_ENABLED_TRUE),
40                 NULL);
41    }
42    if (availability >= 0) {
43      policy.Set(key::kIncognitoModeAvailability,
44                 POLICY_LEVEL_MANDATORY,
45                 POLICY_SCOPE_USER,
46                 new base::FundamentalValue(availability),
47                 NULL);
48    }
49    UpdateProviderPolicy(policy);
50  }
51
52  void VerifyValues(IncognitoModePrefs::Availability availability) {
53    const base::Value* value = NULL;
54    EXPECT_TRUE(store_->GetValue(prefs::kIncognitoModeAvailability, &value));
55    EXPECT_TRUE(base::FundamentalValue(availability).Equals(value));
56  }
57};
58
59// The following testcases verify that if the obsolete IncognitoEnabled
60// policy is not set, the IncognitoModeAvailability values should be copied
61// from IncognitoModeAvailability policy to pref "as is".
62TEST_F(IncognitoModePolicyHandlerTest,
63       NoObsoletePolicyAndIncognitoEnabled) {
64  SetPolicies(INCOGNITO_ENABLED_UNKNOWN, IncognitoModePrefs::ENABLED);
65  VerifyValues(IncognitoModePrefs::ENABLED);
66}
67
68TEST_F(IncognitoModePolicyHandlerTest,
69       NoObsoletePolicyAndIncognitoDisabled) {
70  SetPolicies(INCOGNITO_ENABLED_UNKNOWN, IncognitoModePrefs::DISABLED);
71  VerifyValues(IncognitoModePrefs::DISABLED);
72}
73
74TEST_F(IncognitoModePolicyHandlerTest,
75       NoObsoletePolicyAndIncognitoForced) {
76  SetPolicies(INCOGNITO_ENABLED_UNKNOWN, IncognitoModePrefs::FORCED);
77  VerifyValues(IncognitoModePrefs::FORCED);
78}
79
80TEST_F(IncognitoModePolicyHandlerTest,
81       NoObsoletePolicyAndNoIncognitoAvailability) {
82  SetPolicies(INCOGNITO_ENABLED_UNKNOWN, kIncognitoModeAvailabilityNotSet);
83  const base::Value* value = NULL;
84  EXPECT_FALSE(store_->GetValue(prefs::kIncognitoModeAvailability, &value));
85}
86
87// Checks that if the obsolete IncognitoEnabled policy is set, if sets
88// the IncognitoModeAvailability preference only in case
89// the IncognitoModeAvailability policy is not specified.
90TEST_F(IncognitoModePolicyHandlerTest,
91       ObsoletePolicyDoesNotAffectAvailabilityEnabled) {
92  SetPolicies(INCOGNITO_ENABLED_FALSE, IncognitoModePrefs::ENABLED);
93  VerifyValues(IncognitoModePrefs::ENABLED);
94}
95
96TEST_F(IncognitoModePolicyHandlerTest,
97       ObsoletePolicyDoesNotAffectAvailabilityForced) {
98  SetPolicies(INCOGNITO_ENABLED_TRUE, IncognitoModePrefs::FORCED);
99  VerifyValues(IncognitoModePrefs::FORCED);
100}
101
102TEST_F(IncognitoModePolicyHandlerTest,
103       ObsoletePolicySetsPreferenceToEnabled) {
104  SetPolicies(INCOGNITO_ENABLED_TRUE, kIncognitoModeAvailabilityNotSet);
105  VerifyValues(IncognitoModePrefs::ENABLED);
106}
107
108TEST_F(IncognitoModePolicyHandlerTest,
109       ObsoletePolicySetsPreferenceToDisabled) {
110  SetPolicies(INCOGNITO_ENABLED_FALSE, kIncognitoModeAvailabilityNotSet);
111  VerifyValues(IncognitoModePrefs::DISABLED);
112}
113
114}  // namespace policy
115