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

Side by Side Diff: components/sync_sessions/synced_session_tracker_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698