OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <string> |
| 6 #include <vector> |
| 7 |
| 8 #include "base/scoped_ptr.h" |
| 9 #include "base/values.h" |
| 10 #include "chrome/browser/sessions/session_types.h" |
| 11 #include "chrome/browser/sync/glue/session_model_associator.h" |
| 12 #include "chrome/common/page_transition_types.h" |
| 13 #include "chrome/common/url_constants.h" |
| 14 #include "chrome/test/testing_profile.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 |
| 17 using browser_sync::SessionModelAssociator; |
| 18 using browser_sync::ForeignSessionTracker; |
| 19 namespace browser_sync { |
| 20 |
| 21 typedef testing::Test SessionModelAssociatorTest; |
| 22 |
| 23 TEST_F(SessionModelAssociatorTest, SessionWindowHasNoTabsToSync) { |
| 24 SessionWindow win; |
| 25 ASSERT_TRUE(SessionModelAssociator::SessionWindowHasNoTabsToSync(win)); |
| 26 scoped_ptr<SessionTab> tab(new SessionTab()); |
| 27 win.tabs.push_back(tab.release()); |
| 28 ASSERT_TRUE(SessionModelAssociator::SessionWindowHasNoTabsToSync(win)); |
| 29 TabNavigation nav(0, GURL("about:bubba"), GURL("about:referrer"), |
| 30 string16(ASCIIToUTF16("title")), |
| 31 std::string("state"), 0U); |
| 32 win.tabs[0]->navigations.push_back(nav); |
| 33 ASSERT_FALSE(SessionModelAssociator::SessionWindowHasNoTabsToSync(win)); |
| 34 } |
| 35 |
| 36 TEST_F(SessionModelAssociatorTest, IsValidSessionTab) { |
| 37 SessionTab tab; |
| 38 ASSERT_FALSE(SessionModelAssociator::IsValidSessionTab(tab)); |
| 39 TabNavigation nav(0, GURL(chrome::kChromeUINewTabURL), |
| 40 GURL("about:referrer"), |
| 41 string16(ASCIIToUTF16("title")), |
| 42 std::string("state"), 0U); |
| 43 tab.navigations.push_back(nav); |
| 44 // NewTab does not count as valid if it's the only navigation. |
| 45 ASSERT_FALSE(SessionModelAssociator::IsValidSessionTab(tab)); |
| 46 TabNavigation nav2(0, GURL("about:bubba"), |
| 47 GURL("about:referrer"), |
| 48 string16(ASCIIToUTF16("title")), |
| 49 std::string("state"), 0U); |
| 50 tab.navigations.push_back(nav2); |
| 51 // Once there's another navigation, the tab is valid. |
| 52 ASSERT_TRUE(SessionModelAssociator::IsValidSessionTab(tab)); |
| 53 } |
| 54 |
| 55 TEST_F(SessionModelAssociatorTest, PopulateSessionWindow) { |
| 56 sync_pb::SessionWindow window_s; |
| 57 window_s.add_tab(0); |
| 58 window_s.set_browser_type(sync_pb::SessionWindow_BrowserType_TYPE_NORMAL); |
| 59 window_s.set_selected_tab_index(1); |
| 60 |
| 61 std::string tag = "tag"; |
| 62 ForeignSessionTracker tracker; |
| 63 ForeignSession* session = tracker.GetForeignSession(tag); |
| 64 SessionWindow* win = new SessionWindow(); |
| 65 session->windows.push_back(win); |
| 66 SessionModelAssociator::PopulateSessionWindowFromSpecifics( |
| 67 tag, window_s, 0, win, &tracker); |
| 68 ASSERT_EQ(1U, win->tabs.size()); |
| 69 ASSERT_EQ(1, win->selected_tab_index); |
| 70 ASSERT_EQ(1, win->type); |
| 71 ASSERT_EQ(1U, tracker.num_foreign_sessions()); |
| 72 ASSERT_EQ(1U, tracker.num_foreign_tabs(std::string("tag"))); |
| 73 |
| 74 // We do this so that when the destructor for the tracker is called, it will |
| 75 // be able to delete the session, window, and tab. We can't delete these |
| 76 // ourselves, otherwise we would run into double free errors when the |
| 77 // destructor was invoked (the true argument tells the tracker the tab |
| 78 // is now associated with a window). |
| 79 ASSERT_TRUE(tracker.GetSessionTab(tag, 0, true)); |
| 80 } |
| 81 |
| 82 TEST_F(SessionModelAssociatorTest, PopulateSessionTab) { |
| 83 sync_pb::SessionTab tab_s; |
| 84 tab_s.set_tab_visual_index(13); |
| 85 tab_s.set_current_navigation_index(3); |
| 86 tab_s.set_pinned(true); |
| 87 tab_s.set_extension_app_id("app_id"); |
| 88 sync_pb::TabNavigation* navigation = tab_s.add_navigation(); |
| 89 navigation->set_index(12); |
| 90 navigation->set_virtual_url("http://foo/1"); |
| 91 navigation->set_referrer("referrer"); |
| 92 navigation->set_title("title"); |
| 93 navigation->set_page_transition(sync_pb::TabNavigation_PageTransition_TYPED); |
| 94 |
| 95 SessionTab tab; |
| 96 SessionModelAssociator::PopulateSessionTabFromSpecifics(tab_s, 0, &tab); |
| 97 ASSERT_EQ(13, tab.tab_visual_index); |
| 98 ASSERT_EQ(3, tab.current_navigation_index); |
| 99 ASSERT_TRUE(tab.pinned); |
| 100 ASSERT_EQ("app_id", tab.extension_app_id); |
| 101 ASSERT_EQ(12, tab.navigations[0].index()); |
| 102 ASSERT_EQ(GURL("referrer"), tab.navigations[0].referrer()); |
| 103 ASSERT_EQ(string16(ASCIIToUTF16("title")), tab.navigations[0].title()); |
| 104 ASSERT_EQ(PageTransition::TYPED, tab.navigations[0].transition()); |
| 105 ASSERT_EQ(GURL("http://foo/1"), tab.navigations[0].virtual_url()); |
| 106 } |
| 107 |
| 108 TEST_F(SessionModelAssociatorTest, ForeignSessionTracker) { |
| 109 const std::string tag1 = "tag"; |
| 110 const std::string tag2 = "tag2"; |
| 111 const std::string tag3 = "tag3"; |
| 112 ForeignSessionTracker tracker; |
| 113 ASSERT_TRUE(tracker.empty()); |
| 114 ASSERT_EQ(0U, tracker.num_foreign_sessions()); |
| 115 ASSERT_EQ(0U, tracker.num_foreign_tabs(tag1)); |
| 116 SessionTab* tab = tracker.GetSessionTab(tag1, 0, false); |
| 117 ASSERT_EQ(1U, tracker.num_foreign_tabs(tag1)); |
| 118 ASSERT_EQ(0U, tracker.num_foreign_sessions()); |
| 119 SessionTab* tab2 = tracker.GetSessionTab(tag1, 0, false); |
| 120 ASSERT_EQ(1U, tracker.num_foreign_tabs(tag1)); |
| 121 ASSERT_EQ(0U, tracker.num_foreign_sessions()); |
| 122 ASSERT_EQ(tab, tab2); |
| 123 tab2 = tracker.GetSessionTab(tag2, 0, false); |
| 124 ASSERT_EQ(1U, tracker.num_foreign_tabs(tag1)); |
| 125 ASSERT_EQ(1U, tracker.num_foreign_tabs(tag2)); |
| 126 ASSERT_EQ(0U, tracker.num_foreign_sessions()); |
| 127 |
| 128 ASSERT_FALSE(tracker.DeleteForeignSession(tag1)); |
| 129 ASSERT_FALSE(tracker.DeleteForeignSession(tag3)); |
| 130 |
| 131 ForeignSession* session = tracker.GetForeignSession(tag1); |
| 132 ForeignSession* session2 = tracker.GetForeignSession(tag2); |
| 133 ForeignSession* session3 = tracker.GetForeignSession(tag3); |
| 134 ASSERT_EQ(3U, tracker.num_foreign_sessions()); |
| 135 |
| 136 ASSERT_TRUE(session); |
| 137 ASSERT_TRUE(session2); |
| 138 ASSERT_TRUE(session3); |
| 139 ASSERT_NE(session, session2); |
| 140 ASSERT_NE(session2, session3); |
| 141 ASSERT_TRUE(tracker.DeleteForeignSession(tag3)); |
| 142 ASSERT_EQ(2U, tracker.num_foreign_sessions()); |
| 143 |
| 144 const SessionTab *tab_ptr; |
| 145 ASSERT_TRUE(tracker.LookupSessionTab(tag1, 0, &tab_ptr)); |
| 146 ASSERT_EQ(tab_ptr, tab); |
| 147 |
| 148 std::vector<SessionWindow*> windows; |
| 149 ASSERT_TRUE(tracker.LookupSessionWindows(tag1, &windows)); |
| 150 ASSERT_EQ(0U, windows.size()); |
| 151 |
| 152 // The sessions don't have valid windows, lookup should not succeed. |
| 153 std::vector<const ForeignSession*> sessions; |
| 154 ASSERT_FALSE(tracker.LookupAllForeignSessions(&sessions)); |
| 155 |
| 156 tracker.clear(); |
| 157 ASSERT_EQ(0U, tracker.num_foreign_tabs(tag1)); |
| 158 ASSERT_EQ(0U, tracker.num_foreign_tabs(tag2)); |
| 159 ASSERT_EQ(0U, tracker.num_foreign_sessions()); |
| 160 } |
| 161 |
| 162 } // namespace browser_sync |
| 163 |
OLD | NEW |