root/chrome/browser/ui/webui/options/preferences_browsertest.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Copyright (c) 2012 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.

#ifndef CHROME_BROWSER_UI_WEBUI_OPTIONS_PREFERENCES_BROWSERTEST_H_
#define CHROME_BROWSER_UI_WEBUI_OPTIONS_PREFERENCES_BROWSERTEST_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/prefs/pref_change_registrar.h"
#include "base/prefs/pref_service.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/policy/core/common/mock_configuration_policy_provider.h"
#include "components/policy/core/common/policy_types.h"
#include "content/public/browser/notification_observer.h"
#include "testing/gmock/include/gmock/gmock.h"

namespace base {
class DictionaryValue;
class Value;
}

namespace content {
class NotificationDetails;
class NotificationSource;
class RenderViewHost;
}

// Tests verifying that the JavaScript Preferences class, the underlying C++
// CoreOptionsHandler and the specialized classes handling Chrome OS device and
// proxy prefs behave correctly.
class PreferencesBrowserTest : public InProcessBrowserTest {
 public:
  PreferencesBrowserTest();
  ~PreferencesBrowserTest();

  // InProcessBrowserTest implementation:
  virtual void SetUpOnMainThread() OVERRIDE;

  void OnPreferenceChanged(const std::string& pref_name);

 protected:
  MOCK_METHOD1(OnCommit, void(const PrefService::Preference*));

  void SetUpPrefs();

  // InProcessBrowserTest implementation:
  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE;

  // Sets user policies through the mock policy provider.
  void SetUserPolicies(const std::vector<std::string>& names,
                       const std::vector<base::Value*>& values,
                       policy::PolicyLevel level);
  // Clears user policies.
  void ClearUserPolicies();
  // Set user-modified pref values directly in the C++ backend.
  void SetUserValues(const std::vector<std::string>& names,
                     const std::vector<base::Value*>& values);

  // Verifies that a dictionary contains a (key, value) pair. Takes ownership of
  // |expected|.
  void VerifyKeyValue(const base::DictionaryValue& dict,
                      const std::string& key,
                      const base::Value& expected);
  // Verifies that a dictionary contains a given pref and that its value has
  // been decorated correctly.
  void VerifyPref(const base::DictionaryValue* prefs,
                  const std::string& name,
                  const base::Value* value,
                  const std::string& controlledBy,
                  bool disabled,
                  bool uncommitted);
  // Verifies that a notification received from the JavaScript Preferences
  // class contains a given pref and that its value has been decorated
  // correctly.
  void VerifyObservedPref(const std::string& observed_json,
                          const std::string& name,
                          const base::Value* value,
                          const std::string& controlledBy,
                          bool disabled,
                          bool uncommitted);
  // Verifies that notifications received from the JavaScript Preferences class
  // contain the given prefs and that their values have been decorated
  // correctly.
  void VerifyObservedPrefs(const std::string& observed_json,
                           const std::vector<std::string>& names,
                           const std::vector<base::Value*>& values,
                           const std::string& controlledBy,
                           bool disabled,
                           bool uncommitted);

  // Sets up the expectation that the JavaScript Preferences class will make no
  // change to a user-modified pref value in the C++ backend.
  void ExpectNoCommit(const std::string& name);
  // Sets up the expectation that the JavaScript Preferences class will set a
  // user-modified pref value in the C++ backend.
  void ExpectSetCommit(const std::string& name,
                       const base::Value* value);
  // Sets up the expectation that the JavaScript Preferences class will clear a
  // user-modified pref value in the C++ backend.
  void ExpectClearCommit(const std::string& name);
  // Verifies that previously set expectations are met and clears them.
  void VerifyAndClearExpectations();

  // Sets up the JavaScript part of the test environment.
  void SetupJavaScriptTestEnvironment(
      const std::vector<std::string>& pref_names,
      std::string* observed_json) const;

  // Sets a value through the JavaScript Preferences class as if the user had
  // modified it. Returns the observation which can be verified using the
  // VerifyObserved* methods.
  void SetPref(const std::string& name,
               const std::string& type,
               const base::Value* value,
               bool commit,
               std::string* observed_json);

  // Verifies that setting a user-modified pref value through the JavaScript
  // Preferences class fires the correct notification in JavaScript and commits
  // the change to C++ if |commit| is true.
  void VerifySetPref(const std::string& name,
                     const std::string& type,
                     const base::Value* value,
                     bool commit);
  // Verifies that clearing a user-modified pref value through the JavaScript
  // Preferences class fires the correct notification in JavaScript and does
  // respectively does not cause the change to be committed to the C++ backend.
  void VerifyClearPref(const std::string& name,
                       const base::Value* value,
                       bool commit);
  // Verifies that committing a previously made change of a user-modified pref
  // value through the JavaScript Preferences class fires the correct
  // notification in JavaScript.
  void VerifyCommit(const std::string& name,
                    const base::Value* value,
                    const std::string& controlledBy);
  // Verifies that committing a previously set user-modified pref value through
  // the JavaScript Preferences class fires the correct notification in
  // JavaScript and causes the change to be committed to the C++ backend.
  void VerifySetCommit(const std::string& name,
                       const base::Value* value);
  // Verifies that committing the previously cleared user-modified pref value
  // through the JavaScript Preferences class fires the correct notification in
  // JavaScript and causes the change to be committed to the C++ backend.
  void VerifyClearCommit(const std::string& name,
                         const base::Value* value);
  // Verifies that rolling back a previously made change of a user-modified pref
  // value through the JavaScript Preferences class fires the correct
  // notification in JavaScript and does not cause the change to be committed to
  // the C++ backend.
  void VerifyRollback(const std::string& name,
                      const base::Value* value,
                      const std::string& controlledBy);
  // Start observing notifications sent by the JavaScript Preferences class for
  // pref values changes.
  void StartObserving();
  // Change the value of a sentinel pref in the C++ backend and finish observing
  // notifications sent by the JavaScript Preferences class when the
  // notification for this pref is received.
  void FinishObserving(std::string* observed_json);

  // Populate the lists of test prefs and corresponding policies with default
  // values used by most tests.
  void UseDefaultTestPrefs(bool includeListPref);

  // The current tab's render view host, required to inject JavaScript code into
  // the tab.
  content::RenderViewHost* render_view_host_;

  // Mock policy provider for both user and device policies.
  policy::MockConfigurationPolicyProvider policy_provider_;

  // Pref change registrar that detects changes to user-modified pref values
  // made in the C++ backend by the JavaScript Preferences class.
  PrefChangeRegistrar pref_change_registrar_;

  // The pref service that holds the current pref values in the C++ backend.
  PrefService* pref_service_;

  // The prefs and corresponding policies used by the current test.
  std::vector<std::string> types_;
  std::vector<std::string> pref_names_;
  std::vector<std::string> policy_names_;
  std::vector<base::Value*> default_values_;
  std::vector<base::Value*> non_default_values_;

 private:
  DISALLOW_COPY_AND_ASSIGN(PreferencesBrowserTest);
};

#endif  // CHROME_BROWSER_UI_WEBUI_OPTIONS_PREFERENCES_BROWSERTEST_H_

/* [<][>][^][v][top][bottom][index][help] */