13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/api/sessions/sessions_api.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/command_line.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/path_service.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/strings/stringprintf.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/api/tabs/tabs_api.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/local_device_info_provider_mock.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/open_tabs_ui_delegate.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_mock.h"
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "sync/api/attachments/attachment_id.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/api/fake_sync_change_processor.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/api/sync_error_factory_mock.h"
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h"
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/chromeos_switches.h"
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace utils = extension_function_test_utils;
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace extensions {
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// If more sessions are added to session tags, num sessions should be updated.
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char* kSessionTags[] = {"tag0", "tag1", "tag2", "tag3", "tag4"};
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const size_t kNumSessions = 5;
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BuildSessionSpecifics(const std::string& tag,
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           sync_pb::SessionSpecifics* meta) {
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  meta->set_session_tag(tag);
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  sync_pb::SessionHeader* header = meta->mutable_header();
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  header->set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_LINUX);
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  header->set_client_name(tag);
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BuildWindowSpecifics(int window_id,
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          const std::vector<int>& tab_list,
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          sync_pb::SessionSpecifics* meta) {
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  sync_pb::SessionHeader* header = meta->mutable_header();
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  sync_pb::SessionWindow* window = header->add_window();
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  window->set_window_id(window_id);
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  window->set_selected_tab_index(0);
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  window->set_browser_type(sync_pb::SessionWindow_BrowserType_TYPE_TABBED);
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (std::vector<int>::const_iterator iter = tab_list.begin();
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)       iter != tab_list.end(); ++iter) {
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    window->add_tab(*iter);
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BuildTabSpecifics(const std::string& tag, int window_id, int tab_id,
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                       sync_pb::SessionSpecifics* tab_base) {
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  tab_base->set_session_tag(tag);
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  tab_base->set_tab_node_id(0);
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  sync_pb::SessionTab* tab = tab_base->mutable_tab();
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  tab->set_tab_id(tab_id);
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  tab->set_tab_visual_index(1);
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  tab->set_current_navigation_index(0);
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  tab->set_pinned(true);
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  tab->set_extension_app_id("app_id");
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  sync_pb::TabNavigation* navigation = tab->add_navigation();
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  navigation->set_virtual_url("http://foo/1");
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  navigation->set_referrer("referrer");
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  navigation->set_title("title");
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  navigation->set_page_transition(sync_pb::SyncEnums_PageTransition_TYPED);
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ExtensionSessionsTest : public InProcessBrowserTest {
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE;
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected:
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static KeyedService* BuildProfileSyncService(
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::BrowserContext* profile);
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void CreateTestProfileSyncService();
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void CreateTestExtension();
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void CreateSessionModels();
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  template <class T>
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<T> CreateFunction(bool has_callback) {
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_refptr<T> fn(new T());
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    fn->set_extension(extension_.get());
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    fn->set_has_callback(has_callback);
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return fn;
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Browser* browser_;
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<extensions::Extension> extension_;
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ExtensionSessionsTest::SetUpCommandLine(CommandLine* command_line) {
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  command_line->AppendSwitch(
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      chromeos::switches::kIgnoreUserProfileMappingForTests);
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ExtensionSessionsTest::SetUpOnMainThread() {
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CreateTestProfileSyncService();
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CreateTestExtension();
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)KeyedService* ExtensionSessionsTest::BuildProfileSyncService(
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    content::BrowserContext* profile) {
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ProfileSyncComponentsFactoryMock* factory =
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new ProfileSyncComponentsFactoryMock();
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  factory->SetLocalDeviceInfoProvider(
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<sync_driver::LocalDeviceInfoProvider>(
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          new browser_sync::LocalDeviceInfoProviderMock(
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              kSessionTags[0],
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              "machine name",
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              "Chromium 10k",
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              "Chrome 10k",
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              sync_pb::SyncEnums_DeviceType_TYPE_LINUX,
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              "device_id")));
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return new ProfileSyncServiceMock(
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      scoped_ptr<ProfileSyncComponentsFactory>(factory),
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      static_cast<Profile*>(profile));
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ExtensionSessionsTest::CreateTestProfileSyncService() {
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath path;
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  PathService::Get(chrome::DIR_USER_DATA, &path);
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  path = path.AppendASCII("test_profile");
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!base::PathExists(path))
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    CHECK(base::CreateDirectory(path));
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Profile* profile =
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  profile_manager->RegisterTestingProfile(profile, true, false);
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ProfileSyncServiceMock* service = static_cast<ProfileSyncServiceMock*>(
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      profile, &ExtensionSessionsTest::BuildProfileSyncService));
155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  browser_ = new Browser(Browser::CreateParams(
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      profile, chrome::HOST_DESKTOP_TYPE_NATIVE));
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  syncer::ModelTypeSet preferred_types;
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  preferred_types.Put(syncer::SESSIONS);
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GoogleServiceAuthError no_error(GoogleServiceAuthError::NONE);
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ON_CALL(*service, IsDataTypeControllerRunning(syncer::SESSIONS))
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .WillByDefault(testing::Return(true));
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ON_CALL(*service, GetRegisteredDataTypes())
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillByDefault(testing::Return(syncer::UserTypes()));
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ON_CALL(*service, GetPreferredDataTypes()).WillByDefault(
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      testing::Return(preferred_types));
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_CALL(*service, GetAuthError()).WillRepeatedly(
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      testing::ReturnRef(no_error));
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ON_CALL(*service, GetActiveDataTypes()).WillByDefault(
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      testing::Return(preferred_types));
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_CALL(*service, AddObserver(testing::_)).Times(testing::AnyNumber());
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_CALL(*service, RemoveObserver(testing::_)).Times(testing::AnyNumber());
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  service->Initialize();
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ExtensionSessionsTest::CreateTestExtension() {
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> test_extension_value(
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      utils::ParseDictionary(
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "{\"name\": \"Test\", \"version\": \"1.0\", "
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "\"permissions\": [\"sessions\", \"tabs\"]}"));
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  extension_ = utils::CreateExtension(test_extension_value.get());
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void ExtensionSessionsTest::CreateSessionModels() {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syncer::SyncDataList initial_data;
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (size_t index = 0; index < kNumSessions; ++index) {
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Fill an instance of session specifics with a foreign session's data.
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    sync_pb::SessionSpecifics meta;
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    BuildSessionSpecifics(kSessionTags[index], &meta);
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    SessionID::id_type tab_nums1[] = {5, 10, 13, 17};
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::vector<SessionID::id_type> tab_list1(
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        tab_nums1, tab_nums1 + arraysize(tab_nums1));
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    BuildWindowSpecifics(index, tab_list1, &meta);
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::vector<sync_pb::SessionSpecifics> tabs1;
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    tabs1.resize(tab_list1.size());
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    for (size_t i = 0; i < tab_list1.size(); ++i) {
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      BuildTabSpecifics(kSessionTags[index], 0, tab_list1[i], &tabs1[i]);
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    sync_pb::EntitySpecifics entity;
2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    entity.mutable_session()->CopyFrom(meta);
2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    initial_data.push_back(syncer::SyncData::CreateRemoteData(
2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        1,
2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        entity,
2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        base::Time(),
2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        syncer::AttachmentIdList(),
2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        syncer::AttachmentServiceProxyForTest::Create()));
2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    for (size_t i = 0; i < tabs1.size(); i++) {
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      sync_pb::EntitySpecifics entity;
2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      entity.mutable_session()->CopyFrom(tabs1[i]);
213a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      initial_data.push_back(syncer::SyncData::CreateRemoteData(
2140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          i + 2,
215a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          entity,
216a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          base::Time(),
217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          syncer::AttachmentIdList(),
218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          syncer::AttachmentServiceProxyForTest::Create()));
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ProfileSyncServiceFactory::GetForProfile(browser_->profile())->
2230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      GetSessionsSyncableService()->
2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          MergeDataAndStartSyncing(syncer::SESSIONS, initial_data,
2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<syncer::SyncChangeProcessor>(
2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          new syncer::FakeSyncChangeProcessor()),
2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<syncer::SyncErrorFactory>(
2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          new syncer::SyncErrorFactoryMock()));
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, GetDevices) {
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CreateSessionModels();
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<base::ListValue> result(utils::ToList(
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      utils::RunFunctionAndReturnSingleResult(
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          CreateFunction<SessionsGetDevicesFunction>(true).get(),
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "[{\"maxResults\": 0}]",
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          browser_)));
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(result);
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* devices = result.get();
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(5u, devices->GetSize());
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* device = NULL;
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* sessions = NULL;
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (size_t i = 0; i < devices->GetSize(); ++i) {
2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(devices->GetDictionary(i, &device));
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(kSessionTags[i], utils::GetString(device, "info"));
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(kSessionTags[i], utils::GetString(device, "deviceName"));
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(device->GetList("sessions", &sessions));
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(0u, sessions->GetSize());
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, GetDevicesMaxResults) {
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CreateSessionModels();
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<base::ListValue> result(utils::ToList(
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      utils::RunFunctionAndReturnSingleResult(
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          CreateFunction<SessionsGetDevicesFunction>(true).get(),
2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "[]",
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          browser_)));
2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(result);
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* devices = result.get();
2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(5u, devices->GetSize());
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* device = NULL;
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* sessions = NULL;
2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (size_t i = 0; i < devices->GetSize(); ++i) {
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(devices->GetDictionary(i, &device));
2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(kSessionTags[i], utils::GetString(device, "info"));
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(kSessionTags[i], utils::GetString(device, "deviceName"));
2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(device->GetList("sessions", &sessions));
2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(1u, sessions->GetSize());
2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, GetDevicesListEmpty) {
2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<base::ListValue> result(utils::ToList(
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      utils::RunFunctionAndReturnSingleResult(
2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          CreateFunction<SessionsGetDevicesFunction>(true).get(),
2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "[]",
2803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          browser_)));
2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(result);
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* devices = result.get();
2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0u, devices->GetSize());
2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
287424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Flaky timeout: http://crbug.com/278372
288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionSessionsTest,
289424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                       DISABLED_RestoreForeignSessionWindow) {
2903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CreateSessionModels();
2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> restored_window_session(utils::ToDictionary(
2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      utils::RunFunctionAndReturnSingleResult(
2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          CreateFunction<SessionsRestoreFunction>(true).get(),
2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "[\"tag3.3\"]",
2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          browser_,
2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          utils::INCLUDE_INCOGNITO)));
2983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(restored_window_session);
2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<base::ListValue> result(utils::ToList(
3013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      utils::RunFunctionAndReturnSingleResult(
3023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          CreateFunction<WindowsGetAllFunction>(true).get(),
3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "[]",
3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          browser_)));
3053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(result);
3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* windows = result.get();
3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2u, windows->GetSize());
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* restored_window = NULL;
3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(restored_window_session->GetDictionary("window",
3113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                                     &restored_window));
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* window = NULL;
3133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int restored_id = utils::GetInteger(restored_window, "id");
3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (size_t i = 0; i < windows->GetSize(); ++i) {
3153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(windows->GetDictionary(i, &window));
3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (utils::GetInteger(window, "id") == restored_id)
3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      break;
3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(restored_id, utils::GetInteger(window, "id"));
3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, RestoreForeignSessionInvalidId) {
3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CreateSessionModels();
3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(MatchPattern(utils::RunFunctionAndReturnError(
3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CreateFunction<SessionsRestoreFunction>(true).get(),
3273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "[\"tag3.0\"]",
3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      browser_), "Invalid session id: \"tag3.0\"."));
3293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
331effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, RestoreInIncognito) {
332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CreateSessionModels();
333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(MatchPattern(utils::RunFunctionAndReturnError(
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      CreateFunction<SessionsRestoreFunction>(true).get(),
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "[\"1\"]",
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      CreateIncognitoBrowser()),
338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "Can not restore sessions in incognito mode."));
339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
341effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, GetRecentlyClosedIncognito) {
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<base::ListValue> result(utils::ToList(
343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      utils::RunFunctionAndReturnSingleResult(
344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          CreateFunction<SessionsGetRecentlyClosedFunction>(true).get(),
345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          "[]",
346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          CreateIncognitoBrowser())));
347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(result);
348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::ListValue* sessions = result.get();
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0u, sessions->GetSize());
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Flaky on ChromeOS, times out on OSX Debug http://crbug.com/251199
3533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_CHROMEOS) || (defined(OS_MACOSX) && !defined(NDEBUG))
3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define MAYBE_SessionsApis DISABLED_SessionsApis
3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#else
3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define MAYBE_SessionsApis SessionsApis
3573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_SessionsApis) {
3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_WIN) && defined(USE_ASH)
3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("sessions",
3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  "sessions.html")) << message_;
3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace extensions
370