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