// 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.
//
// Utils to simulate various outcomes of a sync session.
#ifndef SYNC_SESSIONS_TEST_UTIL_H_
#define SYNC_SESSIONS_TEST_UTIL_H_

#include "sync/engine/syncer.h"
#include "sync/sessions/sync_session.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace syncer {
namespace sessions {
namespace test_util {

// Configure sync cycle successes and failures.
void SimulateGetEncryptionKeyFailed(
    ModelTypeSet requested_types,
    sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source,
    sessions::SyncSession* session);
void SimulateConfigureSuccess(
    ModelTypeSet requested_types,
    sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source,
    sessions::SyncSession* session);
void SimulateConfigureFailed(
    ModelTypeSet requested_types,
    sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source,
    sessions::SyncSession* session);
void SimulateConfigureConnectionFailure(
    ModelTypeSet requested_types,
    sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source,
    sessions::SyncSession* session);

// Normal mode sync cycle successes and failures.
void SimulateNormalSuccess(ModelTypeSet requested_types,
                           sessions::NudgeTracker* nudge_tracker,
                           sessions::SyncSession* session);
void SimulateDownloadUpdatesFailed(ModelTypeSet requested_types,
                                   sessions::NudgeTracker* nudge_tracker,
                                   sessions::SyncSession* session);
void SimulateCommitFailed(ModelTypeSet requested_types,
                          sessions::NudgeTracker* nudge_tracker,
                          sessions::SyncSession* session);
void SimulateConnectionFailure(ModelTypeSet requested_types,
                               sessions::NudgeTracker* nudge_tracker,
                               sessions::SyncSession* session);

// Poll successes and failures.
void SimulatePollSuccess(ModelTypeSet requested_types,
                         sessions::SyncSession* session);
void SimulatePollFailed(ModelTypeSet requested_types,
                        sessions::SyncSession* session);

void SimulateGuRetryDelayCommandImpl(sessions::SyncSession* session,
                                     base::TimeDelta delay);

void SimulateThrottledImpl(sessions::SyncSession* session,
    const base::TimeDelta& delta);

void SimulateTypesThrottledImpl(
    sessions::SyncSession* session,
    ModelTypeSet types,
    const base::TimeDelta& delta);

// Works with poll cycles.
void SimulatePollIntervalUpdateImpl(
    ModelTypeSet requested_types,
    sessions::SyncSession* session,
    const base::TimeDelta& new_poll);

// Works with normal cycles.
void SimulateSessionsCommitDelayUpdateImpl(
    ModelTypeSet requested_types,
    sessions::NudgeTracker* nudge_tracker,
    sessions::SyncSession* session,
    const base::TimeDelta& new_delay);

ACTION_P(SimulateThrottled, throttle) {
  SimulateThrottledImpl(arg0, throttle);
}

ACTION_P2(SimulateTypesThrottled, types, throttle) {
  SimulateTypesThrottledImpl(arg0, types, throttle);
}

ACTION_P(SimulatePollIntervalUpdate, poll) {
  SimulatePollIntervalUpdateImpl(arg0, arg1, poll);
}

ACTION_P(SimulateSessionsCommitDelayUpdate, poll) {
  SimulateSessionsCommitDelayUpdateImpl(arg0, arg1, arg2, poll);
}

ACTION_P(SimulateGuRetryDelayCommand, delay) {
  SimulateGuRetryDelayCommandImpl(arg0, delay);
}

}  // namespace test_util
}  // namespace sessions
}  // namespace syncer

#endif  // SYNC_SESSIONS_TEST_UTIL_H_
