1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
23f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
33f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// found in the LICENSE file.
43f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
53f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include <string>
63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include <vector>
73f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
93f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/values.h"
103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/browser/sessions/session_types.h"
113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/browser/sync/glue/session_model_associator.h"
123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/common/url_constants.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/page_transition_types.h"
143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "testing/gtest/include/gtest/gtest.h"
153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenusing browser_sync::SessionModelAssociator;
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenusing browser_sync::ForeignSessionTracker;
183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace browser_sync {
193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsentypedef testing::Test SessionModelAssociatorTest;
213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
223f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenTEST_F(SessionModelAssociatorTest, SessionWindowHasNoTabsToSync) {
233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SessionWindow win;
243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(SessionModelAssociator::SessionWindowHasNoTabsToSync(win));
253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_ptr<SessionTab> tab(new SessionTab());
263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  win.tabs.push_back(tab.release());
273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(SessionModelAssociator::SessionWindowHasNoTabsToSync(win));
283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  TabNavigation nav(0, GURL("about:bubba"), GURL("about:referrer"),
293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                    string16(ASCIIToUTF16("title")),
303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                    std::string("state"), 0U);
313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  win.tabs[0]->navigations.push_back(nav);
323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_FALSE(SessionModelAssociator::SessionWindowHasNoTabsToSync(win));
333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
353f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenTEST_F(SessionModelAssociatorTest, IsValidSessionTab) {
363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SessionTab tab;
373f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_FALSE(SessionModelAssociator::IsValidSessionTab(tab));
383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  TabNavigation nav(0, GURL(chrome::kChromeUINewTabURL),
393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                    GURL("about:referrer"),
403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                    string16(ASCIIToUTF16("title")),
413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                    std::string("state"), 0U);
423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  tab.navigations.push_back(nav);
433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // NewTab does not count as valid if it's the only navigation.
443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_FALSE(SessionModelAssociator::IsValidSessionTab(tab));
453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  TabNavigation nav2(0, GURL("about:bubba"),
463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                    GURL("about:referrer"),
473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                    string16(ASCIIToUTF16("title")),
483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                    std::string("state"), 0U);
493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  tab.navigations.push_back(nav2);
503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Once there's another navigation, the tab is valid.
513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(SessionModelAssociator::IsValidSessionTab(tab));
523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
543f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenTEST_F(SessionModelAssociatorTest, PopulateSessionWindow) {
553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  sync_pb::SessionWindow window_s;
563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  window_s.add_tab(0);
573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  window_s.set_browser_type(sync_pb::SessionWindow_BrowserType_TYPE_NORMAL);
583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  window_s.set_selected_tab_index(1);
593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::string tag = "tag";
613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ForeignSessionTracker tracker;
623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ForeignSession* session = tracker.GetForeignSession(tag);
633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SessionWindow* win = new SessionWindow();
643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  session->windows.push_back(win);
653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SessionModelAssociator::PopulateSessionWindowFromSpecifics(
663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      tag, window_s, 0, win, &tracker);
673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1U, win->tabs.size());
683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1, win->selected_tab_index);
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1, win->type);
703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1U, tracker.num_foreign_sessions());
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1U, tracker.num_foreign_tabs(std::string("tag")));
723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // We do this so that when the destructor for the tracker is called, it will
743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // be able to delete the session, window, and tab. We can't delete these
753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // ourselves, otherwise we would run into double free errors when the
763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // destructor was invoked (the true argument tells the tracker the tab
773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // is now associated with a window).
783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(tracker.GetSessionTab(tag, 0, true));
793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
813f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenTEST_F(SessionModelAssociatorTest, PopulateSessionTab) {
823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  sync_pb::SessionTab tab_s;
833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  tab_s.set_tab_visual_index(13);
843f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  tab_s.set_current_navigation_index(3);
853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  tab_s.set_pinned(true);
863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  tab_s.set_extension_app_id("app_id");
873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  sync_pb::TabNavigation* navigation = tab_s.add_navigation();
883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  navigation->set_index(12);
893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  navigation->set_virtual_url("http://foo/1");
903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  navigation->set_referrer("referrer");
913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  navigation->set_title("title");
923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  navigation->set_page_transition(sync_pb::TabNavigation_PageTransition_TYPED);
933f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SessionTab tab;
953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SessionModelAssociator::PopulateSessionTabFromSpecifics(tab_s, 0, &tab);
963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(13, tab.tab_visual_index);
973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(3, tab.current_navigation_index);
983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(tab.pinned);
993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ("app_id", tab.extension_app_id);
1003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(12, tab.navigations[0].index());
1013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(GURL("referrer"), tab.navigations[0].referrer());
1023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(string16(ASCIIToUTF16("title")), tab.navigations[0].title());
1033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(PageTransition::TYPED, tab.navigations[0].transition());
1043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(GURL("http://foo/1"), tab.navigations[0].virtual_url());
1053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
1063f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1073f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenTEST_F(SessionModelAssociatorTest, ForeignSessionTracker) {
1083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  const std::string tag1 = "tag";
1093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  const std::string tag2 = "tag2";
1103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  const std::string tag3 = "tag3";
1113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ForeignSessionTracker tracker;
1123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(tracker.empty());
1133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, tracker.num_foreign_sessions());
1143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, tracker.num_foreign_tabs(tag1));
1153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SessionTab* tab = tracker.GetSessionTab(tag1, 0, false);
1163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1U, tracker.num_foreign_tabs(tag1));
1173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, tracker.num_foreign_sessions());
1183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SessionTab* tab2 = tracker.GetSessionTab(tag1, 0, false);
1193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1U, tracker.num_foreign_tabs(tag1));
1203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, tracker.num_foreign_sessions());
1213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(tab, tab2);
1223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  tab2 = tracker.GetSessionTab(tag2, 0, false);
1233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1U, tracker.num_foreign_tabs(tag1));
1243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(1U, tracker.num_foreign_tabs(tag2));
1253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, tracker.num_foreign_sessions());
1263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_FALSE(tracker.DeleteForeignSession(tag1));
1283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_FALSE(tracker.DeleteForeignSession(tag3));
1293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ForeignSession* session = tracker.GetForeignSession(tag1);
1313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ForeignSession* session2 = tracker.GetForeignSession(tag2);
1323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ForeignSession* session3 = tracker.GetForeignSession(tag3);
1333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(3U, tracker.num_foreign_sessions());
1343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(session);
1363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(session2);
1373f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(session3);
1383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_NE(session, session2);
1393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_NE(session2, session3);
1403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(tracker.DeleteForeignSession(tag3));
1413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(2U, tracker.num_foreign_sessions());
1423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  const SessionTab *tab_ptr;
1443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(tracker.LookupSessionTab(tag1, 0, &tab_ptr));
1453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(tab_ptr, tab);
1463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::vector<SessionWindow*> windows;
1483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(tracker.LookupSessionWindows(tag1, &windows));
1493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, windows.size());
1503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // The sessions don't have valid windows, lookup should not succeed.
1523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::vector<const ForeignSession*> sessions;
1533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_FALSE(tracker.LookupAllForeignSessions(&sessions));
1543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  tracker.clear();
1563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, tracker.num_foreign_tabs(tag1));
1573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, tracker.num_foreign_tabs(tag2));
1583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_EQ(0U, tracker.num_foreign_sessions());
1593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
1603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace browser_sync
1623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
163