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

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: Address comments 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
« no previous file with comments | « components/sync_sessions/synced_session_tracker.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 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
41 private: 104 private:
42 FakeSyncSessionsClient sessions_client_; 105 FakeSyncSessionsClient sessions_client_;
43 SyncedSessionTracker tracker_; 106 SyncedSessionTracker tracker_;
44 }; 107 };
45 108
46 TEST_F(SyncedSessionTrackerTest, GetSession) { 109 TEST_F(SyncedSessionTrackerTest, GetSession) {
47 SyncedSession* session1 = GetTracker()->GetSession(kTag); 110 SyncedSession* session1 = GetTracker()->GetSession(kTag);
48 SyncedSession* session2 = GetTracker()->GetSession(kTag2); 111 SyncedSession* session2 = GetTracker()->GetSession(kTag2);
49 ASSERT_EQ(session1, GetTracker()->GetSession(kTag)); 112 ASSERT_EQ(session1, GetTracker()->GetSession(kTag));
50 ASSERT_NE(session1, session2); 113 ASSERT_NE(session1, session2);
(...skipping 18 matching lines...) Expand all
69 } 132 }
70 133
71 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { 134 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) {
72 GetTracker()->PutWindowInSession(kTag, 10); 135 GetTracker()->PutWindowInSession(kTag, 10);
73 GetTracker()->PutTabInWindow(kTag, 10, 15); // win id 10, tab id 15 136 GetTracker()->PutTabInWindow(kTag, 10, 15); // win id 10, tab id 15
74 SyncedSession* session = GetTracker()->GetSession(kTag); 137 SyncedSession* session = GetTracker()->GetSession(kTag);
75 ASSERT_EQ(1U, session->windows.size()); 138 ASSERT_EQ(1U, session->windows.size());
76 ASSERT_EQ(1U, session->windows[10]->wrapped_window.tabs.size()); 139 ASSERT_EQ(1U, session->windows[10]->wrapped_window.tabs.size());
77 ASSERT_EQ(GetTracker()->GetTab(kTag, 15), 140 ASSERT_EQ(GetTracker()->GetTab(kTag, 15),
78 session->windows[10]->wrapped_window.tabs[0].get()); 141 session->windows[10]->wrapped_window.tabs[0].get());
142 ASSERT_TRUE(VerifyTabIntegrity(kTag));
79 // Should clean up memory on its own. 143 // Should clean up memory on its own.
80 } 144 }
81 145
82 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { 146 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) {
83 std::vector<const SyncedSession*> sessions; 147 std::vector<const SyncedSession*> sessions;
84 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( 148 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions(
85 &sessions, SyncedSessionTracker::PRESENTABLE)); 149 &sessions, SyncedSessionTracker::PRESENTABLE));
86 GetTracker()->GetSession(kTag); 150 GetTracker()->GetSession(kTag);
87 GetTracker()->PutWindowInSession(kTag, 0); 151 GetTracker()->PutWindowInSession(kTag, 0);
88 GetTracker()->PutTabInWindow(kTag, 0, 15); 152 GetTracker()->PutTabInWindow(kTag, 0, 15);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( 259 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions(
196 &sessions, SyncedSessionTracker::PRESENTABLE)); 260 &sessions, SyncedSessionTracker::PRESENTABLE));
197 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( 261 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions(
198 &sessions, SyncedSessionTracker::RAW)); 262 &sessions, SyncedSessionTracker::RAW));
199 ASSERT_EQ(2U, sessions.size()); 263 ASSERT_EQ(2U, sessions.size());
200 264
201 GetTracker()->Clear(); 265 GetTracker()->Clear();
202 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag)); 266 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag));
203 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag2)); 267 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag2));
204 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); 268 ASSERT_EQ(0U, GetTracker()->num_synced_sessions());
269 ASSERT_TRUE(VerifyTabIntegrity(kTag));
205 } 270 }
206 271
207 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) { 272 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) {
208 ASSERT_TRUE(GetTracker()->Empty()); 273 ASSERT_TRUE(GetTracker()->Empty());
209 const int kMaxSessions = 10; 274 const int kMaxSessions = 10;
210 const int kMaxTabs = 1000; 275 const int kMaxTabs = 1000;
211 const int kMaxAttempts = 10000; 276 const int kMaxAttempts = 10000;
212 for (int j = 0; j < kMaxSessions; ++j) { 277 for (int j = 0; j < kMaxSessions; ++j) {
213 std::string tag = base::StringPrintf("tag%d", j); 278 std::string tag = base::StringPrintf("tag%d", j);
214 for (int i = 0; i < kMaxAttempts; ++i) { 279 for (int i = 0; i < kMaxAttempts; ++i) {
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 GetTracker()->CleanupSession(kTag); 396 GetTracker()->CleanupSession(kTag);
332 397
333 // Verify that only those parts of the session not owned have been removed. 398 // Verify that only those parts of the session not owned have been removed.
334 ASSERT_EQ(1U, session1->windows.size()); 399 ASSERT_EQ(1U, session1->windows.size());
335 ASSERT_EQ(4U, session1->windows[0]->wrapped_window.tabs.size()); 400 ASSERT_EQ(4U, session1->windows[0]->wrapped_window.tabs.size());
336 ASSERT_EQ(1U, session2->windows.size()); 401 ASSERT_EQ(1U, session2->windows.size());
337 ASSERT_EQ(1U, session2->windows[2]->wrapped_window.tabs.size()); 402 ASSERT_EQ(1U, session2->windows[2]->wrapped_window.tabs.size());
338 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); 403 ASSERT_EQ(2U, GetTracker()->num_synced_sessions());
339 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(kTag)); 404 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(kTag));
340 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); 405 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2));
406 ASSERT_TRUE(VerifyTabIntegrity(kTag));
341 407
342 // All memory should be properly deallocated by destructor for the 408 // All memory should be properly deallocated by destructor for the
343 // SyncedSessionTracker. 409 // SyncedSessionTracker.
344 } 410 }
345 411
346 TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) { 412 TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) {
347 int tab_node_id_1 = 1; 413 int tab_node_id_1 = 1;
348 int tab_node_id_2 = 2; 414 int tab_node_id_2 = 2;
349 std::set<int> result; 415 std::set<int> result;
350 416
351 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_1); 417 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_1);
352 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_2); 418 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_2);
353 419
354 GetTracker()->LookupForeignTabNodeIds(kTag, &result); 420 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
355 EXPECT_EQ(2U, result.size()); 421 EXPECT_EQ(2U, result.size());
356 EXPECT_TRUE(result.find(tab_node_id_1) != result.end()); 422 EXPECT_TRUE(result.find(tab_node_id_1) != result.end());
357 EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); 423 EXPECT_TRUE(result.find(tab_node_id_2) != result.end());
358 424
359 GetTracker()->DeleteForeignTab(kTag, tab_node_id_1); 425 GetTracker()->DeleteForeignTab(kTag, tab_node_id_1);
360 GetTracker()->LookupForeignTabNodeIds(kTag, &result); 426 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
361 EXPECT_EQ(1U, result.size()); 427 EXPECT_EQ(1U, result.size());
362 EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); 428 EXPECT_TRUE(result.find(tab_node_id_2) != result.end());
363 429
364 GetTracker()->DeleteForeignTab(kTag, tab_node_id_2); 430 GetTracker()->DeleteForeignTab(kTag, tab_node_id_2);
365 GetTracker()->LookupForeignTabNodeIds(kTag, &result); 431 GetTracker()->LookupForeignTabNodeIds(kTag, &result);
366 EXPECT_TRUE(result.empty()); 432 EXPECT_TRUE(result.empty());
433 ASSERT_TRUE(VerifyTabIntegrity(kTag));
367 } 434 }
368 435
369 TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) { 436 TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) {
370 std::set<int> free_node_ids; 437 std::set<int> free_node_ids;
371 int tab_node_id = TabNodePool::kInvalidTabNodeID; 438 int tab_node_id = TabNodePool::kInvalidTabNodeID;
372 const int kTabNode1 = 1;
373 const int kTabNode2 = 2;
374 const int kTabNode3 = 3;
375 439
376 GetTracker()->SetLocalSessionTag(kTag); 440 GetTracker()->SetLocalSessionTag(kTag);
377 441
378 // Start with two restored tab nodes. 442 // Start with two restored tab nodes.
379 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); 443 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
380 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2); 444 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2);
381 EXPECT_TRUE(GetTabNodePool()->Empty()); 445 EXPECT_TRUE(GetTabNodePool()->Empty());
382 EXPECT_FALSE(GetTabNodePool()->Full()); 446 EXPECT_FALSE(GetTabNodePool()->Full());
383 EXPECT_EQ(2U, GetTabNodePool()->Capacity()); 447 EXPECT_EQ(2U, GetTabNodePool()->Capacity());
384 448
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 EXPECT_EQ(kTabNode3, tab_node_id); 481 EXPECT_EQ(kTabNode3, tab_node_id);
418 EXPECT_TRUE(GetTabNodePool()->Empty()); 482 EXPECT_TRUE(GetTabNodePool()->Empty());
419 483
420 // Associate with no tabs. All tabs should be freed again, and the pool 484 // Associate with no tabs. All tabs should be freed again, and the pool
421 // should now be full. 485 // should now be full.
422 GetTracker()->ResetSessionTracking(kTag); 486 GetTracker()->ResetSessionTracking(kTag);
423 GetTracker()->CleanupLocalTabs(&free_node_ids); 487 GetTracker()->CleanupLocalTabs(&free_node_ids);
424 EXPECT_TRUE(free_node_ids.empty()); 488 EXPECT_TRUE(free_node_ids.empty());
425 EXPECT_TRUE(GetTabNodePool()->Full()); 489 EXPECT_TRUE(GetTabNodePool()->Full());
426 EXPECT_FALSE(GetTabNodePool()->Empty()); 490 EXPECT_FALSE(GetTabNodePool()->Empty());
491 ASSERT_TRUE(VerifyTabIntegrity(kTag));
427 } 492 }
428 493
429 TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { 494 TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) {
430 std::set<int> free_node_ids; 495 std::set<int> free_node_ids;
431 496
432 // First create the tab normally. 497 // First create the tab normally.
433 GetTracker()->SetLocalSessionTag(kTag); 498 GetTracker()->SetLocalSessionTag(kTag);
434 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 499 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
435 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); 500 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
436 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 501 ASSERT_TRUE(VerifyTabIntegrity(kTag));
502 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
437 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 503 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
438 504
439 // Map it to a window with the same tab id as it was created with. 505 // Map it to a window with the same tab id as it was created with.
440 GetTracker()->ResetSessionTracking(kTag); 506 GetTracker()->ResetSessionTracking(kTag);
441 GetTracker()->PutWindowInSession(kTag, kWindow1); 507 GetTracker()->PutWindowInSession(kTag, kWindow1);
442 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); 508 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
443 GetTracker()->CleanupLocalTabs(&free_node_ids); 509 GetTracker()->CleanupLocalTabs(&free_node_ids);
510 ASSERT_TRUE(VerifyTabIntegrity(kTag));
444 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 511 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
445 SyncedSession* session = GetTracker()->GetSession(kTag); 512 SyncedSession* session = GetTracker()->GetSession(kTag);
446 ASSERT_EQ(1U, session->windows.size()); 513 ASSERT_EQ(1U, session->windows.size());
447 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); 514 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
448 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), 515 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1),
449 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 516 session->windows[kWindow1]->wrapped_window.tabs[0].get());
450 517
451 // Then reassociate with a new tab id. 518 // Then reassociate with a new tab id.
452 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); 519 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
453 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 520 ASSERT_TRUE(VerifyTabIntegrity(kTag));
521 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
454 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 522 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
455 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 523 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
456 524
457 // Reset tracking, and put the new tab id into the window. 525 // Reset tracking, and put the new tab id into the window.
458 GetTracker()->ResetSessionTracking(kTag); 526 GetTracker()->ResetSessionTracking(kTag);
459 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 527 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
460 GetTracker()->PutWindowInSession(kTag, kWindow1); 528 GetTracker()->PutWindowInSession(kTag, kWindow1);
461 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); 529 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
462 GetTracker()->CleanupLocalTabs(&free_node_ids); 530 GetTracker()->CleanupLocalTabs(&free_node_ids);
531 ASSERT_TRUE(VerifyTabIntegrity(kTag));
463 EXPECT_TRUE(free_node_ids.empty()); 532 EXPECT_TRUE(free_node_ids.empty());
464 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 533 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
465 534
466 // Now that it's been mapped, it should be accessible both via the 535 // Now that it's been mapped, it should be accessible both via the
467 // GetSession as well as the GetTab. 536 // GetSession as well as the GetTab.
468 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), 537 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
469 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 538 session->windows[kWindow1]->wrapped_window.tabs[0].get());
470 ASSERT_EQ(session->tab_node_ids.size(), 539 ASSERT_EQ(session->tab_node_ids.size(),
471 session->tab_node_ids.count(kTabNode)); 540 session->tab_node_ids.count(kTabNode1));
472 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); 541 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
542 ASSERT_TRUE(VerifyTabIntegrity(kTag));
473 } 543 }
474 544
475 TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { 545 TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) {
476 std::set<int> free_node_ids; 546 std::set<int> free_node_ids;
477 547
478 // First create the tab normally. 548 // First create the tab normally.
479 GetTracker()->SetLocalSessionTag(kTag); 549 GetTracker()->SetLocalSessionTag(kTag);
480 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 550 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
481 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); 551 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
482 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 552 ASSERT_TRUE(VerifyTabIntegrity(kTag));
553 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
483 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 554 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
484 555
485 // Map it to a window with the same tab id as it was created with. 556 // Map it to a window with the same tab id as it was created with.
486 GetTracker()->ResetSessionTracking(kTag); 557 GetTracker()->ResetSessionTracking(kTag);
487 GetTracker()->PutWindowInSession(kTag, kWindow1); 558 GetTracker()->PutWindowInSession(kTag, kWindow1);
488 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); 559 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
489 GetTracker()->CleanupLocalTabs(&free_node_ids); 560 GetTracker()->CleanupLocalTabs(&free_node_ids);
561 ASSERT_TRUE(VerifyTabIntegrity(kTag));
490 EXPECT_TRUE(free_node_ids.empty()); 562 EXPECT_TRUE(free_node_ids.empty());
491 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 563 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
492 SyncedSession* session = GetTracker()->GetSession(kTag); 564 SyncedSession* session = GetTracker()->GetSession(kTag);
493 ASSERT_EQ(1U, session->windows.size()); 565 ASSERT_EQ(1U, session->windows.size());
494 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); 566 ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size());
495 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab1), 567 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab1),
496 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 568 session->windows[kWindow1]->wrapped_window.tabs[0].get());
497 569
498 // Then reassociate with a new tab id. 570 // Then reassociate with a new tab id.
499 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); 571 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
500 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 572 ASSERT_TRUE(VerifyTabIntegrity(kTag));
573 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
501 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 574 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
502 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 575 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
503 576
504 // Tab 1 should no longer be associated with any SessionTab object. At this 577 // 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. 578 // point there's no need to verify it's unmapped state.
506 const sessions::SessionTab* tab_ptr = nullptr; 579 const sessions::SessionTab* tab_ptr = nullptr;
507 EXPECT_FALSE(GetTracker()->LookupSessionTab(kTag, kTab1, &tab_ptr)); 580 EXPECT_FALSE(GetTracker()->LookupSessionTab(kTag, kTab1, &tab_ptr));
508 581
509 // Reset tracking and add back both the old tab and the new tab (both of which 582 // Reset tracking and add back both the old tab and the new tab (both of which
510 // refer to the same tab node id). 583 // refer to the same tab node id).
511 GetTracker()->ResetSessionTracking(kTag); 584 GetTracker()->ResetSessionTracking(kTag);
512 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 585 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
513 GetTracker()->PutWindowInSession(kTag, kWindow1); 586 GetTracker()->PutWindowInSession(kTag, kWindow1);
514 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); 587 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1);
515 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); 588 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
516 GetTracker()->CleanupLocalTabs(&free_node_ids); 589 GetTracker()->CleanupLocalTabs(&free_node_ids);
590 ASSERT_TRUE(VerifyTabIntegrity(kTag));
517 EXPECT_TRUE(free_node_ids.empty()); 591 EXPECT_TRUE(free_node_ids.empty());
518 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 592 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
519 593
520 // Now that it's been mapped, it should be accessible both via the 594 // Now that it's been mapped, it should be accessible both via the
521 // GetSession as well as the GetTab. 595 // GetSession as well as the GetTab.
522 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab2), 596 EXPECT_EQ(GetTracker()->GetTab(kTag, kTab2),
523 session->windows[kWindow1]->wrapped_window.tabs[1].get()); 597 session->windows[kWindow1]->wrapped_window.tabs[1].get());
524 EXPECT_EQ(session->tab_node_ids.size(), 598 EXPECT_EQ(session->tab_node_ids.size(),
525 session->tab_node_ids.count(kTabNode)); 599 session->tab_node_ids.count(kTabNode1));
526 EXPECT_EQ(1U, GetTabNodePool()->Capacity()); 600 EXPECT_EQ(1U, GetTabNodePool()->Capacity());
527 601
528 // Attempting to access the original tab will create a new SessionTab object. 602 // Attempting to access the original tab will create a new SessionTab object.
529 EXPECT_NE(GetTracker()->GetTab(kTag, kTab1), 603 EXPECT_NE(GetTracker()->GetTab(kTag, kTab1),
530 GetTracker()->GetTab(kTag, kTab2)); 604 GetTracker()->GetTab(kTag, kTab2));
531 int tab_node_id = -1; 605 int tab_node_id = -1;
532 EXPECT_FALSE(GetTracker()->GetTabNodeFromLocalTabId(kTab1, &tab_node_id)); 606 EXPECT_FALSE(GetTracker()->GetTabNodeFromLocalTabId(kTab1, &tab_node_id));
607 ASSERT_TRUE(VerifyTabIntegrity(kTag));
533 } 608 }
534 609
535 TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) { 610 TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) {
536 std::set<int> free_node_ids; 611 std::set<int> free_node_ids;
537 612
538 // First create the old tab in an unmapped state. 613 // First create the old tab in an unmapped state.
539 GetTracker()->SetLocalSessionTag(kTag); 614 GetTracker()->SetLocalSessionTag(kTag);
540 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 615 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
541 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); 616 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
542 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 617 ASSERT_TRUE(VerifyTabIntegrity(kTag));
618 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
543 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 619 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
544 620
545 // Map it to a window, but reassociated with a new tab id. 621 // Map it to a window, but reassociated with a new tab id.
546 GetTracker()->ResetSessionTracking(kTag); 622 GetTracker()->ResetSessionTracking(kTag);
547 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); 623 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
548 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 624 ASSERT_TRUE(VerifyTabIntegrity(kTag));
625 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
549 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 626 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2));
550 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 627 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
551 GetTracker()->PutWindowInSession(kTag, kWindow1); 628 GetTracker()->PutWindowInSession(kTag, kWindow1);
552 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); 629 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
553 GetTracker()->CleanupLocalTabs(&free_node_ids); 630 GetTracker()->CleanupLocalTabs(&free_node_ids);
631 ASSERT_TRUE(VerifyTabIntegrity(kTag));
554 EXPECT_TRUE(free_node_ids.empty()); 632 EXPECT_TRUE(free_node_ids.empty());
555 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 633 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
556 634
557 // Now that it's been mapped, it should be accessible both via the 635 // Now that it's been mapped, it should be accessible both via the
558 // GetSession as well as GetTab. 636 // GetSession as well as GetTab.
559 SyncedSession* session = GetTracker()->GetSession(kTag); 637 SyncedSession* session = GetTracker()->GetSession(kTag);
560 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), 638 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
561 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 639 session->windows[kWindow1]->wrapped_window.tabs[0].get());
562 ASSERT_EQ(session->tab_node_ids.size(), 640 ASSERT_EQ(session->tab_node_ids.size(),
563 session->tab_node_ids.count(kTabNode)); 641 session->tab_node_ids.count(kTabNode1));
564 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); 642 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
643 ASSERT_TRUE(VerifyTabIntegrity(kTag));
565 } 644 }
566 645
567 TEST_F(SyncedSessionTrackerTest, ReassociateTabMapMismatch) { 646 TEST_F(SyncedSessionTrackerTest, ReassociateTabOldUnmappedNewMapped) {
568 std::set<int> free_node_ids; 647 std::set<int> free_node_ids;
569 648
570 // First create the old tab in an unmapped state. 649 // First create the old tab in an unmapped state.
571 GetTracker()->SetLocalSessionTag(kTag); 650 GetTracker()->SetLocalSessionTag(kTag);
572 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 651 EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
573 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); 652 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1);
574 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 653 ASSERT_TRUE(VerifyTabIntegrity(kTag));
654 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
575 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 655 EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1));
576 656
577 // Map an unseen tab to a window, then reassociate the existing tab to the 657 // Map an unseen tab to a window, then reassociate the existing tab to the
578 // mapped tab id. 658 // mapped tab id.
579 GetTracker()->ResetSessionTracking(kTag); 659 GetTracker()->ResetSessionTracking(kTag);
580 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); 660 EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1));
581 GetTracker()->PutWindowInSession(kTag, kWindow1); 661 GetTracker()->PutWindowInSession(kTag, kWindow1);
582 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); 662 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2);
583 GetTracker()->CleanupLocalTabs(&free_node_ids); 663 GetTracker()->CleanupLocalTabs(&free_node_ids);
664 ASSERT_TRUE(VerifyTabIntegrity(kTag));
584 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 665 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
585 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 666 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
586 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); 667 GetTracker()->ReassociateLocalTab(kTabNode1, kTab2);
668 ASSERT_TRUE(VerifyTabIntegrity(kTag));
587 EXPECT_TRUE(free_node_ids.empty()); 669 EXPECT_TRUE(free_node_ids.empty());
588 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); 670 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1));
589 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); 671 EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2));
590 672
591 // Now that it's been mapped, it should be accessible both via the 673 // Now that it's been mapped, it should be accessible both via the
592 // GetSession as well as GetTab. 674 // GetSession as well as GetTab.
593 SyncedSession* session = GetTracker()->GetSession(kTag); 675 SyncedSession* session = GetTracker()->GetSession(kTag);
594 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), 676 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2),
595 session->windows[kWindow1]->wrapped_window.tabs[0].get()); 677 session->windows[kWindow1]->wrapped_window.tabs[0].get());
596 ASSERT_EQ(session->tab_node_ids.size(), 678 ASSERT_EQ(session->tab_node_ids.size(),
597 session->tab_node_ids.count(kTabNode)); 679 session->tab_node_ids.count(kTabNode1));
598 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); 680 ASSERT_EQ(1U, GetTabNodePool()->Capacity());
681 ASSERT_TRUE(VerifyTabIntegrity(kTag));
682 }
683
684 TEST_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
734 TEST_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));
599 } 787 }
600 788
601 } // namespace sync_sessions 789 } // namespace sync_sessions
OLDNEW
« no previous file with comments | « components/sync_sessions/synced_session_tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698