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

Side by Side Diff: chrome/browser/sync/glue/synced_session_tracker_unittest.cc

Issue 7966020: [Sync] Fix Session's handling of windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nits, rebase. Created 9 years, 2 months 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <string>
6 #include <vector>
7
8 #include "base/memory/scoped_ptr.h"
9 #include "base/rand_util.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/sessions/session_types.h"
12 #include "chrome/browser/sync/glue/synced_session_tracker.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace browser_sync {
16
17 typedef testing::Test SyncedSessionTrackerTest;
18
19 TEST_F(SyncedSessionTrackerTest, GetSession) {
20 SyncedSessionTracker tracker;
21 SyncedSession* session1 = tracker.GetSession("tag");
22 SyncedSession* session2 = tracker.GetSession("tag2");
23 ASSERT_EQ(session1, tracker.GetSession("tag"));
24 ASSERT_NE(session1, session2);
25 // Should clean up memory on it's own.
26 }
27
28 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) {
29 SyncedSessionTracker tracker;
30 SessionTab* tab = tracker.GetTab("tag", 0);
31 ASSERT_EQ(tab, tracker.GetTab("tag", 0));
32 // Should clean up memory on it's own.
33 }
34
35 TEST_F(SyncedSessionTrackerTest, PutWindowInSession) {
36 SyncedSessionTracker tracker;
37 tracker.PutWindowInSession("tag", 0);
38 SyncedSession* session = tracker.GetSession("tag");
39 ASSERT_EQ(1U, session->windows.size());
40 // Should clean up memory on it's own.
41 }
42
43 TEST_F(SyncedSessionTrackerTest, PutTabInWindow) {
44 SyncedSessionTracker tracker;
45 tracker.PutWindowInSession("tag", 10);
46 tracker.PutTabInWindow("tag", 10, 15, 0); // win id 10, tab id 15, tab ind 0.
47 SyncedSession* session = tracker.GetSession("tag");
48 ASSERT_EQ(1U, session->windows.size());
49 ASSERT_EQ(1U, session->windows[10]->tabs.size());
50 ASSERT_EQ(tracker.GetTab("tag", 15), session->windows[10]->tabs[0]);
51 // Should clean up memory on it's own.
52 }
53
54 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) {
55 SyncedSessionTracker tracker;
56 std::vector<const SyncedSession*> sessions;
57 ASSERT_FALSE(tracker.LookupAllForeignSessions(&sessions));
58 tracker.GetSession("tag1");
59 tracker.GetSession("tag2");
60 tracker.PutWindowInSession("tag1", 0);
61 tracker.PutTabInWindow("tag1", 0, 15, 0);
62 SessionTab* tab = tracker.GetTab("tag1", 15);
63 ASSERT_TRUE(tab);
64 tab->navigations.push_back(TabNavigation(
65 0, GURL("valid_url"), GURL("referrer"),
66 string16(ASCIIToUTF16("title")),
67 std::string("state"), 0U));
68 ASSERT_TRUE(tracker.LookupAllForeignSessions(&sessions));
69 // Only the session with a valid window and tab gets returned.
70 ASSERT_EQ(1U, sessions.size());
71 ASSERT_EQ("tag1", sessions[0]->session_tag);
72 }
73
74 TEST_F(SyncedSessionTrackerTest, LookupSessionWindows) {
75 SyncedSessionTracker tracker;
76 std::vector<const SessionWindow*> windows;
77 ASSERT_FALSE(tracker.LookupSessionWindows("tag1", &windows));
78 tracker.GetSession("tag1");
79 tracker.PutWindowInSession("tag1", 0);
80 tracker.PutWindowInSession("tag1", 2);
81 tracker.GetSession("tag2");
82 tracker.PutWindowInSession("tag2", 0);
83 tracker.PutWindowInSession("tag2", 2);
84 ASSERT_TRUE(tracker.LookupSessionWindows("tag1", &windows));
85 ASSERT_EQ(2U, windows.size()); // Only windows from tag1 session.
86 ASSERT_NE((SessionWindow*)NULL, windows[0]);
87 ASSERT_NE((SessionWindow*)NULL, windows[1]);
88 ASSERT_NE(windows[1], windows[0]);
89 }
90
91 TEST_F(SyncedSessionTrackerTest, LookupSessionTab) {
92 SyncedSessionTracker tracker;
93 const SessionTab* tab;
94 ASSERT_FALSE(tracker.LookupSessionTab("tag1", 5, &tab));
95 tracker.GetSession("tag1");
96 tracker.PutWindowInSession("tag1", 0);
97 tracker.PutTabInWindow("tag1", 0, 5, 0);
98 ASSERT_TRUE(tracker.LookupSessionTab("tag1", 5, &tab));
99 ASSERT_NE((SessionTab*)NULL, tab);
100 }
101
102 TEST_F(SyncedSessionTrackerTest, Complex) {
103 const std::string tag1 = "tag";
104 const std::string tag2 = "tag2";
105 const std::string tag3 = "tag3";
106 SyncedSessionTracker tracker;
107 std::vector<SessionTab*> tabs1, tabs2;
108 SessionTab* temp_tab;
109 ASSERT_TRUE(tracker.Empty());
110 ASSERT_EQ(0U, tracker.num_synced_sessions());
111 ASSERT_EQ(0U, tracker.num_synced_tabs(tag1));
112 tabs1.push_back(tracker.GetTab(tag1, 0));
113 tabs1.push_back(tracker.GetTab(tag1, 1));
114 tabs1.push_back(tracker.GetTab(tag1, 2));
115 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1));
116 ASSERT_EQ(0U, tracker.num_synced_sessions());
117 temp_tab = tracker.GetTab(tag1, 0); // Already created.
118 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1));
119 ASSERT_EQ(0U, tracker.num_synced_sessions());
120 ASSERT_EQ(tabs1[0], temp_tab);
121 tabs2.push_back(tracker.GetTab(tag2, 0));
122 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2));
123 ASSERT_EQ(0U, tracker.num_synced_sessions());
124
125 ASSERT_FALSE(tracker.DeleteSession(tag1));
126 ASSERT_FALSE(tracker.DeleteSession(tag3));
127
128 SyncedSession* session = tracker.GetSession(tag1);
129 SyncedSession* session2 = tracker.GetSession(tag2);
130 SyncedSession* session3 = tracker.GetSession(tag3);
131 ASSERT_EQ(3U, tracker.num_synced_sessions());
132
133 ASSERT_TRUE(session);
134 ASSERT_TRUE(session2);
135 ASSERT_TRUE(session3);
136 ASSERT_NE(session, session2);
137 ASSERT_NE(session2, session3);
138 ASSERT_TRUE(tracker.DeleteSession(tag3));
139 ASSERT_EQ(2U, tracker.num_synced_sessions());
140
141 tracker.PutWindowInSession(tag1, 0); // Create a window.
142 tracker.PutTabInWindow(tag1, 0, 2, 0); // No longer unmapped.
143 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1)); // Has not changed.
144
145 const SessionTab *tab_ptr;
146 ASSERT_TRUE(tracker.LookupSessionTab(tag1, 0, &tab_ptr));
147 ASSERT_EQ(tab_ptr, tabs1[0]);
148 ASSERT_TRUE(tracker.LookupSessionTab(tag1, 2, &tab_ptr));
149 ASSERT_EQ(tab_ptr, tabs1[2]);
150 ASSERT_FALSE(tracker.LookupSessionTab(tag1, 3, &tab_ptr));
151 ASSERT_EQ(static_cast<const SessionTab*>(NULL), tab_ptr);
152
153 std::vector<const SessionWindow*> windows;
154 ASSERT_TRUE(tracker.LookupSessionWindows(tag1, &windows));
155 ASSERT_EQ(1U, windows.size());
156 ASSERT_TRUE(tracker.LookupSessionWindows(tag2, &windows));
157 ASSERT_EQ(0U, windows.size());
158
159 // The sessions don't have valid tabs, lookup should not succeed.
160 std::vector<const SyncedSession*> sessions;
161 ASSERT_FALSE(tracker.LookupAllForeignSessions(&sessions));
162
163 tracker.Clear();
164 ASSERT_EQ(0U, tracker.num_synced_tabs(tag1));
165 ASSERT_EQ(0U, tracker.num_synced_tabs(tag2));
166 ASSERT_EQ(0U, tracker.num_synced_sessions());
167 }
168
169 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) {
170 SyncedSessionTracker tracker;
171 ASSERT_TRUE(tracker.Empty());
172 const int kMaxSessions = 10;
173 const int kMaxTabs = 1000;
174 const int kMaxAttempts = 10000;
175 for (int j=0; j<kMaxSessions; ++j) {
176 std::string tag = "tag" + j;
177 for (int i=0; i<kMaxAttempts; ++i) {
178 // More attempts than tabs means we'll sometimes get the same tabs,
179 // sometimes have to allocate new tabs.
180 int rand_tab_num = base::RandInt(0, kMaxTabs);
181 SessionTab* tab = tracker.GetTab(tag, rand_tab_num);
182 ASSERT_TRUE(tab);
183 }
184 }
185 }
186
187 TEST_F(SyncedSessionTrackerTest, SessionTracking) {
188 SyncedSessionTracker tracker;
189 ASSERT_TRUE(tracker.Empty());
190 std::string tag1 = "tag1";
191 std::string tag2 = "tag2";
192
193 // Create some session information that is stale.
194 SyncedSession* session1= tracker.GetSession(tag1);
195 tracker.PutWindowInSession(tag1, 0);
196 tracker.PutTabInWindow(tag1, 0, 0, 0);
197 tracker.PutTabInWindow(tag1, 0, 1, 1);
198 tracker.GetTab(tag1, 2)->window_id.set_id(0); // Will be an unmapped tab.
199 tracker.GetTab(tag1, 3)->window_id.set_id(0); // Will be an unmapped tab.
200 tracker.PutWindowInSession(tag1, 1);
201 tracker.PutTabInWindow(tag1, 1, 4, 0);
202 tracker.PutTabInWindow(tag1, 1, 5, 1);
203 ASSERT_EQ(2U, session1->windows.size());
204 ASSERT_EQ(2U, session1->windows[0]->tabs.size());
205 ASSERT_EQ(2U, session1->windows[1]->tabs.size());
206 ASSERT_EQ(6U, tracker.num_synced_tabs(tag1));
207
208 // Create a session that should not be affected.
209 SyncedSession* session2 = tracker.GetSession(tag2);
210 tracker.PutWindowInSession(tag2, 2);
211 tracker.PutTabInWindow(tag2, 2, 1, 0);
212 ASSERT_EQ(1U, session2->windows.size());
213 ASSERT_EQ(1U, session2->windows[2]->tabs.size());
214 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2));
215
216 // Reset tracking and get the current windows/tabs.
217 // We simulate moving a tab from one window to another, then closing the first
218 // window (including it's one remaining tab), and opening a new tab on the
219 // remaining window.
220 tracker.GetTab(tag1, 6); // New tab, arrived before meta node so unmapped.
221 tracker.ResetSessionTracking(tag1);
222 tracker.PutWindowInSession(tag1, 0);
223 tracker.PutTabInWindow(tag1, 0, 0, 0);
224 // Tab 1 is closed.
225 tracker.PutTabInWindow(tag1, 0, 2, 1); // No longer unmapped.
226 // Tab 3 was unmapped and does not get used.
227 tracker.PutTabInWindow(tag1, 0, 4, 2); // Moved from window 1.
228 // Window 1 was closed, along with tab 5.
229 tracker.PutTabInWindow(tag1, 0, 6, 3); // No longer unmapped.
230 // Session 2 should not be affected.
231 tracker.CleanupSession(tag1);
232
233 // Verify that only those parts of the session not owned have been removed.
234 ASSERT_EQ(1U, session1->windows.size());
235 ASSERT_EQ(4U, session1->windows[0]->tabs.size());
236 ASSERT_EQ(1U, session2->windows.size());
237 ASSERT_EQ(1U, session2->windows[2]->tabs.size());
238 ASSERT_EQ(2U, tracker.num_synced_sessions());
239 ASSERT_EQ(4U, tracker.num_synced_tabs(tag1));
240 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2));
241
242 // All memory should be properly deallocated by destructor for the
243 // SyncedSessionTracker.
244 }
245
246 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/synced_session_tracker.cc ('k') | chrome/browser/sync/profile_sync_service_session_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698