chromium/chrome/browser/sync/test/integration/preferences_helper.h

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_PREFERENCES_HELPER_H_
#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_PREFERENCES_HELPER_H_

#include <stdint.h>

#include <memory>
#include <optional>
#include <string>
#include <vector>

#include "base/memory/scoped_refptr.h"
#include "base/values.h"
#include "chrome/browser/sync/test/integration/fake_server_match_status_checker.h"
#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
#include "chrome/browser/sync/test/integration/status_change_checker.h"
#include "components/prefs/json_pref_store.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/sync/base/data_type.h"
#include "components/sync/protocol/preference_specifics.pb.h"
#include "components/sync/test/fake_server.h"

class PrefChangeRegistrar;
class PrefService;
class Profile;

namespace user_prefs {
class PrefRegistrySyncable;
}

namespace preferences_helper {

// Used to access the preferences within a particular sync profile.
PrefService* GetPrefs(int index);

// Provides access to the syncable pref registy of a profile.
user_prefs::PrefRegistrySyncable* GetRegistry(Profile* profile);

// Inverts the value of the boolean preference with name |pref_name| in the
// profile with index |index|.
void ChangeBooleanPref(int index, const char* pref_name);

// Changes the value of the integer preference with name |pref_name| in the
// profile with index |index| to |new_value|.
void ChangeIntegerPref(int index, const char* pref_name, int new_value);

// Changes the value of the string preference with name |pref_name| in the
// profile with index |index| to |new_value|.
void ChangeStringPref(int index,
                      const char* pref_name,
                      const std::string& new_value);

// Clears the value of the preference with name |pref_name| in the profile with
// index |index|.
void ClearPref(int index, const char* pref_name);

// Changes the value of the list preference with name |pref_name| in the
// profile with index |index| to |new_value|.
void ChangeListPref(int index,
                    const char* pref_name,
                    const base::Value::List& new_value);

// Used to verify that the boolean preference with name |pref_name| has the
// same value across all profiles.
[[nodiscard]] bool BooleanPrefMatches(const char* pref_name);

// Used to verify that the integer preference with name |pref_name| has the
// same value across all profiles.
[[nodiscard]] bool IntegerPrefMatches(const char* pref_name);

// Used to verify that the string preference with name |pref_name| has the
// same value across all profiles.
[[nodiscard]] bool StringPrefMatches(const char* pref_name);

// Used to verify that the list preference with name |pref_name| has the
// same value across all profiles.
[[nodiscard]] bool ListPrefMatches(const char* pref_name);

// Returns a server-side preference in FakeServer for |pref_name| or nullopt if
// no preference exists.
std::optional<sync_pb::PreferenceSpecifics> GetPreferenceInFakeServer(
    syncer::DataType data_type,
    const std::string& pref_name,
    fake_server::FakeServer* fake_server);

// Converts `value` to the synced pref value, i.e. the value as it is sent via
// the specifics.
std::string ConvertPrefValueToValueInSpecifics(const base::Value& value);

}  // namespace preferences_helper

// Checker that blocks until pref has the specified value.
class BooleanPrefValueChecker : public StatusChangeChecker {};

// Abstract checker that takes care of registering for preference changes.
class PrefMatchChecker : public StatusChangeChecker {};

// Matcher that blocks until the specified list pref matches on all clients.
class ListPrefMatchChecker : public PrefMatchChecker {};

// Matcher that blocks until the specified boolean pref matches on all clients.
class BooleanPrefMatchChecker : public PrefMatchChecker {};

// Matcher that blocks until the specified integer pref matches on all clients.
class IntegerPrefMatchChecker : public PrefMatchChecker {};

// Matcher that blocks until the specified string pref matches on all clients.
class StringPrefMatchChecker : public PrefMatchChecker {};

// Matcher that blocks until the specified pref is cleared on all clients.
class ClearedPrefMatchChecker : public PrefMatchChecker {};

// Waits until GetPreferenceInFakeServer() returns an expected value.
class FakeServerPrefMatchesValueChecker
    : public fake_server::FakeServerMatchStatusChecker {};

#endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_PREFERENCES_HELPER_H_