15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_test_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_backend.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_types.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/sessions/serialized_navigation_entry_test_helper.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/sessions/session_id.h"
14c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "content/public/browser/browser_thread.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_utils.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionServiceTestHelper::SessionServiceTestHelper() {}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionServiceTestHelper::SessionServiceTestHelper(SessionService* service)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : service_(service) {}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionServiceTestHelper::~SessionServiceTestHelper() {}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionServiceTestHelper::PrepareTabInWindow(const SessionID& window_id,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  const SessionID& tab_id,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  int visual_index,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  bool select) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetTabWindow(window_id, tab_id);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetTabIndexInWindow(window_id, tab_id, visual_index);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (select)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetSelectedTabInWindow(window_id, visual_index);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionServiceTestHelper::SetTabExtensionAppID(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SessionID& window_id,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SessionID& tab_id,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_app_id) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetTabExtensionAppID(window_id, tab_id, extension_app_id);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionServiceTestHelper::SetTabUserAgentOverride(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SessionID& window_id,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SessionID& tab_id,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& user_agent_override) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetTabUserAgentOverride(window_id, tab_id, user_agent_override);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionServiceTestHelper::SetForceBrowserNotAliveWithNoWindows(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool force_browser_not_alive_with_no_windows) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->force_browser_not_alive_with_no_windows_ =
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      force_browser_not_alive_with_no_windows;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Be sure and null out service to force closing the file.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionServiceTestHelper::ReadWindows(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<SessionWindow*>* windows,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionID::id_type* active_window_id) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time last_time;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionCommand> read_commands;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  backend()->ReadLastSessionCommandsImpl(&(read_commands.get()));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->RestoreSessionFromCommands(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_commands.get(), windows, active_window_id);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SessionServiceTestHelper::AssertTabEquals(const SessionID& window_id,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const SessionID& tab_id,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int visual_index,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int nav_index,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               size_t nav_count,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const SessionTab& session_tab) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(window_id.id(), session_tab.window_id.id());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(tab_id.id(), session_tab.tab_id.id());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertTabEquals(visual_index, nav_index, nav_count, session_tab);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionServiceTestHelper::AssertTabEquals(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int visual_index,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nav_index,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t nav_count,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SessionTab& session_tab) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(visual_index, session_tab.tab_visual_index);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(nav_index, session_tab.current_navigation_index);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(nav_count, session_tab.navigations.size());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(sky): nuke this and change to call directly into
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// SerializedNavigationEntryTestHelper.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionServiceTestHelper::AssertNavigationEquals(
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const sessions::SerializedNavigationEntry& expected,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const sessions::SerializedNavigationEntry& actual) {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sessions::SerializedNavigationEntryTestHelper::ExpectNavigationEquals(
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected, actual);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SessionServiceTestHelper::AssertSingleWindowWithSingleTab(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<SessionWindow*>& windows,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t nav_count) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, windows[0]->tabs.size());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(nav_count, windows[0]->tabs[0]->navigations.size());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionBackend* SessionServiceTestHelper::backend() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return service_->backend();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
109c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
110c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid SessionServiceTestHelper::SetService(SessionService* service) {
111c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  service_.reset(service);
112c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // Execute IO tasks posted by the SessionService.
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::RunAllBlockingPoolTasksUntilIdle();
114c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
115c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SessionServiceTestHelper::RunTaskOnBackendThread(
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const tracked_objects::Location& from_here,
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::Closure& task) {
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->RunTaskOnBackendThread(from_here, task);
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
121