15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/fake_data_type_controller.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::ModelType;
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace sync_driver {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeDataTypeController::FakeDataTypeController(ModelType type)
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      : DataTypeController(base::MessageLoopProxy::current(), base::Closure()),
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        state_(NOT_RUNNING),
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        model_load_delayed_(false),
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        type_(type),
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ready_for_start_(true) {}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeDataTypeController::~FakeDataTypeController() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOT_RUNNING ->MODEL_LOADED |MODEL_STARTING.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeDataTypeController::LoadModels(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ModelLoadCallback& model_load_callback) {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_load_callback_ = model_load_callback;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ != NOT_RUNNING) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (model_load_delayed_ == false) {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (load_error_.IsSet())
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      state_ = DISABLED;
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      state_ = MODEL_LOADED;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    model_load_callback.Run(type(), load_error_);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = MODEL_STARTING;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeDataTypeController::OnModelLoaded() {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MODEL_LOADED -> MODEL_STARTING.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeDataTypeController::StartAssociating(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const StartCallback& start_callback) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_start_callback_ = start_callback;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = ASSOCIATING;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MODEL_STARTING | ASSOCIATING -> RUNNING | DISABLED | NOT_RUNNING
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (depending on |result|)
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void FakeDataTypeController::FinishStart(ConfigureResult result) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have a callback from Start().
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_start_callback_.is_null()) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set |state_| first below since the callback may call state().
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncer::SyncMergeResult local_merge_result(type());
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncer::SyncMergeResult syncer_merge_result(type());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result <= OK_FIRST_RUN) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = RUNNING;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (result == ASSOCIATION_FAILED) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = DISABLED;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_merge_result.set_error(
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        syncer::SyncError(FROM_HERE,
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          syncer::SyncError::DATATYPE_ERROR,
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          "Association failed",
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          type()));
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else if (result == UNRECOVERABLE_ERROR) {
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    state_ = NOT_RUNNING;
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    local_merge_result.set_error(
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        syncer::SyncError(FROM_HERE,
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                          syncer::SyncError::UNRECOVERABLE_ERROR,
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                          "Unrecoverable error",
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                          type()));
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (result == NEEDS_CRYPTO) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = NOT_RUNNING;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_merge_result.set_error(
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        syncer::SyncError(FROM_HERE,
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          syncer::SyncError::CRYPTO_ERROR,
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          "Crypto error",
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          type()));
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  last_start_callback_.Run(result, local_merge_result, syncer_merge_result);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * -> NOT_RUNNING
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeDataTypeController::Stop() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = NOT_RUNNING;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!model_load_callback_.is_null()) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Real data type controllers run the callback and specify "ABORTED" as an
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // error.  We should probably find a way to use the real code and mock out
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // unnecessary pieces.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SimulateModelLoadFinishing();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ModelType FakeDataTypeController::type() const {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string FakeDataTypeController::name() const {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ModelTypeToString(type_);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelSafeGroup FakeDataTypeController::model_safe_group() const {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::GROUP_PASSIVE;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ChangeProcessor* FakeDataTypeController::GetChangeProcessor() const {
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return NULL;
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DataTypeController::State FakeDataTypeController::state() const {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void FakeDataTypeController::OnSingleDataTypeUnrecoverableError(
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const syncer::SyncError& error) {
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!model_load_callback_.is_null())
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    model_load_callback_.Run(type(), error);
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool FakeDataTypeController::ReadyForStart() const {
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return ready_for_start_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeDataTypeController::SetDelayModelLoad() {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model_load_delayed_ = true;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeDataTypeController::SetModelLoadError(syncer::SyncError error) {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  load_error_ = error;
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeDataTypeController::SimulateModelLoadFinishing() {
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_load_callback_.Run(type(), load_error_);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void FakeDataTypeController::SetReadyForStart(bool ready) {
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ready_for_start_ = ready;
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace sync_driver
154