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/chrome_notification_types.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/local_device_info_provider_mock.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/synced_window_delegate.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/sessions/session_data_type_controller.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/sessions/synced_window_delegates_getter.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/notification_service.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace browser_sync {
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MockSyncedWindowDelegate : public SyncedWindowDelegate {
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit MockSyncedWindowDelegate(Profile* profile)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : is_restore_in_progress_(false),
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      profile_(profile) {}
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~MockSyncedWindowDelegate() {}
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool HasWindow() const OVERRIDE { return false; }
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual SessionID::id_type GetSessionId() const OVERRIDE { return 0; }
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int GetTabCount() const OVERRIDE { return 0; }
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int GetActiveIndex() const OVERRIDE { return 0; }
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool IsApp() const OVERRIDE { return false; }
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool IsTypeTabbed() const OVERRIDE { return false; }
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool IsTypePopup() const OVERRIDE { return false; }
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool IsTabPinned(const SyncedTabDelegate* tab) const OVERRIDE {
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual SyncedTabDelegate* GetTabAt(int index) const OVERRIDE { return NULL; }
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual SessionID::id_type GetTabIdAt(int index) const OVERRIDE { return 0; }
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool IsSessionRestoreInProgress() const OVERRIDE {
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return is_restore_in_progress_;
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void SetSessionRestoreInProgress(bool is_restore_in_progress) {
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    is_restore_in_progress_ = is_restore_in_progress;
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!is_restore_in_progress_) {
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::NotificationService::current()->Notify(
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          chrome::NOTIFICATION_SESSION_RESTORE_COMPLETE,
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          content::Source<Profile>(profile_),
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          content::NotificationService::NoDetails());
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool is_restore_in_progress_;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Profile* profile_;
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MockSyncedWindowDelegatesGetter : public SyncedWindowDelegatesGetter {
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual const std::set<SyncedWindowDelegate*>
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetSyncedWindowDelegates() OVERRIDE {
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return delegates_;
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Add(SyncedWindowDelegate* delegate) {
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    delegates_.insert(delegate);
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::set<SyncedWindowDelegate*> delegates_;
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class SessionDataTypeControllerTest
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : public testing::Test {
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SessionDataTypeControllerTest()
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : load_finished_(false),
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        thread_bundle_(content::TestBrowserThreadBundle::DEFAULT),
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        weak_ptr_factory_(this),
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        last_type_(syncer::UNSPECIFIED) {}
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~SessionDataTypeControllerTest() {}
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    synced_window_delegate_.reset(new MockSyncedWindowDelegate(&profile_));
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    synced_window_getter_.reset(new MockSyncedWindowDelegatesGetter());
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    synced_window_getter_->Add(synced_window_delegate_.get());
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_device_.reset(new LocalDeviceInfoProviderMock(
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "cache_guid",
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "Wayne Gretzky's Hacking Box",
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "Chromium 10k",
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "Chrome 10k",
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        sync_pb::SyncEnums_DeviceType_TYPE_LINUX,
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "device_id"));
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    controller_ = new SessionDataTypeController(
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        &profile_sync_factory_,
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        &profile_,
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        synced_window_getter_.get(),
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        local_device_.get());
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    load_finished_ = false;
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_type_ = syncer::UNSPECIFIED;
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_error_ = syncer::SyncError();
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    controller_ = NULL;
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_device_.reset();
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    synced_window_getter_.reset();
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    synced_window_delegate_.reset();
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Start() {
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    controller_->LoadModels(
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&SessionDataTypeControllerTest::OnLoadFinished,
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnLoadFinished(syncer::ModelType type, syncer::SyncError error) {
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    load_finished_ = true;
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_type_ = type;
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_error_ = error;
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  testing::AssertionResult LoadResult() {
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!load_finished_) {
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return testing::AssertionFailure() <<
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "OnLoadFinished wasn't called";
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (last_error_.IsSet()) {
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return testing::AssertionFailure() <<
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "OnLoadFinished was called with a SyncError: " <<
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          last_error_.ToString();
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (last_type_ != syncer::SESSIONS) {
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return testing::AssertionFailure() <<
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "OnLoadFinished was called with a wrong sync type: " <<
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          last_type_;
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return testing::AssertionSuccess();
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<SessionDataTypeController> controller_;
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<MockSyncedWindowDelegatesGetter> synced_window_getter_;
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<LocalDeviceInfoProviderMock> local_device_;
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<MockSyncedWindowDelegate> synced_window_delegate_;
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool load_finished_;
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ProfileSyncComponentsFactoryMock profile_sync_factory_;
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestingProfile profile_;
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::WeakPtrFactory<SessionDataTypeControllerTest> weak_ptr_factory_;
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  syncer::ModelType last_type_;
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  syncer::SyncError last_error_;
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(SessionDataTypeControllerTest, StartModels) {
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Start();
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED,
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(LoadResult());
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(SessionDataTypeControllerTest, StartModelsDelayedByLocalDevice) {
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_->SetInitialized(false);
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Start();
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(load_finished_);
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_STARTING,
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_->SetInitialized(true);
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED,
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(LoadResult());
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(SessionDataTypeControllerTest, StartModelsDelayedByRestoreInProgress) {
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  synced_window_delegate_->SetSessionRestoreInProgress(true);
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Start();
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(load_finished_);
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_STARTING,
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  synced_window_delegate_->SetSessionRestoreInProgress(false);
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED,
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(LoadResult());
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(SessionDataTypeControllerTest,
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       StartModelsDelayedByLocalDeviceThenRestoreInProgress) {
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_->SetInitialized(false);
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  synced_window_delegate_->SetSessionRestoreInProgress(true);
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Start();
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(load_finished_);
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_STARTING,
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_->SetInitialized(true);
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(load_finished_);
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_STARTING,
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  synced_window_delegate_->SetSessionRestoreInProgress(false);
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED,
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(LoadResult());
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(SessionDataTypeControllerTest,
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       StartModelsDelayedByRestoreInProgressThenLocalDevice) {
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_->SetInitialized(false);
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  synced_window_delegate_->SetSessionRestoreInProgress(true);
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Start();
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(load_finished_);
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_STARTING,
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  synced_window_delegate_->SetSessionRestoreInProgress(false);
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(load_finished_);
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_STARTING,
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_->SetInitialized(true);
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(sync_driver::DataTypeController::MODEL_LOADED,
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            controller_->state());
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(LoadResult());
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace browser_sync
245