Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/sync_sessions/synced_session_tracker.h" | 5 #include "components/sync_sessions/synced_session_tracker.h" |
| 6 | 6 |
| 7 #include "base/rand_util.h" | 7 #include "base/rand_util.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" | 10 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" |
| 11 #include "components/sync_sessions/fake_sync_sessions_client.h" | 11 #include "components/sync_sessions/fake_sync_sessions_client.h" |
| 12 #include "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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |