15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/bind.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/callback.h"
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/weak_ptr.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/run_loop.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/local_device_info_provider_mock.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/sync_driver/device_info_data_type_controller.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::DataTypeController;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing sync_driver::DeviceInfoDataTypeController;
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace browser_sync {
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class DeviceInfoDataTypeControllerTest : public testing::Test {
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DeviceInfoDataTypeControllerTest()
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : load_finished_(false),
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        thread_bundle_(content::TestBrowserThreadBundle::DEFAULT),
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        weak_ptr_factory_(this),
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        last_type_(syncer::UNSPECIFIED) {}
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~DeviceInfoDataTypeControllerTest() {}
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_device_.reset(new LocalDeviceInfoProviderMock(
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "cache_guid",
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "Wayne Gretzky's Hacking Box",
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "Chromium 10k",
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "Chrome 10k",
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        sync_pb::SyncEnums_DeviceType_TYPE_LINUX,
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "device_id"));
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    controller_ = new DeviceInfoDataTypeController(
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::MessageLoopProxy::current(),
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Closure(),
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        &profile_sync_factory_,
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        local_device_.get());
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    load_finished_ = false;
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_type_ = syncer::UNSPECIFIED;
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_error_ = syncer::SyncError();
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    controller_ = NULL;
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_device_.reset();
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Start() {
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    controller_->LoadModels(
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::Bind(&DeviceInfoDataTypeControllerTest::OnLoadFinished,
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnLoadFinished(syncer::ModelType type, syncer::SyncError error) {
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    load_finished_ = true;
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_type_ = type;
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_error_ = error;
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  testing::AssertionResult LoadResult() {
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!load_finished_) {
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return testing::AssertionFailure() << "OnLoadFinished wasn't called";
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (last_error_.IsSet()) {
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return testing::AssertionFailure()
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             << "OnLoadFinished was called with a SyncError: "
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             << last_error_.ToString();
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (last_type_ != syncer::DEVICE_INFO) {
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return testing::AssertionFailure()
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             << "OnLoadFinished was called with a wrong sync type: "
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             << last_type_;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return testing::AssertionSuccess();
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<DeviceInfoDataTypeController> controller_;
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<LocalDeviceInfoProviderMock> local_device_;
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool load_finished_;
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ProfileSyncComponentsFactoryMock profile_sync_factory_;
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::WeakPtrFactory<DeviceInfoDataTypeControllerTest> weak_ptr_factory_;
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  syncer::ModelType last_type_;
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  syncer::SyncError last_error_;
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoDataTypeControllerTest, StartModels) {
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Start();
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_LOADED, controller_->state());
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(LoadResult());
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoDataTypeControllerTest, StartModelsDelayedByLocalDevice) {
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_->SetInitialized(false);
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Start();
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(load_finished_);
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_STARTING, controller_->state());
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_->SetInitialized(true);
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(DataTypeController::MODEL_LOADED, controller_->state());
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(LoadResult());
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace browser_sync
121