Index: components/sync_sessions/synced_session_tracker_unittest.cc |
diff --git a/components/sync_sessions/synced_session_tracker_unittest.cc b/components/sync_sessions/synced_session_tracker_unittest.cc |
index 04cc0fd7daea01c2430ee783523372b848377f74..e79301ac35e394061a6b7c47cbcd955a9adb6a99 100644 |
--- a/components/sync_sessions/synced_session_tracker_unittest.cc |
+++ b/components/sync_sessions/synced_session_tracker_unittest.cc |
@@ -12,6 +12,10 @@ |
#include "components/sync_sessions/synced_tab_delegate.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using testing::AssertionFailure; |
+using testing::AssertionResult; |
+using testing::AssertionSuccess; |
+ |
namespace sync_sessions { |
namespace { |
@@ -23,7 +27,9 @@ const char kTag2[] = "tag2"; |
const char kTag3[] = "tag3"; |
const char kTitle[] = "title"; |
const int kWindow1 = 1; |
-const int kTabNode = 0; |
+const int kTabNode1 = 1; |
+const int kTabNode2 = 2; |
+const int kTabNode3 = 3; |
const int kTab1 = 15; |
const int kTab2 = 25; |
const int kTab3 = 35; |
@@ -38,6 +44,65 @@ class SyncedSessionTrackerTest : public testing::Test { |
SyncedSessionTracker* GetTracker() { return &tracker_; } |
TabNodePool* GetTabNodePool() { return &tracker_.local_tab_pool_; } |
+ // Verify that each tab within a session is allocated one SessionTab object, |
+ // and that that tab object is owned either by the Session itself or the |
+ // |unmapped_tabs_| tab holder. |
+ AssertionResult VerifyTabIntegrity(const std::string& session_tag) { |
+ // First get all the tabs associated with this session. |
+ int total_tab_count = 0; |
+ 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.
|
+ 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.
|
+ total_tab_count = 0; |
+ else |
+ total_tab_count = sess_iter->second.size(); |
+ |
+ // Now traverse the SyncedSession tree to verify the mapped tabs all match |
+ // up. |
+ int mapped_tab_count = 0; |
+ if (tracker_.synced_session_map_.find(session_tag) != |
+ tracker_.synced_session_map_.end()) { |
+ SyncedSession* session = tracker_.synced_session_map_[session_tag].get(); |
+ for (auto& window_pair : session->windows) { |
+ mapped_tab_count += window_pair.second->wrapped_window.tabs.size(); |
+ for (auto& tab : window_pair.second->wrapped_window.tabs) { |
+ if (sess_iter->second[tab->tab_id.id()] != tab.get()) { |
+ return AssertionFailure() |
+ << "Mapped tab " << tab->tab_id.id() |
+ << " does not match synced tab map " << tab->tab_id.id(); |
+ } |
+ } |
+ } |
+ } |
+ |
+ // Wrap up by verifying all unmapped tabs are tracked. |
+ int unmapped_tab_count = 0; |
+ if (tracker_.unmapped_tabs_.find(session_tag) != |
+ tracker_.unmapped_tabs_.end()) { |
+ unmapped_tab_count = tracker_.unmapped_tabs_[session_tag].size(); |
+ for (const auto& tab_pair : tracker_.unmapped_tabs_[session_tag]) { |
+ if (tab_pair.first != tab_pair.second->tab_id.id()) { |
+ return AssertionFailure() |
+ << "Unmapped tab " << tab_pair.second->tab_id.id() |
+ << " associated with wrong tab " << tab_pair.first; |
+ } |
+ if (sess_iter->second[tab_pair.second->tab_id.id()] != |
+ tab_pair.second.get()) { |
+ return AssertionFailure() |
+ << "Unmapped tab " << tab_pair.second->tab_id.id() |
+ << " does not match synced tab map " |
+ << tab_pair.second->tab_id.id(); |
+ } |
+ } |
+ } |
+ |
+ return mapped_tab_count + unmapped_tab_count == total_tab_count |
+ ? AssertionSuccess() |
+ : AssertionFailure() |
+ << " Tab count mismatch. Total: " << total_tab_count |
+ << ". Mapped + Unmapped: " << mapped_tab_count << " + " |
+ << unmapped_tab_count; |
+ } |
+ |
private: |
FakeSyncSessionsClient sessions_client_; |
SyncedSessionTracker tracker_; |
@@ -76,6 +141,7 @@ TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { |
ASSERT_EQ(1U, session->windows[10]->wrapped_window.tabs.size()); |
ASSERT_EQ(GetTracker()->GetTab(kTag, 15), |
session->windows[10]->wrapped_window.tabs[0].get()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
// Should clean up memory on its own. |
} |
@@ -202,6 +268,7 @@ TEST_F(SyncedSessionTrackerTest, Complex) { |
ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag)); |
ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag2)); |
ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
} |
TEST_F(SyncedSessionTrackerTest, ManyGetTabs) { |
@@ -338,6 +405,7 @@ TEST_F(SyncedSessionTrackerTest, SessionTracking) { |
ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); |
ASSERT_EQ(4U, GetTracker()->num_synced_tabs(kTag)); |
ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
// All memory should be properly deallocated by destructor for the |
// SyncedSessionTracker. |
@@ -364,14 +432,12 @@ TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) { |
GetTracker()->DeleteForeignTab(kTag, tab_node_id_2); |
GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
EXPECT_TRUE(result.empty()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
} |
TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) { |
std::set<int> free_node_ids; |
int tab_node_id = TabNodePool::kInvalidTabNodeID; |
- const int kTabNode1 = 1; |
- const int kTabNode2 = 2; |
- const int kTabNode3 = 3; |
GetTracker()->SetLocalSessionTag(kTag); |
@@ -424,6 +490,7 @@ TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) { |
EXPECT_TRUE(free_node_ids.empty()); |
EXPECT_TRUE(GetTabNodePool()->Full()); |
EXPECT_FALSE(GetTabNodePool()->Empty()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
} |
TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { |
@@ -431,9 +498,10 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { |
// First create the tab normally. |
GetTracker()->SetLocalSessionTag(kTag); |
- EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
- GetTracker()->ReassociateLocalTab(kTabNode, kTab1); |
- EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
+ EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
// Map it to a window with the same tab id as it was created with. |
@@ -441,6 +509,7 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { |
GetTracker()->PutWindowInSession(kTag, kWindow1); |
GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); |
GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
SyncedSession* session = GetTracker()->GetSession(kTag); |
ASSERT_EQ(1U, session->windows.size()); |
@@ -449,8 +518,9 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { |
session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
// Then reassociate with a new tab id. |
- GetTracker()->ReassociateLocalTab(kTabNode, kTab2); |
- EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab2); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
@@ -460,6 +530,7 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { |
GetTracker()->PutWindowInSession(kTag, kWindow1); |
GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); |
GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
EXPECT_TRUE(free_node_ids.empty()); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
@@ -468,8 +539,9 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { |
ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), |
session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
ASSERT_EQ(session->tab_node_ids.size(), |
- session->tab_node_ids.count(kTabNode)); |
+ session->tab_node_ids.count(kTabNode1)); |
ASSERT_EQ(1U, GetTabNodePool()->Capacity()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
} |
TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { |
@@ -477,9 +549,10 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { |
// First create the tab normally. |
GetTracker()->SetLocalSessionTag(kTag); |
- EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
- GetTracker()->ReassociateLocalTab(kTabNode, kTab1); |
- EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
+ EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
// Map it to a window with the same tab id as it was created with. |
@@ -487,6 +560,7 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { |
GetTracker()->PutWindowInSession(kTag, kWindow1); |
GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); |
GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
EXPECT_TRUE(free_node_ids.empty()); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
SyncedSession* session = GetTracker()->GetSession(kTag); |
@@ -496,8 +570,9 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { |
session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
// Then reassociate with a new tab id. |
- GetTracker()->ReassociateLocalTab(kTabNode, kTab2); |
- EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab2); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
@@ -514,6 +589,7 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { |
GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); |
GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); |
GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
EXPECT_TRUE(free_node_ids.empty()); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
@@ -522,7 +598,7 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { |
EXPECT_EQ(GetTracker()->GetTab(kTag, kTab2), |
session->windows[kWindow1]->wrapped_window.tabs[1].get()); |
EXPECT_EQ(session->tab_node_ids.size(), |
- session->tab_node_ids.count(kTabNode)); |
+ session->tab_node_ids.count(kTabNode1)); |
EXPECT_EQ(1U, GetTabNodePool()->Capacity()); |
// Attempting to access the original tab will create a new SessionTab object. |
@@ -530,6 +606,7 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMappedTwice) { |
GetTracker()->GetTab(kTag, kTab2)); |
int tab_node_id = -1; |
EXPECT_FALSE(GetTracker()->GetTabNodeFromLocalTabId(kTab1, &tab_node_id)); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
} |
TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) { |
@@ -537,20 +614,23 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) { |
// First create the old tab in an unmapped state. |
GetTracker()->SetLocalSessionTag(kTag); |
- EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
- GetTracker()->ReassociateLocalTab(kTabNode, kTab1); |
- EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
+ EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
// Map it to a window, but reassociated with a new tab id. |
GetTracker()->ResetSessionTracking(kTag); |
- GetTracker()->ReassociateLocalTab(kTabNode, kTab2); |
- EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab2); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
GetTracker()->PutWindowInSession(kTag, kWindow1); |
GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); |
GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
EXPECT_TRUE(free_node_ids.empty()); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
@@ -560,30 +640,34 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) { |
ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), |
session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
ASSERT_EQ(session->tab_node_ids.size(), |
- session->tab_node_ids.count(kTabNode)); |
+ session->tab_node_ids.count(kTabNode1)); |
ASSERT_EQ(1U, GetTabNodePool()->Capacity()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
} |
-TEST_F(SyncedSessionTrackerTest, ReassociateTabMapMismatch) { |
+TEST_F(SyncedSessionTrackerTest, ReassociateTabOldUnmappedNewMapped) { |
std::set<int> free_node_ids; |
// First create the old tab in an unmapped state. |
GetTracker()->SetLocalSessionTag(kTag); |
- EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
- GetTracker()->ReassociateLocalTab(kTabNode, kTab1); |
- EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
+ EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
// Map an unseen tab to a window, then reassociate the existing tab to the |
// mapped tab id. |
GetTracker()->ResetSessionTracking(kTag); |
- EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
GetTracker()->PutWindowInSession(kTag, kWindow1); |
GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); |
GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
- GetTracker()->ReassociateLocalTab(kTabNode, kTab2); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab2); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
EXPECT_TRUE(free_node_ids.empty()); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
@@ -594,8 +678,114 @@ TEST_F(SyncedSessionTrackerTest, ReassociateTabMapMismatch) { |
ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), |
session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
ASSERT_EQ(session->tab_node_ids.size(), |
- session->tab_node_ids.count(kTabNode)); |
+ session->tab_node_ids.count(kTabNode1)); |
+ ASSERT_EQ(1U, GetTabNodePool()->Capacity()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+} |
+ |
+TEST_F(SyncedSessionTrackerTest, ReassociateTabSameTabId) { |
+ std::set<int> free_node_ids; |
+ |
+ // First create the tab normally. |
+ GetTracker()->SetLocalSessionTag(kTag); |
+ EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ |
+ // Map it to a window. |
+ GetTracker()->ResetSessionTracking(kTag); |
+ GetTracker()->PutWindowInSession(kTag, kWindow1); |
+ GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); |
+ GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ SyncedSession* session = GetTracker()->GetSession(kTag); |
+ ASSERT_EQ(1U, session->windows.size()); |
+ ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); |
+ ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), |
+ session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
+ |
+ // Reassociate, using the same tab id. |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ |
+ // Reset tracking, and put the tab id back into the same window. |
+ GetTracker()->ResetSessionTracking(kTag); |
+ EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ GetTracker()->PutWindowInSession(kTag, kWindow1); |
+ GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); |
+ GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(free_node_ids.empty()); |
+ EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ |
+ // Now that it's been mapped, it should be accessible both via the |
+ // GetSession as well as the GetTab. |
+ ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), |
+ session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
+ ASSERT_EQ(session->tab_node_ids.size(), |
+ session->tab_node_ids.count(kTabNode1)); |
ASSERT_EQ(1U, GetTabNodePool()->Capacity()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+} |
+ |
+TEST_F(SyncedSessionTrackerTest, ReassociateTabOldMappedNewUnmapped) { |
+ std::set<int> free_node_ids; |
+ |
+ // First create an unmapped tab. |
+ GetTracker()->SetLocalSessionTag(kTag); |
+ EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ |
+ // Now, map the first one, deleting the second one. |
+ GetTracker()->ResetSessionTracking(kTag); |
+ GetTracker()->PutWindowInSession(kTag, kWindow1); |
+ GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); |
+ GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ SyncedSession* session = GetTracker()->GetSession(kTag); |
+ ASSERT_EQ(1U, session->windows.size()); |
+ ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); |
+ ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), |
+ session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
+ |
+ // Create a second unmapped tab. |
+ GetTracker()->ReassociateLocalTab(kTabNode2, kTab2); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode2)); |
+ EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
+ |
+ // Reassociate the second tab with node of the first tab. |
+ GetTracker()->ReassociateLocalTab(kTabNode1, kTab2); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode1)); |
+ EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode2)); |
+ EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
+ |
+ // Now map the new one. |
+ GetTracker()->ResetSessionTracking(kTag); |
+ GetTracker()->PutWindowInSession(kTag, kWindow1); |
+ GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); |
+ GetTracker()->CleanupLocalTabs(&free_node_ids); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
+ EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); |
+ EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); |
+ |
+ // Now that it's been mapped, it should be accessible both via the |
+ // GetSession as well as the GetTab. |
+ ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), |
+ session->windows[kWindow1]->wrapped_window.tabs[0].get()); |
+ ASSERT_EQ(2U, GetTabNodePool()->Capacity()); |
+ ASSERT_TRUE(VerifyTabIntegrity(kTag)); |
} |
} // namespace sync_sessions |