blob: 88cdf646fa242f387742b50816eb6d5dc24f4c96 [file] [log] [blame]
skuhneb7409dcf2014-11-14 04:06:551// Copyright 2012 The Chromium Authors. All rights reserved.
[email protected]13daae6d2011-10-04 13:43:122// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
danakj5b9c7ed62016-04-22 23:33:375#include "components/sync_sessions/synced_session_tracker.h"
6
[email protected]13daae6d2011-10-04 13:43:127#include "base/rand_util.h"
[email protected]54618862013-06-10 20:37:098#include "base/strings/stringprintf.h"
[email protected]e309f312013-06-07 21:50:089#include "base/strings/utf_string_conversions.h"
blundell47c6d8a2015-09-24 11:06:4010#include "components/sessions/core/serialized_navigation_entry_test_helper.h"
zeaf09345c2015-10-27 05:29:5011#include "components/sync_sessions/fake_sync_sessions_client.h"
pnoland1901afa52017-03-23 21:24:0012#include "components/sync_sessions/synced_tab_delegate.h"
[email protected]13daae6d2011-10-04 13:43:1213#include "testing/gtest/include/gtest/gtest.h"
14
zea783900c2017-05-05 00:46:4715using testing::AssertionFailure;
16using testing::AssertionResult;
17using testing::AssertionSuccess;
18
maxboguea79d99b72016-09-15 15:59:1619namespace sync_sessions {
[email protected]13daae6d2011-10-04 13:43:1220
zeaf09345c2015-10-27 05:29:5021namespace {
22
thestig1cbab2cb2016-06-13 18:35:5323const char kValidUrl[] = "http://www.example.com";
24const char kInvalidUrl[] = "invalid.url";
zea9b42f4312017-03-01 19:15:4425const char kTag[] = "tag";
26const char kTag2[] = "tag2";
27const char kTag3[] = "tag3";
28const char kTitle[] = "title";
29const int kWindow1 = 1;
zea783900c2017-05-05 00:46:4730const int kTabNode1 = 1;
31const int kTabNode2 = 2;
32const int kTabNode3 = 3;
zea9b42f4312017-03-01 19:15:4433const int kTab1 = 15;
34const int kTab2 = 25;
35const int kTab3 = 35;
zeaf09345c2015-10-27 05:29:5036
37} // namespace
38
39class SyncedSessionTrackerTest : public testing::Test {
40 public:
41 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {}
42 ~SyncedSessionTrackerTest() override {}
43
44 SyncedSessionTracker* GetTracker() { return &tracker_; }
zea9b42f4312017-03-01 19:15:4445 TabNodePool* GetTabNodePool() { return &tracker_.local_tab_pool_; }
zeaf09345c2015-10-27 05:29:5046
zea783900c2017-05-05 00:46:4747 // Verify that each tab within a session is allocated one SessionTab object,
48 // and that that tab object is owned either by the Session itself or the
49 // |unmapped_tabs_| tab holder.
50 AssertionResult VerifyTabIntegrity(const std::string& session_tag) {
51 // First get all the tabs associated with this session.
52 int total_tab_count = 0;
53 auto tab_map_iter = tracker_.synced_tab_map_.find(session_tag);
54 if (tab_map_iter != tracker_.synced_tab_map_.end())
55 total_tab_count = tab_map_iter->second.size();
56
57 // Now traverse the SyncedSession tree to verify the mapped tabs all match
58 // up.
59 int mapped_tab_count = 0;
60 if (tracker_.synced_session_map_.find(session_tag) !=
61 tracker_.synced_session_map_.end()) {
62 SyncedSession* session = tracker_.synced_session_map_[session_tag].get();
63 for (auto& window_pair : session->windows) {
64 mapped_tab_count += window_pair.second->wrapped_window.tabs.size();
65 for (auto& tab : window_pair.second->wrapped_window.tabs) {
66 if (tab_map_iter->second[tab->tab_id.id()] != tab.get()) {
67 return AssertionFailure()
68 << "Mapped tab " << tab->tab_id.id()
69 << " does not match synced tab map " << tab->tab_id.id();
70 }
71 }
72 }
73 }
74
75 // Wrap up by verifying all unmapped tabs are tracked.
76 int unmapped_tab_count = 0;
77 if (tracker_.unmapped_tabs_.find(session_tag) !=
78 tracker_.unmapped_tabs_.end()) {
79 unmapped_tab_count = tracker_.unmapped_tabs_[session_tag].size();
80 for (const auto& tab_pair : tracker_.unmapped_tabs_[session_tag]) {
81 if (tab_pair.first != tab_pair.second->tab_id.id()) {
82 return AssertionFailure()
83 << "Unmapped tab " << tab_pair.second->tab_id.id()
84 << " associated with wrong tab " << tab_pair.first;
85 }
86 if (tab_map_iter->second[tab_pair.second->tab_id.id()] !=
87 tab_pair.second.get()) {
88 return AssertionFailure()
89 << "Unmapped tab " << tab_pair.second->tab_id.id()
90 << " does not match synced tab map "
91 << tab_pair.second->tab_id.id();
92 }
93 }
94 }
95
96 return mapped_tab_count + unmapped_tab_count == total_tab_count
97 ? AssertionSuccess()
98 : AssertionFailure()
99 << " Tab count mismatch. Total: " << total_tab_count
100 << ". Mapped + Unmapped: " << mapped_tab_count << " + "
101 << unmapped_tab_count;
102 }
103
zeaf09345c2015-10-27 05:29:50104 private:
maxboguea79d99b72016-09-15 15:59:16105 FakeSyncSessionsClient sessions_client_;
zeaf09345c2015-10-27 05:29:50106 SyncedSessionTracker tracker_;
107};
[email protected]13daae6d2011-10-04 13:43:12108
109TEST_F(SyncedSessionTrackerTest, GetSession) {
zea9b42f4312017-03-01 19:15:44110 SyncedSession* session1 = GetTracker()->GetSession(kTag);
111 SyncedSession* session2 = GetTracker()->GetSession(kTag2);
112 ASSERT_EQ(session1, GetTracker()->GetSession(kTag));
[email protected]13daae6d2011-10-04 13:43:12113 ASSERT_NE(session1, session2);
[email protected]5ecb11d2012-04-10 17:01:29114 // Should clean up memory on its own.
[email protected]13daae6d2011-10-04 13:43:12115}
116
117TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) {
zea9b42f4312017-03-01 19:15:44118 sessions::SessionTab* tab = GetTracker()->GetTab(kTag, 0);
119 ASSERT_EQ(tab, GetTracker()->GetTab(kTag, 0));
[email protected]5ecb11d2012-04-10 17:01:29120 // Should clean up memory on its own.
[email protected]13daae6d2011-10-04 13:43:12121}
122
123TEST_F(SyncedSessionTrackerTest, PutWindowInSession) {
zea9b42f4312017-03-01 19:15:44124 GetTracker()->PutWindowInSession(kTag, 0);
125 SyncedSession* session = GetTracker()->GetSession(kTag);
[email protected]13daae6d2011-10-04 13:43:12126 ASSERT_EQ(1U, session->windows.size());
zea92d4a102017-04-18 06:26:07127
128 // Doing it again should have no effect.
129 GetTracker()->PutWindowInSession(kTag, 0);
130 ASSERT_EQ(1U, session->windows.size());
[email protected]5ecb11d2012-04-10 17:01:29131 // Should clean up memory on its own.
[email protected]13daae6d2011-10-04 13:43:12132}
133
134TEST_F(SyncedSessionTrackerTest, PutTabInWindow) {
zea9b42f4312017-03-01 19:15:44135 GetTracker()->PutWindowInSession(kTag, 10);
136 GetTracker()->PutTabInWindow(kTag, 10, 15); // win id 10, tab id 15
137 SyncedSession* session = GetTracker()->GetSession(kTag);
[email protected]13daae6d2011-10-04 13:43:12138 ASSERT_EQ(1U, session->windows.size());
zea325508e2017-03-29 20:11:22139 ASSERT_EQ(1U, session->windows[10]->wrapped_window.tabs.size());
zea9b42f4312017-03-01 19:15:44140 ASSERT_EQ(GetTracker()->GetTab(kTag, 15),
zea325508e2017-03-29 20:11:22141 session->windows[10]->wrapped_window.tabs[0].get());
zea783900c2017-05-05 00:46:47142 ASSERT_TRUE(VerifyTabIntegrity(kTag));
[email protected]5ecb11d2012-04-10 17:01:29143 // Should clean up memory on its own.
[email protected]13daae6d2011-10-04 13:43:12144}
145
146TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) {
maxboguea79d99b72016-09-15 15:59:16147 std::vector<const SyncedSession*> sessions;
skym199c7fd2016-04-14 19:26:42148 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions(
149 &sessions, SyncedSessionTracker::PRESENTABLE));
zea9b42f4312017-03-01 19:15:44150 GetTracker()->GetSession(kTag);
151 GetTracker()->PutWindowInSession(kTag, 0);
152 GetTracker()->PutTabInWindow(kTag, 0, 15);
153 sessions::SessionTab* tab = GetTracker()->GetTab(kTag, 15);
zeaf09345c2015-10-27 05:29:50154 ASSERT_TRUE(tab);
155 tab->navigations.push_back(
156 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(kValidUrl,
zea9b42f4312017-03-01 19:15:44157 kTitle));
158 GetTracker()->GetSession(kTag2);
159 GetTracker()->GetSession(kTag3);
160 GetTracker()->PutWindowInSession(kTag3, 0);
161 GetTracker()->PutTabInWindow(kTag3, 0, 15);
162 tab = GetTracker()->GetTab(kTag3, 15);
[email protected]13daae6d2011-10-04 13:43:12163 ASSERT_TRUE(tab);
[email protected]40a7e412013-04-29 18:13:01164 tab->navigations.push_back(
165 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
zea9b42f4312017-03-01 19:15:44166 kInvalidUrl, kTitle));
skym199c7fd2016-04-14 19:26:42167 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions(
168 &sessions, SyncedSessionTracker::PRESENTABLE));
[email protected]13daae6d2011-10-04 13:43:12169 // Only the session with a valid window and tab gets returned.
170 ASSERT_EQ(1U, sessions.size());
zea9b42f4312017-03-01 19:15:44171 ASSERT_EQ(kTag, sessions[0]->session_tag);
skym199c7fd2016-04-14 19:26:42172
173 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions(
174 &sessions, SyncedSessionTracker::RAW));
175 ASSERT_EQ(3U, sessions.size());
[email protected]13daae6d2011-10-04 13:43:12176}
177
178TEST_F(SyncedSessionTrackerTest, LookupSessionWindows) {
skuhneb7409dcf2014-11-14 04:06:55179 std::vector<const sessions::SessionWindow*> windows;
zea9b42f4312017-03-01 19:15:44180 ASSERT_FALSE(GetTracker()->LookupSessionWindows(kTag, &windows));
181 GetTracker()->GetSession(kTag);
182 GetTracker()->PutWindowInSession(kTag, 0);
183 GetTracker()->PutWindowInSession(kTag, 2);
184 GetTracker()->GetSession(kTag2);
185 GetTracker()->PutWindowInSession(kTag2, 0);
186 GetTracker()->PutWindowInSession(kTag2, 2);
187 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag, &windows));
188 ASSERT_EQ(2U, windows.size()); // Only windows from kTag session.
skuhneb7409dcf2014-11-14 04:06:55189 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[0]);
190 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[1]);
[email protected]13daae6d2011-10-04 13:43:12191 ASSERT_NE(windows[1], windows[0]);
192}
193
194TEST_F(SyncedSessionTrackerTest, LookupSessionTab) {
skuhneb7409dcf2014-11-14 04:06:55195 const sessions::SessionTab* tab;
pnoland1901afa52017-03-23 21:24:00196 ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, kInvalidTabID, &tab));
zea9b42f4312017-03-01 19:15:44197 ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, 5, &tab));
198 GetTracker()->GetSession(kTag);
199 GetTracker()->PutWindowInSession(kTag, 0);
200 GetTracker()->PutTabInWindow(kTag, 0, 5);
201 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 5, &tab));
skuhneb7409dcf2014-11-14 04:06:55202 ASSERT_NE((sessions::SessionTab*)nullptr, tab);
[email protected]13daae6d2011-10-04 13:43:12203}
204
205TEST_F(SyncedSessionTrackerTest, Complex) {
zeac2f678e2015-10-28 06:16:10206 std::vector<sessions::SessionTab *> tabs1, tabs2;
skuhneb7409dcf2014-11-14 04:06:55207 sessions::SessionTab* temp_tab;
zeaf09345c2015-10-27 05:29:50208 ASSERT_TRUE(GetTracker()->Empty());
209 ASSERT_EQ(0U, GetTracker()->num_synced_sessions());
zea9b42f4312017-03-01 19:15:44210 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag));
211 tabs1.push_back(GetTracker()->GetTab(kTag, 0));
212 tabs1.push_back(GetTracker()->GetTab(kTag, 1));
213 tabs1.push_back(GetTracker()->GetTab(kTag, 2));
214 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag));
215 ASSERT_EQ(0U, GetTracker()->num_synced_sessions());
216 temp_tab = GetTracker()->GetTab(kTag, 0); // Already created.
217 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag));
218 ASSERT_EQ(0U, GetTracker()->num_synced_sessions());
[email protected]13daae6d2011-10-04 13:43:12219 ASSERT_EQ(tabs1[0], temp_tab);
zea9b42f4312017-03-01 19:15:44220 tabs2.push_back(GetTracker()->GetTab(kTag2, 0));
221 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2));
222 ASSERT_EQ(0U, GetTracker()->num_synced_sessions());
223 ASSERT_FALSE(GetTracker()->DeleteForeignSession(kTag3));
[email protected]13daae6d2011-10-04 13:43:12224
zea9b42f4312017-03-01 19:15:44225 SyncedSession* session = GetTracker()->GetSession(kTag);
226 SyncedSession* session2 = GetTracker()->GetSession(kTag2);
227 SyncedSession* session3 = GetTracker()->GetSession(kTag3);
maxboguea79d99b72016-09-15 15:59:16228 session3->device_type = SyncedSession::TYPE_OTHER;
zeaf09345c2015-10-27 05:29:50229 ASSERT_EQ(3U, GetTracker()->num_synced_sessions());
[email protected]13daae6d2011-10-04 13:43:12230
231 ASSERT_TRUE(session);
232 ASSERT_TRUE(session2);
233 ASSERT_TRUE(session3);
234 ASSERT_NE(session, session2);
235 ASSERT_NE(session2, session3);
zea9b42f4312017-03-01 19:15:44236 ASSERT_TRUE(GetTracker()->DeleteForeignSession(kTag3));
zeaf09345c2015-10-27 05:29:50237 ASSERT_EQ(2U, GetTracker()->num_synced_sessions());
[email protected]13daae6d2011-10-04 13:43:12238
zea9b42f4312017-03-01 19:15:44239 GetTracker()->PutWindowInSession(kTag, 0); // Create a window.
240 GetTracker()->PutTabInWindow(kTag, 0, 2); // No longer unmapped.
241 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag)); // Has not changed.
[email protected]13daae6d2011-10-04 13:43:12242
zeac2f678e2015-10-28 06:16:10243 const sessions::SessionTab* tab_ptr;
zea9b42f4312017-03-01 19:15:44244 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 0, &tab_ptr));
[email protected]13daae6d2011-10-04 13:43:12245 ASSERT_EQ(tab_ptr, tabs1[0]);
zea9b42f4312017-03-01 19:15:44246 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 2, &tab_ptr));
[email protected]13daae6d2011-10-04 13:43:12247 ASSERT_EQ(tab_ptr, tabs1[2]);
zea9b42f4312017-03-01 19:15:44248 ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, 3, &tab_ptr));
thestig1cbab2cb2016-06-13 18:35:53249 ASSERT_FALSE(tab_ptr);
[email protected]13daae6d2011-10-04 13:43:12250
skuhneb7409dcf2014-11-14 04:06:55251 std::vector<const sessions::SessionWindow*> windows;
zea9b42f4312017-03-01 19:15:44252 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag, &windows));
[email protected]13daae6d2011-10-04 13:43:12253 ASSERT_EQ(1U, windows.size());
zea9b42f4312017-03-01 19:15:44254 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag2, &windows));
[email protected]13daae6d2011-10-04 13:43:12255 ASSERT_EQ(0U, windows.size());
256
257 // The sessions don't have valid tabs, lookup should not succeed.
maxboguea79d99b72016-09-15 15:59:16258 std::vector<const SyncedSession*> sessions;
skym199c7fd2016-04-14 19:26:42259 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions(
260 &sessions, SyncedSessionTracker::PRESENTABLE));
261 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions(
262 &sessions, SyncedSessionTracker::RAW));
263 ASSERT_EQ(2U, sessions.size());
[email protected]13daae6d2011-10-04 13:43:12264
zeaf09345c2015-10-27 05:29:50265 GetTracker()->Clear();
zea9b42f4312017-03-01 19:15:44266 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag));
267 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag2));
zeaf09345c2015-10-27 05:29:50268 ASSERT_EQ(0U, GetTracker()->num_synced_sessions());
zea783900c2017-05-05 00:46:47269 ASSERT_TRUE(VerifyTabIntegrity(kTag));
[email protected]13daae6d2011-10-04 13:43:12270}
271
272TEST_F(SyncedSessionTrackerTest, ManyGetTabs) {
zeaf09345c2015-10-27 05:29:50273 ASSERT_TRUE(GetTracker()->Empty());
[email protected]13daae6d2011-10-04 13:43:12274 const int kMaxSessions = 10;
275 const int kMaxTabs = 1000;
276 const int kMaxAttempts = 10000;
zeac2f678e2015-10-28 06:16:10277 for (int j = 0; j < kMaxSessions; ++j) {
[email protected]02991c0d2011-11-08 09:27:43278 std::string tag = base::StringPrintf("tag%d", j);
zeac2f678e2015-10-28 06:16:10279 for (int i = 0; i < kMaxAttempts; ++i) {
[email protected]13daae6d2011-10-04 13:43:12280 // More attempts than tabs means we'll sometimes get the same tabs,
281 // sometimes have to allocate new tabs.
282 int rand_tab_num = base::RandInt(0, kMaxTabs);
zea9b42f4312017-03-01 19:15:44283 sessions::SessionTab* tab = GetTracker()->GetTab(tag, rand_tab_num + 1);
[email protected]13daae6d2011-10-04 13:43:12284 ASSERT_TRUE(tab);
285 }
286 }
287}
288
zea9b42f4312017-03-01 19:15:44289TEST_F(SyncedSessionTrackerTest, LookupForeignTabNodeIds) {
[email protected]98f589d2013-08-01 05:14:01290 std::set<int> result;
[email protected]98f589d2013-08-01 05:14:01291
zea9b42f4312017-03-01 19:15:44292 GetTracker()->OnTabNodeSeen(kTag, 1);
293 GetTracker()->OnTabNodeSeen(kTag, 2);
294 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
[email protected]98f589d2013-08-01 05:14:01295 EXPECT_EQ(2U, result.size());
296 EXPECT_FALSE(result.end() == result.find(1));
297 EXPECT_FALSE(result.end() == result.find(2));
zea9b42f4312017-03-01 19:15:44298 GetTracker()->LookupForeignTabNodeIds(kTag2, &result);
skym199c7fd2016-04-14 19:26:42299 EXPECT_TRUE(result.empty());
[email protected]98f589d2013-08-01 05:14:01300
zea9b42f4312017-03-01 19:15:44301 GetTracker()->PutWindowInSession(kTag, 0);
302 GetTracker()->PutTabInWindow(kTag, 0, 3);
303 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
[email protected]98f589d2013-08-01 05:14:01304 EXPECT_EQ(2U, result.size());
305
zea9b42f4312017-03-01 19:15:44306 GetTracker()->OnTabNodeSeen(kTag, 3);
307 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
[email protected]98f589d2013-08-01 05:14:01308 EXPECT_EQ(3U, result.size());
309 EXPECT_FALSE(result.end() == result.find(3));
310
zea9b42f4312017-03-01 19:15:44311 GetTracker()->OnTabNodeSeen(kTag2, 21);
312 GetTracker()->OnTabNodeSeen(kTag2, 22);
313 GetTracker()->LookupForeignTabNodeIds(kTag2, &result);
[email protected]98f589d2013-08-01 05:14:01314 EXPECT_EQ(2U, result.size());
315 EXPECT_FALSE(result.end() == result.find(21));
316 EXPECT_FALSE(result.end() == result.find(22));
zea9b42f4312017-03-01 19:15:44317 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
[email protected]98f589d2013-08-01 05:14:01318 EXPECT_EQ(3U, result.size());
319 EXPECT_FALSE(result.end() == result.find(1));
320 EXPECT_FALSE(result.end() == result.find(2));
321
zea9b42f4312017-03-01 19:15:44322 GetTracker()->LookupForeignTabNodeIds(kTag3, &result);
skym199c7fd2016-04-14 19:26:42323 EXPECT_TRUE(result.empty());
zea9b42f4312017-03-01 19:15:44324 GetTracker()->PutWindowInSession(kTag3, 1);
325 GetTracker()->PutTabInWindow(kTag3, 1, 5);
326 GetTracker()->LookupForeignTabNodeIds(kTag3, &result);
[email protected]98f589d2013-08-01 05:14:01327 EXPECT_TRUE(result.empty());
zea9b42f4312017-03-01 19:15:44328 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag3));
329 GetTracker()->LookupForeignTabNodeIds(kTag3, &result);
skym199c7fd2016-04-14 19:26:42330 EXPECT_TRUE(result.empty());
[email protected]98f589d2013-08-01 05:14:01331
zea9b42f4312017-03-01 19:15:44332 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag));
333 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
skym199c7fd2016-04-14 19:26:42334 EXPECT_TRUE(result.empty());
zea9b42f4312017-03-01 19:15:44335 GetTracker()->LookupForeignTabNodeIds(kTag2, &result);
[email protected]98f589d2013-08-01 05:14:01336 EXPECT_EQ(2U, result.size());
337 EXPECT_FALSE(result.end() == result.find(21));
338 EXPECT_FALSE(result.end() == result.find(22));
skym199c7fd2016-04-14 19:26:42339
zea9b42f4312017-03-01 19:15:44340 GetTracker()->OnTabNodeSeen(kTag2, 21);
341 GetTracker()->OnTabNodeSeen(kTag2, 23);
342 GetTracker()->LookupForeignTabNodeIds(kTag2, &result);
skym199c7fd2016-04-14 19:26:42343 EXPECT_EQ(3U, result.size());
344 EXPECT_FALSE(result.end() == result.find(21));
345 EXPECT_FALSE(result.end() == result.find(22));
346 EXPECT_FALSE(result.end() == result.find(23));
347
zea9b42f4312017-03-01 19:15:44348 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag2));
349 GetTracker()->LookupForeignTabNodeIds(kTag2, &result);
skym199c7fd2016-04-14 19:26:42350 EXPECT_TRUE(result.empty());
[email protected]98f589d2013-08-01 05:14:01351}
352
[email protected]13daae6d2011-10-04 13:43:12353TEST_F(SyncedSessionTrackerTest, SessionTracking) {
zeaf09345c2015-10-27 05:29:50354 ASSERT_TRUE(GetTracker()->Empty());
[email protected]13daae6d2011-10-04 13:43:12355
356 // Create some session information that is stale.
zea9b42f4312017-03-01 19:15:44357 SyncedSession* session1 = GetTracker()->GetSession(kTag);
358 GetTracker()->PutWindowInSession(kTag, 0);
359 GetTracker()->PutTabInWindow(kTag, 0, 0);
360 GetTracker()->PutTabInWindow(kTag, 0, 1);
361 GetTracker()->GetTab(kTag, 2)->window_id.set_id(0); // Will be unmapped.
362 GetTracker()->GetTab(kTag, 3)->window_id.set_id(0); // Will be unmapped.
363 GetTracker()->PutWindowInSession(kTag, 1);
364 GetTracker()->PutTabInWindow(kTag, 1, 4);
365 GetTracker()->PutTabInWindow(kTag, 1, 5);
[email protected]13daae6d2011-10-04 13:43:12366 ASSERT_EQ(2U, session1->windows.size());
zea325508e2017-03-29 20:11:22367 ASSERT_EQ(2U, session1->windows[0]->wrapped_window.tabs.size());
368 ASSERT_EQ(2U, session1->windows[1]->wrapped_window.tabs.size());
zea9b42f4312017-03-01 19:15:44369 ASSERT_EQ(6U, GetTracker()->num_synced_tabs(kTag));
[email protected]13daae6d2011-10-04 13:43:12370
371 // Create a session that should not be affected.
zea9b42f4312017-03-01 19:15:44372 SyncedSession* session2 = GetTracker()->GetSession(kTag2);
373 GetTracker()->PutWindowInSession(kTag2, 2);
374 GetTracker()->PutTabInWindow(kTag2, 2, 1);
[email protected]13daae6d2011-10-04 13:43:12375 ASSERT_EQ(1U, session2->windows.size());
zea325508e2017-03-29 20:11:22376 ASSERT_EQ(1U, session2->windows[2]->wrapped_window.tabs.size());
zea9b42f4312017-03-01 19:15:44377 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2));
[email protected]13daae6d2011-10-04 13:43:12378
379 // Reset tracking and get the current windows/tabs.
[email protected]98f589d2013-08-01 05:14:01380 // We simulate moving a tab from one window to another, then closing the
381 // first window (including its one remaining tab), and opening a new tab
382 // on the remaining window.
383
384 // New tab, arrived before meta node so unmapped.
zea9b42f4312017-03-01 19:15:44385 GetTracker()->GetTab(kTag, 6);
386 GetTracker()->ResetSessionTracking(kTag);
387 GetTracker()->PutWindowInSession(kTag, 0);
388 GetTracker()->PutTabInWindow(kTag, 0, 0);
[email protected]13daae6d2011-10-04 13:43:12389 // Tab 1 is closed.
zea9b42f4312017-03-01 19:15:44390 GetTracker()->PutTabInWindow(kTag, 0, 2); // No longer unmapped.
[email protected]13daae6d2011-10-04 13:43:12391 // Tab 3 was unmapped and does not get used.
zea9b42f4312017-03-01 19:15:44392 GetTracker()->PutTabInWindow(kTag, 0, 4); // Moved from window 1.
[email protected]13daae6d2011-10-04 13:43:12393 // Window 1 was closed, along with tab 5.
zea9b42f4312017-03-01 19:15:44394 GetTracker()->PutTabInWindow(kTag, 0, 6); // No longer unmapped.
[email protected]13daae6d2011-10-04 13:43:12395 // Session 2 should not be affected.
zea92d4a102017-04-18 06:26:07396 GetTracker()->CleanupSession(kTag);
[email protected]13daae6d2011-10-04 13:43:12397
398 // Verify that only those parts of the session not owned have been removed.
399 ASSERT_EQ(1U, session1->windows.size());
zea325508e2017-03-29 20:11:22400 ASSERT_EQ(4U, session1->windows[0]->wrapped_window.tabs.size());
[email protected]13daae6d2011-10-04 13:43:12401 ASSERT_EQ(1U, session2->windows.size());
zea325508e2017-03-29 20:11:22402 ASSERT_EQ(1U, session2->windows[2]->wrapped_window.tabs.size());
zeaf09345c2015-10-27 05:29:50403 ASSERT_EQ(2U, GetTracker()->num_synced_sessions());
zea9b42f4312017-03-01 19:15:44404 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(kTag));
405 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2));
zea783900c2017-05-05 00:46:47406 ASSERT_TRUE(VerifyTabIntegrity(kTag));
[email protected]13daae6d2011-10-04 13:43:12407
408 // All memory should be properly deallocated by destructor for the
409 // SyncedSessionTracker.
410}
411
skym199c7fd2016-04-14 19:26:42412TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) {
zea9b42f4312017-03-01 19:15:44413 int tab_node_id_1 = 1;
414 int tab_node_id_2 = 2;
skym199c7fd2016-04-14 19:26:42415 std::set<int> result;
416
zea9b42f4312017-03-01 19:15:44417 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_1);
418 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_2);
skym199c7fd2016-04-14 19:26:42419
zea9b42f4312017-03-01 19:15:44420 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
skym199c7fd2016-04-14 19:26:42421 EXPECT_EQ(2U, result.size());
zea9b42f4312017-03-01 19:15:44422 EXPECT_TRUE(result.find(tab_node_id_1) != result.end());
423 EXPECT_TRUE(result.find(tab_node_id_2) != result.end());
skym199c7fd2016-04-14 19:26:42424
zea9b42f4312017-03-01 19:15:44425 GetTracker()->DeleteForeignTab(kTag, tab_node_id_1);
426 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
skym199c7fd2016-04-14 19:26:42427 EXPECT_EQ(1U, result.size());
zea9b42f4312017-03-01 19:15:44428 EXPECT_TRUE(result.find(tab_node_id_2) != result.end());
skym199c7fd2016-04-14 19:26:42429
zea9b42f4312017-03-01 19:15:44430 GetTracker()->DeleteForeignTab(kTag, tab_node_id_2);
431 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
skym199c7fd2016-04-14 19:26:42432 EXPECT_TRUE(result.empty());
zea783900c2017-05-05 00:46:47433 ASSERT_TRUE(VerifyTabIntegrity(kTag));
skym199c7fd2016-04-14 19:26:42434}
435
zea9b42f4312017-03-01 19:15:44436TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) {
437 std::set<int> free_node_ids;
438 int tab_node_id = TabNodePool::kInvalidTabNodeID;
zea9b42f4312017-03-01 19:15:44439
440 GetTracker()->SetLocalSessionTag(kTag);
441
442 // Start with two restored tab nodes.
443 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
444 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2);
445 EXPECT_TRUE(GetTabNodePool()->Empty());
446 EXPECT_FALSE(GetTabNodePool()->Full());
447 EXPECT_EQ(2U, GetTabNodePool()->Capacity());
448
449 // Associate with no tabs. The tab pool should now be full.
450 GetTracker()->ResetSessionTracking(kTag);
451 GetTracker()->CleanupLocalTabs(&free_node_ids);
452 EXPECT_TRUE(free_node_ids.empty());
453 EXPECT_TRUE(GetTabNodePool()->Full());
454
455 // Associate with only 1 tab open. A tab node should be reused.
456 GetTracker()->ResetSessionTracking(kTag);
457 GetTracker()->PutWindowInSession(kTag, kWindow1);
458 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
459 EXPECT_TRUE(GetTracker()->GetTabNodeFromLocalTabId(kTab1, &tab_node_id));
460 GetTracker()->CleanupLocalTabs(&free_node_ids);
461 EXPECT_TRUE(free_node_ids.empty());
462
463 // TabNodePool should have one free tab node and one used.
464 EXPECT_EQ(2U, GetTabNodePool()->Capacity());
465 EXPECT_FALSE(GetTabNodePool()->Empty());
466 EXPECT_FALSE(GetTabNodePool()->Full());
467
468 // Simulate a tab opening, which should use the last free tab node.
469 EXPECT_TRUE(GetTracker()->GetTabNodeFromLocalTabId(kTab2, &tab_node_id));
470 EXPECT_TRUE(GetTabNodePool()->Empty());
471
472 // Simulate another tab opening, which should create a new associated tab
473 // node.
474 EXPECT_FALSE(GetTracker()->GetTabNodeFromLocalTabId(kTab3, &tab_node_id));
475 EXPECT_EQ(kTabNode3, tab_node_id);
476 EXPECT_EQ(3U, GetTabNodePool()->Capacity());
477 EXPECT_TRUE(GetTabNodePool()->Empty());
478
479 // Fetching the same tab should return the same tab node id.
480 EXPECT_TRUE(GetTracker()->GetTabNodeFromLocalTabId(kTab3, &tab_node_id));
481 EXPECT_EQ(kTabNode3, tab_node_id);
482 EXPECT_TRUE(GetTabNodePool()->Empty());
483
484 // Associate with no tabs. All tabs should be freed again, and the pool
485 // should now be full.
486 GetTracker()->ResetSessionTracking(kTag);
487 GetTracker()->CleanupLocalTabs(&free_node_ids);
488 EXPECT_TRUE(free_node_ids.empty());
489 EXPECT_TRUE(GetTabNodePool()->Full());
490 EXPECT_FALSE(GetTabNodePool()->Empty());
zea783900c2017-05-05 00:46:47491 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44492}
493
494TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) {
495 std::set<int> free_node_ids;
496
497 // First create the tab normally.
498 GetTracker()->SetLocalSessionTag(kTag);
zea783900c2017-05-05 00:46:47499 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
500 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
501 ASSERT_TRUE(VerifyTabIntegrity(kTag));
502 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
zea9b42f4312017-03-01 19:15:44503 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
504
505 // Map it to a window with the same tab id as it was created with.
506 GetTracker()->ResetSessionTracking(kTag);
507 GetTracker()->PutWindowInSession(kTag, kWindow1);
508 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
509 GetTracker()->CleanupLocalTabs(&free_node_ids);
zea783900c2017-05-05 00:46:47510 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44511 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
512 SyncedSession* session = GetTracker()->GetSession(kTag);
513 ASSERT_EQ(1U, session->windows.size());
zea325508e2017-03-29 20:11:22514 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
zea9b42f4312017-03-01 19:15:44515 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
zea325508e2017-03-29 20:11:22516 session->windows[kWindow1]->wrapped_window.tabs[0].get());
zea9b42f4312017-03-01 19:15:44517
518 // Then reassociate with a new tab id.
zea783900c2017-05-05 00:46:47519 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
520 ASSERT_TRUE(VerifyTabIntegrity(kTag));
521 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
zea9b42f4312017-03-01 19:15:44522 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
523 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
524
525 // Reset tracking, and put the new tab id into the window.
526 GetTracker()->ResetSessionTracking(kTag);
527 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
528 GetTracker()->PutWindowInSession(kTag, kWindow1);
529 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
530 GetTracker()->CleanupLocalTabs(&free_node_ids);
zea783900c2017-05-05 00:46:47531 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44532 EXPECT_TRUE(free_node_ids.empty());
533 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
534
535 // Now that it's been mapped, it should be accessible both via the
536 // GetSession as well as the GetTab.
537 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
zea325508e2017-03-29 20:11:22538 session->windows[kWindow1]->wrapped_window.tabs[0].get());
zea9b42f4312017-03-01 19:15:44539 ASSERT_EQ(session->tab_node_ids.size(),
zea783900c2017-05-05 00:46:47540 session->tab_node_ids.count(kTabNode1));
zea9b42f4312017-03-01 19:15:44541 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
zea783900c2017-05-05 00:46:47542 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44543}
544
545TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) {
546 std::set<int> free_node_ids;
547
548 // First create the tab normally.
549 GetTracker()->SetLocalSessionTag(kTag);
zea783900c2017-05-05 00:46:47550 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
551 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
552 ASSERT_TRUE(VerifyTabIntegrity(kTag));
553 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
zea9b42f4312017-03-01 19:15:44554 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
555
556 // Map it to a window with the same tab id as it was created with.
557 GetTracker()->ResetSessionTracking(kTag);
558 GetTracker()->PutWindowInSession(kTag, kWindow1);
559 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
560 GetTracker()->CleanupLocalTabs(&free_node_ids);
zea783900c2017-05-05 00:46:47561 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44562 EXPECT_TRUE(free_node_ids.empty());
563 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
564 SyncedSession* session = GetTracker()->GetSession(kTag);
565 ASSERT_EQ(1U, session->windows.size());
zea325508e2017-03-29 20:11:22566 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
zea9b42f4312017-03-01 19:15:44567 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab1),
zea325508e2017-03-29 20:11:22568 session->windows[kWindow1]->wrapped_window.tabs[0].get());
zea9b42f4312017-03-01 19:15:44569
570 // Then reassociate with a new tab id.
zea783900c2017-05-05 00:46:47571 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
572 ASSERT_TRUE(VerifyTabIntegrity(kTag));
573 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
zea9b42f4312017-03-01 19:15:44574 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
575 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
576
577 // Tab 1 should no longer be associated with any SessionTab object. At this
578 // point there's no need to verify it's unmapped state.
579 const sessions::SessionTab* tab_ptr = nullptr;
580 EXPECT_FALSE(GetTracker()->LookupSessionTab(kTag, kTab1, &tab_ptr));
581
582 // Reset tracking and add back both the old tab and the new tab (both of which
583 // refer to the same tab node id).
584 GetTracker()->ResetSessionTracking(kTag);
585 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
586 GetTracker()->PutWindowInSession(kTag, kWindow1);
587 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
588 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
589 GetTracker()->CleanupLocalTabs(&free_node_ids);
zea783900c2017-05-05 00:46:47590 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44591 EXPECT_TRUE(free_node_ids.empty());
592 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
593
594 // Now that it's been mapped, it should be accessible both via the
595 // GetSession as well as the GetTab.
596 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab2),
zea325508e2017-03-29 20:11:22597 session->windows[kWindow1]->wrapped_window.tabs[1].get());
zea9b42f4312017-03-01 19:15:44598 EXPECT_EQ(session->tab_node_ids.size(),
zea783900c2017-05-05 00:46:47599 session->tab_node_ids.count(kTabNode1));
zea9b42f4312017-03-01 19:15:44600 EXPECT_EQ(1U, GetTabNodePool()->Capacity());
601
602 // Attempting to access the original tab will create a new SessionTab object.
603 EXPECT_NE(GetTracker()->GetTab(kTag, kTab1),
604 GetTracker()->GetTab(kTag, kTab2));
605 int tab_node_id = -1;
606 EXPECT_FALSE(GetTracker()->GetTabNodeFromLocalTabId(kTab1, &tab_node_id));
zea783900c2017-05-05 00:46:47607 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44608}
609
610TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) {
611 std::set<int> free_node_ids;
612
613 // First create the old tab in an unmapped state.
614 GetTracker()->SetLocalSessionTag(kTag);
zea783900c2017-05-05 00:46:47615 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
616 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
617 ASSERT_TRUE(VerifyTabIntegrity(kTag));
618 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
zea9b42f4312017-03-01 19:15:44619 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
620
621 // Map it to a window, but reassociated with a new tab id.
622 GetTracker()->ResetSessionTracking(kTag);
zea783900c2017-05-05 00:46:47623 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
624 ASSERT_TRUE(VerifyTabIntegrity(kTag));
625 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
zea9b42f4312017-03-01 19:15:44626 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
627 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
628 GetTracker()->PutWindowInSession(kTag, kWindow1);
629 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
630 GetTracker()->CleanupLocalTabs(&free_node_ids);
zea783900c2017-05-05 00:46:47631 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44632 EXPECT_TRUE(free_node_ids.empty());
633 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
634
635 // Now that it's been mapped, it should be accessible both via the
636 // GetSession as well as GetTab.
637 SyncedSession* session = GetTracker()->GetSession(kTag);
638 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
zea325508e2017-03-29 20:11:22639 session->windows[kWindow1]->wrapped_window.tabs[0].get());
zea9b42f4312017-03-01 19:15:44640 ASSERT_EQ(session->tab_node_ids.size(),
zea783900c2017-05-05 00:46:47641 session->tab_node_ids.count(kTabNode1));
zea9b42f4312017-03-01 19:15:44642 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
zea783900c2017-05-05 00:46:47643 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea9b42f4312017-03-01 19:15:44644}
645
zea783900c2017-05-05 00:46:47646TEST_F(SyncedSessionTrackerTest, ReassociateTabOldUnmappedNewMapped) {
zea92d4a102017-04-18 06:26:07647 std::set<int> free_node_ids;
648
649 // First create the old tab in an unmapped state.
650 GetTracker()->SetLocalSessionTag(kTag);
zea783900c2017-05-05 00:46:47651 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
652 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
653 ASSERT_TRUE(VerifyTabIntegrity(kTag));
654 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
zea92d4a102017-04-18 06:26:07655 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
656
657 // Map an unseen tab to a window, then reassociate the existing tab to the
658 // mapped tab id.
659 GetTracker()->ResetSessionTracking(kTag);
zea783900c2017-05-05 00:46:47660 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
zea92d4a102017-04-18 06:26:07661 GetTracker()->PutWindowInSession(kTag, kWindow1);
662 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
663 GetTracker()->CleanupLocalTabs(&free_node_ids);
zea783900c2017-05-05 00:46:47664 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea92d4a102017-04-18 06:26:07665 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
666 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
zea783900c2017-05-05 00:46:47667 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
668 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea92d4a102017-04-18 06:26:07669 EXPECT_TRUE(free_node_ids.empty());
670 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
671 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
672
673 // Now that it's been mapped, it should be accessible both via the
674 // GetSession as well as GetTab.
675 SyncedSession* session = GetTracker()->GetSession(kTag);
676 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
677 session->windows[kWindow1]->wrapped_window.tabs[0].get());
678 ASSERT_EQ(session->tab_node_ids.size(),
zea783900c2017-05-05 00:46:47679 session->tab_node_ids.count(kTabNode1));
zea92d4a102017-04-18 06:26:07680 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
zea783900c2017-05-05 00:46:47681 ASSERT_TRUE(VerifyTabIntegrity(kTag));
682}
683
684TEST_F(SyncedSessionTrackerTest, ReassociateTabSameTabId) {
685 std::set<int> free_node_ids;
686
687 // First create the tab normally.
688 GetTracker()->SetLocalSessionTag(kTag);
689 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
690 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
691 ASSERT_TRUE(VerifyTabIntegrity(kTag));
692 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
693 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
694
695 // Map it to a window.
696 GetTracker()->ResetSessionTracking(kTag);
697 GetTracker()->PutWindowInSession(kTag, kWindow1);
698 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
699 GetTracker()->CleanupLocalTabs(&free_node_ids);
700 ASSERT_TRUE(VerifyTabIntegrity(kTag));
701 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
702 SyncedSession* session = GetTracker()->GetSession(kTag);
703 ASSERT_EQ(1U, session->windows.size());
704 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
705 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
706 session->windows[kWindow1]->wrapped_window.tabs[0].get());
707
708 // Reassociate, using the same tab id.
709 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
710 ASSERT_TRUE(VerifyTabIntegrity(kTag));
711 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
712 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
713
714 // Reset tracking, and put the tab id back into the same window.
715 GetTracker()->ResetSessionTracking(kTag);
716 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
717 GetTracker()->PutWindowInSession(kTag, kWindow1);
718 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
719 GetTracker()->CleanupLocalTabs(&free_node_ids);
720 ASSERT_TRUE(VerifyTabIntegrity(kTag));
721 EXPECT_TRUE(free_node_ids.empty());
722 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
723
724 // Now that it's been mapped, it should be accessible both via the
725 // GetSession as well as the GetTab.
726 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
727 session->windows[kWindow1]->wrapped_window.tabs[0].get());
728 ASSERT_EQ(session->tab_node_ids.size(),
729 session->tab_node_ids.count(kTabNode1));
730 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
731 ASSERT_TRUE(VerifyTabIntegrity(kTag));
732}
733
734TEST_F(SyncedSessionTrackerTest, ReassociateTabOldMappedNewUnmapped) {
735 std::set<int> free_node_ids;
736
737 // First create an unmapped tab.
738 GetTracker()->SetLocalSessionTag(kTag);
739 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
740 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
741 ASSERT_TRUE(VerifyTabIntegrity(kTag));
742 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
743 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
744
745 // Now, map the first one, deleting the second one.
746 GetTracker()->ResetSessionTracking(kTag);
747 GetTracker()->PutWindowInSession(kTag, kWindow1);
748 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
749 GetTracker()->CleanupLocalTabs(&free_node_ids);
750 ASSERT_TRUE(VerifyTabIntegrity(kTag));
751 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
752 SyncedSession* session = GetTracker()->GetSession(kTag);
753 ASSERT_EQ(1U, session->windows.size());
754 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
755 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
756 session->windows[kWindow1]->wrapped_window.tabs[0].get());
757
758 // Create a second unmapped tab.
759 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2);
760 ASSERT_TRUE(VerifyTabIntegrity(kTag));
761 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode2));
762 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
763
764 // Reassociate the second tab with node of the first tab.
765 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
766 ASSERT_TRUE(VerifyTabIntegrity(kTag));
767 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
768 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode2));
769 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
770 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
771
772 // Now map the new one.
773 GetTracker()->ResetSessionTracking(kTag);
774 GetTracker()->PutWindowInSession(kTag, kWindow1);
775 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
776 GetTracker()->CleanupLocalTabs(&free_node_ids);
777 ASSERT_TRUE(VerifyTabIntegrity(kTag));
778 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
779 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
780
781 // Now that it's been mapped, it should be accessible both via the
782 // GetSession as well as the GetTab.
783 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
784 session->windows[kWindow1]->wrapped_window.tabs[0].get());
785 ASSERT_EQ(2U, GetTabNodePool()->Capacity());
786 ASSERT_TRUE(VerifyTabIntegrity(kTag));
zea92d4a102017-04-18 06:26:07787}
788
maxboguea79d99b72016-09-15 15:59:16789} // namespace sync_sessions