| 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 "base/rand_util.h" | 7 #include "base/rand_util.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" | 10 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" |
| 11 #include "components/sync_sessions/fake_sync_sessions_client.h" | 11 #include "components/sync_sessions/fake_sync_sessions_client.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 13 |
| 14 namespace sync_sessions { | 14 namespace sync_sessions { |
| 15 | 15 |
| 16 namespace { | 16 namespace { |
| 17 | 17 |
| 18 const char kValidUrl[] = "http://www.example.com"; | 18 const char kValidUrl[] = "http://www.example.com"; |
| 19 const char kInvalidUrl[] = "invalid.url"; | 19 const char kInvalidUrl[] = "invalid.url"; |
| 20 const char kTag[] = "tag"; |
| 21 const char kTag2[] = "tag2"; |
| 22 const char kTag3[] = "tag3"; |
| 23 const char kTitle[] = "title"; |
| 20 | 24 |
| 21 } // namespace | 25 } // namespace |
| 22 | 26 |
| 23 class SyncedSessionTrackerTest : public testing::Test { | 27 class SyncedSessionTrackerTest : public testing::Test { |
| 24 public: | 28 public: |
| 25 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {} | 29 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {} |
| 26 ~SyncedSessionTrackerTest() override {} | 30 ~SyncedSessionTrackerTest() override {} |
| 27 | 31 |
| 28 SyncedSessionTracker* GetTracker() { return &tracker_; } | 32 SyncedSessionTracker* GetTracker() { return &tracker_; } |
| 33 TabNodePool* GetTabNodePool() { return &tracker_.local_tab_pool_; } |
| 29 | 34 |
| 30 private: | 35 private: |
| 31 FakeSyncSessionsClient sessions_client_; | 36 FakeSyncSessionsClient sessions_client_; |
| 32 SyncedSessionTracker tracker_; | 37 SyncedSessionTracker tracker_; |
| 33 }; | 38 }; |
| 34 | 39 |
| 35 TEST_F(SyncedSessionTrackerTest, GetSession) { | 40 TEST_F(SyncedSessionTrackerTest, GetSession) { |
| 36 SyncedSession* session1 = GetTracker()->GetSession("tag"); | 41 SyncedSession* session1 = GetTracker()->GetSession(kTag); |
| 37 SyncedSession* session2 = GetTracker()->GetSession("tag2"); | 42 SyncedSession* session2 = GetTracker()->GetSession(kTag2); |
| 38 ASSERT_EQ(session1, GetTracker()->GetSession("tag")); | 43 ASSERT_EQ(session1, GetTracker()->GetSession(kTag)); |
| 39 ASSERT_NE(session1, session2); | 44 ASSERT_NE(session1, session2); |
| 40 // Should clean up memory on its own. | 45 // Should clean up memory on its own. |
| 41 } | 46 } |
| 42 | 47 |
| 43 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) { | 48 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) { |
| 44 sessions::SessionTab* tab = GetTracker()->GetTab("tag", 0, 0); | 49 sessions::SessionTab* tab = GetTracker()->GetTab(kTag, 0); |
| 45 ASSERT_EQ(tab, GetTracker()->GetTab("tag", 0, 0)); | 50 ASSERT_EQ(tab, GetTracker()->GetTab(kTag, 0)); |
| 46 // Should clean up memory on its own. | 51 // Should clean up memory on its own. |
| 47 } | 52 } |
| 48 | 53 |
| 49 TEST_F(SyncedSessionTrackerTest, PutWindowInSession) { | 54 TEST_F(SyncedSessionTrackerTest, PutWindowInSession) { |
| 50 GetTracker()->PutWindowInSession("tag", 0); | 55 GetTracker()->PutWindowInSession(kTag, 0); |
| 51 SyncedSession* session = GetTracker()->GetSession("tag"); | 56 SyncedSession* session = GetTracker()->GetSession(kTag); |
| 52 ASSERT_EQ(1U, session->windows.size()); | 57 ASSERT_EQ(1U, session->windows.size()); |
| 53 // Should clean up memory on its own. | 58 // Should clean up memory on its own. |
| 54 } | 59 } |
| 55 | 60 |
| 56 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { | 61 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { |
| 57 GetTracker()->PutWindowInSession("tag", 10); | 62 GetTracker()->PutWindowInSession(kTag, 10); |
| 58 GetTracker()->PutTabInWindow("tag", 10, 15, | 63 GetTracker()->PutTabInWindow(kTag, 10, 15, |
| 59 0); // win id 10, tab id 15, tab ind 0. | 64 0); // win id 10, tab id 15, tab ind 0. |
| 60 SyncedSession* session = GetTracker()->GetSession("tag"); | 65 SyncedSession* session = GetTracker()->GetSession(kTag); |
| 61 ASSERT_EQ(1U, session->windows.size()); | 66 ASSERT_EQ(1U, session->windows.size()); |
| 62 ASSERT_EQ(1U, session->windows[10]->tabs.size()); | 67 ASSERT_EQ(1U, session->windows[10]->tabs.size()); |
| 63 ASSERT_EQ(GetTracker()->GetTab("tag", 15, 1), | 68 ASSERT_EQ(GetTracker()->GetTab(kTag, 15), |
| 64 session->windows[10]->tabs[0].get()); | 69 session->windows[10]->tabs[0].get()); |
| 65 // Should clean up memory on its own. | 70 // Should clean up memory on its own. |
| 66 } | 71 } |
| 67 | 72 |
| 68 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { | 73 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { |
| 69 std::vector<const SyncedSession*> sessions; | 74 std::vector<const SyncedSession*> sessions; |
| 70 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( | 75 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( |
| 71 &sessions, SyncedSessionTracker::PRESENTABLE)); | 76 &sessions, SyncedSessionTracker::PRESENTABLE)); |
| 72 GetTracker()->GetSession("tag1"); | 77 GetTracker()->GetSession(kTag); |
| 73 GetTracker()->PutWindowInSession("tag1", 0); | 78 GetTracker()->PutWindowInSession(kTag, 0); |
| 74 GetTracker()->PutTabInWindow("tag1", 0, 15, 0); | 79 GetTracker()->PutTabInWindow(kTag, 0, 15, 0); |
| 75 sessions::SessionTab* tab = GetTracker()->GetTab("tag1", 15, 1); | 80 sessions::SessionTab* tab = GetTracker()->GetTab(kTag, 15); |
| 76 ASSERT_TRUE(tab); | 81 ASSERT_TRUE(tab); |
| 77 tab->navigations.push_back( | 82 tab->navigations.push_back( |
| 78 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(kValidUrl, | 83 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(kValidUrl, |
| 79 "title")); | 84 kTitle)); |
| 80 GetTracker()->GetSession("tag2"); | 85 GetTracker()->GetSession(kTag2); |
| 81 GetTracker()->GetSession("tag3"); | 86 GetTracker()->GetSession(kTag3); |
| 82 GetTracker()->PutWindowInSession("tag3", 0); | 87 GetTracker()->PutWindowInSession(kTag3, 0); |
| 83 GetTracker()->PutTabInWindow("tag3", 0, 15, 0); | 88 GetTracker()->PutTabInWindow(kTag3, 0, 15, 0); |
| 84 tab = GetTracker()->GetTab("tag3", 15, 1); | 89 tab = GetTracker()->GetTab(kTag3, 15); |
| 85 ASSERT_TRUE(tab); | 90 ASSERT_TRUE(tab); |
| 86 tab->navigations.push_back( | 91 tab->navigations.push_back( |
| 87 sessions::SerializedNavigationEntryTestHelper::CreateNavigation( | 92 sessions::SerializedNavigationEntryTestHelper::CreateNavigation( |
| 88 kInvalidUrl, "title")); | 93 kInvalidUrl, kTitle)); |
| 89 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( | 94 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( |
| 90 &sessions, SyncedSessionTracker::PRESENTABLE)); | 95 &sessions, SyncedSessionTracker::PRESENTABLE)); |
| 91 // Only the session with a valid window and tab gets returned. | 96 // Only the session with a valid window and tab gets returned. |
| 92 ASSERT_EQ(1U, sessions.size()); | 97 ASSERT_EQ(1U, sessions.size()); |
| 93 ASSERT_EQ("tag1", sessions[0]->session_tag); | 98 ASSERT_EQ(kTag, sessions[0]->session_tag); |
| 94 | 99 |
| 95 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( | 100 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( |
| 96 &sessions, SyncedSessionTracker::RAW)); | 101 &sessions, SyncedSessionTracker::RAW)); |
| 97 ASSERT_EQ(3U, sessions.size()); | 102 ASSERT_EQ(3U, sessions.size()); |
| 98 } | 103 } |
| 99 | 104 |
| 100 TEST_F(SyncedSessionTrackerTest, LookupSessionWindows) { | 105 TEST_F(SyncedSessionTrackerTest, LookupSessionWindows) { |
| 101 std::vector<const sessions::SessionWindow*> windows; | 106 std::vector<const sessions::SessionWindow*> windows; |
| 102 ASSERT_FALSE(GetTracker()->LookupSessionWindows("tag1", &windows)); | 107 ASSERT_FALSE(GetTracker()->LookupSessionWindows(kTag, &windows)); |
| 103 GetTracker()->GetSession("tag1"); | 108 GetTracker()->GetSession(kTag); |
| 104 GetTracker()->PutWindowInSession("tag1", 0); | 109 GetTracker()->PutWindowInSession(kTag, 0); |
| 105 GetTracker()->PutWindowInSession("tag1", 2); | 110 GetTracker()->PutWindowInSession(kTag, 2); |
| 106 GetTracker()->GetSession("tag2"); | 111 GetTracker()->GetSession(kTag2); |
| 107 GetTracker()->PutWindowInSession("tag2", 0); | 112 GetTracker()->PutWindowInSession(kTag2, 0); |
| 108 GetTracker()->PutWindowInSession("tag2", 2); | 113 GetTracker()->PutWindowInSession(kTag2, 2); |
| 109 ASSERT_TRUE(GetTracker()->LookupSessionWindows("tag1", &windows)); | 114 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag, &windows)); |
| 110 ASSERT_EQ(2U, windows.size()); // Only windows from tag1 session. | 115 ASSERT_EQ(2U, windows.size()); // Only windows from kTag session. |
| 111 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[0]); | 116 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[0]); |
| 112 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[1]); | 117 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[1]); |
| 113 ASSERT_NE(windows[1], windows[0]); | 118 ASSERT_NE(windows[1], windows[0]); |
| 114 } | 119 } |
| 115 | 120 |
| 116 TEST_F(SyncedSessionTrackerTest, LookupSessionTab) { | 121 TEST_F(SyncedSessionTrackerTest, LookupSessionTab) { |
| 117 const sessions::SessionTab* tab; | 122 const sessions::SessionTab* tab; |
| 118 ASSERT_FALSE(GetTracker()->LookupSessionTab("tag1", 5, &tab)); | 123 ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, 5, &tab)); |
| 119 GetTracker()->GetSession("tag1"); | 124 GetTracker()->GetSession(kTag); |
| 120 GetTracker()->PutWindowInSession("tag1", 0); | 125 GetTracker()->PutWindowInSession(kTag, 0); |
| 121 GetTracker()->PutTabInWindow("tag1", 0, 5, 0); | 126 GetTracker()->PutTabInWindow(kTag, 0, 5, 0); |
| 122 ASSERT_TRUE(GetTracker()->LookupSessionTab("tag1", 5, &tab)); | 127 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 5, &tab)); |
| 123 ASSERT_NE((sessions::SessionTab*)nullptr, tab); | 128 ASSERT_NE((sessions::SessionTab*)nullptr, tab); |
| 124 } | 129 } |
| 125 | 130 |
| 126 TEST_F(SyncedSessionTrackerTest, Complex) { | 131 TEST_F(SyncedSessionTrackerTest, Complex) { |
| 127 const std::string tag1 = "tag"; | |
| 128 const std::string tag2 = "tag2"; | |
| 129 const std::string tag3 = "tag3"; | |
| 130 std::vector<sessions::SessionTab *> tabs1, tabs2; | 132 std::vector<sessions::SessionTab *> tabs1, tabs2; |
| 131 sessions::SessionTab* temp_tab; | 133 sessions::SessionTab* temp_tab; |
| 132 ASSERT_TRUE(GetTracker()->Empty()); | 134 ASSERT_TRUE(GetTracker()->Empty()); |
| 133 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); | 135 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
| 134 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag1)); | 136 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag)); |
| 135 tabs1.push_back(GetTracker()->GetTab(tag1, 0, 0)); | 137 tabs1.push_back(GetTracker()->GetTab(kTag, 0)); |
| 136 tabs1.push_back(GetTracker()->GetTab(tag1, 1, 1)); | 138 tabs1.push_back(GetTracker()->GetTab(kTag, 1)); |
| 137 tabs1.push_back(GetTracker()->GetTab(tag1, 2, 2)); | 139 tabs1.push_back(GetTracker()->GetTab(kTag, 2)); |
| 138 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); | 140 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag)); |
| 139 ASSERT_EQ(1U, GetTracker()->num_synced_sessions()); | 141 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
| 140 temp_tab = GetTracker()->GetTab(tag1, 0, 0); // Already created. | 142 temp_tab = GetTracker()->GetTab(kTag, 0); // Already created. |
| 141 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); | 143 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag)); |
| 142 ASSERT_EQ(1U, GetTracker()->num_synced_sessions()); | 144 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
| 143 ASSERT_EQ(tabs1[0], temp_tab); | 145 ASSERT_EQ(tabs1[0], temp_tab); |
| 144 tabs2.push_back(GetTracker()->GetTab(tag2, 0, 0)); | 146 tabs2.push_back(GetTracker()->GetTab(kTag2, 0)); |
| 145 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); | 147 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); |
| 146 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); | 148 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
| 147 ASSERT_FALSE(GetTracker()->DeleteSession(tag3)); | 149 ASSERT_FALSE(GetTracker()->DeleteForeignSession(kTag3)); |
| 148 | 150 |
| 149 SyncedSession* session = GetTracker()->GetSession(tag1); | 151 SyncedSession* session = GetTracker()->GetSession(kTag); |
| 150 SyncedSession* session2 = GetTracker()->GetSession(tag2); | 152 SyncedSession* session2 = GetTracker()->GetSession(kTag2); |
| 151 SyncedSession* session3 = GetTracker()->GetSession(tag3); | 153 SyncedSession* session3 = GetTracker()->GetSession(kTag3); |
| 152 session3->device_type = SyncedSession::TYPE_OTHER; | 154 session3->device_type = SyncedSession::TYPE_OTHER; |
| 153 ASSERT_EQ(3U, GetTracker()->num_synced_sessions()); | 155 ASSERT_EQ(3U, GetTracker()->num_synced_sessions()); |
| 154 | 156 |
| 155 ASSERT_TRUE(session); | 157 ASSERT_TRUE(session); |
| 156 ASSERT_TRUE(session2); | 158 ASSERT_TRUE(session2); |
| 157 ASSERT_TRUE(session3); | 159 ASSERT_TRUE(session3); |
| 158 ASSERT_NE(session, session2); | 160 ASSERT_NE(session, session2); |
| 159 ASSERT_NE(session2, session3); | 161 ASSERT_NE(session2, session3); |
| 160 ASSERT_TRUE(GetTracker()->DeleteSession(tag3)); | 162 ASSERT_TRUE(GetTracker()->DeleteForeignSession(kTag3)); |
| 161 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); | 163 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); |
| 162 | 164 |
| 163 GetTracker()->PutWindowInSession(tag1, 0); // Create a window. | 165 GetTracker()->PutWindowInSession(kTag, 0); // Create a window. |
| 164 GetTracker()->PutTabInWindow(tag1, 0, 2, 0); // No longer unmapped. | 166 GetTracker()->PutTabInWindow(kTag, 0, 2, 0); // No longer unmapped. |
| 165 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); // Has not changed. | 167 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag)); // Has not changed. |
| 166 | 168 |
| 167 const sessions::SessionTab* tab_ptr; | 169 const sessions::SessionTab* tab_ptr; |
| 168 ASSERT_TRUE(GetTracker()->LookupSessionTab(tag1, 0, &tab_ptr)); | 170 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 0, &tab_ptr)); |
| 169 ASSERT_EQ(tab_ptr, tabs1[0]); | 171 ASSERT_EQ(tab_ptr, tabs1[0]); |
| 170 ASSERT_TRUE(GetTracker()->LookupSessionTab(tag1, 2, &tab_ptr)); | 172 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 2, &tab_ptr)); |
| 171 ASSERT_EQ(tab_ptr, tabs1[2]); | 173 ASSERT_EQ(tab_ptr, tabs1[2]); |
| 172 ASSERT_FALSE(GetTracker()->LookupSessionTab(tag1, 3, &tab_ptr)); | 174 ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, 3, &tab_ptr)); |
| 173 ASSERT_FALSE(tab_ptr); | 175 ASSERT_FALSE(tab_ptr); |
| 174 | 176 |
| 175 std::vector<const sessions::SessionWindow*> windows; | 177 std::vector<const sessions::SessionWindow*> windows; |
| 176 ASSERT_TRUE(GetTracker()->LookupSessionWindows(tag1, &windows)); | 178 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag, &windows)); |
| 177 ASSERT_EQ(1U, windows.size()); | 179 ASSERT_EQ(1U, windows.size()); |
| 178 ASSERT_TRUE(GetTracker()->LookupSessionWindows(tag2, &windows)); | 180 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag2, &windows)); |
| 179 ASSERT_EQ(0U, windows.size()); | 181 ASSERT_EQ(0U, windows.size()); |
| 180 | 182 |
| 181 // The sessions don't have valid tabs, lookup should not succeed. | 183 // The sessions don't have valid tabs, lookup should not succeed. |
| 182 std::vector<const SyncedSession*> sessions; | 184 std::vector<const SyncedSession*> sessions; |
| 183 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( | 185 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( |
| 184 &sessions, SyncedSessionTracker::PRESENTABLE)); | 186 &sessions, SyncedSessionTracker::PRESENTABLE)); |
| 185 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( | 187 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( |
| 186 &sessions, SyncedSessionTracker::RAW)); | 188 &sessions, SyncedSessionTracker::RAW)); |
| 187 ASSERT_EQ(2U, sessions.size()); | 189 ASSERT_EQ(2U, sessions.size()); |
| 188 | 190 |
| 189 GetTracker()->Clear(); | 191 GetTracker()->Clear(); |
| 190 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag1)); | 192 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag)); |
| 191 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag2)); | 193 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag2)); |
| 192 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); | 194 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
| 193 } | 195 } |
| 194 | 196 |
| 195 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) { | 197 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) { |
| 196 ASSERT_TRUE(GetTracker()->Empty()); | 198 ASSERT_TRUE(GetTracker()->Empty()); |
| 197 const int kMaxSessions = 10; | 199 const int kMaxSessions = 10; |
| 198 const int kMaxTabs = 1000; | 200 const int kMaxTabs = 1000; |
| 199 const int kMaxAttempts = 10000; | 201 const int kMaxAttempts = 10000; |
| 200 for (int j = 0; j < kMaxSessions; ++j) { | 202 for (int j = 0; j < kMaxSessions; ++j) { |
| 201 std::string tag = base::StringPrintf("tag%d", j); | 203 std::string tag = base::StringPrintf("tag%d", j); |
| 202 for (int i = 0; i < kMaxAttempts; ++i) { | 204 for (int i = 0; i < kMaxAttempts; ++i) { |
| 203 // More attempts than tabs means we'll sometimes get the same tabs, | 205 // More attempts than tabs means we'll sometimes get the same tabs, |
| 204 // sometimes have to allocate new tabs. | 206 // sometimes have to allocate new tabs. |
| 205 int rand_tab_num = base::RandInt(0, kMaxTabs); | 207 int rand_tab_num = base::RandInt(0, kMaxTabs); |
| 206 sessions::SessionTab* tab = | 208 sessions::SessionTab* tab = GetTracker()->GetTab(tag, rand_tab_num + 1); |
| 207 GetTracker()->GetTab(tag, rand_tab_num, rand_tab_num + 1); | |
| 208 ASSERT_TRUE(tab); | 209 ASSERT_TRUE(tab); |
| 209 } | 210 } |
| 210 } | 211 } |
| 211 } | 212 } |
| 212 | 213 |
| 213 TEST_F(SyncedSessionTrackerTest, LookupTabNodeIds) { | 214 TEST_F(SyncedSessionTrackerTest, LookupForeignTabNodeIds) { |
| 214 std::set<int> result; | 215 std::set<int> result; |
| 215 std::string tag1 = "session1"; | |
| 216 std::string tag2 = "session2"; | |
| 217 std::string tag3 = "session3"; | |
| 218 | 216 |
| 219 GetTracker()->GetTab(tag1, 1, 1); | 217 GetTracker()->OnTabNodeSeen(kTag, 1); |
| 220 GetTracker()->GetTab(tag1, 2, 2); | 218 GetTracker()->OnTabNodeSeen(kTag, 2); |
| 221 GetTracker()->LookupTabNodeIds(tag1, &result); | 219 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
| 222 EXPECT_EQ(2U, result.size()); | 220 EXPECT_EQ(2U, result.size()); |
| 223 EXPECT_FALSE(result.end() == result.find(1)); | 221 EXPECT_FALSE(result.end() == result.find(1)); |
| 224 EXPECT_FALSE(result.end() == result.find(2)); | 222 EXPECT_FALSE(result.end() == result.find(2)); |
| 225 GetTracker()->LookupTabNodeIds(tag2, &result); | 223 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
| 226 EXPECT_TRUE(result.empty()); | 224 EXPECT_TRUE(result.empty()); |
| 227 | 225 |
| 228 GetTracker()->PutWindowInSession(tag1, 0); | 226 GetTracker()->PutWindowInSession(kTag, 0); |
| 229 GetTracker()->PutTabInWindow(tag1, 0, 3, 0); | 227 GetTracker()->PutTabInWindow(kTag, 0, 3, 0); |
| 230 GetTracker()->LookupTabNodeIds(tag1, &result); | 228 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
| 231 EXPECT_EQ(2U, result.size()); | 229 EXPECT_EQ(2U, result.size()); |
| 232 | 230 |
| 233 GetTracker()->GetTab(tag1, 3, 3); | 231 GetTracker()->OnTabNodeSeen(kTag, 3); |
| 234 GetTracker()->LookupTabNodeIds(tag1, &result); | 232 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
| 235 EXPECT_EQ(3U, result.size()); | 233 EXPECT_EQ(3U, result.size()); |
| 236 EXPECT_FALSE(result.end() == result.find(3)); | 234 EXPECT_FALSE(result.end() == result.find(3)); |
| 237 | 235 |
| 238 GetTracker()->GetTab(tag2, 1, 21); | 236 GetTracker()->OnTabNodeSeen(kTag2, 21); |
| 239 GetTracker()->GetTab(tag2, 2, 22); | 237 GetTracker()->OnTabNodeSeen(kTag2, 22); |
| 240 GetTracker()->LookupTabNodeIds(tag2, &result); | 238 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
| 241 EXPECT_EQ(2U, result.size()); | 239 EXPECT_EQ(2U, result.size()); |
| 242 EXPECT_FALSE(result.end() == result.find(21)); | 240 EXPECT_FALSE(result.end() == result.find(21)); |
| 243 EXPECT_FALSE(result.end() == result.find(22)); | 241 EXPECT_FALSE(result.end() == result.find(22)); |
| 244 GetTracker()->LookupTabNodeIds(tag1, &result); | 242 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
| 245 EXPECT_EQ(3U, result.size()); | 243 EXPECT_EQ(3U, result.size()); |
| 246 EXPECT_FALSE(result.end() == result.find(1)); | 244 EXPECT_FALSE(result.end() == result.find(1)); |
| 247 EXPECT_FALSE(result.end() == result.find(2)); | 245 EXPECT_FALSE(result.end() == result.find(2)); |
| 248 | 246 |
| 249 GetTracker()->LookupTabNodeIds(tag3, &result); | 247 GetTracker()->LookupForeignTabNodeIds(kTag3, &result); |
| 250 EXPECT_TRUE(result.empty()); | 248 EXPECT_TRUE(result.empty()); |
| 251 GetTracker()->PutWindowInSession(tag3, 1); | 249 GetTracker()->PutWindowInSession(kTag3, 1); |
| 252 GetTracker()->PutTabInWindow(tag3, 1, 5, 0); | 250 GetTracker()->PutTabInWindow(kTag3, 1, 5, 0); |
| 253 GetTracker()->LookupTabNodeIds(tag3, &result); | 251 GetTracker()->LookupForeignTabNodeIds(kTag3, &result); |
| 254 EXPECT_TRUE(result.empty()); | 252 EXPECT_TRUE(result.empty()); |
| 255 EXPECT_FALSE(GetTracker()->DeleteSession(tag3)); | 253 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag3)); |
| 256 GetTracker()->LookupTabNodeIds(tag3, &result); | 254 GetTracker()->LookupForeignTabNodeIds(kTag3, &result); |
| 257 EXPECT_TRUE(result.empty()); | 255 EXPECT_TRUE(result.empty()); |
| 258 | 256 |
| 259 EXPECT_FALSE(GetTracker()->DeleteSession(tag1)); | 257 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag)); |
| 260 GetTracker()->LookupTabNodeIds(tag1, &result); | 258 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
| 261 EXPECT_TRUE(result.empty()); | 259 EXPECT_TRUE(result.empty()); |
| 262 GetTracker()->LookupTabNodeIds(tag2, &result); | 260 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
| 263 EXPECT_EQ(2U, result.size()); | 261 EXPECT_EQ(2U, result.size()); |
| 264 EXPECT_FALSE(result.end() == result.find(21)); | 262 EXPECT_FALSE(result.end() == result.find(21)); |
| 265 EXPECT_FALSE(result.end() == result.find(22)); | 263 EXPECT_FALSE(result.end() == result.find(22)); |
| 266 | 264 |
| 267 GetTracker()->GetTab(tag2, 1, 21); | 265 GetTracker()->OnTabNodeSeen(kTag2, 21); |
| 268 GetTracker()->GetTab(tag2, 2, 23); | 266 GetTracker()->OnTabNodeSeen(kTag2, 23); |
| 269 GetTracker()->LookupTabNodeIds(tag2, &result); | 267 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
| 270 EXPECT_EQ(3U, result.size()); | 268 EXPECT_EQ(3U, result.size()); |
| 271 EXPECT_FALSE(result.end() == result.find(21)); | 269 EXPECT_FALSE(result.end() == result.find(21)); |
| 272 EXPECT_FALSE(result.end() == result.find(22)); | 270 EXPECT_FALSE(result.end() == result.find(22)); |
| 273 EXPECT_FALSE(result.end() == result.find(23)); | 271 EXPECT_FALSE(result.end() == result.find(23)); |
| 274 | 272 |
| 275 EXPECT_FALSE(GetTracker()->DeleteSession(tag2)); | 273 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag2)); |
| 276 GetTracker()->LookupTabNodeIds(tag2, &result); | 274 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
| 277 EXPECT_TRUE(result.empty()); | 275 EXPECT_TRUE(result.empty()); |
| 278 } | 276 } |
| 279 | 277 |
| 280 TEST_F(SyncedSessionTrackerTest, SessionTracking) { | 278 TEST_F(SyncedSessionTrackerTest, SessionTracking) { |
| 281 ASSERT_TRUE(GetTracker()->Empty()); | 279 ASSERT_TRUE(GetTracker()->Empty()); |
| 282 std::string tag1 = "tag1"; | |
| 283 std::string tag2 = "tag2"; | |
| 284 | 280 |
| 285 // Create some session information that is stale. | 281 // Create some session information that is stale. |
| 286 SyncedSession* session1 = GetTracker()->GetSession(tag1); | 282 SyncedSession* session1 = GetTracker()->GetSession(kTag); |
| 287 GetTracker()->PutWindowInSession(tag1, 0); | 283 GetTracker()->PutWindowInSession(kTag, 0); |
| 288 GetTracker()->PutTabInWindow(tag1, 0, 0, 0); | 284 GetTracker()->PutTabInWindow(kTag, 0, 0, 0); |
| 289 GetTracker()->PutTabInWindow(tag1, 0, 1, 1); | 285 GetTracker()->PutTabInWindow(kTag, 0, 1, 1); |
| 290 GetTracker()->GetTab(tag1, 2, 3U)->window_id.set_id(0); // Will be unmapped. | 286 GetTracker()->GetTab(kTag, 2)->window_id.set_id(0); // Will be unmapped. |
| 291 GetTracker()->GetTab(tag1, 3, 4U)->window_id.set_id(0); // Will be unmapped. | 287 GetTracker()->GetTab(kTag, 3)->window_id.set_id(0); // Will be unmapped. |
| 292 GetTracker()->PutWindowInSession(tag1, 1); | 288 GetTracker()->PutWindowInSession(kTag, 1); |
| 293 GetTracker()->PutTabInWindow(tag1, 1, 4, 0); | 289 GetTracker()->PutTabInWindow(kTag, 1, 4, 0); |
| 294 GetTracker()->PutTabInWindow(tag1, 1, 5, 1); | 290 GetTracker()->PutTabInWindow(kTag, 1, 5, 1); |
| 295 ASSERT_EQ(2U, session1->windows.size()); | 291 ASSERT_EQ(2U, session1->windows.size()); |
| 296 ASSERT_EQ(2U, session1->windows[0]->tabs.size()); | 292 ASSERT_EQ(2U, session1->windows[0]->tabs.size()); |
| 297 ASSERT_EQ(2U, session1->windows[1]->tabs.size()); | 293 ASSERT_EQ(2U, session1->windows[1]->tabs.size()); |
| 298 ASSERT_EQ(6U, GetTracker()->num_synced_tabs(tag1)); | 294 ASSERT_EQ(6U, GetTracker()->num_synced_tabs(kTag)); |
| 299 | 295 |
| 300 // Create a session that should not be affected. | 296 // Create a session that should not be affected. |
| 301 SyncedSession* session2 = GetTracker()->GetSession(tag2); | 297 SyncedSession* session2 = GetTracker()->GetSession(kTag2); |
| 302 GetTracker()->PutWindowInSession(tag2, 2); | 298 GetTracker()->PutWindowInSession(kTag2, 2); |
| 303 GetTracker()->PutTabInWindow(tag2, 2, 1, 0); | 299 GetTracker()->PutTabInWindow(kTag2, 2, 1, 0); |
| 304 ASSERT_EQ(1U, session2->windows.size()); | 300 ASSERT_EQ(1U, session2->windows.size()); |
| 305 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); | 301 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); |
| 306 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); | 302 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); |
| 307 | 303 |
| 308 // Reset tracking and get the current windows/tabs. | 304 // Reset tracking and get the current windows/tabs. |
| 309 // We simulate moving a tab from one window to another, then closing the | 305 // We simulate moving a tab from one window to another, then closing the |
| 310 // first window (including its one remaining tab), and opening a new tab | 306 // first window (including its one remaining tab), and opening a new tab |
| 311 // on the remaining window. | 307 // on the remaining window. |
| 312 | 308 |
| 313 // New tab, arrived before meta node so unmapped. | 309 // New tab, arrived before meta node so unmapped. |
| 314 GetTracker()->GetTab(tag1, 6, 7U); | 310 GetTracker()->GetTab(kTag, 6); |
| 315 GetTracker()->ResetSessionTracking(tag1); | 311 GetTracker()->ResetSessionTracking(kTag); |
| 316 GetTracker()->PutWindowInSession(tag1, 0); | 312 GetTracker()->PutWindowInSession(kTag, 0); |
| 317 GetTracker()->PutTabInWindow(tag1, 0, 0, 0); | 313 GetTracker()->PutTabInWindow(kTag, 0, 0, 0); |
| 318 // Tab 1 is closed. | 314 // Tab 1 is closed. |
| 319 GetTracker()->PutTabInWindow(tag1, 0, 2, 1); // No longer unmapped. | 315 GetTracker()->PutTabInWindow(kTag, 0, 2, 1); // No longer unmapped. |
| 320 // Tab 3 was unmapped and does not get used. | 316 // Tab 3 was unmapped and does not get used. |
| 321 GetTracker()->PutTabInWindow(tag1, 0, 4, 2); // Moved from window 1. | 317 GetTracker()->PutTabInWindow(kTag, 0, 4, 2); // Moved from window 1. |
| 322 // Window 1 was closed, along with tab 5. | 318 // Window 1 was closed, along with tab 5. |
| 323 GetTracker()->PutTabInWindow(tag1, 0, 6, 3); // No longer unmapped. | 319 GetTracker()->PutTabInWindow(kTag, 0, 6, 3); // No longer unmapped. |
| 324 // Session 2 should not be affected. | 320 // Session 2 should not be affected. |
| 325 GetTracker()->CleanupSession(tag1); | 321 GetTracker()->CleanupForeignSession(kTag); |
| 326 | 322 |
| 327 // Verify that only those parts of the session not owned have been removed. | 323 // Verify that only those parts of the session not owned have been removed. |
| 328 ASSERT_EQ(1U, session1->windows.size()); | 324 ASSERT_EQ(1U, session1->windows.size()); |
| 329 ASSERT_EQ(4U, session1->windows[0]->tabs.size()); | 325 ASSERT_EQ(4U, session1->windows[0]->tabs.size()); |
| 330 ASSERT_EQ(1U, session2->windows.size()); | 326 ASSERT_EQ(1U, session2->windows.size()); |
| 331 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); | 327 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); |
| 332 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); | 328 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); |
| 333 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(tag1)); | 329 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(kTag)); |
| 334 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); | 330 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); |
| 335 | 331 |
| 336 // All memory should be properly deallocated by destructor for the | 332 // All memory should be properly deallocated by destructor for the |
| 337 // SyncedSessionTracker. | 333 // SyncedSessionTracker. |
| 338 } | 334 } |
| 339 | 335 |
| 340 TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) { | 336 TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) { |
| 341 std::string session_tag = "session_tag"; | 337 int tab_node_id_1 = 1; |
| 342 int tab_id_1 = 1; | 338 int tab_node_id_2 = 2; |
| 343 int tab_id_2 = 2; | |
| 344 int tab_node_id_3 = 3; | |
| 345 int tab_node_id_4 = 4; | |
| 346 std::set<int> result; | 339 std::set<int> result; |
| 347 | 340 |
| 348 GetTracker()->GetTab(session_tag, tab_id_1, tab_node_id_3); | 341 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_1); |
| 349 GetTracker()->GetTab(session_tag, tab_id_1, tab_node_id_4); | 342 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_2); |
| 350 GetTracker()->GetTab(session_tag, tab_id_2, tab_node_id_3); | |
| 351 GetTracker()->GetTab(session_tag, tab_id_2, tab_node_id_4); | |
| 352 | 343 |
| 353 GetTracker()->LookupTabNodeIds(session_tag, &result); | 344 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
| 354 EXPECT_EQ(2U, result.size()); | 345 EXPECT_EQ(2U, result.size()); |
| 355 EXPECT_TRUE(result.find(tab_node_id_3) != result.end()); | 346 EXPECT_TRUE(result.find(tab_node_id_1) != result.end()); |
| 356 EXPECT_TRUE(result.find(tab_node_id_4) != result.end()); | 347 EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); |
| 357 | 348 |
| 358 GetTracker()->DeleteForeignTab(session_tag, tab_node_id_3); | 349 GetTracker()->DeleteForeignTab(kTag, tab_node_id_1); |
| 359 GetTracker()->LookupTabNodeIds(session_tag, &result); | 350 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
| 360 EXPECT_EQ(1U, result.size()); | 351 EXPECT_EQ(1U, result.size()); |
| 361 EXPECT_TRUE(result.find(tab_node_id_4) != result.end()); | 352 EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); |
| 362 | 353 |
| 363 GetTracker()->DeleteForeignTab(session_tag, tab_node_id_4); | 354 GetTracker()->DeleteForeignTab(kTag, tab_node_id_2); |
| 364 GetTracker()->LookupTabNodeIds(session_tag, &result); | 355 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
| 365 EXPECT_TRUE(result.empty()); | 356 EXPECT_TRUE(result.empty()); |
| 366 } | 357 } |
| 367 | 358 |
| 359 TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) { |
| 360 std::set<int> free_node_ids; |
| 361 int tab_node_id = TabNodePool::kInvalidTabNodeID; |
| 362 const int kWindow1 = 1; |
| 363 const int kTabNode1 = 1; |
| 364 const int kTabNode2 = 2; |
| 365 const int kTabNode3 = 3; |
| 366 const int kTab1 = 15; |
| 367 const int kTab2 = 25; |
| 368 const int kTab3 = 35; |
| 369 const int kTabIndex = 0; |
| 370 |
| 371 GetTracker()->SetLocalSessionTag(kTag); |
| 372 |
| 373 // Start with two restored tab nodes. |
| 374 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); |
| 375 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2); |
| 376 EXPECT_TRUE(GetTabNodePool()->Empty()); |
| 377 EXPECT_FALSE(GetTabNodePool()->Full()); |
| 378 EXPECT_EQ(2U, GetTabNodePool()->Capacity()); |
| 379 |
| 380 // Associate with no tabs. The tab pool should now be full. |
| 381 GetTracker()->ResetSessionTracking(kTag); |
| 382 GetTracker()->CleanupLocalTabs(&free_node_ids); |
| 383 EXPECT_TRUE(free_node_ids.empty()); |
| 384 EXPECT_TRUE(GetTabNodePool()->Full()); |
| 385 |
| 386 // Associate with only 1 tab open. A tab node should be reused. |
| 387 GetTracker()->ResetSessionTracking(kTag); |
| 388 GetTracker()->PutWindowInSession(kTag, kWindow1); |
| 389 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1, kTabIndex); |
| 390 EXPECT_TRUE(GetTracker()->GetTabNodeForLocalTab(kTab1, &tab_node_id)); |
| 391 GetTracker()->CleanupLocalTabs(&free_node_ids); |
| 392 EXPECT_TRUE(free_node_ids.empty()); |
| 393 |
| 394 // TabNodePool should have one free tab node and one used. |
| 395 EXPECT_EQ(2U, GetTabNodePool()->Capacity()); |
| 396 EXPECT_FALSE(GetTabNodePool()->Empty()); |
| 397 EXPECT_FALSE(GetTabNodePool()->Full()); |
| 398 |
| 399 // Simulate a tab opening, which should use the last free tab node. |
| 400 EXPECT_TRUE(GetTracker()->GetTabNodeForLocalTab(kTab2, &tab_node_id)); |
| 401 EXPECT_TRUE(GetTabNodePool()->Empty()); |
| 402 |
| 403 // Simulate another tab opening, which should create a new associated tab |
| 404 // node. |
| 405 EXPECT_FALSE(GetTracker()->GetTabNodeForLocalTab(kTab3, &tab_node_id)); |
| 406 EXPECT_EQ(kTabNode3, tab_node_id); |
| 407 EXPECT_EQ(3U, GetTabNodePool()->Capacity()); |
| 408 EXPECT_TRUE(GetTabNodePool()->Empty()); |
| 409 |
| 410 // Fetching the same tab should return the same tab node id. |
| 411 EXPECT_TRUE(GetTracker()->GetTabNodeForLocalTab(kTab3, &tab_node_id)); |
| 412 EXPECT_EQ(kTabNode3, tab_node_id); |
| 413 EXPECT_TRUE(GetTabNodePool()->Empty()); |
| 414 |
| 415 // Associate with no tabs. All tabs should be freed again, and the pool |
| 416 // should now be full. |
| 417 GetTracker()->ResetSessionTracking(kTag); |
| 418 GetTracker()->CleanupLocalTabs(&free_node_ids); |
| 419 EXPECT_TRUE(free_node_ids.empty()); |
| 420 EXPECT_TRUE(GetTabNodePool()->Full()); |
| 421 EXPECT_FALSE(GetTabNodePool()->Empty()); |
| 422 } |
| 423 |
| 424 TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { |
| 425 std::set<int> free_node_ids; |
| 426 const int kWindow1 = 1; |
| 427 const int kTabNode = 0; |
| 428 const int kTabIndex = 0; |
| 429 const int kTab1 = 15; |
| 430 const int kTab2 = 25; |
| 431 |
| 432 // First create the tab normally. |
| 433 GetTracker()->SetLocalSessionTag(kTag); |
| 434 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); |
| 435 |
| 436 // Map it to a window with the same tab id as it was created with. |
| 437 GetTracker()->ResetSessionTracking(kTag); |
| 438 GetTracker()->PutWindowInSession(kTag, kWindow1); |
| 439 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1, kTabIndex); |
| 440 GetTracker()->CleanupLocalTabs(&free_node_ids); |
| 441 SyncedSession* session = GetTracker()->GetSession(kTag); |
| 442 ASSERT_EQ(1U, session->windows.size()); |
| 443 ASSERT_EQ(1U, session->windows[kWindow1]->tabs.size()); |
| 444 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), |
| 445 session->windows[kWindow1]->tabs[0].get()); |
| 446 |
| 447 // Then reassociate with a new tab id. |
| 448 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); |
| 449 |
| 450 // Reset tracking, and put the new tab id into the window. |
| 451 GetTracker()->ResetSessionTracking(kTag); |
| 452 GetTracker()->PutWindowInSession(kTag, kWindow1); |
| 453 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2, kTabIndex); |
| 454 GetTracker()->CleanupLocalTabs(&free_node_ids); |
| 455 EXPECT_TRUE(free_node_ids.empty()); |
| 456 |
| 457 // Now that it's been mapped, it should be accessible both via the |
| 458 // GetSession as well as the GetTab. |
| 459 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), |
| 460 session->windows[kWindow1]->tabs[0].get()); |
| 461 ASSERT_EQ(session->tab_node_ids.size(), |
| 462 session->tab_node_ids.count(kTabNode)); |
| 463 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); |
| 464 } |
| 465 |
| 466 TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) { |
| 467 std::set<int> free_node_ids; |
| 468 const int kWindow1 = 1; |
| 469 const int kTabNode = 0; |
| 470 const int kTabIndex = 0; |
| 471 const int kTab1 = 15; |
| 472 const int kTab2 = 25; |
| 473 |
| 474 // First create the old tab in an unmapped state. |
| 475 GetTracker()->SetLocalSessionTag(kTag); |
| 476 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); |
| 477 |
| 478 // Map it to a window, but reassociated with a new tab id. |
| 479 GetTracker()->ResetSessionTracking(kTag); |
| 480 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); |
| 481 GetTracker()->PutWindowInSession(kTag, kWindow1); |
| 482 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2, kTabIndex); |
| 483 GetTracker()->CleanupLocalTabs(&free_node_ids); |
| 484 EXPECT_TRUE(free_node_ids.empty()); |
| 485 |
| 486 // Now that it's been mapped, it should be accessible both via the |
| 487 // GetSession as well as GetTab. |
| 488 SyncedSession* session = GetTracker()->GetSession(kTag); |
| 489 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), |
| 490 session->windows[kWindow1]->tabs[0].get()); |
| 491 ASSERT_EQ(session->tab_node_ids.size(), |
| 492 session->tab_node_ids.count(kTabNode)); |
| 493 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); |
| 494 } |
| 495 |
| 368 } // namespace sync_sessions | 496 } // namespace sync_sessions |
| OLD | NEW |