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 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |