OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 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/memory/scoped_ptr.h" |
| 9 #include "base/rand_util.h" |
| 10 #include "base/utf_string_conversions.h" |
| 11 #include "chrome/browser/sessions/session_types.h" |
| 12 #include "chrome/browser/sync/glue/synced_session_tracker.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 |
| 15 namespace browser_sync { |
| 16 |
| 17 typedef testing::Test SyncedSessionTrackerTest; |
| 18 |
| 19 TEST_F(SyncedSessionTrackerTest, GetSession) { |
| 20 SyncedSessionTracker tracker; |
| 21 SyncedSession* session1 = tracker.GetSession("tag"); |
| 22 SyncedSession* session2 = tracker.GetSession("tag2"); |
| 23 ASSERT_EQ(session1, tracker.GetSession("tag")); |
| 24 ASSERT_NE(session1, session2); |
| 25 // Should clean up memory on it's own. |
| 26 } |
| 27 |
| 28 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) { |
| 29 SyncedSessionTracker tracker; |
| 30 SessionTab* tab = tracker.GetTab("tag", 0); |
| 31 ASSERT_EQ(tab, tracker.GetTab("tag", 0)); |
| 32 // Should clean up memory on it's own. |
| 33 } |
| 34 |
| 35 TEST_F(SyncedSessionTrackerTest, PutWindowInSession) { |
| 36 SyncedSessionTracker tracker; |
| 37 tracker.PutWindowInSession("tag", 0); |
| 38 SyncedSession* session = tracker.GetSession("tag"); |
| 39 ASSERT_EQ(1U, session->windows.size()); |
| 40 // Should clean up memory on it's own. |
| 41 } |
| 42 |
| 43 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { |
| 44 SyncedSessionTracker tracker; |
| 45 tracker.PutWindowInSession("tag", 10); |
| 46 tracker.PutTabInWindow("tag", 10, 15, 0); // win id 10, tab id 15, tab ind 0. |
| 47 SyncedSession* session = tracker.GetSession("tag"); |
| 48 ASSERT_EQ(1U, session->windows.size()); |
| 49 ASSERT_EQ(1U, session->windows[10]->tabs.size()); |
| 50 ASSERT_EQ(tracker.GetTab("tag", 15), session->windows[10]->tabs[0]); |
| 51 // Should clean up memory on it's own. |
| 52 } |
| 53 |
| 54 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { |
| 55 SyncedSessionTracker tracker; |
| 56 std::vector<const SyncedSession*> sessions; |
| 57 ASSERT_FALSE(tracker.LookupAllForeignSessions(&sessions)); |
| 58 tracker.GetSession("tag1"); |
| 59 tracker.GetSession("tag2"); |
| 60 tracker.PutWindowInSession("tag1", 0); |
| 61 tracker.PutTabInWindow("tag1", 0, 15, 0); |
| 62 SessionTab* tab = tracker.GetTab("tag1", 15); |
| 63 ASSERT_TRUE(tab); |
| 64 tab->navigations.push_back(TabNavigation( |
| 65 0, GURL("valid_url"), GURL("referrer"), |
| 66 string16(ASCIIToUTF16("title")), |
| 67 std::string("state"), 0U)); |
| 68 ASSERT_TRUE(tracker.LookupAllForeignSessions(&sessions)); |
| 69 // Only the session with a valid window and tab gets returned. |
| 70 ASSERT_EQ(1U, sessions.size()); |
| 71 ASSERT_EQ("tag1", sessions[0]->session_tag); |
| 72 } |
| 73 |
| 74 TEST_F(SyncedSessionTrackerTest, LookupSessionWindows) { |
| 75 SyncedSessionTracker tracker; |
| 76 std::vector<const SessionWindow*> windows; |
| 77 ASSERT_FALSE(tracker.LookupSessionWindows("tag1", &windows)); |
| 78 tracker.GetSession("tag1"); |
| 79 tracker.PutWindowInSession("tag1", 0); |
| 80 tracker.PutWindowInSession("tag1", 2); |
| 81 tracker.GetSession("tag2"); |
| 82 tracker.PutWindowInSession("tag2", 0); |
| 83 tracker.PutWindowInSession("tag2", 2); |
| 84 ASSERT_TRUE(tracker.LookupSessionWindows("tag1", &windows)); |
| 85 ASSERT_EQ(2U, windows.size()); // Only windows from tag1 session. |
| 86 ASSERT_NE((SessionWindow*)NULL, windows[0]); |
| 87 ASSERT_NE((SessionWindow*)NULL, windows[1]); |
| 88 ASSERT_NE(windows[1], windows[0]); |
| 89 } |
| 90 |
| 91 TEST_F(SyncedSessionTrackerTest, LookupSessionTab) { |
| 92 SyncedSessionTracker tracker; |
| 93 const SessionTab* tab; |
| 94 ASSERT_FALSE(tracker.LookupSessionTab("tag1", 5, &tab)); |
| 95 tracker.GetSession("tag1"); |
| 96 tracker.PutWindowInSession("tag1", 0); |
| 97 tracker.PutTabInWindow("tag1", 0, 5, 0); |
| 98 ASSERT_TRUE(tracker.LookupSessionTab("tag1", 5, &tab)); |
| 99 ASSERT_NE((SessionTab*)NULL, tab); |
| 100 } |
| 101 |
| 102 TEST_F(SyncedSessionTrackerTest, Complex) { |
| 103 const std::string tag1 = "tag"; |
| 104 const std::string tag2 = "tag2"; |
| 105 const std::string tag3 = "tag3"; |
| 106 SyncedSessionTracker tracker; |
| 107 std::vector<SessionTab*> tabs1, tabs2; |
| 108 SessionTab* temp_tab; |
| 109 ASSERT_TRUE(tracker.Empty()); |
| 110 ASSERT_EQ(0U, tracker.num_synced_sessions()); |
| 111 ASSERT_EQ(0U, tracker.num_synced_tabs(tag1)); |
| 112 tabs1.push_back(tracker.GetTab(tag1, 0)); |
| 113 tabs1.push_back(tracker.GetTab(tag1, 1)); |
| 114 tabs1.push_back(tracker.GetTab(tag1, 2)); |
| 115 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1)); |
| 116 ASSERT_EQ(0U, tracker.num_synced_sessions()); |
| 117 temp_tab = tracker.GetTab(tag1, 0); // Already created. |
| 118 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1)); |
| 119 ASSERT_EQ(0U, tracker.num_synced_sessions()); |
| 120 ASSERT_EQ(tabs1[0], temp_tab); |
| 121 tabs2.push_back(tracker.GetTab(tag2, 0)); |
| 122 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2)); |
| 123 ASSERT_EQ(0U, tracker.num_synced_sessions()); |
| 124 |
| 125 ASSERT_FALSE(tracker.DeleteSession(tag1)); |
| 126 ASSERT_FALSE(tracker.DeleteSession(tag3)); |
| 127 |
| 128 SyncedSession* session = tracker.GetSession(tag1); |
| 129 SyncedSession* session2 = tracker.GetSession(tag2); |
| 130 SyncedSession* session3 = tracker.GetSession(tag3); |
| 131 ASSERT_EQ(3U, tracker.num_synced_sessions()); |
| 132 |
| 133 ASSERT_TRUE(session); |
| 134 ASSERT_TRUE(session2); |
| 135 ASSERT_TRUE(session3); |
| 136 ASSERT_NE(session, session2); |
| 137 ASSERT_NE(session2, session3); |
| 138 ASSERT_TRUE(tracker.DeleteSession(tag3)); |
| 139 ASSERT_EQ(2U, tracker.num_synced_sessions()); |
| 140 |
| 141 tracker.PutWindowInSession(tag1, 0); // Create a window. |
| 142 tracker.PutTabInWindow(tag1, 0, 2, 0); // No longer unmapped. |
| 143 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1)); // Has not changed. |
| 144 |
| 145 const SessionTab *tab_ptr; |
| 146 ASSERT_TRUE(tracker.LookupSessionTab(tag1, 0, &tab_ptr)); |
| 147 ASSERT_EQ(tab_ptr, tabs1[0]); |
| 148 ASSERT_TRUE(tracker.LookupSessionTab(tag1, 2, &tab_ptr)); |
| 149 ASSERT_EQ(tab_ptr, tabs1[2]); |
| 150 ASSERT_FALSE(tracker.LookupSessionTab(tag1, 3, &tab_ptr)); |
| 151 ASSERT_EQ(static_cast<const SessionTab*>(NULL), tab_ptr); |
| 152 |
| 153 std::vector<const SessionWindow*> windows; |
| 154 ASSERT_TRUE(tracker.LookupSessionWindows(tag1, &windows)); |
| 155 ASSERT_EQ(1U, windows.size()); |
| 156 ASSERT_TRUE(tracker.LookupSessionWindows(tag2, &windows)); |
| 157 ASSERT_EQ(0U, windows.size()); |
| 158 |
| 159 // The sessions don't have valid tabs, lookup should not succeed. |
| 160 std::vector<const SyncedSession*> sessions; |
| 161 ASSERT_FALSE(tracker.LookupAllForeignSessions(&sessions)); |
| 162 |
| 163 tracker.Clear(); |
| 164 ASSERT_EQ(0U, tracker.num_synced_tabs(tag1)); |
| 165 ASSERT_EQ(0U, tracker.num_synced_tabs(tag2)); |
| 166 ASSERT_EQ(0U, tracker.num_synced_sessions()); |
| 167 } |
| 168 |
| 169 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) { |
| 170 SyncedSessionTracker tracker; |
| 171 ASSERT_TRUE(tracker.Empty()); |
| 172 const int kMaxSessions = 10; |
| 173 const int kMaxTabs = 1000; |
| 174 const int kMaxAttempts = 10000; |
| 175 for (int j=0; j<kMaxSessions; ++j) { |
| 176 std::string tag = "tag" + j; |
| 177 for (int i=0; i<kMaxAttempts; ++i) { |
| 178 // More attempts than tabs means we'll sometimes get the same tabs, |
| 179 // sometimes have to allocate new tabs. |
| 180 int rand_tab_num = base::RandInt(0, kMaxTabs); |
| 181 SessionTab* tab = tracker.GetTab(tag, rand_tab_num); |
| 182 ASSERT_TRUE(tab); |
| 183 } |
| 184 } |
| 185 } |
| 186 |
| 187 TEST_F(SyncedSessionTrackerTest, SessionTracking) { |
| 188 SyncedSessionTracker tracker; |
| 189 ASSERT_TRUE(tracker.Empty()); |
| 190 std::string tag1 = "tag1"; |
| 191 std::string tag2 = "tag2"; |
| 192 |
| 193 // Create some session information that is stale. |
| 194 SyncedSession* session1= tracker.GetSession(tag1); |
| 195 tracker.PutWindowInSession(tag1, 0); |
| 196 tracker.PutTabInWindow(tag1, 0, 0, 0); |
| 197 tracker.PutTabInWindow(tag1, 0, 1, 1); |
| 198 tracker.GetTab(tag1, 2)->window_id.set_id(0); // Will be an unmapped tab. |
| 199 tracker.GetTab(tag1, 3)->window_id.set_id(0); // Will be an unmapped tab. |
| 200 tracker.PutWindowInSession(tag1, 1); |
| 201 tracker.PutTabInWindow(tag1, 1, 4, 0); |
| 202 tracker.PutTabInWindow(tag1, 1, 5, 1); |
| 203 ASSERT_EQ(2U, session1->windows.size()); |
| 204 ASSERT_EQ(2U, session1->windows[0]->tabs.size()); |
| 205 ASSERT_EQ(2U, session1->windows[1]->tabs.size()); |
| 206 ASSERT_EQ(6U, tracker.num_synced_tabs(tag1)); |
| 207 |
| 208 // Create a session that should not be affected. |
| 209 SyncedSession* session2 = tracker.GetSession(tag2); |
| 210 tracker.PutWindowInSession(tag2, 2); |
| 211 tracker.PutTabInWindow(tag2, 2, 1, 0); |
| 212 ASSERT_EQ(1U, session2->windows.size()); |
| 213 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); |
| 214 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2)); |
| 215 |
| 216 // Reset tracking and get the current windows/tabs. |
| 217 // We simulate moving a tab from one window to another, then closing the first |
| 218 // window (including it's one remaining tab), and opening a new tab on the |
| 219 // remaining window. |
| 220 tracker.GetTab(tag1, 6); // New tab, arrived before meta node so unmapped. |
| 221 tracker.ResetSessionTracking(tag1); |
| 222 tracker.PutWindowInSession(tag1, 0); |
| 223 tracker.PutTabInWindow(tag1, 0, 0, 0); |
| 224 // Tab 1 is closed. |
| 225 tracker.PutTabInWindow(tag1, 0, 2, 1); // No longer unmapped. |
| 226 // Tab 3 was unmapped and does not get used. |
| 227 tracker.PutTabInWindow(tag1, 0, 4, 2); // Moved from window 1. |
| 228 // Window 1 was closed, along with tab 5. |
| 229 tracker.PutTabInWindow(tag1, 0, 6, 3); // No longer unmapped. |
| 230 // Session 2 should not be affected. |
| 231 tracker.CleanupSession(tag1); |
| 232 |
| 233 // Verify that only those parts of the session not owned have been removed. |
| 234 ASSERT_EQ(1U, session1->windows.size()); |
| 235 ASSERT_EQ(4U, session1->windows[0]->tabs.size()); |
| 236 ASSERT_EQ(1U, session2->windows.size()); |
| 237 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); |
| 238 ASSERT_EQ(2U, tracker.num_synced_sessions()); |
| 239 ASSERT_EQ(4U, tracker.num_synced_tabs(tag1)); |
| 240 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2)); |
| 241 |
| 242 // All memory should be properly deallocated by destructor for the |
| 243 // SyncedSessionTracker. |
| 244 } |
| 245 |
| 246 } // namespace browser_sync |
OLD | NEW |