| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/sync_sessions/synced_session_tracker.h" | 5 #include "components/sync_sessions/synced_session_tracker.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" | 13 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" |
| 14 #include "components/sessions/core/session_types.h" | 14 #include "components/sessions/core/session_types.h" |
| 15 #include "components/sync_sessions/fake_sync_sessions_client.h" | 15 #include "components/sync_sessions/fake_sync_sessions_client.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 namespace browser_sync { | 18 namespace sync_sessions { |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 const char kValidUrl[] = "http://www.example.com"; | 22 const char kValidUrl[] = "http://www.example.com"; |
| 23 const char kInvalidUrl[] = "invalid.url"; | 23 const char kInvalidUrl[] = "invalid.url"; |
| 24 | 24 |
| 25 } // namespace | 25 } // namespace |
| 26 | 26 |
| 27 class SyncedSessionTrackerTest : public testing::Test { | 27 class SyncedSessionTrackerTest : public testing::Test { |
| 28 public: | 28 public: |
| 29 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {} | 29 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {} |
| 30 ~SyncedSessionTrackerTest() override {} | 30 ~SyncedSessionTrackerTest() override {} |
| 31 | 31 |
| 32 SyncedSessionTracker* GetTracker() { return &tracker_; } | 32 SyncedSessionTracker* GetTracker() { return &tracker_; } |
| 33 | 33 |
| 34 private: | 34 private: |
| 35 sync_sessions::FakeSyncSessionsClient sessions_client_; | 35 FakeSyncSessionsClient sessions_client_; |
| 36 SyncedSessionTracker tracker_; | 36 SyncedSessionTracker tracker_; |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 TEST_F(SyncedSessionTrackerTest, GetSession) { | 39 TEST_F(SyncedSessionTrackerTest, GetSession) { |
| 40 sync_driver::SyncedSession* session1 = GetTracker()->GetSession("tag"); | 40 SyncedSession* session1 = GetTracker()->GetSession("tag"); |
| 41 sync_driver::SyncedSession* session2 = GetTracker()->GetSession("tag2"); | 41 SyncedSession* session2 = GetTracker()->GetSession("tag2"); |
| 42 ASSERT_EQ(session1, GetTracker()->GetSession("tag")); | 42 ASSERT_EQ(session1, GetTracker()->GetSession("tag")); |
| 43 ASSERT_NE(session1, session2); | 43 ASSERT_NE(session1, session2); |
| 44 // Should clean up memory on its own. | 44 // Should clean up memory on its own. |
| 45 } | 45 } |
| 46 | 46 |
| 47 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) { | 47 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) { |
| 48 sessions::SessionTab* tab = GetTracker()->GetTab("tag", 0, 0); | 48 sessions::SessionTab* tab = GetTracker()->GetTab("tag", 0, 0); |
| 49 ASSERT_EQ(tab, GetTracker()->GetTab("tag", 0, 0)); | 49 ASSERT_EQ(tab, GetTracker()->GetTab("tag", 0, 0)); |
| 50 // Should clean up memory on its own. | 50 // Should clean up memory on its own. |
| 51 } | 51 } |
| 52 | 52 |
| 53 TEST_F(SyncedSessionTrackerTest, PutWindowInSession) { | 53 TEST_F(SyncedSessionTrackerTest, PutWindowInSession) { |
| 54 GetTracker()->PutWindowInSession("tag", 0); | 54 GetTracker()->PutWindowInSession("tag", 0); |
| 55 sync_driver::SyncedSession* session = GetTracker()->GetSession("tag"); | 55 SyncedSession* session = GetTracker()->GetSession("tag"); |
| 56 ASSERT_EQ(1U, session->windows.size()); | 56 ASSERT_EQ(1U, session->windows.size()); |
| 57 // Should clean up memory on its own. | 57 // Should clean up memory on its own. |
| 58 } | 58 } |
| 59 | 59 |
| 60 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { | 60 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { |
| 61 GetTracker()->PutWindowInSession("tag", 10); | 61 GetTracker()->PutWindowInSession("tag", 10); |
| 62 GetTracker()->PutTabInWindow("tag", 10, 15, | 62 GetTracker()->PutTabInWindow("tag", 10, 15, |
| 63 0); // win id 10, tab id 15, tab ind 0. | 63 0); // win id 10, tab id 15, tab ind 0. |
| 64 sync_driver::SyncedSession* session = GetTracker()->GetSession("tag"); | 64 SyncedSession* session = GetTracker()->GetSession("tag"); |
| 65 ASSERT_EQ(1U, session->windows.size()); | 65 ASSERT_EQ(1U, session->windows.size()); |
| 66 ASSERT_EQ(1U, session->windows[10]->tabs.size()); | 66 ASSERT_EQ(1U, session->windows[10]->tabs.size()); |
| 67 ASSERT_EQ(GetTracker()->GetTab("tag", 15, 1), session->windows[10]->tabs[0]); | 67 ASSERT_EQ(GetTracker()->GetTab("tag", 15, 1), session->windows[10]->tabs[0]); |
| 68 // Should clean up memory on its own. | 68 // Should clean up memory on its own. |
| 69 } | 69 } |
| 70 | 70 |
| 71 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { | 71 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { |
| 72 std::vector<const sync_driver::SyncedSession*> sessions; | 72 std::vector<const SyncedSession*> sessions; |
| 73 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( | 73 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( |
| 74 &sessions, SyncedSessionTracker::PRESENTABLE)); | 74 &sessions, SyncedSessionTracker::PRESENTABLE)); |
| 75 GetTracker()->GetSession("tag1"); | 75 GetTracker()->GetSession("tag1"); |
| 76 GetTracker()->PutWindowInSession("tag1", 0); | 76 GetTracker()->PutWindowInSession("tag1", 0); |
| 77 GetTracker()->PutTabInWindow("tag1", 0, 15, 0); | 77 GetTracker()->PutTabInWindow("tag1", 0, 15, 0); |
| 78 sessions::SessionTab* tab = GetTracker()->GetTab("tag1", 15, 1); | 78 sessions::SessionTab* tab = GetTracker()->GetTab("tag1", 15, 1); |
| 79 ASSERT_TRUE(tab); | 79 ASSERT_TRUE(tab); |
| 80 tab->navigations.push_back( | 80 tab->navigations.push_back( |
| 81 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(kValidUrl, | 81 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(kValidUrl, |
| 82 "title")); | 82 "title")); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 ASSERT_EQ(1U, GetTracker()->num_synced_sessions()); | 142 ASSERT_EQ(1U, GetTracker()->num_synced_sessions()); |
| 143 temp_tab = GetTracker()->GetTab(tag1, 0, 0); // Already created. | 143 temp_tab = GetTracker()->GetTab(tag1, 0, 0); // Already created. |
| 144 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); | 144 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); |
| 145 ASSERT_EQ(1U, GetTracker()->num_synced_sessions()); | 145 ASSERT_EQ(1U, GetTracker()->num_synced_sessions()); |
| 146 ASSERT_EQ(tabs1[0], temp_tab); | 146 ASSERT_EQ(tabs1[0], temp_tab); |
| 147 tabs2.push_back(GetTracker()->GetTab(tag2, 0, 0)); | 147 tabs2.push_back(GetTracker()->GetTab(tag2, 0, 0)); |
| 148 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); | 148 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); |
| 149 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); | 149 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); |
| 150 ASSERT_FALSE(GetTracker()->DeleteSession(tag3)); | 150 ASSERT_FALSE(GetTracker()->DeleteSession(tag3)); |
| 151 | 151 |
| 152 sync_driver::SyncedSession* session = GetTracker()->GetSession(tag1); | 152 SyncedSession* session = GetTracker()->GetSession(tag1); |
| 153 sync_driver::SyncedSession* session2 = GetTracker()->GetSession(tag2); | 153 SyncedSession* session2 = GetTracker()->GetSession(tag2); |
| 154 sync_driver::SyncedSession* session3 = GetTracker()->GetSession(tag3); | 154 SyncedSession* session3 = GetTracker()->GetSession(tag3); |
| 155 session3->device_type = sync_driver::SyncedSession::TYPE_OTHER; | 155 session3->device_type = SyncedSession::TYPE_OTHER; |
| 156 ASSERT_EQ(3U, GetTracker()->num_synced_sessions()); | 156 ASSERT_EQ(3U, GetTracker()->num_synced_sessions()); |
| 157 | 157 |
| 158 ASSERT_TRUE(session); | 158 ASSERT_TRUE(session); |
| 159 ASSERT_TRUE(session2); | 159 ASSERT_TRUE(session2); |
| 160 ASSERT_TRUE(session3); | 160 ASSERT_TRUE(session3); |
| 161 ASSERT_NE(session, session2); | 161 ASSERT_NE(session, session2); |
| 162 ASSERT_NE(session2, session3); | 162 ASSERT_NE(session2, session3); |
| 163 ASSERT_TRUE(GetTracker()->DeleteSession(tag3)); | 163 ASSERT_TRUE(GetTracker()->DeleteSession(tag3)); |
| 164 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); | 164 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); |
| 165 | 165 |
| 166 GetTracker()->PutWindowInSession(tag1, 0); // Create a window. | 166 GetTracker()->PutWindowInSession(tag1, 0); // Create a window. |
| 167 GetTracker()->PutTabInWindow(tag1, 0, 2, 0); // No longer unmapped. | 167 GetTracker()->PutTabInWindow(tag1, 0, 2, 0); // No longer unmapped. |
| 168 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); // Has not changed. | 168 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); // Has not changed. |
| 169 | 169 |
| 170 const sessions::SessionTab* tab_ptr; | 170 const sessions::SessionTab* tab_ptr; |
| 171 ASSERT_TRUE(GetTracker()->LookupSessionTab(tag1, 0, &tab_ptr)); | 171 ASSERT_TRUE(GetTracker()->LookupSessionTab(tag1, 0, &tab_ptr)); |
| 172 ASSERT_EQ(tab_ptr, tabs1[0]); | 172 ASSERT_EQ(tab_ptr, tabs1[0]); |
| 173 ASSERT_TRUE(GetTracker()->LookupSessionTab(tag1, 2, &tab_ptr)); | 173 ASSERT_TRUE(GetTracker()->LookupSessionTab(tag1, 2, &tab_ptr)); |
| 174 ASSERT_EQ(tab_ptr, tabs1[2]); | 174 ASSERT_EQ(tab_ptr, tabs1[2]); |
| 175 ASSERT_FALSE(GetTracker()->LookupSessionTab(tag1, 3, &tab_ptr)); | 175 ASSERT_FALSE(GetTracker()->LookupSessionTab(tag1, 3, &tab_ptr)); |
| 176 ASSERT_FALSE(tab_ptr); | 176 ASSERT_FALSE(tab_ptr); |
| 177 | 177 |
| 178 std::vector<const sessions::SessionWindow*> windows; | 178 std::vector<const sessions::SessionWindow*> windows; |
| 179 ASSERT_TRUE(GetTracker()->LookupSessionWindows(tag1, &windows)); | 179 ASSERT_TRUE(GetTracker()->LookupSessionWindows(tag1, &windows)); |
| 180 ASSERT_EQ(1U, windows.size()); | 180 ASSERT_EQ(1U, windows.size()); |
| 181 ASSERT_TRUE(GetTracker()->LookupSessionWindows(tag2, &windows)); | 181 ASSERT_TRUE(GetTracker()->LookupSessionWindows(tag2, &windows)); |
| 182 ASSERT_EQ(0U, windows.size()); | 182 ASSERT_EQ(0U, windows.size()); |
| 183 | 183 |
| 184 // The sessions don't have valid tabs, lookup should not succeed. | 184 // The sessions don't have valid tabs, lookup should not succeed. |
| 185 std::vector<const sync_driver::SyncedSession*> sessions; | 185 std::vector<const SyncedSession*> sessions; |
| 186 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( | 186 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( |
| 187 &sessions, SyncedSessionTracker::PRESENTABLE)); | 187 &sessions, SyncedSessionTracker::PRESENTABLE)); |
| 188 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( | 188 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( |
| 189 &sessions, SyncedSessionTracker::RAW)); | 189 &sessions, SyncedSessionTracker::RAW)); |
| 190 ASSERT_EQ(2U, sessions.size()); | 190 ASSERT_EQ(2U, sessions.size()); |
| 191 | 191 |
| 192 GetTracker()->Clear(); | 192 GetTracker()->Clear(); |
| 193 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag1)); | 193 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag1)); |
| 194 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag2)); | 194 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag2)); |
| 195 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); | 195 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 GetTracker()->LookupTabNodeIds(tag2, &result); | 279 GetTracker()->LookupTabNodeIds(tag2, &result); |
| 280 EXPECT_TRUE(result.empty()); | 280 EXPECT_TRUE(result.empty()); |
| 281 } | 281 } |
| 282 | 282 |
| 283 TEST_F(SyncedSessionTrackerTest, SessionTracking) { | 283 TEST_F(SyncedSessionTrackerTest, SessionTracking) { |
| 284 ASSERT_TRUE(GetTracker()->Empty()); | 284 ASSERT_TRUE(GetTracker()->Empty()); |
| 285 std::string tag1 = "tag1"; | 285 std::string tag1 = "tag1"; |
| 286 std::string tag2 = "tag2"; | 286 std::string tag2 = "tag2"; |
| 287 | 287 |
| 288 // Create some session information that is stale. | 288 // Create some session information that is stale. |
| 289 sync_driver::SyncedSession* session1 = GetTracker()->GetSession(tag1); | 289 SyncedSession* session1 = GetTracker()->GetSession(tag1); |
| 290 GetTracker()->PutWindowInSession(tag1, 0); | 290 GetTracker()->PutWindowInSession(tag1, 0); |
| 291 GetTracker()->PutTabInWindow(tag1, 0, 0, 0); | 291 GetTracker()->PutTabInWindow(tag1, 0, 0, 0); |
| 292 GetTracker()->PutTabInWindow(tag1, 0, 1, 1); | 292 GetTracker()->PutTabInWindow(tag1, 0, 1, 1); |
| 293 GetTracker()->GetTab(tag1, 2, 3U)->window_id.set_id(0); // Will be unmapped. | 293 GetTracker()->GetTab(tag1, 2, 3U)->window_id.set_id(0); // Will be unmapped. |
| 294 GetTracker()->GetTab(tag1, 3, 4U)->window_id.set_id(0); // Will be unmapped. | 294 GetTracker()->GetTab(tag1, 3, 4U)->window_id.set_id(0); // Will be unmapped. |
| 295 GetTracker()->PutWindowInSession(tag1, 1); | 295 GetTracker()->PutWindowInSession(tag1, 1); |
| 296 GetTracker()->PutTabInWindow(tag1, 1, 4, 0); | 296 GetTracker()->PutTabInWindow(tag1, 1, 4, 0); |
| 297 GetTracker()->PutTabInWindow(tag1, 1, 5, 1); | 297 GetTracker()->PutTabInWindow(tag1, 1, 5, 1); |
| 298 ASSERT_EQ(2U, session1->windows.size()); | 298 ASSERT_EQ(2U, session1->windows.size()); |
| 299 ASSERT_EQ(2U, session1->windows[0]->tabs.size()); | 299 ASSERT_EQ(2U, session1->windows[0]->tabs.size()); |
| 300 ASSERT_EQ(2U, session1->windows[1]->tabs.size()); | 300 ASSERT_EQ(2U, session1->windows[1]->tabs.size()); |
| 301 ASSERT_EQ(6U, GetTracker()->num_synced_tabs(tag1)); | 301 ASSERT_EQ(6U, GetTracker()->num_synced_tabs(tag1)); |
| 302 | 302 |
| 303 // Create a session that should not be affected. | 303 // Create a session that should not be affected. |
| 304 sync_driver::SyncedSession* session2 = GetTracker()->GetSession(tag2); | 304 SyncedSession* session2 = GetTracker()->GetSession(tag2); |
| 305 GetTracker()->PutWindowInSession(tag2, 2); | 305 GetTracker()->PutWindowInSession(tag2, 2); |
| 306 GetTracker()->PutTabInWindow(tag2, 2, 1, 0); | 306 GetTracker()->PutTabInWindow(tag2, 2, 1, 0); |
| 307 ASSERT_EQ(1U, session2->windows.size()); | 307 ASSERT_EQ(1U, session2->windows.size()); |
| 308 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); | 308 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); |
| 309 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); | 309 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); |
| 310 | 310 |
| 311 // Reset tracking and get the current windows/tabs. | 311 // Reset tracking and get the current windows/tabs. |
| 312 // We simulate moving a tab from one window to another, then closing the | 312 // We simulate moving a tab from one window to another, then closing the |
| 313 // first window (including its one remaining tab), and opening a new tab | 313 // first window (including its one remaining tab), and opening a new tab |
| 314 // on the remaining window. | 314 // on the remaining window. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 GetTracker()->DeleteForeignTab(session_tag, tab_node_id_3); | 361 GetTracker()->DeleteForeignTab(session_tag, tab_node_id_3); |
| 362 GetTracker()->LookupTabNodeIds(session_tag, &result); | 362 GetTracker()->LookupTabNodeIds(session_tag, &result); |
| 363 EXPECT_EQ(1U, result.size()); | 363 EXPECT_EQ(1U, result.size()); |
| 364 EXPECT_TRUE(result.find(tab_node_id_4) != result.end()); | 364 EXPECT_TRUE(result.find(tab_node_id_4) != result.end()); |
| 365 | 365 |
| 366 GetTracker()->DeleteForeignTab(session_tag, tab_node_id_4); | 366 GetTracker()->DeleteForeignTab(session_tag, tab_node_id_4); |
| 367 GetTracker()->LookupTabNodeIds(session_tag, &result); | 367 GetTracker()->LookupTabNodeIds(session_tag, &result); |
| 368 EXPECT_TRUE(result.empty()); | 368 EXPECT_TRUE(result.empty()); |
| 369 } | 369 } |
| 370 | 370 |
| 371 } // namespace browser_sync | 371 } // namespace sync_sessions |
| OLD | NEW |