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 "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 | 13 |
14 namespace sync_sessions { | 14 namespace sync_sessions { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 const char kValidUrl[] = "http://www.example.com"; | 18 const char kValidUrl[] = "http://www.example.com"; |
19 const char kInvalidUrl[] = "invalid.url"; | 19 const char kInvalidUrl[] = "invalid.url"; |
20 const char kTag[] = "tag"; | |
21 const char kTag2[] = "tag2"; | |
22 const char kTag3[] = "tag3"; | |
23 const char kTitle[] = "title"; | |
20 | 24 |
21 } // namespace | 25 } // namespace |
22 | 26 |
23 class SyncedSessionTrackerTest : public testing::Test { | 27 class SyncedSessionTrackerTest : public testing::Test { |
24 public: | 28 public: |
25 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {} | 29 SyncedSessionTrackerTest() : tracker_(&sessions_client_) {} |
26 ~SyncedSessionTrackerTest() override {} | 30 ~SyncedSessionTrackerTest() override {} |
27 | 31 |
28 SyncedSessionTracker* GetTracker() { return &tracker_; } | 32 SyncedSessionTracker* GetTracker() { return &tracker_; } |
33 TabNodePool* GetTabNodePool() { return &tracker_.local_tab_pool_; } | |
29 | 34 |
30 private: | 35 private: |
31 FakeSyncSessionsClient sessions_client_; | 36 FakeSyncSessionsClient sessions_client_; |
32 SyncedSessionTracker tracker_; | 37 SyncedSessionTracker tracker_; |
33 }; | 38 }; |
34 | 39 |
35 TEST_F(SyncedSessionTrackerTest, GetSession) { | 40 TEST_F(SyncedSessionTrackerTest, GetSession) { |
36 SyncedSession* session1 = GetTracker()->GetSession("tag"); | 41 SyncedSession* session1 = GetTracker()->GetSession(kTag); |
37 SyncedSession* session2 = GetTracker()->GetSession("tag2"); | 42 SyncedSession* session2 = GetTracker()->GetSession(kTag2); |
38 ASSERT_EQ(session1, GetTracker()->GetSession("tag")); | 43 ASSERT_EQ(session1, GetTracker()->GetSession(kTag)); |
39 ASSERT_NE(session1, session2); | 44 ASSERT_NE(session1, session2); |
40 // Should clean up memory on its own. | 45 // Should clean up memory on its own. |
41 } | 46 } |
42 | 47 |
43 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) { | 48 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) { |
44 sessions::SessionTab* tab = GetTracker()->GetTab("tag", 0, 0); | 49 sessions::SessionTab* tab = GetTracker()->GetTab(kTag, 0); |
45 ASSERT_EQ(tab, GetTracker()->GetTab("tag", 0, 0)); | 50 ASSERT_EQ(tab, GetTracker()->GetTab(kTag, 0)); |
46 // Should clean up memory on its own. | 51 // Should clean up memory on its own. |
47 } | 52 } |
48 | 53 |
49 TEST_F(SyncedSessionTrackerTest, PutWindowInSession) { | 54 TEST_F(SyncedSessionTrackerTest, PutWindowInSession) { |
50 GetTracker()->PutWindowInSession("tag", 0); | 55 GetTracker()->PutWindowInSession(kTag, 0); |
51 SyncedSession* session = GetTracker()->GetSession("tag"); | 56 SyncedSession* session = GetTracker()->GetSession(kTag); |
52 ASSERT_EQ(1U, session->windows.size()); | 57 ASSERT_EQ(1U, session->windows.size()); |
53 // Should clean up memory on its own. | 58 // Should clean up memory on its own. |
54 } | 59 } |
55 | 60 |
56 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { | 61 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { |
57 GetTracker()->PutWindowInSession("tag", 10); | 62 GetTracker()->PutWindowInSession(kTag, 10); |
58 GetTracker()->PutTabInWindow("tag", 10, 15, | 63 GetTracker()->PutTabInWindow(kTag, 10, 15); // win id 10, tab id 15 |
59 0); // win id 10, tab id 15, tab ind 0. | 64 SyncedSession* session = GetTracker()->GetSession(kTag); |
60 SyncedSession* session = GetTracker()->GetSession("tag"); | |
61 ASSERT_EQ(1U, session->windows.size()); | 65 ASSERT_EQ(1U, session->windows.size()); |
62 ASSERT_EQ(1U, session->windows[10]->tabs.size()); | 66 ASSERT_EQ(1U, session->windows[10]->tabs.size()); |
63 ASSERT_EQ(GetTracker()->GetTab("tag", 15, 1), | 67 ASSERT_EQ(GetTracker()->GetTab(kTag, 15), |
64 session->windows[10]->tabs[0].get()); | 68 session->windows[10]->tabs[0].get()); |
65 // Should clean up memory on its own. | 69 // Should clean up memory on its own. |
66 } | 70 } |
67 | 71 |
68 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { | 72 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) { |
69 std::vector<const SyncedSession*> sessions; | 73 std::vector<const SyncedSession*> sessions; |
70 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( | 74 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( |
71 &sessions, SyncedSessionTracker::PRESENTABLE)); | 75 &sessions, SyncedSessionTracker::PRESENTABLE)); |
72 GetTracker()->GetSession("tag1"); | 76 GetTracker()->GetSession(kTag); |
73 GetTracker()->PutWindowInSession("tag1", 0); | 77 GetTracker()->PutWindowInSession(kTag, 0); |
74 GetTracker()->PutTabInWindow("tag1", 0, 15, 0); | 78 GetTracker()->PutTabInWindow(kTag, 0, 15); |
75 sessions::SessionTab* tab = GetTracker()->GetTab("tag1", 15, 1); | 79 sessions::SessionTab* tab = GetTracker()->GetTab(kTag, 15); |
76 ASSERT_TRUE(tab); | 80 ASSERT_TRUE(tab); |
77 tab->navigations.push_back( | 81 tab->navigations.push_back( |
78 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(kValidUrl, | 82 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(kValidUrl, |
79 "title")); | 83 kTitle)); |
80 GetTracker()->GetSession("tag2"); | 84 GetTracker()->GetSession(kTag2); |
81 GetTracker()->GetSession("tag3"); | 85 GetTracker()->GetSession(kTag3); |
82 GetTracker()->PutWindowInSession("tag3", 0); | 86 GetTracker()->PutWindowInSession(kTag3, 0); |
83 GetTracker()->PutTabInWindow("tag3", 0, 15, 0); | 87 GetTracker()->PutTabInWindow(kTag3, 0, 15); |
84 tab = GetTracker()->GetTab("tag3", 15, 1); | 88 tab = GetTracker()->GetTab(kTag3, 15); |
85 ASSERT_TRUE(tab); | 89 ASSERT_TRUE(tab); |
86 tab->navigations.push_back( | 90 tab->navigations.push_back( |
87 sessions::SerializedNavigationEntryTestHelper::CreateNavigation( | 91 sessions::SerializedNavigationEntryTestHelper::CreateNavigation( |
88 kInvalidUrl, "title")); | 92 kInvalidUrl, kTitle)); |
89 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( | 93 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( |
90 &sessions, SyncedSessionTracker::PRESENTABLE)); | 94 &sessions, SyncedSessionTracker::PRESENTABLE)); |
91 // Only the session with a valid window and tab gets returned. | 95 // Only the session with a valid window and tab gets returned. |
92 ASSERT_EQ(1U, sessions.size()); | 96 ASSERT_EQ(1U, sessions.size()); |
93 ASSERT_EQ("tag1", sessions[0]->session_tag); | 97 ASSERT_EQ(kTag, sessions[0]->session_tag); |
94 | 98 |
95 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( | 99 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( |
96 &sessions, SyncedSessionTracker::RAW)); | 100 &sessions, SyncedSessionTracker::RAW)); |
97 ASSERT_EQ(3U, sessions.size()); | 101 ASSERT_EQ(3U, sessions.size()); |
98 } | 102 } |
99 | 103 |
100 TEST_F(SyncedSessionTrackerTest, LookupSessionWindows) { | 104 TEST_F(SyncedSessionTrackerTest, LookupSessionWindows) { |
101 std::vector<const sessions::SessionWindow*> windows; | 105 std::vector<const sessions::SessionWindow*> windows; |
102 ASSERT_FALSE(GetTracker()->LookupSessionWindows("tag1", &windows)); | 106 ASSERT_FALSE(GetTracker()->LookupSessionWindows(kTag, &windows)); |
103 GetTracker()->GetSession("tag1"); | 107 GetTracker()->GetSession(kTag); |
104 GetTracker()->PutWindowInSession("tag1", 0); | 108 GetTracker()->PutWindowInSession(kTag, 0); |
105 GetTracker()->PutWindowInSession("tag1", 2); | 109 GetTracker()->PutWindowInSession(kTag, 2); |
106 GetTracker()->GetSession("tag2"); | 110 GetTracker()->GetSession(kTag2); |
107 GetTracker()->PutWindowInSession("tag2", 0); | 111 GetTracker()->PutWindowInSession(kTag2, 0); |
108 GetTracker()->PutWindowInSession("tag2", 2); | 112 GetTracker()->PutWindowInSession(kTag2, 2); |
109 ASSERT_TRUE(GetTracker()->LookupSessionWindows("tag1", &windows)); | 113 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag, &windows)); |
110 ASSERT_EQ(2U, windows.size()); // Only windows from tag1 session. | 114 ASSERT_EQ(2U, windows.size()); // Only windows from kTag session. |
111 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[0]); | 115 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[0]); |
112 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[1]); | 116 ASSERT_NE((sessions::SessionWindow*)nullptr, windows[1]); |
113 ASSERT_NE(windows[1], windows[0]); | 117 ASSERT_NE(windows[1], windows[0]); |
114 } | 118 } |
115 | 119 |
116 TEST_F(SyncedSessionTrackerTest, LookupSessionTab) { | 120 TEST_F(SyncedSessionTrackerTest, LookupSessionTab) { |
117 const sessions::SessionTab* tab; | 121 const sessions::SessionTab* tab; |
118 ASSERT_FALSE(GetTracker()->LookupSessionTab("tag1", 5, &tab)); | 122 ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, 5, &tab)); |
119 GetTracker()->GetSession("tag1"); | 123 GetTracker()->GetSession(kTag); |
120 GetTracker()->PutWindowInSession("tag1", 0); | 124 GetTracker()->PutWindowInSession(kTag, 0); |
121 GetTracker()->PutTabInWindow("tag1", 0, 5, 0); | 125 GetTracker()->PutTabInWindow(kTag, 0, 5); |
122 ASSERT_TRUE(GetTracker()->LookupSessionTab("tag1", 5, &tab)); | 126 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 5, &tab)); |
123 ASSERT_NE((sessions::SessionTab*)nullptr, tab); | 127 ASSERT_NE((sessions::SessionTab*)nullptr, tab); |
124 } | 128 } |
125 | 129 |
126 TEST_F(SyncedSessionTrackerTest, Complex) { | 130 TEST_F(SyncedSessionTrackerTest, Complex) { |
127 const std::string tag1 = "tag"; | |
128 const std::string tag2 = "tag2"; | |
129 const std::string tag3 = "tag3"; | |
130 std::vector<sessions::SessionTab *> tabs1, tabs2; | 131 std::vector<sessions::SessionTab *> tabs1, tabs2; |
131 sessions::SessionTab* temp_tab; | 132 sessions::SessionTab* temp_tab; |
132 ASSERT_TRUE(GetTracker()->Empty()); | 133 ASSERT_TRUE(GetTracker()->Empty()); |
133 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); | 134 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
134 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag1)); | 135 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag)); |
135 tabs1.push_back(GetTracker()->GetTab(tag1, 0, 0)); | 136 tabs1.push_back(GetTracker()->GetTab(kTag, 0)); |
136 tabs1.push_back(GetTracker()->GetTab(tag1, 1, 1)); | 137 tabs1.push_back(GetTracker()->GetTab(kTag, 1)); |
137 tabs1.push_back(GetTracker()->GetTab(tag1, 2, 2)); | 138 tabs1.push_back(GetTracker()->GetTab(kTag, 2)); |
138 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); | 139 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag)); |
139 ASSERT_EQ(1U, GetTracker()->num_synced_sessions()); | 140 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
140 temp_tab = GetTracker()->GetTab(tag1, 0, 0); // Already created. | 141 temp_tab = GetTracker()->GetTab(kTag, 0); // Already created. |
141 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); | 142 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag)); |
142 ASSERT_EQ(1U, GetTracker()->num_synced_sessions()); | 143 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
143 ASSERT_EQ(tabs1[0], temp_tab); | 144 ASSERT_EQ(tabs1[0], temp_tab); |
144 tabs2.push_back(GetTracker()->GetTab(tag2, 0, 0)); | 145 tabs2.push_back(GetTracker()->GetTab(kTag2, 0)); |
145 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); | 146 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); |
146 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); | 147 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
147 ASSERT_FALSE(GetTracker()->DeleteSession(tag3)); | 148 ASSERT_FALSE(GetTracker()->DeleteForeignSession(kTag3)); |
148 | 149 |
149 SyncedSession* session = GetTracker()->GetSession(tag1); | 150 SyncedSession* session = GetTracker()->GetSession(kTag); |
150 SyncedSession* session2 = GetTracker()->GetSession(tag2); | 151 SyncedSession* session2 = GetTracker()->GetSession(kTag2); |
151 SyncedSession* session3 = GetTracker()->GetSession(tag3); | 152 SyncedSession* session3 = GetTracker()->GetSession(kTag3); |
152 session3->device_type = SyncedSession::TYPE_OTHER; | 153 session3->device_type = SyncedSession::TYPE_OTHER; |
153 ASSERT_EQ(3U, GetTracker()->num_synced_sessions()); | 154 ASSERT_EQ(3U, GetTracker()->num_synced_sessions()); |
154 | 155 |
155 ASSERT_TRUE(session); | 156 ASSERT_TRUE(session); |
156 ASSERT_TRUE(session2); | 157 ASSERT_TRUE(session2); |
157 ASSERT_TRUE(session3); | 158 ASSERT_TRUE(session3); |
158 ASSERT_NE(session, session2); | 159 ASSERT_NE(session, session2); |
159 ASSERT_NE(session2, session3); | 160 ASSERT_NE(session2, session3); |
160 ASSERT_TRUE(GetTracker()->DeleteSession(tag3)); | 161 ASSERT_TRUE(GetTracker()->DeleteForeignSession(kTag3)); |
161 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); | 162 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); |
162 | 163 |
163 GetTracker()->PutWindowInSession(tag1, 0); // Create a window. | 164 GetTracker()->PutWindowInSession(kTag, 0); // Create a window. |
164 GetTracker()->PutTabInWindow(tag1, 0, 2, 0); // No longer unmapped. | 165 GetTracker()->PutTabInWindow(kTag, 0, 2); // No longer unmapped. |
165 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(tag1)); // Has not changed. | 166 ASSERT_EQ(3U, GetTracker()->num_synced_tabs(kTag)); // Has not changed. |
166 | 167 |
167 const sessions::SessionTab* tab_ptr; | 168 const sessions::SessionTab* tab_ptr; |
168 ASSERT_TRUE(GetTracker()->LookupSessionTab(tag1, 0, &tab_ptr)); | 169 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 0, &tab_ptr)); |
169 ASSERT_EQ(tab_ptr, tabs1[0]); | 170 ASSERT_EQ(tab_ptr, tabs1[0]); |
170 ASSERT_TRUE(GetTracker()->LookupSessionTab(tag1, 2, &tab_ptr)); | 171 ASSERT_TRUE(GetTracker()->LookupSessionTab(kTag, 2, &tab_ptr)); |
171 ASSERT_EQ(tab_ptr, tabs1[2]); | 172 ASSERT_EQ(tab_ptr, tabs1[2]); |
172 ASSERT_FALSE(GetTracker()->LookupSessionTab(tag1, 3, &tab_ptr)); | 173 ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, 3, &tab_ptr)); |
173 ASSERT_FALSE(tab_ptr); | 174 ASSERT_FALSE(tab_ptr); |
174 | 175 |
175 std::vector<const sessions::SessionWindow*> windows; | 176 std::vector<const sessions::SessionWindow*> windows; |
176 ASSERT_TRUE(GetTracker()->LookupSessionWindows(tag1, &windows)); | 177 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag, &windows)); |
177 ASSERT_EQ(1U, windows.size()); | 178 ASSERT_EQ(1U, windows.size()); |
178 ASSERT_TRUE(GetTracker()->LookupSessionWindows(tag2, &windows)); | 179 ASSERT_TRUE(GetTracker()->LookupSessionWindows(kTag2, &windows)); |
179 ASSERT_EQ(0U, windows.size()); | 180 ASSERT_EQ(0U, windows.size()); |
180 | 181 |
181 // The sessions don't have valid tabs, lookup should not succeed. | 182 // The sessions don't have valid tabs, lookup should not succeed. |
182 std::vector<const SyncedSession*> sessions; | 183 std::vector<const SyncedSession*> sessions; |
183 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( | 184 ASSERT_FALSE(GetTracker()->LookupAllForeignSessions( |
184 &sessions, SyncedSessionTracker::PRESENTABLE)); | 185 &sessions, SyncedSessionTracker::PRESENTABLE)); |
185 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( | 186 ASSERT_TRUE(GetTracker()->LookupAllForeignSessions( |
186 &sessions, SyncedSessionTracker::RAW)); | 187 &sessions, SyncedSessionTracker::RAW)); |
187 ASSERT_EQ(2U, sessions.size()); | 188 ASSERT_EQ(2U, sessions.size()); |
188 | 189 |
189 GetTracker()->Clear(); | 190 GetTracker()->Clear(); |
190 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag1)); | 191 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag)); |
191 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(tag2)); | 192 ASSERT_EQ(0U, GetTracker()->num_synced_tabs(kTag2)); |
192 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); | 193 ASSERT_EQ(0U, GetTracker()->num_synced_sessions()); |
193 } | 194 } |
194 | 195 |
195 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) { | 196 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) { |
196 ASSERT_TRUE(GetTracker()->Empty()); | 197 ASSERT_TRUE(GetTracker()->Empty()); |
197 const int kMaxSessions = 10; | 198 const int kMaxSessions = 10; |
198 const int kMaxTabs = 1000; | 199 const int kMaxTabs = 1000; |
199 const int kMaxAttempts = 10000; | 200 const int kMaxAttempts = 10000; |
200 for (int j = 0; j < kMaxSessions; ++j) { | 201 for (int j = 0; j < kMaxSessions; ++j) { |
201 std::string tag = base::StringPrintf("tag%d", j); | 202 std::string tag = base::StringPrintf("tag%d", j); |
202 for (int i = 0; i < kMaxAttempts; ++i) { | 203 for (int i = 0; i < kMaxAttempts; ++i) { |
203 // More attempts than tabs means we'll sometimes get the same tabs, | 204 // More attempts than tabs means we'll sometimes get the same tabs, |
204 // sometimes have to allocate new tabs. | 205 // sometimes have to allocate new tabs. |
205 int rand_tab_num = base::RandInt(0, kMaxTabs); | 206 int rand_tab_num = base::RandInt(0, kMaxTabs); |
206 sessions::SessionTab* tab = | 207 sessions::SessionTab* tab = GetTracker()->GetTab(tag, rand_tab_num + 1); |
207 GetTracker()->GetTab(tag, rand_tab_num, rand_tab_num + 1); | |
208 ASSERT_TRUE(tab); | 208 ASSERT_TRUE(tab); |
209 } | 209 } |
210 } | 210 } |
211 } | 211 } |
212 | 212 |
213 TEST_F(SyncedSessionTrackerTest, LookupTabNodeIds) { | 213 TEST_F(SyncedSessionTrackerTest, LookupForeignTabNodeIds) { |
214 std::set<int> result; | 214 std::set<int> result; |
215 std::string tag1 = "session1"; | |
216 std::string tag2 = "session2"; | |
217 std::string tag3 = "session3"; | |
218 | 215 |
219 GetTracker()->GetTab(tag1, 1, 1); | 216 GetTracker()->OnTabNodeSeen(kTag, 1); |
220 GetTracker()->GetTab(tag1, 2, 2); | 217 GetTracker()->OnTabNodeSeen(kTag, 2); |
221 GetTracker()->LookupTabNodeIds(tag1, &result); | 218 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
222 EXPECT_EQ(2U, result.size()); | 219 EXPECT_EQ(2U, result.size()); |
223 EXPECT_FALSE(result.end() == result.find(1)); | 220 EXPECT_FALSE(result.end() == result.find(1)); |
224 EXPECT_FALSE(result.end() == result.find(2)); | 221 EXPECT_FALSE(result.end() == result.find(2)); |
225 GetTracker()->LookupTabNodeIds(tag2, &result); | 222 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
226 EXPECT_TRUE(result.empty()); | 223 EXPECT_TRUE(result.empty()); |
227 | 224 |
228 GetTracker()->PutWindowInSession(tag1, 0); | 225 GetTracker()->PutWindowInSession(kTag, 0); |
229 GetTracker()->PutTabInWindow(tag1, 0, 3, 0); | 226 GetTracker()->PutTabInWindow(kTag, 0, 3); |
230 GetTracker()->LookupTabNodeIds(tag1, &result); | 227 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
231 EXPECT_EQ(2U, result.size()); | 228 EXPECT_EQ(2U, result.size()); |
232 | 229 |
233 GetTracker()->GetTab(tag1, 3, 3); | 230 GetTracker()->OnTabNodeSeen(kTag, 3); |
234 GetTracker()->LookupTabNodeIds(tag1, &result); | 231 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
235 EXPECT_EQ(3U, result.size()); | 232 EXPECT_EQ(3U, result.size()); |
236 EXPECT_FALSE(result.end() == result.find(3)); | 233 EXPECT_FALSE(result.end() == result.find(3)); |
237 | 234 |
238 GetTracker()->GetTab(tag2, 1, 21); | 235 GetTracker()->OnTabNodeSeen(kTag2, 21); |
239 GetTracker()->GetTab(tag2, 2, 22); | 236 GetTracker()->OnTabNodeSeen(kTag2, 22); |
240 GetTracker()->LookupTabNodeIds(tag2, &result); | 237 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
241 EXPECT_EQ(2U, result.size()); | 238 EXPECT_EQ(2U, result.size()); |
242 EXPECT_FALSE(result.end() == result.find(21)); | 239 EXPECT_FALSE(result.end() == result.find(21)); |
243 EXPECT_FALSE(result.end() == result.find(22)); | 240 EXPECT_FALSE(result.end() == result.find(22)); |
244 GetTracker()->LookupTabNodeIds(tag1, &result); | 241 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
245 EXPECT_EQ(3U, result.size()); | 242 EXPECT_EQ(3U, result.size()); |
246 EXPECT_FALSE(result.end() == result.find(1)); | 243 EXPECT_FALSE(result.end() == result.find(1)); |
247 EXPECT_FALSE(result.end() == result.find(2)); | 244 EXPECT_FALSE(result.end() == result.find(2)); |
248 | 245 |
249 GetTracker()->LookupTabNodeIds(tag3, &result); | 246 GetTracker()->LookupForeignTabNodeIds(kTag3, &result); |
250 EXPECT_TRUE(result.empty()); | 247 EXPECT_TRUE(result.empty()); |
251 GetTracker()->PutWindowInSession(tag3, 1); | 248 GetTracker()->PutWindowInSession(kTag3, 1); |
252 GetTracker()->PutTabInWindow(tag3, 1, 5, 0); | 249 GetTracker()->PutTabInWindow(kTag3, 1, 5); |
253 GetTracker()->LookupTabNodeIds(tag3, &result); | 250 GetTracker()->LookupForeignTabNodeIds(kTag3, &result); |
254 EXPECT_TRUE(result.empty()); | 251 EXPECT_TRUE(result.empty()); |
255 EXPECT_FALSE(GetTracker()->DeleteSession(tag3)); | 252 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag3)); |
256 GetTracker()->LookupTabNodeIds(tag3, &result); | 253 GetTracker()->LookupForeignTabNodeIds(kTag3, &result); |
257 EXPECT_TRUE(result.empty()); | 254 EXPECT_TRUE(result.empty()); |
258 | 255 |
259 EXPECT_FALSE(GetTracker()->DeleteSession(tag1)); | 256 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag)); |
260 GetTracker()->LookupTabNodeIds(tag1, &result); | 257 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
261 EXPECT_TRUE(result.empty()); | 258 EXPECT_TRUE(result.empty()); |
262 GetTracker()->LookupTabNodeIds(tag2, &result); | 259 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
263 EXPECT_EQ(2U, result.size()); | 260 EXPECT_EQ(2U, result.size()); |
264 EXPECT_FALSE(result.end() == result.find(21)); | 261 EXPECT_FALSE(result.end() == result.find(21)); |
265 EXPECT_FALSE(result.end() == result.find(22)); | 262 EXPECT_FALSE(result.end() == result.find(22)); |
266 | 263 |
267 GetTracker()->GetTab(tag2, 1, 21); | 264 GetTracker()->OnTabNodeSeen(kTag2, 21); |
268 GetTracker()->GetTab(tag2, 2, 23); | 265 GetTracker()->OnTabNodeSeen(kTag2, 23); |
269 GetTracker()->LookupTabNodeIds(tag2, &result); | 266 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
270 EXPECT_EQ(3U, result.size()); | 267 EXPECT_EQ(3U, result.size()); |
271 EXPECT_FALSE(result.end() == result.find(21)); | 268 EXPECT_FALSE(result.end() == result.find(21)); |
272 EXPECT_FALSE(result.end() == result.find(22)); | 269 EXPECT_FALSE(result.end() == result.find(22)); |
273 EXPECT_FALSE(result.end() == result.find(23)); | 270 EXPECT_FALSE(result.end() == result.find(23)); |
274 | 271 |
275 EXPECT_FALSE(GetTracker()->DeleteSession(tag2)); | 272 EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag2)); |
276 GetTracker()->LookupTabNodeIds(tag2, &result); | 273 GetTracker()->LookupForeignTabNodeIds(kTag2, &result); |
277 EXPECT_TRUE(result.empty()); | 274 EXPECT_TRUE(result.empty()); |
278 } | 275 } |
279 | 276 |
280 TEST_F(SyncedSessionTrackerTest, SessionTracking) { | 277 TEST_F(SyncedSessionTrackerTest, SessionTracking) { |
281 ASSERT_TRUE(GetTracker()->Empty()); | 278 ASSERT_TRUE(GetTracker()->Empty()); |
282 std::string tag1 = "tag1"; | |
283 std::string tag2 = "tag2"; | |
284 | 279 |
285 // Create some session information that is stale. | 280 // Create some session information that is stale. |
286 SyncedSession* session1 = GetTracker()->GetSession(tag1); | 281 SyncedSession* session1 = GetTracker()->GetSession(kTag); |
287 GetTracker()->PutWindowInSession(tag1, 0); | 282 GetTracker()->PutWindowInSession(kTag, 0); |
288 GetTracker()->PutTabInWindow(tag1, 0, 0, 0); | 283 GetTracker()->PutTabInWindow(kTag, 0, 0); |
289 GetTracker()->PutTabInWindow(tag1, 0, 1, 1); | 284 GetTracker()->PutTabInWindow(kTag, 0, 1); |
290 GetTracker()->GetTab(tag1, 2, 3U)->window_id.set_id(0); // Will be unmapped. | 285 GetTracker()->GetTab(kTag, 2)->window_id.set_id(0); // Will be unmapped. |
291 GetTracker()->GetTab(tag1, 3, 4U)->window_id.set_id(0); // Will be unmapped. | 286 GetTracker()->GetTab(kTag, 3)->window_id.set_id(0); // Will be unmapped. |
292 GetTracker()->PutWindowInSession(tag1, 1); | 287 GetTracker()->PutWindowInSession(kTag, 1); |
293 GetTracker()->PutTabInWindow(tag1, 1, 4, 0); | 288 GetTracker()->PutTabInWindow(kTag, 1, 4); |
294 GetTracker()->PutTabInWindow(tag1, 1, 5, 1); | 289 GetTracker()->PutTabInWindow(kTag, 1, 5); |
295 ASSERT_EQ(2U, session1->windows.size()); | 290 ASSERT_EQ(2U, session1->windows.size()); |
296 ASSERT_EQ(2U, session1->windows[0]->tabs.size()); | 291 ASSERT_EQ(2U, session1->windows[0]->tabs.size()); |
297 ASSERT_EQ(2U, session1->windows[1]->tabs.size()); | 292 ASSERT_EQ(2U, session1->windows[1]->tabs.size()); |
298 ASSERT_EQ(6U, GetTracker()->num_synced_tabs(tag1)); | 293 ASSERT_EQ(6U, GetTracker()->num_synced_tabs(kTag)); |
299 | 294 |
300 // Create a session that should not be affected. | 295 // Create a session that should not be affected. |
301 SyncedSession* session2 = GetTracker()->GetSession(tag2); | 296 SyncedSession* session2 = GetTracker()->GetSession(kTag2); |
302 GetTracker()->PutWindowInSession(tag2, 2); | 297 GetTracker()->PutWindowInSession(kTag2, 2); |
303 GetTracker()->PutTabInWindow(tag2, 2, 1, 0); | 298 GetTracker()->PutTabInWindow(kTag2, 2, 1); |
304 ASSERT_EQ(1U, session2->windows.size()); | 299 ASSERT_EQ(1U, session2->windows.size()); |
305 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); | 300 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); |
306 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); | 301 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); |
307 | 302 |
308 // Reset tracking and get the current windows/tabs. | 303 // Reset tracking and get the current windows/tabs. |
309 // We simulate moving a tab from one window to another, then closing the | 304 // We simulate moving a tab from one window to another, then closing the |
310 // first window (including its one remaining tab), and opening a new tab | 305 // first window (including its one remaining tab), and opening a new tab |
311 // on the remaining window. | 306 // on the remaining window. |
312 | 307 |
313 // New tab, arrived before meta node so unmapped. | 308 // New tab, arrived before meta node so unmapped. |
314 GetTracker()->GetTab(tag1, 6, 7U); | 309 GetTracker()->GetTab(kTag, 6); |
315 GetTracker()->ResetSessionTracking(tag1); | 310 GetTracker()->ResetSessionTracking(kTag); |
316 GetTracker()->PutWindowInSession(tag1, 0); | 311 GetTracker()->PutWindowInSession(kTag, 0); |
317 GetTracker()->PutTabInWindow(tag1, 0, 0, 0); | 312 GetTracker()->PutTabInWindow(kTag, 0, 0); |
318 // Tab 1 is closed. | 313 // Tab 1 is closed. |
319 GetTracker()->PutTabInWindow(tag1, 0, 2, 1); // No longer unmapped. | 314 GetTracker()->PutTabInWindow(kTag, 0, 2); // No longer unmapped. |
320 // Tab 3 was unmapped and does not get used. | 315 // Tab 3 was unmapped and does not get used. |
321 GetTracker()->PutTabInWindow(tag1, 0, 4, 2); // Moved from window 1. | 316 GetTracker()->PutTabInWindow(kTag, 0, 4); // Moved from window 1. |
322 // Window 1 was closed, along with tab 5. | 317 // Window 1 was closed, along with tab 5. |
323 GetTracker()->PutTabInWindow(tag1, 0, 6, 3); // No longer unmapped. | 318 GetTracker()->PutTabInWindow(kTag, 0, 6); // No longer unmapped. |
324 // Session 2 should not be affected. | 319 // Session 2 should not be affected. |
325 GetTracker()->CleanupSession(tag1); | 320 GetTracker()->CleanupForeignSession(kTag); |
326 | 321 |
327 // Verify that only those parts of the session not owned have been removed. | 322 // Verify that only those parts of the session not owned have been removed. |
328 ASSERT_EQ(1U, session1->windows.size()); | 323 ASSERT_EQ(1U, session1->windows.size()); |
329 ASSERT_EQ(4U, session1->windows[0]->tabs.size()); | 324 ASSERT_EQ(4U, session1->windows[0]->tabs.size()); |
330 ASSERT_EQ(1U, session2->windows.size()); | 325 ASSERT_EQ(1U, session2->windows.size()); |
331 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); | 326 ASSERT_EQ(1U, session2->windows[2]->tabs.size()); |
332 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); | 327 ASSERT_EQ(2U, GetTracker()->num_synced_sessions()); |
333 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(tag1)); | 328 ASSERT_EQ(4U, GetTracker()->num_synced_tabs(kTag)); |
334 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(tag2)); | 329 ASSERT_EQ(1U, GetTracker()->num_synced_tabs(kTag2)); |
335 | 330 |
336 // All memory should be properly deallocated by destructor for the | 331 // All memory should be properly deallocated by destructor for the |
337 // SyncedSessionTracker. | 332 // SyncedSessionTracker. |
338 } | 333 } |
339 | 334 |
340 TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) { | 335 TEST_F(SyncedSessionTrackerTest, DeleteForeignTab) { |
341 std::string session_tag = "session_tag"; | 336 int tab_node_id_1 = 1; |
342 int tab_id_1 = 1; | 337 int tab_node_id_2 = 2; |
343 int tab_id_2 = 2; | |
344 int tab_node_id_3 = 3; | |
345 int tab_node_id_4 = 4; | |
346 std::set<int> result; | 338 std::set<int> result; |
347 | 339 |
348 GetTracker()->GetTab(session_tag, tab_id_1, tab_node_id_3); | 340 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_1); |
349 GetTracker()->GetTab(session_tag, tab_id_1, tab_node_id_4); | 341 GetTracker()->OnTabNodeSeen(kTag, tab_node_id_2); |
350 GetTracker()->GetTab(session_tag, tab_id_2, tab_node_id_3); | |
351 GetTracker()->GetTab(session_tag, tab_id_2, tab_node_id_4); | |
352 | 342 |
353 GetTracker()->LookupTabNodeIds(session_tag, &result); | 343 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
354 EXPECT_EQ(2U, result.size()); | 344 EXPECT_EQ(2U, result.size()); |
355 EXPECT_TRUE(result.find(tab_node_id_3) != result.end()); | 345 EXPECT_TRUE(result.find(tab_node_id_1) != result.end()); |
356 EXPECT_TRUE(result.find(tab_node_id_4) != result.end()); | 346 EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); |
357 | 347 |
358 GetTracker()->DeleteForeignTab(session_tag, tab_node_id_3); | 348 GetTracker()->DeleteForeignTab(kTag, tab_node_id_1); |
359 GetTracker()->LookupTabNodeIds(session_tag, &result); | 349 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
360 EXPECT_EQ(1U, result.size()); | 350 EXPECT_EQ(1U, result.size()); |
361 EXPECT_TRUE(result.find(tab_node_id_4) != result.end()); | 351 EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); |
362 | 352 |
363 GetTracker()->DeleteForeignTab(session_tag, tab_node_id_4); | 353 GetTracker()->DeleteForeignTab(kTag, tab_node_id_2); |
364 GetTracker()->LookupTabNodeIds(session_tag, &result); | 354 GetTracker()->LookupForeignTabNodeIds(kTag, &result); |
365 EXPECT_TRUE(result.empty()); | 355 EXPECT_TRUE(result.empty()); |
366 } | 356 } |
367 | 357 |
358 TEST_F(SyncedSessionTrackerTest, CleanupLocalTabs) { | |
359 std::set<int> free_node_ids; | |
360 int tab_node_id = TabNodePool::kInvalidTabNodeID; | |
361 const int kWindow1 = 1; | |
362 const int kTabNode1 = 1; | |
363 const int kTabNode2 = 2; | |
364 const int kTabNode3 = 3; | |
365 const int kTab1 = 15; | |
366 const int kTab2 = 25; | |
367 const int kTab3 = 35; | |
368 | |
369 GetTracker()->SetLocalSessionTag(kTag); | |
370 | |
371 // Start with two restored tab nodes. | |
372 GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); | |
373 GetTracker()->ReassociateLocalTab(kTabNode2, kTab2); | |
374 EXPECT_TRUE(GetTabNodePool()->Empty()); | |
375 EXPECT_FALSE(GetTabNodePool()->Full()); | |
376 EXPECT_EQ(2U, GetTabNodePool()->Capacity()); | |
377 | |
378 // Associate with no tabs. The tab pool should now be full. | |
379 GetTracker()->ResetSessionTracking(kTag); | |
380 GetTracker()->CleanupLocalTabs(&free_node_ids); | |
381 EXPECT_TRUE(free_node_ids.empty()); | |
382 EXPECT_TRUE(GetTabNodePool()->Full()); | |
383 | |
384 // Associate with only 1 tab open. A tab node should be reused. | |
385 GetTracker()->ResetSessionTracking(kTag); | |
386 GetTracker()->PutWindowInSession(kTag, kWindow1); | |
387 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); | |
388 EXPECT_TRUE(GetTracker()->GetTabNodeForLocalTab(kTab1, &tab_node_id)); | |
389 GetTracker()->CleanupLocalTabs(&free_node_ids); | |
390 EXPECT_TRUE(free_node_ids.empty()); | |
391 | |
392 // TabNodePool should have one free tab node and one used. | |
393 EXPECT_EQ(2U, GetTabNodePool()->Capacity()); | |
394 EXPECT_FALSE(GetTabNodePool()->Empty()); | |
395 EXPECT_FALSE(GetTabNodePool()->Full()); | |
396 | |
397 // Simulate a tab opening, which should use the last free tab node. | |
398 EXPECT_TRUE(GetTracker()->GetTabNodeForLocalTab(kTab2, &tab_node_id)); | |
399 EXPECT_TRUE(GetTabNodePool()->Empty()); | |
400 | |
401 // Simulate another tab opening, which should create a new associated tab | |
402 // node. | |
403 EXPECT_FALSE(GetTracker()->GetTabNodeForLocalTab(kTab3, &tab_node_id)); | |
404 EXPECT_EQ(kTabNode3, tab_node_id); | |
405 EXPECT_EQ(3U, GetTabNodePool()->Capacity()); | |
406 EXPECT_TRUE(GetTabNodePool()->Empty()); | |
407 | |
408 // Fetching the same tab should return the same tab node id. | |
409 EXPECT_TRUE(GetTracker()->GetTabNodeForLocalTab(kTab3, &tab_node_id)); | |
410 EXPECT_EQ(kTabNode3, tab_node_id); | |
411 EXPECT_TRUE(GetTabNodePool()->Empty()); | |
412 | |
413 // Associate with no tabs. All tabs should be freed again, and the pool | |
414 // should now be full. | |
415 GetTracker()->ResetSessionTracking(kTag); | |
416 GetTracker()->CleanupLocalTabs(&free_node_ids); | |
417 EXPECT_TRUE(free_node_ids.empty()); | |
418 EXPECT_TRUE(GetTabNodePool()->Full()); | |
419 EXPECT_FALSE(GetTabNodePool()->Empty()); | |
420 } | |
421 | |
422 TEST_F(SyncedSessionTrackerTest, ReassociateTabMapped) { | |
423 std::set<int> free_node_ids; | |
424 const int kWindow1 = 1; | |
Patrick Noland
2017/01/25 19:23:41
You use these constants in the previous function a
Nicolas Zea
2017/01/25 23:55:05
Done.
| |
425 const int kTabNode = 0; | |
426 const int kTab1 = 15; | |
427 const int kTab2 = 25; | |
428 | |
429 // First create the tab normally. | |
430 GetTracker()->SetLocalSessionTag(kTag); | |
431 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); | |
432 | |
433 // Map it to a window with the same tab id as it was created with. | |
434 GetTracker()->ResetSessionTracking(kTag); | |
435 GetTracker()->PutWindowInSession(kTag, kWindow1); | |
436 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); | |
437 GetTracker()->CleanupLocalTabs(&free_node_ids); | |
438 SyncedSession* session = GetTracker()->GetSession(kTag); | |
439 ASSERT_EQ(1U, session->windows.size()); | |
440 ASSERT_EQ(1U, session->windows[kWindow1]->tabs.size()); | |
441 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), | |
442 session->windows[kWindow1]->tabs[0].get()); | |
443 | |
444 // Then reassociate with a new tab id. | |
445 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); | |
446 | |
447 // Reset tracking, and put the new tab id into the window. | |
448 GetTracker()->ResetSessionTracking(kTag); | |
449 GetTracker()->PutWindowInSession(kTag, kWindow1); | |
450 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); | |
451 GetTracker()->CleanupLocalTabs(&free_node_ids); | |
452 EXPECT_TRUE(free_node_ids.empty()); | |
453 | |
454 // Now that it's been mapped, it should be accessible both via the | |
455 // GetSession as well as the GetTab. | |
456 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), | |
457 session->windows[kWindow1]->tabs[0].get()); | |
458 ASSERT_EQ(session->tab_node_ids.size(), | |
459 session->tab_node_ids.count(kTabNode)); | |
460 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); | |
461 } | |
462 | |
463 TEST_F(SyncedSessionTrackerTest, ReassociateTabUnmapped) { | |
464 std::set<int> free_node_ids; | |
465 const int kWindow1 = 1; | |
466 const int kTabNode = 0; | |
467 const int kTab1 = 15; | |
468 const int kTab2 = 25; | |
469 | |
470 // First create the old tab in an unmapped state. | |
471 GetTracker()->SetLocalSessionTag(kTag); | |
472 GetTracker()->ReassociateLocalTab(kTabNode, kTab1); | |
473 | |
474 // Map it to a window, but reassociated with a new tab id. | |
475 GetTracker()->ResetSessionTracking(kTag); | |
476 GetTracker()->ReassociateLocalTab(kTabNode, kTab2); | |
477 GetTracker()->PutWindowInSession(kTag, kWindow1); | |
478 GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); | |
479 GetTracker()->CleanupLocalTabs(&free_node_ids); | |
480 EXPECT_TRUE(free_node_ids.empty()); | |
481 | |
482 // Now that it's been mapped, it should be accessible both via the | |
483 // GetSession as well as GetTab. | |
484 SyncedSession* session = GetTracker()->GetSession(kTag); | |
485 ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), | |
486 session->windows[kWindow1]->tabs[0].get()); | |
487 ASSERT_EQ(session->tab_node_ids.size(), | |
488 session->tab_node_ids.count(kTabNode)); | |
489 ASSERT_EQ(1U, GetTabNodePool()->Capacity()); | |
490 } | |
491 | |
368 } // namespace sync_sessions | 492 } // namespace sync_sessions |
OLD | NEW |