Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: components/sync_sessions/synced_session_tracker_unittest.cc

Issue 2856913007: [Sync] Handle reassociation of tabs where the old tab is already mapped. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "components/sync_sessions/synced_tab_delegate.h" 12 #include "components/sync_sessions/synced_tab_delegate.h"
13 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
14 14
15 using testing::AssertionFailure;
16 using testing::AssertionResult;
17 using testing::AssertionSuccess;
18
15 namespace sync_sessions { 19 namespace sync_sessions {
16 20
17 namespace { 21 namespace {
18 22
19 const char kValidUrl[] = "http://www.example.com"; 23 const char kValidUrl[] = "http://www.example.com";
20 const char kInvalidUrl[] = "invalid.url"; 24 const char kInvalidUrl[] = "invalid.url";
21 const char kTag[] = "tag"; 25 const char kTag[] = "tag";
22 const char kTag2[] = "tag2"; 26 const char kTag2[] = "tag2";
23 const char kTag3[] = "tag3"; 27 const char kTag3[] = "tag3";
24 const char kTitle[] = "title"; 28 const char kTitle[] = "title";
25 const int kWindow1 = 1; 29 const int kWindow1 = 1;
26 const int kTabNode = 0; 30 const int kTabNode1 = 1;
31 const int kTabNode2 = 2;
32 const int kTabNode3 = 3;
27 const int kTab1 = 15; 33 const int kTab1 = 15;
28 const int kTab2 = 25; 34 const int kTab2 = 25;
29 const int kTab3 = 35; 35 const int kTab3 = 35;
30 36
31 } // namespace 37 } // namespace
32 38
33 class SyncedSessionTrackerTest : public testing::Test { 39 class SyncedSessionTrackerTest : public testing::Test {
34 public: 40 public:
35 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {} 41 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {}
36 ~SyncedSessionTrackerTest() override {} 42 ~SyncedSessionTrackerTest() override {}
37 43
38 SyncedSessionTracker* GetTracker() { return &tracker_; } 44 SyncedSessionTracker* GetTracker() { return &tracker_; }
39 TabNodePool* GetTabNodePool() { return &tracker_.local_tab_pool_; } 45 TabNodePool* GetTabNodePool() { return &tracker_.local_tab_pool_; }
40 46
47 // 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 sess_iter = tracker_.synced_tab_map_.find(session_tag);
skym 2017/05/04 20:07:20 sess_iter is a confusing name. Maybe tab_map_iter?
Nicolas Zea 2017/05/04 23:36:15 Done.
54 if (sess_iter == tracker_.synced_tab_map_.end())
skym 2017/05/04 20:07:20 I think a ternary on the same line as declaration
Nicolas Zea 2017/05/04 23:36:15 Done.
55 total_tab_count = 0;
56 else
57 total_tab_count = sess_iter->second.size();
58
59 // Now traverse the SyncedSession tree to verify the mapped tabs all match
60 // up.
61 int mapped_tab_count = 0;
62 if (tracker_.synced_session_map_.find(session_tag) !=
63 tracker_.synced_session_map_.end()) {
64 SyncedSession* session = tracker_.synced_session_map_[session_tag].get();
65 for (auto& window_pair : session->windows) {
66 mapped_tab_count += window_pair.second->wrapped_window.tabs.size();
67 for (auto& tab : window_pair.second->wrapped_window.tabs) {
68 if (sess_iter->second[tab->tab_id.id()] != tab.get()) {
69 return AssertionFailure()
70 << "Mapped tab " << tab->tab_id.id()
71 << " does not match synced tab map " << tab->tab_id.id();
72 }
73 }
74 }
75 }
76
77 // Wrap up by verifying all unmapped tabs are tracked.
78 int unmapped_tab_count = 0;
79 if (tracker_.unmapped_tabs_.find(session_tag) !=
80 tracker_.unmapped_tabs_.end()) {
81 unmapped_tab_count = tracker_.unmapped_tabs_[session_tag].size();
82 for (const auto& tab_pair : tracker_.unmapped_tabs_[session_tag]) {
83 if (tab_pair.first != tab_pair.second->tab_id.id()) {
84 return AssertionFailure()
85 << "Unmapped tab " << tab_pair.second->tab_id.id()
86 << " associated with wrong tab " << tab_pair.first;
87 }
88 if (sess_iter->second[tab_pair.second->tab_id.id()] !=
89 tab_pair.second.get()) {
90 return AssertionFailure()
91 << "Unmapped tab " << tab_pair.second->tab_id.id()
92 << " does not match synced tab map "
93 << tab_pair.second->tab_id.id();
94 }
95 }
96 }
97
98 return mapped_tab_count + unmapped_tab_count == total_tab_count
99 ? AssertionSuccess()
100 : AssertionFailure()
101 << " Tab count mismatch. Total: " << total_tab_count
102 << ". Mapped + Unmapped: " << mapped_tab_count << " + "
103 << unmapped_tab_count;
104 }
105
41 private: 106 private:
42 FakeSyncSessionsClient sessions_client_; 107 FakeSyncSessionsClient sessions_client_;
43 SyncedSessionTracker tracker_; 108 SyncedSessionTracker tracker_;
44 }; 109 };
45 110
46 TEST_F(SyncedSessionTrackerTest, GetSession) { 111 TEST_F(SyncedSessionTrackerTest, GetSession) {
47 SyncedSession* session1 = GetTracker()->GetSession(kTag); 112 SyncedSession* session1 = GetTracker()->GetSession(kTag);
48 SyncedSession* session2 = GetTracker()->GetSession(kTag2); 113 SyncedSession* session2 = GetTracker()->GetSession(kTag2);
49 ASSERT_EQ(session1, GetTracker()->GetSession(kTag)); 114 ASSERT_EQ(session1, GetTracker()->GetSession(kTag));
50 ASSERT_NE(session1, session2); 115 ASSERT_NE(session1, session2);
(...skipping 18 matching lines...) Expand all
69 } 134 }
70 135
71 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { 136 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) {
72 GetTracker()->PutWindowInSession(kTag, 10); 137 GetTracker()->PutWindowInSession(kTag, 10);
73 GetTracker()->PutTabInWindow(kTag, 10, 15); // win id 10, tab id 15 138 GetTracker()->PutTabInWindow(kTag, 10, 15); // win id 10, tab id 15
74 SyncedSession* session = GetTracker()->GetSession(kTag); 139 SyncedSession* session = GetTracker()->GetSession(kTag);
75 ASSERT_EQ(1U, session->windows.size()); 140 ASSERT_EQ(1U, session->windows.size());
76 ASSERT_EQ(1U, session->windows[10]->wrapped_window.tabs.size()); 141 ASSERT_EQ(1U, session->windows[10]->wrapped_window.tabs.size());
77 ASSERT_EQ(GetTracker()->GetTab(kTag, 15), 142 ASSERT_EQ(GetTracker()->GetTab(kTag, 15),
78 session->windows[10]->wrapped_window.tabs[0].get()); 143 session->windows[10]->wrapped_window.tabs[0].get());
144 ASSERT_TRUE(VerifyTabIntegrity(kTag));
79 // Should clean up memory on its own. 145 // Should clean up memory on its own.
80 } 146 }
81 147
82 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { 148 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) {
83 std::vector<const SyncedSession*> sessions; 149 std::vector<const SyncedSession*> sessions;
84 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( 150 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions(
85 &sessions, SyncedSessionTracker::PRESENTABLE)); 151 &sessions, SyncedSessionTracker::PRESENTABLE));
86 GetTracker()->GetSession(kTag); 152 GetTracker()->GetSession(kTag);
87 GetTracker()->PutWindowInSession(kTag, 0); 153 GetTracker()->PutWindowInSession(kTag, 0);
88 GetTracker()->PutTabInWindow(kTag, 0, 15); 154 GetTracker()->PutTabInWindow(kTag, 0, 15);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( 261 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions(
196 &sessions, SyncedSessionTracker::PRESENTABLE)); 262 &sessions, SyncedSessionTracker::PRESENTABLE));
197 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( 263 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions(
198 &sessions, SyncedSessionTracker::RAW)); 264 &sessions, SyncedSessionTracker::RAW));
199 ASSERT_EQ(2U, sessions.size()); 265 ASSERT_EQ(2U, sessions.size());
200 266
201 GetTracker()->Clear(); 267 GetTracker()->Clear();
202 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag)); 268 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag));
203 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag2)); 269 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag2));
204 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); 270 ASSERT_EQ(0U, GetTracker()->num_synced_sessions());
271 ASSERT_TRUE(VerifyTabIntegrity(kTag));
205 } 272 }
206 273
207 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) { 274 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) {
208 ASSERT_TRUE(GetTracker()->Empty()); 275 ASSERT_TRUE(GetTracker()->Empty());
209 const int kMaxSessions = 10; 276 const int kMaxSessions = 10;
210 const int kMaxTabs = 1000; 277 const int kMaxTabs = 1000;
211 const int kMaxAttempts = 10000; 278 const int kMaxAttempts = 10000;
212 for (int j = 0; j < kMaxSessions; ++j) { 279 for (int j = 0; j < kMaxSessions; ++j) {
213 std::string tag = base::StringPrintf("tag%d", j); 280 std::string tag = base::StringPrintf("tag%d", j);
214 for (int i = 0; i < kMaxAttempts; ++i) { 281 for (int i = 0; i < kMaxAttempts; ++i) {
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 GetTracker()->CleanupSession(kTag); 398 GetTracker()->CleanupSession(kTag);
332 399
333 // Verify that only those parts of the session not owned have been removed. 400 // Verify that only those parts of the session not owned have been removed.
334 ASSERT_EQ(1U, session1->windows.size()); 401 ASSERT_EQ(1U, session1->windows.size());
335 ASSERT_EQ(4U, session1->windows[0]->wrapped_window.tabs.size()); 402 ASSERT_EQ(4U, session1->windows[0]->wrapped_window.tabs.size());
336 ASSERT_EQ(1U, session2->windows.size()); 403 ASSERT_EQ(1U, session2->windows.size());
337 ASSERT_EQ(1U, session2->windows[2]->wrapped_window.tabs.size()); 404 ASSERT_EQ(1U, session2->windows[2]->wrapped_window.tabs.size());
338 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); 405 ASSERT_EQ(2U, GetTracker()->num_synced_sessions());
339 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(kTag)); 406 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(kTag));
340 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); 407 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2));
408 ASSERT_TRUE(VerifyTabIntegrity(kTag));
341 409
342 // All memory should be properly deallocated by destructor for the 410 // All memory should be properly deallocated by destructor for the
343 // SyncedSessionTracker. 411 // SyncedSessionTracker.
344 } 412 }
345 413
346 TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) { 414 TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) {
347 int tab_node_id_1 = 1; 415 int tab_node_id_1 = 1;
348 int tab_node_id_2 = 2; 416 int tab_node_id_2 = 2;
349 std::set<int> result; 417 std::set<int> result;
350 418
351 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_1); 419 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_1);
352 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_2); 420 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_2);
353 421
354 GetTracker()->LookupForeignTabNodeIds(kTag, &result); 422 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
355 EXPECT_EQ(2U, result.size()); 423 EXPECT_EQ(2U, result.size());
356 EXPECT_TRUE(result.find(tab_node_id_1) != result.end()); 424 EXPECT_TRUE(result.find(tab_node_id_1) != result.end());
357 EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); 425 EXPECT_TRUE(result.find(tab_node_id_2) != result.end());
358 426
359 GetTracker()->DeleteForeignTab(kTag, tab_node_id_1); 427 GetTracker()->DeleteForeignTab(kTag, tab_node_id_1);
360 GetTracker()->LookupForeignTabNodeIds(kTag, &result); 428 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
361 EXPECT_EQ(1U, result.size()); 429 EXPECT_EQ(1U, result.size());
362 EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); 430 EXPECT_TRUE(result.find(tab_node_id_2) != result.end());
363 431
364 GetTracker()->DeleteForeignTab(kTag, tab_node_id_2); 432 GetTracker()->DeleteForeignTab(kTag, tab_node_id_2);
365 GetTracker()->LookupForeignTabNodeIds(kTag, &result); 433 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
366 EXPECT_TRUE(result.empty()); 434 EXPECT_TRUE(result.empty());
435 ASSERT_TRUE(VerifyTabIntegrity(kTag));
367 } 436 }
368 437
369 TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) { 438 TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) {
370 std::set<int> free_node_ids; 439 std::set<int> free_node_ids;
371 int tab_node_id = TabNodePool::kInvalidTabNodeID; 440 int tab_node_id = TabNodePool::kInvalidTabNodeID;
372 const int kTabNode1 = 1;
373 const int kTabNode2 = 2;
374 const int kTabNode3 = 3;
375 441
376 GetTracker()->SetLocalSessionTag(kTag); 442 GetTracker()->SetLocalSessionTag(kTag);
377 443
378 // Start with two restored tab nodes. 444 // Start with two restored tab nodes.
379 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); 445 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
380 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2); 446 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2);
381 EXPECT_TRUE(GetTabNodePool()->Empty()); 447 EXPECT_TRUE(GetTabNodePool()->Empty());
382 EXPECT_FALSE(GetTabNodePool()->Full()); 448 EXPECT_FALSE(GetTabNodePool()->Full());
383 EXPECT_EQ(2U, GetTabNodePool()->Capacity()); 449 EXPECT_EQ(2U, GetTabNodePool()->Capacity());
384 450
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 EXPECT_EQ(kTabNode3, tab_node_id); 483 EXPECT_EQ(kTabNode3, tab_node_id);
418 EXPECT_TRUE(GetTabNodePool()->Empty()); 484 EXPECT_TRUE(GetTabNodePool()->Empty());
419 485
420 // Associate with no tabs. All tabs should be freed again, and the pool 486 // Associate with no tabs. All tabs should be freed again, and the pool
421 // should now be full. 487 // should now be full.
422 GetTracker()->ResetSessionTracking(kTag); 488 GetTracker()->ResetSessionTracking(kTag);
423 GetTracker()->CleanupLocalTabs(&free_node_ids); 489 GetTracker()->CleanupLocalTabs(&free_node_ids);
424 EXPECT_TRUE(free_node_ids.empty()); 490 EXPECT_TRUE(free_node_ids.empty());
425 EXPECT_TRUE(GetTabNodePool()->Full()); 491 EXPECT_TRUE(GetTabNodePool()->Full());
426 EXPECT_FALSE(GetTabNodePool()->Empty()); 492 EXPECT_FALSE(GetTabNodePool()->Empty());
493 ASSERT_TRUE(VerifyTabIntegrity(kTag));
427 } 494 }
428 495
429 TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { 496 TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) {
430 std::set<int> free_node_ids; 497 std::set<int> free_node_ids;
431 498
432 // First create the tab normally. 499 // First create the tab normally.
433 GetTracker()->SetLocalSessionTag(kTag); 500 GetTracker()->SetLocalSessionTag(kTag);
434 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 501 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
435 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); 502 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
436 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 503 ASSERT_TRUE(VerifyTabIntegrity(kTag));
504 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
437 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 505 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
438 506
439 // Map it to a window with the same tab id as it was created with. 507 // Map it to a window with the same tab id as it was created with.
440 GetTracker()->ResetSessionTracking(kTag); 508 GetTracker()->ResetSessionTracking(kTag);
441 GetTracker()->PutWindowInSession(kTag, kWindow1); 509 GetTracker()->PutWindowInSession(kTag, kWindow1);
442 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); 510 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
443 GetTracker()->CleanupLocalTabs(&free_node_ids); 511 GetTracker()->CleanupLocalTabs(&free_node_ids);
512 ASSERT_TRUE(VerifyTabIntegrity(kTag));
444 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 513 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
445 SyncedSession* session = GetTracker()->GetSession(kTag); 514 SyncedSession* session = GetTracker()->GetSession(kTag);
446 ASSERT_EQ(1U, session->windows.size()); 515 ASSERT_EQ(1U, session->windows.size());
447 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); 516 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
448 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), 517 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
449 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 518 session->windows[kWindow1]->wrapped_window.tabs[0].get());
450 519
451 // Then reassociate with a new tab id. 520 // Then reassociate with a new tab id.
452 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); 521 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
453 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 522 ASSERT_TRUE(VerifyTabIntegrity(kTag));
523 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
454 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 524 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
455 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 525 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
456 526
457 // Reset tracking, and put the new tab id into the window. 527 // Reset tracking, and put the new tab id into the window.
458 GetTracker()->ResetSessionTracking(kTag); 528 GetTracker()->ResetSessionTracking(kTag);
459 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 529 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
460 GetTracker()->PutWindowInSession(kTag, kWindow1); 530 GetTracker()->PutWindowInSession(kTag, kWindow1);
461 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); 531 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
462 GetTracker()->CleanupLocalTabs(&free_node_ids); 532 GetTracker()->CleanupLocalTabs(&free_node_ids);
533 ASSERT_TRUE(VerifyTabIntegrity(kTag));
463 EXPECT_TRUE(free_node_ids.empty()); 534 EXPECT_TRUE(free_node_ids.empty());
464 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 535 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
465 536
466 // Now that it's been mapped, it should be accessible both via the 537 // Now that it's been mapped, it should be accessible both via the
467 // GetSession as well as the GetTab. 538 // GetSession as well as the GetTab.
468 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), 539 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
469 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 540 session->windows[kWindow1]->wrapped_window.tabs[0].get());
470 ASSERT_EQ(session->tab_node_ids.size(), 541 ASSERT_EQ(session->tab_node_ids.size(),
471 session->tab_node_ids.count(kTabNode)); 542 session->tab_node_ids.count(kTabNode1));
472 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); 543 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
544 ASSERT_TRUE(VerifyTabIntegrity(kTag));
473 } 545 }
474 546
475 TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { 547 TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) {
476 std::set<int> free_node_ids; 548 std::set<int> free_node_ids;
477 549
478 // First create the tab normally. 550 // First create the tab normally.
479 GetTracker()->SetLocalSessionTag(kTag); 551 GetTracker()->SetLocalSessionTag(kTag);
480 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 552 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
481 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); 553 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
482 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 554 ASSERT_TRUE(VerifyTabIntegrity(kTag));
555 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
483 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 556 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
484 557
485 // Map it to a window with the same tab id as it was created with. 558 // Map it to a window with the same tab id as it was created with.
486 GetTracker()->ResetSessionTracking(kTag); 559 GetTracker()->ResetSessionTracking(kTag);
487 GetTracker()->PutWindowInSession(kTag, kWindow1); 560 GetTracker()->PutWindowInSession(kTag, kWindow1);
488 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); 561 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
489 GetTracker()->CleanupLocalTabs(&free_node_ids); 562 GetTracker()->CleanupLocalTabs(&free_node_ids);
563 ASSERT_TRUE(VerifyTabIntegrity(kTag));
490 EXPECT_TRUE(free_node_ids.empty()); 564 EXPECT_TRUE(free_node_ids.empty());
491 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 565 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
492 SyncedSession* session = GetTracker()->GetSession(kTag); 566 SyncedSession* session = GetTracker()->GetSession(kTag);
493 ASSERT_EQ(1U, session->windows.size()); 567 ASSERT_EQ(1U, session->windows.size());
494 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); 568 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
495 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab1), 569 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab1),
496 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 570 session->windows[kWindow1]->wrapped_window.tabs[0].get());
497 571
498 // Then reassociate with a new tab id. 572 // Then reassociate with a new tab id.
499 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); 573 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
500 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 574 ASSERT_TRUE(VerifyTabIntegrity(kTag));
575 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
501 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 576 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
502 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 577 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
503 578
504 // Tab 1 should no longer be associated with any SessionTab object. At this 579 // Tab 1 should no longer be associated with any SessionTab object. At this
505 // point there's no need to verify it's unmapped state. 580 // point there's no need to verify it's unmapped state.
506 const sessions::SessionTab* tab_ptr = nullptr; 581 const sessions::SessionTab* tab_ptr = nullptr;
507 EXPECT_FALSE(GetTracker()->LookupSessionTab(kTag, kTab1, &tab_ptr)); 582 EXPECT_FALSE(GetTracker()->LookupSessionTab(kTag, kTab1, &tab_ptr));
508 583
509 // Reset tracking and add back both the old tab and the new tab (both of which 584 // Reset tracking and add back both the old tab and the new tab (both of which
510 // refer to the same tab node id). 585 // refer to the same tab node id).
511 GetTracker()->ResetSessionTracking(kTag); 586 GetTracker()->ResetSessionTracking(kTag);
512 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 587 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
513 GetTracker()->PutWindowInSession(kTag, kWindow1); 588 GetTracker()->PutWindowInSession(kTag, kWindow1);
514 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); 589 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
515 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); 590 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
516 GetTracker()->CleanupLocalTabs(&free_node_ids); 591 GetTracker()->CleanupLocalTabs(&free_node_ids);
592 ASSERT_TRUE(VerifyTabIntegrity(kTag));
517 EXPECT_TRUE(free_node_ids.empty()); 593 EXPECT_TRUE(free_node_ids.empty());
518 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 594 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
519 595
520 // Now that it's been mapped, it should be accessible both via the 596 // Now that it's been mapped, it should be accessible both via the
521 // GetSession as well as the GetTab. 597 // GetSession as well as the GetTab.
522 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab2), 598 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab2),
523 session->windows[kWindow1]->wrapped_window.tabs[1].get()); 599 session->windows[kWindow1]->wrapped_window.tabs[1].get());
524 EXPECT_EQ(session->tab_node_ids.size(), 600 EXPECT_EQ(session->tab_node_ids.size(),
525 session->tab_node_ids.count(kTabNode)); 601 session->tab_node_ids.count(kTabNode1));
526 EXPECT_EQ(1U, GetTabNodePool()->Capacity()); 602 EXPECT_EQ(1U, GetTabNodePool()->Capacity());
527 603
528 // Attempting to access the original tab will create a new SessionTab object. 604 // Attempting to access the original tab will create a new SessionTab object.
529 EXPECT_NE(GetTracker()->GetTab(kTag, kTab1), 605 EXPECT_NE(GetTracker()->GetTab(kTag, kTab1),
530 GetTracker()->GetTab(kTag, kTab2)); 606 GetTracker()->GetTab(kTag, kTab2));
531 int tab_node_id = -1; 607 int tab_node_id = -1;
532 EXPECT_FALSE(GetTracker()->GetTabNodeFromLocalTabId(kTab1, &tab_node_id)); 608 EXPECT_FALSE(GetTracker()->GetTabNodeFromLocalTabId(kTab1, &tab_node_id));
609 ASSERT_TRUE(VerifyTabIntegrity(kTag));
533 } 610 }
534 611
535 TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) { 612 TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) {
536 std::set<int> free_node_ids; 613 std::set<int> free_node_ids;
537 614
538 // First create the old tab in an unmapped state. 615 // First create the old tab in an unmapped state.
539 GetTracker()->SetLocalSessionTag(kTag); 616 GetTracker()->SetLocalSessionTag(kTag);
540 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 617 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
541 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); 618 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
542 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 619 ASSERT_TRUE(VerifyTabIntegrity(kTag));
620 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
543 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 621 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
544 622
545 // Map it to a window, but reassociated with a new tab id. 623 // Map it to a window, but reassociated with a new tab id.
546 GetTracker()->ResetSessionTracking(kTag); 624 GetTracker()->ResetSessionTracking(kTag);
547 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); 625 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
548 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 626 ASSERT_TRUE(VerifyTabIntegrity(kTag));
627 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
549 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 628 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
550 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 629 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
551 GetTracker()->PutWindowInSession(kTag, kWindow1); 630 GetTracker()->PutWindowInSession(kTag, kWindow1);
552 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); 631 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
553 GetTracker()->CleanupLocalTabs(&free_node_ids); 632 GetTracker()->CleanupLocalTabs(&free_node_ids);
633 ASSERT_TRUE(VerifyTabIntegrity(kTag));
554 EXPECT_TRUE(free_node_ids.empty()); 634 EXPECT_TRUE(free_node_ids.empty());
555 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 635 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
556 636
557 // Now that it's been mapped, it should be accessible both via the 637 // Now that it's been mapped, it should be accessible both via the
558 // GetSession as well as GetTab. 638 // GetSession as well as GetTab.
559 SyncedSession* session = GetTracker()->GetSession(kTag); 639 SyncedSession* session = GetTracker()->GetSession(kTag);
560 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), 640 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
561 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 641 session->windows[kWindow1]->wrapped_window.tabs[0].get());
562 ASSERT_EQ(session->tab_node_ids.size(), 642 ASSERT_EQ(session->tab_node_ids.size(),
563 session->tab_node_ids.count(kTabNode)); 643 session->tab_node_ids.count(kTabNode1));
564 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); 644 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
645 ASSERT_TRUE(VerifyTabIntegrity(kTag));
565 } 646 }
566 647
567 TEST_F(SyncedSessionTrackerTest, ReassociateTabMapMismatch) { 648 TEST_F(SyncedSessionTrackerTest, ReassociateTabOldUnmappedNewMapped) {
568 std::set<int> free_node_ids; 649 std::set<int> free_node_ids;
569 650
570 // First create the old tab in an unmapped state. 651 // First create the old tab in an unmapped state.
571 GetTracker()->SetLocalSessionTag(kTag); 652 GetTracker()->SetLocalSessionTag(kTag);
572 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 653 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
573 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); 654 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
574 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 655 ASSERT_TRUE(VerifyTabIntegrity(kTag));
656 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
575 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 657 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
576 658
577 // Map an unseen tab to a window, then reassociate the existing tab to the 659 // Map an unseen tab to a window, then reassociate the existing tab to the
578 // mapped tab id. 660 // mapped tab id.
579 GetTracker()->ResetSessionTracking(kTag); 661 GetTracker()->ResetSessionTracking(kTag);
580 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 662 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
581 GetTracker()->PutWindowInSession(kTag, kWindow1); 663 GetTracker()->PutWindowInSession(kTag, kWindow1);
582 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); 664 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
583 GetTracker()->CleanupLocalTabs(&free_node_ids); 665 GetTracker()->CleanupLocalTabs(&free_node_ids);
666 ASSERT_TRUE(VerifyTabIntegrity(kTag));
584 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 667 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
585 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 668 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
586 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); 669 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
670 ASSERT_TRUE(VerifyTabIntegrity(kTag));
587 EXPECT_TRUE(free_node_ids.empty()); 671 EXPECT_TRUE(free_node_ids.empty());
588 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 672 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
589 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 673 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
590 674
591 // Now that it's been mapped, it should be accessible both via the 675 // Now that it's been mapped, it should be accessible both via the
592 // GetSession as well as GetTab. 676 // GetSession as well as GetTab.
593 SyncedSession* session = GetTracker()->GetSession(kTag); 677 SyncedSession* session = GetTracker()->GetSession(kTag);
594 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), 678 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
595 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 679 session->windows[kWindow1]->wrapped_window.tabs[0].get());
596 ASSERT_EQ(session->tab_node_ids.size(), 680 ASSERT_EQ(session->tab_node_ids.size(),
597 session->tab_node_ids.count(kTabNode)); 681 session->tab_node_ids.count(kTabNode1));
598 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); 682 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
683 ASSERT_TRUE(VerifyTabIntegrity(kTag));
684 }
685
686 TEST_F(SyncedSessionTrackerTest, ReassociateTabSameTabId) {
687 std::set<int> free_node_ids;
688
689 // First create the tab normally.
690 GetTracker()->SetLocalSessionTag(kTag);
691 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
692 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
693 ASSERT_TRUE(VerifyTabIntegrity(kTag));
694 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
695 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
696
697 // Map it to a window.
698 GetTracker()->ResetSessionTracking(kTag);
699 GetTracker()->PutWindowInSession(kTag, kWindow1);
700 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
701 GetTracker()->CleanupLocalTabs(&free_node_ids);
702 ASSERT_TRUE(VerifyTabIntegrity(kTag));
703 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
704 SyncedSession* session = GetTracker()->GetSession(kTag);
705 ASSERT_EQ(1U, session->windows.size());
706 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
707 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
708 session->windows[kWindow1]->wrapped_window.tabs[0].get());
709
710 // Reassociate, using the same tab id.
711 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
712 ASSERT_TRUE(VerifyTabIntegrity(kTag));
713 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
714 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
715
716 // Reset tracking, and put the tab id back into the same window.
717 GetTracker()->ResetSessionTracking(kTag);
718 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
719 GetTracker()->PutWindowInSession(kTag, kWindow1);
720 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
721 GetTracker()->CleanupLocalTabs(&free_node_ids);
722 ASSERT_TRUE(VerifyTabIntegrity(kTag));
723 EXPECT_TRUE(free_node_ids.empty());
724 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
725
726 // Now that it's been mapped, it should be accessible both via the
727 // GetSession as well as the GetTab.
728 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
729 session->windows[kWindow1]->wrapped_window.tabs[0].get());
730 ASSERT_EQ(session->tab_node_ids.size(),
731 session->tab_node_ids.count(kTabNode1));
732 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
733 ASSERT_TRUE(VerifyTabIntegrity(kTag));
734 }
735
736 TEST_F(SyncedSessionTrackerTest, ReassociateTabOldMappedNewUnmapped) {
737 std::set<int> free_node_ids;
738
739 // First create an unmapped tab.
740 GetTracker()->SetLocalSessionTag(kTag);
741 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
742 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
743 ASSERT_TRUE(VerifyTabIntegrity(kTag));
744 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
745 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
746
747 // Now, map the first one, deleting the second one.
748 GetTracker()->ResetSessionTracking(kTag);
749 GetTracker()->PutWindowInSession(kTag, kWindow1);
750 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
751 GetTracker()->CleanupLocalTabs(&free_node_ids);
752 ASSERT_TRUE(VerifyTabIntegrity(kTag));
753 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
754 SyncedSession* session = GetTracker()->GetSession(kTag);
755 ASSERT_EQ(1U, session->windows.size());
756 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
757 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
758 session->windows[kWindow1]->wrapped_window.tabs[0].get());
759
760 // Create a second unmapped tab.
761 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2);
762 ASSERT_TRUE(VerifyTabIntegrity(kTag));
763 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode2));
764 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
765
766 // Reassociate the second tab with node of the first tab.
767 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
768 ASSERT_TRUE(VerifyTabIntegrity(kTag));
769 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
770 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode2));
771 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
772 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
773
774 // Now map the new one.
775 GetTracker()->ResetSessionTracking(kTag);
776 GetTracker()->PutWindowInSession(kTag, kWindow1);
777 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
778 GetTracker()->CleanupLocalTabs(&free_node_ids);
779 ASSERT_TRUE(VerifyTabIntegrity(kTag));
780 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
781 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
782
783 // Now that it's been mapped, it should be accessible both via the
784 // GetSession as well as the GetTab.
785 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
786 session->windows[kWindow1]->wrapped_window.tabs[0].get());
787 ASSERT_EQ(2U, GetTabNodePool()->Capacity());
788 ASSERT_TRUE(VerifyTabIntegrity(kTag));
599 } 789 }
600 790
601 } // namespace sync_sessions 791 } // namespace sync_sessions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698