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